In cumulus/chip.pads, now support non-square corner I/O pads.

This commit is contained in:
Jean-Paul Chaput 2023-07-15 21:26:13 +02:00
parent 9d98c9aafd
commit d0f0cdc47d
2 changed files with 14 additions and 3 deletions

View File

@ -744,7 +744,10 @@ class IoPadConf ( object ):
else: else:
if self._datas[5] is not None: self.flags |= IoPadConf.BIDIR if self._datas[5] is not None: self.flags |= IoPadConf.BIDIR
elif self._datas[6] is not None: self.flags |= IoPadConf.TRISTATE elif self._datas[6] is not None: self.flags |= IoPadConf.TRISTATE
trace( 550, '\tIoPadConf._datas: {}\n'.format(self._datas) ) sPos = ''
if self._datas[1]:
sPos = DbU.getValueString(self._datas[1])
trace( 550, '\tIoPadConf._datas: @{} {}\n'.format(sPos,self._datas) )
@property @property
def side ( self ): return self._datas[0] def side ( self ): return self._datas[0]

View File

@ -169,7 +169,7 @@ class Side ( object ):
self.type = sideType self.type = sideType
self.corona = corona self.corona = corona
self.pins = [] self.pins = []
self.u = self.conf.ioPadHeight self.u = 0
self.spacerCount = 0 self.spacerCount = 0
self.gap = 0 self.gap = 0
self.coreWires = [] self.coreWires = []
@ -370,6 +370,10 @@ class Side ( object ):
return return
def _placePads ( self ): def _placePads ( self ):
if self.type in (North,South):
self.u = self.corona.padCornerWidth
else:
self.u = self.corona.padCornerHeight
padLength = 0 padLength = 0
for pad in self.pads: padLength += pad[1].getMasterCell().getAbutmentBox().getWidth() for pad in self.pads: padLength += pad[1].getMasterCell().getAbutmentBox().getWidth()
padSpacing = (self.sideLength - 2*self.conf.ioPadHeight - padLength) // (len(self.pads) + 1) padSpacing = (self.sideLength - 2*self.conf.ioPadHeight - padLength) // (len(self.pads) + 1)
@ -551,6 +555,8 @@ class Corona ( object ):
self.padCorner = [] self.padCorner = []
self.padRails = [] # [ , [net, layer, axis, width] ] self.padRails = [] # [ , [net, layer, axis, width] ]
self.powerCount = 0 self.powerCount = 0
self.padCornerWidth = self.conf.ioPadHeight
self.padCornerHeight = self.conf.ioPadHeight
self.conf.cfg.chip.padCoreSide = None self.conf.cfg.chip.padCoreSide = None
if self.conf.cfg.chip.padCoreSide.lower() == 'south': if self.conf.cfg.chip.padCoreSide.lower() == 'south':
self.padOrient = Transformation.Orientation.MY self.padOrient = Transformation.Orientation.MY
@ -567,7 +573,9 @@ class Corona ( object ):
raise ErrorMessage( 1, 'Corona.__init__(): Missing spacer cell "{}"'.format(spacerName) ) raise ErrorMessage( 1, 'Corona.__init__(): Missing spacer cell "{}"'.format(spacerName) )
self.padSpacers = sorted( self.padSpacers, key=_cmpPad, reverse=True ) self.padSpacers = sorted( self.padSpacers, key=_cmpPad, reverse=True )
if self.conf.cfg.chip.padCorner is not None: if self.conf.cfg.chip.padCorner is not None:
self.padCorner = self.padLib.getCell( self.conf.cfg.chip.padCorner ) self.padCorner = self.padLib.getCell( self.conf.cfg.chip.padCorner )
self.padCornerWidth = self.padCorner.getAbutmentBox().getWidth()
self.padCornerHeight = self.padCorner.getAbutmentBox().getHeight()
if self.conf.cfg.chip.minPadSpacing is None: if self.conf.cfg.chip.minPadSpacing is None:
self.conf.cfg.chip.minPadSpacing = 0 self.conf.cfg.chip.minPadSpacing = 0