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:
Jean-Paul Chaput 2023-07-17 15:12:56 +02:00
parent 6401f0d455
commit 46d81c5cb0
2 changed files with 38 additions and 3 deletions

View File

@ -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 )

View File

@ -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