diff --git a/cumulus/src/plugins/alpha/block/block.py b/cumulus/src/plugins/alpha/block/block.py index 0c8b448b..17fdf133 100644 --- a/cumulus/src/plugins/alpha/block/block.py +++ b/cumulus/src/plugins/alpha/block/block.py @@ -333,6 +333,22 @@ class Block ( object ): .format(self.conf.cell.getName()) ) Block.LUT[ self.conf.cell ] = self + + @staticmethod + def abPlace ( instance, transf ): + """ + Place an instance so it is it's abutment box which will be + placed at ``transf``. Incomplete implementation for now, only + Orientation::ID in ``transf`` is supported. + """ + ab = instance.getMasterCell().getAbutmentBox() + abTransf = Transformation( ab.getXMin(), ab.getYMin(), Transformation.Orientation.ID ) + abTransf.invert() + abTransf.applyOn( transf ) + instance.setTransformation( transf ) + instance.setPlacementStatus( Instance.PlacementStatus.FIXED ) + + @staticmethod def _getInstance ( cell, pattern, level=0 ): """ diff --git a/cumulus/src/plugins/alpha/chip/configuration.py b/cumulus/src/plugins/alpha/chip/configuration.py index 81bc18a6..3bc00c96 100644 --- a/cumulus/src/plugins/alpha/chip/configuration.py +++ b/cumulus/src/plugins/alpha/chip/configuration.py @@ -91,7 +91,7 @@ class ChipConf ( BlockConf ): def __init__ ( self, cell, ioPins=[], ioPads=[] ): trace( 550, ',+', 'ChipConf.__init__(): "{}"'.format(cell.getName()) ) super(ChipConf,self).__init__( cell, ioPins, ioPads ) -# trace( 550, '\tONE LAMBDA = %s\n' % DbU.getValueString(DbU.fromLambda(1.0)) ) + #trace( 550, '\tONE LAMBDA = %s\n' % DbU.getValueString(DbU.fromLambda(1.0)) ) self.validated = True # Block Corona parameters (triggers loading from disk). self.cfg.chip.padCoreSide = None @@ -111,6 +111,7 @@ class ChipConf ( BlockConf ): self.coronaCks = [] self.blockageNet = None self.padsHavePosition = False + self.chipLogos = [] trace( 550, '-' ) @property diff --git a/cumulus/src/plugins/alpha/chip/pads.py b/cumulus/src/plugins/alpha/chip/pads.py index 2257a859..f2640d52 100644 --- a/cumulus/src/plugins/alpha/chip/pads.py +++ b/cumulus/src/plugins/alpha/chip/pads.py @@ -22,7 +22,8 @@ from Hurricane import DbU, Point, Transformation, Interval, Box, \ Path, Occurrence, UpdateSession, Layer, \ BasicLayer, Net, Pin, Contact, Segment, Pad, \ Horizontal, Vertical, Diagonal, RoutingPad, \ - Instance, DataBase, NetExternalComponents + Instance, DataBase, NetExternalComponents, \ + Library import CRL from CRL import RoutingGauge, RoutingLayerGauge import helpers @@ -30,11 +31,15 @@ from helpers import trace, l, u, n, onFGrid from helpers.io import ErrorMessage, WarningMessage from helpers.overlay import UpdateSession import plugins.alpha.chip +from plugins.alpha.block.block import Block from plugins.alpha.block.bigvia import BigVia plugins.alpha.chip.importConstants( globals() ) +af = CRL.AllianceFramework.get() + + # -------------------------------------------------------------------- # Class : "pads.Corner" @@ -1295,6 +1300,7 @@ class Corona ( object ): self.eastSide.doLayout() self.westSide.doLayout() self._placeInnerCorona() + self.doLogosLayout() self.conf.chip.setRouted( True ) def doPowerLayout ( self ): @@ -1402,4 +1408,36 @@ class Corona ( object ): # chipNet = chipPowerNet # self._supplyToPad( chipNet, coronaNet, axis, North ) # self._supplyToPad( chipNet, coronaNet, axis, South ) + + def doLogosLayout ( self ): + """ + Add GDS logos layout in the bottom left corner of the chip, if any. + """ + global af + print( ' o Inserting chip logo(s).' ) + if not len(self.conf.chipLogos): return + with UpdateSession(): + rootLib = DataBase.getDB().getRootLibrary() + logosLib = rootLib.getLibrary( 'Logos' ) + if not logosLib: + print( ' o Creating GDS Logos library.' ) + logosLib = Library.create( rootLib, 'LogosLib' ) + af.wrapLibrary( logosLib, 0 ) + xLogo = 0 + yLogo = 0 + rowHeight = 0 + count = 0 + for logo in self.conf.chipLogos: + print( ' - GDS Logo "{0}.gds".'.format(logo) ) + CRL.Gds.load( logosLib, './{}.gds'.format(logo) ) + logoCell = logosLib.getCell( 'gds_{}'.format(logo) ) + logoInstance = Instance.create( self.conf.chip, logo, logoCell ) + Block.abPlace( logoInstance + , Transformation( xLogo, yLogo, Transformation.Orientation.ID )) + xLogo += logoCell.getAbutmentBox().getWidth() + rowHeight = max( rowHeight, logoCell.getAbutmentBox().getHeight() ) + if count % 2: + xLogo = 0 + yLogo += rowHeight + count += 1