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:
parent
14ff6ce78a
commit
21c269a855
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue