Various improvement & bug correction in Katabatic & Kite.
* Bug: In Katabatic, in AutoContactTurn::cacheAttach() unset the "cache invalidated" flag *only* if the h1 & v1 component are sets. This is needed because we can attach *before* the first cache revalidation (in the initial building stage). * Bug: In Katabatic, in AutoSegment::getPPitch() out of bound access of the top of the RoutingGauge, in case of a top layer segment with a spin top flag (maybe this shouldn't happen?). * Change: In Kite, in SegmentFsm::conflictSolveByPlaceds() take account as conflicting other global, global, blockage *and* now fixeds. * Change: In Cumulus, in px2mpx.py more accurate way of transforming the pad blockages.
This commit is contained in:
parent
a3963716b1
commit
2c345c9033
|
@ -121,6 +121,8 @@ def px2mpx ( editor, pxCell ):
|
|||
raise ErrorMessage( 3, 'px2mpx.px2mpx(): Mandatory pxCell argument is None.' )
|
||||
mpxCell = None
|
||||
|
||||
print '\nProcessing', pxCell
|
||||
|
||||
UpdateSession.open()
|
||||
try:
|
||||
if pxCell.getName() != 'padreal':
|
||||
|
@ -178,8 +180,9 @@ def px2mpx ( editor, pxCell ):
|
|||
)
|
||||
elif isinstance(component,Horizontal):
|
||||
dL, dW, mW = getDeltas( layer )
|
||||
dLLeft = dL
|
||||
dLRight = dL
|
||||
dLLeft = dL
|
||||
dLRight = dL
|
||||
skipComponent = False
|
||||
|
||||
bb = component.getBoundingBox()
|
||||
if component.getSourceX() > component.getTargetX(): component.invert()
|
||||
|
@ -198,12 +201,16 @@ def px2mpx ( editor, pxCell ):
|
|||
print ' Shrink right.'
|
||||
dLRight = dL - DbU.fromLambda( 1.5 )
|
||||
|
||||
if layer.getName()[-1] == '4' and state == AllSpan:
|
||||
print ' Skipping component.'
|
||||
skipComponent = True
|
||||
|
||||
width = mW
|
||||
if component.getWidth() > mW:
|
||||
width = component.getWidth()*2 + dW
|
||||
|
||||
#print DbU.toLambda(bb.getWidth()), DbU.toLambda( dLLeft-dLRight)
|
||||
if bb.getWidth()*2 > abs(dLLeft+dLRight):
|
||||
if bb.getWidth()*2 > abs(dLLeft+dLRight) and not skipComponent:
|
||||
dupComponent = Horizontal.create( mpxNet
|
||||
, layer
|
||||
, component.getY ()*2
|
||||
|
@ -212,11 +219,14 @@ def px2mpx ( editor, pxCell ):
|
|||
, component.getDxTarget()*2 + dLRight
|
||||
)
|
||||
else:
|
||||
print ' Horizontal component too small, not converted'
|
||||
print ' Horizontal component too small *or* skipped, not converted'
|
||||
|
||||
elif isinstance(component,Vertical):
|
||||
dL, dW, mW = getDeltas( component.getLayer() )
|
||||
dX = 0
|
||||
dLTop = dL
|
||||
dLBottom = dL
|
||||
dX = 0
|
||||
skipComponent = False
|
||||
|
||||
if component.getSourceY() > component.getTargetY(): component.invert()
|
||||
if isinstance(layer,RegularLayer):
|
||||
|
@ -237,7 +247,14 @@ def px2mpx ( editor, pxCell ):
|
|||
dX = 0
|
||||
dW += DbU.fromLambda( -4.0 )
|
||||
|
||||
if dW < component.getWidth():
|
||||
if layer.getName()[-1] == '5':
|
||||
if state == AllSpan:
|
||||
print ' Skipping component.'
|
||||
skipComponent = True
|
||||
else:
|
||||
dLTop = DbU.fromLambda(120.0) - component.getDyTarget()*2
|
||||
|
||||
if dW < component.getWidth() and not skipComponent:
|
||||
width = mW
|
||||
if component.getWidth() > mW:
|
||||
width = component.getWidth()*2 + dW
|
||||
|
@ -246,11 +263,11 @@ def px2mpx ( editor, pxCell ):
|
|||
, layer
|
||||
, component.getX ()*2 + dX
|
||||
, width
|
||||
, component.getDySource()*2 - dL
|
||||
, component.getDyTarget()*2 + dL
|
||||
, component.getDySource()*2 - dLBottom
|
||||
, component.getDyTarget()*2 + dLTop
|
||||
)
|
||||
else:
|
||||
print ' Vertical component too small, not converted'
|
||||
print ' Vertical component too small *or* skipped, not converted'
|
||||
|
||||
else:
|
||||
print '[WARNING] Unchanged component:', component
|
||||
|
|
|
@ -136,7 +136,8 @@ namespace Katabatic {
|
|||
}
|
||||
_vertical1 = static_cast<AutoVertical*>(segment);
|
||||
}
|
||||
unsetFlags( CntInvalidatedCache );
|
||||
|
||||
if (_horizontal1 and _vertical1) unsetFlags( CntInvalidatedCache );
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -534,16 +534,9 @@ namespace Katabatic {
|
|||
|
||||
DbU::Unit AutoSegment::getPPitch () const
|
||||
{
|
||||
DbU::Unit topPPitch = getPitch();
|
||||
DbU::Unit bottomPPitch = topPPitch;
|
||||
unsigned int depth = getDepth();
|
||||
|
||||
if (depth < Session::getDepth()) {
|
||||
topPPitch = Session::getPitch( depth + ((_flags & SegSpinTop) ? 1 : 0) );
|
||||
}
|
||||
if (depth > 0) {
|
||||
bottomPPitch = Session::getPitch( depth - ((_flags & SegSpinBottom) ? 1 : 0) );
|
||||
}
|
||||
unsigned int depth = getDepth();
|
||||
DbU::Unit topPPitch = Session::getPitch( depth + ( ((_flags & SegSpinTop) and (depth+1 < Session::getDepth())) ? 1 : 0) );
|
||||
DbU::Unit bottomPPitch = Session::getPitch( depth - ( ((_flags & SegSpinBottom) and (depth > 0))? 1 : 0) );
|
||||
|
||||
return std::max( topPPitch, bottomPPitch );
|
||||
}
|
||||
|
|
|
@ -787,10 +787,10 @@ namespace Kite {
|
|||
}
|
||||
otherNet = other->getNet();
|
||||
otherOverlap = other->getCanonicalInterval();
|
||||
otherIsGlobal = other->isGlobal() or other->isBlockage();
|
||||
otherIsGlobal = other->isGlobal() or other->isBlockage() or other->isFixed();
|
||||
} else {
|
||||
otherOverlap.merge(other->getCanonicalInterval());
|
||||
otherIsGlobal = otherIsGlobal or other->isGlobal() or other->isBlockage();
|
||||
otherIsGlobal = otherIsGlobal or other->isGlobal() or other->isBlockage() or other->isFixed();
|
||||
}
|
||||
}
|
||||
if (not otherOverlap.isEmpty()) {
|
||||
|
|
Loading…
Reference in New Issue