Improved support for foreign block support in Cumulus.

* Change: In cumulus/plugins.block.Block.__init__(), assume that a block
    is already built only if *all* it's instances are placed. Not some
    of them.
* New: In cumulus/plugins/block/configuration, added support for a
    placeArea parameter to restrict the placement area further than the
    abutment box (see Etesian for the new feature).
* Change: In cumulus/plugins/CoreToChip, no longer adds I/O pads for
    core signals that lacks one. Only issue an error message and
    continue. More useful for debugging block support.
This commit is contained in:
Jean-Paul Chaput 2021-02-01 17:01:32 +01:00
parent 14ff6ce78a
commit 21c269a855
3 changed files with 31 additions and 15 deletions

View File

@ -308,10 +308,20 @@ class Block ( object ):
, IoPin.NORTH : Side( self.conf, IoPin.NORTH )
}
if not self.conf.cell.getAbutmentBox().isEmpty():
print( ' o Block "{}" is already done, reusing layout.' \
.format(self.conf.cell.getName()) )
self.conf.cell.setTerminalNetlist( True )
self.conf.isBuilt = True
isBuilt = True
for instance in self.conf.cell.getInstances():
status = instance.getPlacementStatus()
if status == Instance.PlacementStatus.UNPLACED:
isBuilt = False
break
if isBuilt:
print( ' o Block "{}" is already done, reusing layout.' \
.format(self.conf.cell.getName()) )
self.conf.cell.setTerminalNetlist( True )
else:
print( ' o Block "{}" is partially placed, reusing layout.' \
.format(self.conf.cell.getName()) )
self.conf.isBuilt = isBuilt
else:
print( ' o Block "{}" will be generated.' \
.format(self.conf.cell.getName()) )
@ -534,6 +544,8 @@ class Block ( object ):
Breakpoint.stop( 100, 'Block.place(), corona loaded.')
else:
self.etesian = Etesian.EtesianEngine.create( self.conf.cell )
if self.conf.placeArea:
self.etesian.setPlaceArea( self.conf.placeArea )
self.etesian.place()
Breakpoint.stop( 100, 'Placement done.' )
self.etesian.clearColoquinte()

View File

@ -1087,6 +1087,7 @@ class BlockConf ( GaugeConf ):
self.chip = None
self.fixedWidth = None
self.fixedHeight = None
self.placeArea = None
self.deltaAb = [ 0, 0, 0, 0 ]
self.useClockTree = False
self.useHFNS = False

View File

@ -665,17 +665,20 @@ class CoreToChip ( object ):
elif coreNet.isClock(): continue
elif self.hasIoNet(coreNet.getName()): continue
# Remaining non configured Standard I/O pads.
ioNet = IoNet( self, coreNet )
directPad = IoPadConf( ( 0 # Unkown side.
, None # Unknow position.
, ioNet.padInstanceName
, ioNet.chipExtNetName
, ioNet.coreNetName
) )
directPad.udata = IoPad( self, directPad.instanceName )
directPad.udata.addNet( ioNet )
ioPads.append( directPad )
trace( 550, '\tNon-configured core net {}, adding {}\n'.format(coreNet,directPad) )
print( ErrorMessage( 1, 'CoreToChip.buildChip(): No pad configured for core signal "{}".' \
.format(coreNet.getName()) ) )
continue
#ioNet = IoNet( self, coreNet )
#directPad = IoPadConf( ( 0 # Unkown side.
# , None # Unknow position.
# , ioNet.padInstanceName
# , ioNet.chipExtNetName
# , ioNet.coreNetName
# ) )
#directPad.udata = IoPad( self, directPad )
#directPad.udata.addNet( ioNet )
#ioPads.append( directPad )
#trace( 550, '\tNon-configured core net {}, adding {}\n'.format(coreNet,directPad) )
for ioPad in ioPads:
ioPad.udata.createPad()
self._connectRing()