diff --git a/cumulus/src/plugins/chip/Chip.py b/cumulus/src/plugins/chip/Chip.py index a5a58063..7fe5f25a 100644 --- a/cumulus/src/plugins/chip/Chip.py +++ b/cumulus/src/plugins/chip/Chip.py @@ -117,9 +117,31 @@ class PlaceRoute ( object ): raise ErrorMessage( 1, 'chip.doCoronaFloorplan(): Chip is not valid, aborting.' ) return + railsNb = Cfg.getParamInt('chip.block.rails.count' ).asInt() + hRailWidth = Cfg.getParamInt('chip.block.rails.hWidth' ).asInt() + vRailWidth = Cfg.getParamInt('chip.block.rails.vWidth' ).asInt() + hRailSpace = Cfg.getParamInt('chip.block.rails.hSpacing').asInt() + vRailSpace = Cfg.getParamInt('chip.block.rails.vSpacing').asInt() + + if not self.conf.useClockTree: self.railsNb -= 1 + + innerBb = Box( self.conf.coreSize ) + innerBb.inflate( (railsNb * vRailWidth + (railsNb+1) * vRailSpace + self.conf.getSliceHeight()) * 2 + , (railsNb * hRailWidth + (railsNb+1) * hRailSpace + self.conf.getSliceHeight()) * 2 ) + + coronaAb = self.conf.corona.getAbutmentBox() + if innerBb.getWidth() > coronaAb.getWidth(): + raise ErrorMessage( 1, 'Core is too wide to fit into the corona, needs %s but only has %s.' + % ( DbU.getValueString(innerBb .getWidth()) + , DbU.getValueString(coronaAb.getWidth()) ) ) + + if innerBb.getHeight() > coronaAb.getHeight(): + raise ErrorMessage( 1, 'Core is too tall to fit into the corona, needs %s but only has %s.' + % ( DbU.getValueString(innerBb .getHeight()) + , DbU.getValueString(coronaAb.getHeight()) ) ) + UpdateSession.open() self.conf.core.setAbutmentBox( self.conf.coreSize ) - coronaAb = self.conf.corona.getAbutmentBox() x = (coronaAb.getWidth () - self.conf.coreSize.getWidth ()) / 2 y = (coronaAb.getHeight() - self.conf.coreSize.getHeight()) / 2 x = x - (x % self.conf.getSliceHeight()) diff --git a/cumulus/src/plugins/chip/Configuration.py b/cumulus/src/plugins/chip/Configuration.py index cbcd7b08..c5f64052 100644 --- a/cumulus/src/plugins/chip/Configuration.py +++ b/cumulus/src/plugins/chip/Configuration.py @@ -697,6 +697,15 @@ class ChipConf ( object ): abMin = ab.getXMin() abMax = ab.getXMax() + if uMin <= abMin: + shiftRight = abMin - uMin + lg.getPitch() + uMin += shiftRight + uMax += shiftRight + if uMax >= abMax: + shiftLeft = uMax - abMax + lg.getPitch() + uMin -= shiftLeft + uMax -= shiftLeft + iTrackMin = lg.getTrackIndex( abMin, abMax, uMin, RoutingLayerGauge.Superior ) iTrackMax = lg.getTrackIndex( abMin, abMax, uMax, RoutingLayerGauge.Inferior ) if iTrackMax < iTrackMin: iTrackMax = iTrackMin diff --git a/cumulus/src/plugins/chip/PadsCorona.py b/cumulus/src/plugins/chip/PadsCorona.py index 991a346b..923f0dc7 100644 --- a/cumulus/src/plugins/chip/PadsCorona.py +++ b/cumulus/src/plugins/chip/PadsCorona.py @@ -703,25 +703,25 @@ class CoreWire ( object ): if self.arraySize: if self.side == chip.West: xContact = min( xContact, vStrapBb.getXMin() ) - else: xContact = max( xContact, vStrapBb.getXMax() ) + else: xContact = max( xContact, vStrapBb.getXMax() ) self.conf.coronaHorizontal( self.chipNet - , self.symSegmentLayer - , self.bbSegment.getCenter().getY() - , self.bbSegment.getHeight() - , xContact - , xCore - ) + , self.symSegmentLayer + , self.bbSegment.getCenter().getY() + , self.bbSegment.getHeight() + , xContact + , xCore + ) trace( 550, '\tCORONA PIN: %s %d\n' % (self.chipNet, self.count) ) pin = self.conf.coronaPin( self.chipNet - , self.count - , accessDirection - , self.symSegmentLayer - , xCore - , self.bbSegment.getCenter().getY() - , DbU.fromLambda( 1.0 ) - , self.bbSegment.getHeight() - ) + , self.count + , accessDirection + , self.symSegmentLayer + , xCore + , self.bbSegment.getCenter().getY() + , DbU.fromLambda( 1.0 ) + , self.bbSegment.getHeight() + ) else: flags = chip.OnVerticalPitch @@ -790,7 +790,7 @@ class CoreWire ( object ): if self.arraySize: if self.side == chip.South: yContact = min( yContact, hStrapBb.getYMin() ) - else: yContact = max( yContact, hStrapBb.getYMax() ) + else: yContact = max( yContact, hStrapBb.getYMax() ) self.conf.coronaVertical( self.chipNet , self.symSegmentLayer