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:
Jean-Paul Chaput 2014-09-14 18:54:10 +02:00
parent a3963716b1
commit 2c345c9033
4 changed files with 33 additions and 22 deletions

View File

@ -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

View File

@ -136,7 +136,8 @@ namespace Katabatic {
} }
_vertical1 = static_cast<AutoVertical*>(segment); _vertical1 = static_cast<AutoVertical*>(segment);
} }
unsetFlags( CntInvalidatedCache );
if (_horizontal1 and _vertical1) unsetFlags( CntInvalidatedCache );
} }

View File

@ -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 );
} }

View File

@ -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()) {