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.' )
|
raise ErrorMessage( 3, 'px2mpx.px2mpx(): Mandatory pxCell argument is None.' )
|
||||||
mpxCell = None
|
mpxCell = None
|
||||||
|
|
||||||
|
print '\nProcessing', pxCell
|
||||||
|
|
||||||
UpdateSession.open()
|
UpdateSession.open()
|
||||||
try:
|
try:
|
||||||
if pxCell.getName() != 'padreal':
|
if pxCell.getName() != 'padreal':
|
||||||
|
@ -178,8 +180,9 @@ def px2mpx ( editor, pxCell ):
|
||||||
)
|
)
|
||||||
elif isinstance(component,Horizontal):
|
elif isinstance(component,Horizontal):
|
||||||
dL, dW, mW = getDeltas( layer )
|
dL, dW, mW = getDeltas( layer )
|
||||||
dLLeft = dL
|
dLLeft = dL
|
||||||
dLRight = dL
|
dLRight = dL
|
||||||
|
skipComponent = False
|
||||||
|
|
||||||
bb = component.getBoundingBox()
|
bb = component.getBoundingBox()
|
||||||
if component.getSourceX() > component.getTargetX(): component.invert()
|
if component.getSourceX() > component.getTargetX(): component.invert()
|
||||||
|
@ -198,12 +201,16 @@ def px2mpx ( editor, pxCell ):
|
||||||
print ' Shrink right.'
|
print ' Shrink right.'
|
||||||
dLRight = dL - DbU.fromLambda( 1.5 )
|
dLRight = dL - DbU.fromLambda( 1.5 )
|
||||||
|
|
||||||
|
if layer.getName()[-1] == '4' and state == AllSpan:
|
||||||
|
print ' Skipping component.'
|
||||||
|
skipComponent = True
|
||||||
|
|
||||||
width = mW
|
width = mW
|
||||||
if component.getWidth() > mW:
|
if component.getWidth() > mW:
|
||||||
width = component.getWidth()*2 + dW
|
width = component.getWidth()*2 + dW
|
||||||
|
|
||||||
#print DbU.toLambda(bb.getWidth()), DbU.toLambda( dLLeft-dLRight)
|
#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
|
dupComponent = Horizontal.create( mpxNet
|
||||||
, layer
|
, layer
|
||||||
, component.getY ()*2
|
, component.getY ()*2
|
||||||
|
@ -212,11 +219,14 @@ def px2mpx ( editor, pxCell ):
|
||||||
, component.getDxTarget()*2 + dLRight
|
, component.getDxTarget()*2 + dLRight
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
print ' Horizontal component too small, not converted'
|
print ' Horizontal component too small *or* skipped, not converted'
|
||||||
|
|
||||||
elif isinstance(component,Vertical):
|
elif isinstance(component,Vertical):
|
||||||
dL, dW, mW = getDeltas( component.getLayer() )
|
dL, dW, mW = getDeltas( component.getLayer() )
|
||||||
dX = 0
|
dLTop = dL
|
||||||
|
dLBottom = dL
|
||||||
|
dX = 0
|
||||||
|
skipComponent = False
|
||||||
|
|
||||||
if component.getSourceY() > component.getTargetY(): component.invert()
|
if component.getSourceY() > component.getTargetY(): component.invert()
|
||||||
if isinstance(layer,RegularLayer):
|
if isinstance(layer,RegularLayer):
|
||||||
|
@ -237,7 +247,14 @@ def px2mpx ( editor, pxCell ):
|
||||||
dX = 0
|
dX = 0
|
||||||
dW += DbU.fromLambda( -4.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
|
width = mW
|
||||||
if component.getWidth() > mW:
|
if component.getWidth() > mW:
|
||||||
width = component.getWidth()*2 + dW
|
width = component.getWidth()*2 + dW
|
||||||
|
@ -246,11 +263,11 @@ def px2mpx ( editor, pxCell ):
|
||||||
, layer
|
, layer
|
||||||
, component.getX ()*2 + dX
|
, component.getX ()*2 + dX
|
||||||
, width
|
, width
|
||||||
, component.getDySource()*2 - dL
|
, component.getDySource()*2 - dLBottom
|
||||||
, component.getDyTarget()*2 + dL
|
, component.getDyTarget()*2 + dLTop
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
print ' Vertical component too small, not converted'
|
print ' Vertical component too small *or* skipped, not converted'
|
||||||
|
|
||||||
else:
|
else:
|
||||||
print '[WARNING] Unchanged component:', component
|
print '[WARNING] Unchanged component:', component
|
||||||
|
|
|
@ -136,7 +136,8 @@ namespace Katabatic {
|
||||||
}
|
}
|
||||||
_vertical1 = static_cast<AutoVertical*>(segment);
|
_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 AutoSegment::getPPitch () const
|
||||||
{
|
{
|
||||||
DbU::Unit topPPitch = getPitch();
|
unsigned int depth = getDepth();
|
||||||
DbU::Unit bottomPPitch = topPPitch;
|
DbU::Unit topPPitch = Session::getPitch( depth + ( ((_flags & SegSpinTop) and (depth+1 < Session::getDepth())) ? 1 : 0) );
|
||||||
unsigned int depth = getDepth();
|
DbU::Unit bottomPPitch = Session::getPitch( depth - ( ((_flags & SegSpinBottom) and (depth > 0))? 1 : 0) );
|
||||||
|
|
||||||
if (depth < Session::getDepth()) {
|
|
||||||
topPPitch = Session::getPitch( depth + ((_flags & SegSpinTop) ? 1 : 0) );
|
|
||||||
}
|
|
||||||
if (depth > 0) {
|
|
||||||
bottomPPitch = Session::getPitch( depth - ((_flags & SegSpinBottom) ? 1 : 0) );
|
|
||||||
}
|
|
||||||
|
|
||||||
return std::max( topPPitch, bottomPPitch );
|
return std::max( topPPitch, bottomPPitch );
|
||||||
}
|
}
|
||||||
|
|
|
@ -787,10 +787,10 @@ namespace Kite {
|
||||||
}
|
}
|
||||||
otherNet = other->getNet();
|
otherNet = other->getNet();
|
||||||
otherOverlap = other->getCanonicalInterval();
|
otherOverlap = other->getCanonicalInterval();
|
||||||
otherIsGlobal = other->isGlobal() or other->isBlockage();
|
otherIsGlobal = other->isGlobal() or other->isBlockage() or other->isFixed();
|
||||||
} else {
|
} else {
|
||||||
otherOverlap.merge(other->getCanonicalInterval());
|
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()) {
|
if (not otherOverlap.isEmpty()) {
|
||||||
|
|
Loading…
Reference in New Issue