Change policy for vertical track protection of the H-Tree.
Formerly we were using Placement::Area::TrackAvoid() to shift cells terminals out of the way of the reserved vertical track. With double height cells, this is coming more complex and due to heavy tracks uses in some cells, the shift required may becomes too great. Instead, we place filler cells just underneath the reserved track to prevent their usage. This is a supplemental constraint on the router, but the new version manage it correctly. * New: In cumulus/block.spares.Spares.trackAvoid() to place filler cells under a given vertical area.
This commit is contained in:
parent
6401f0d455
commit
46d81c5cb0
|
@ -106,7 +106,11 @@ class HTree ( object ):
|
|||
hLeafDepth = gaugeConf.horizontalDepth - 2
|
||||
gaugeConf.setStackPosition( contact, x, y )
|
||||
gaugeConf.createVertical ( contact, forkContact, x, 0 )
|
||||
gaugeConf.addTrackAvoid( Box( x, forkContact.getY(), x, y ) )
|
||||
trackAvoidBox = Box( x, forkContact.getY(), x, y )
|
||||
if forkContact.getY() > contact.getY():
|
||||
trackAvoidBox.inflate( 0, 0, 0, self.spares.conf.sliceHeight )
|
||||
gaugeConf.addTrackAvoid( trackAvoidBox )
|
||||
self.spares.trackAvoid( trackAvoidBox )
|
||||
if len(leaf.buffers) > 1:
|
||||
tl1Contact = gaugeConf.rpAccessByPlugName( leaf.buffers[1], bufferConf.input, ckNet, GaugeConf.DeepDepth|GaugeConf.HAccess )
|
||||
tl2Contact = gaugeConf.rpAccessByPlugName( leaf.buffers[2], bufferConf.input, ckNet )
|
||||
|
|
|
@ -1103,8 +1103,8 @@ class Spares ( object ):
|
|||
trace( 540, ',+', '\tSpares.addStrayBuffer()\n' )
|
||||
|
||||
sliceHeight = self.conf.sliceHeight
|
||||
x = self.quadTree.toXPitch( position.getX() )
|
||||
y = self.quadTree.toYSlice( position.getY() )
|
||||
x = self.toXPitch( position.getX() )
|
||||
y = self.toYSlice( position.getY() )
|
||||
slice = y // sliceHeight
|
||||
orientation = Transformation.Orientation.ID
|
||||
y = slice * sliceHeight
|
||||
|
@ -1134,6 +1134,37 @@ class Spares ( object ):
|
|||
raise ErrorMessage( 2, 'Spares.getFreeBufferUnder(): No more free buffers under {}.'.format(area) )
|
||||
return leaf.selectFree()
|
||||
|
||||
def trackAvoid ( self, box ):
|
||||
"""
|
||||
Protect a vertical track by putting a vertical column of narrow filler
|
||||
under it (usually tie). Used by the H-Tree (clock tree) in low-metal
|
||||
nodes.
|
||||
"""
|
||||
trace( 540, ',+', '\tSpares.trackAvoid() {}\n'.format( box ))
|
||||
yoffset = 0
|
||||
if self.conf.isCoreBlock:
|
||||
yoffset = self.conf.icore.getTransformation().getTy()
|
||||
sliceHeight = self.conf.sliceHeight
|
||||
x = self.toXPitch( box.getXMin() ) - self.conf.sliceStep
|
||||
ymin = self.toYSlice( box.getYMin() )
|
||||
ymax = self.toYSlice( box.getYMax() )
|
||||
sliceMin = (ymin - yoffset) // sliceHeight
|
||||
sliceMax = (ymax - yoffset) // sliceHeight
|
||||
orientation = Transformation.Orientation.ID
|
||||
ymin = sliceMin * sliceHeight
|
||||
for row in range( sliceMin+1, sliceMax ):
|
||||
orientation = Transformation.Orientation.ID
|
||||
y = row * sliceHeight + yoffset
|
||||
if row%2:
|
||||
orientation = Transformation.Orientation.MY
|
||||
y += sliceHeight
|
||||
transf = Transformation( x, y, orientation )
|
||||
instance = self.conf.feedsConf.createFeed( self.conf.corona )
|
||||
instance.setTransformation( transf )
|
||||
instance.setPlacementStatus( Instance.PlacementStatus.FIXED )
|
||||
trace( 540, '\ttrackAvoid, feed: {} @{}\n'.format(instance,transf) )
|
||||
trace( 540, '-' )
|
||||
|
||||
def raddTransNet ( self, topNet, path ):
|
||||
"""
|
||||
Add a net through a whole hierarchy of Instance/Cells. The master cells
|
||||
|
|
Loading…
Reference in New Issue