In the H-Tree, shift vertical H wire one pitch to the left.

* Bug: In cumulus/plugins.block.HTree._rrouteHTree(), the RoutingPads
    for the input and output of the buffer where sometimes put too
    close from each others, giving the pitch of the vertical tracks.
    Now shift one pitch left the vertical branchs of the H-Tree.
* Bug: In cumulus/plugins.block.HTree._rrouteHTree(), also shift down
    one pitch the horizontal branch, due to track rounding they *may*
    end up on the same track, generating a short.
This commit is contained in:
Jean-Paul Chaput 2021-12-25 15:22:58 +01:00
parent 64056d25ee
commit 104c043416
2 changed files with 44 additions and 21 deletions

View File

@ -62,13 +62,14 @@ class GaugeConf ( object ):
""" """
HAccess = 0x0001 HAccess = 0x0001
OffsetRight1 = 0x0002 OffsetLeft1 = 0x0002
OffsetTop1 = 0x0004 OffsetRight1 = 0x0004
OffsetBottom1 = 0x0008 OffsetTop1 = 0x0008
DeepDepth = 0x0010 OffsetBottom1 = 0x0010
UseContactWidth = 0x0020 DeepDepth = 0x0020
ExpandWidth = 0x0040 UseContactWidth = 0x0040
SourceExtend = 0x0080 ExpandWidth = 0x0080
SourceExtend = 0x0100
def __init__ ( self ): def __init__ ( self ):
self._cellGauge = None self._cellGauge = None
@ -307,10 +308,12 @@ class GaugeConf ( object ):
yoffset = 0 yoffset = 0
if flags & GaugeConf.OffsetBottom1: yoffset = 1 if flags & GaugeConf.OffsetBottom1: yoffset = 1
if flags & GaugeConf.OffsetTop1: yoffset = -1 if flags & GaugeConf.OffsetTop1: yoffset = -1
trace( 550, '\tyoffset:{}\n'.format(yoffset) )
if startDepth == 0: if startDepth == 0:
contact1 = Contact.create( rp, self._routingGauge.getContactLayer(0), 0, 0 ) contact1 = Contact.create( rp, self._routingGauge.getContactLayer(0), 0, 0 )
ytrack = self.getTrack( contact1.getY(), self.horizontalDeepDepth, yoffset ) ytrack = self.getTrack( contact1.getY(), self.horizontalDeepDepth, yoffset )
dy = ytrack - contact1.getY() dy = ytrack - contact1.getY()
trace( 550, '\tPut on Y-tracks:{}\n'.format(DbU.getValueString(ytrack)) )
contact1.setDy( dy ) contact1.setDy( dy )
else: else:
contact1 = Contact.create( rp, self._routingGauge.getContactLayer(startDepth), 0, 0 ) contact1 = Contact.create( rp, self._routingGauge.getContactLayer(startDepth), 0, 0 )
@ -328,6 +331,8 @@ class GaugeConf ( object ):
xoffset = 0 xoffset = 0
if flags & GaugeConf.OffsetRight1 and depth == 1: if flags & GaugeConf.OffsetRight1 and depth == 1:
xoffset = 1 xoffset = 1
if flags & GaugeConf.OffsetLeft1 and depth == 1:
xoffset = -1
if rg.getDirection() == RoutingLayerGauge.Horizontal: if rg.getDirection() == RoutingLayerGauge.Horizontal:
xtrack = self.getTrack( contact1.getX(), depth+1, xoffset ) xtrack = self.getTrack( contact1.getX(), depth+1, xoffset )
ytrack = self.getTrack( contact1.getY(), depth , 0 ) ytrack = self.getTrack( contact1.getY(), depth , 0 )
@ -388,6 +393,13 @@ class GaugeConf ( object ):
return self.rpAccess( self.rpByOccurrence(occurrence,net), flags ) return self.rpAccess( self.rpByOccurrence(occurrence,net), flags )
def rpByPlug ( self, plug, net ): def rpByPlug ( self, plug, net ):
"""
Create a RoutingPad on a ``Plug`` for ``net``, in the cell owning the net.
This will be a *top level* RoutingPad, that is one with an empty Path.
Only creates *one* RoutingPad per Plug. Maintains a lookup table to
return the one associated to a Plug if it is requested a second time.
"""
if plug in self._plugToRp: if plug in self._plugToRp:
rp = self._plugToRp[plug] rp = self._plugToRp[plug]
else: else:
@ -397,12 +409,19 @@ class GaugeConf ( object ):
return rp return rp
def rpByPlugName ( self, instance, plugName, net ): def rpByPlugName ( self, instance, plugName, net ):
"""
Frontend for ``rpByPlug()``, extract the plug from the pair ``(instance,plugName)``.
"""
return self.rpByPlug( getPlugByName(instance,plugName), net ) return self.rpByPlug( getPlugByName(instance,plugName), net )
def rpAccessByPlug ( self, plug, net, flags ): def rpAccessByPlug ( self, plug, net, flags ):
return self.rpAccess( self.rpByPlug(plug,net), flags ) return self.rpAccess( self.rpByPlug(plug,net), flags )
def rpAccessByPlugName ( self, instance, plugName, net, flags=0 ): def rpAccessByPlugName ( self, instance, plugName, net, flags=0 ):
"""
Creates a RoutingPad from a Plug (using ``rpByPlug()``) and build a contact
stack using a relative positionning specified by ``flags``.
"""
return self.rpAccess( self.rpByPlugName(instance,plugName,net), flags ) return self.rpAccess( self.rpByPlugName(instance,plugName,net), flags )
def setStackPosition ( self, topContact, x, y ): def setStackPosition ( self, topContact, x, y ):

View File

@ -137,35 +137,39 @@ class HTree ( object ):
hLeafDepth = gaugeConf.horizontalDepth hLeafDepth = gaugeConf.horizontalDepth
if gaugeConf.horizontalDepth > 2 and (gaugeConf.horizontalDepth > gaugeConf.verticalDepth): if gaugeConf.horizontalDepth > 2 and (gaugeConf.horizontalDepth > gaugeConf.verticalDepth):
hLeafDepth = gaugeConf.horizontalDepth - 2 hLeafDepth = gaugeConf.horizontalDepth - 2
blContact = None blContact = None
brContact = None brContact = None
tlContact = None tlContact = None
trContact = None trContact = None
leftContact = None leftContact = None
rigthContact = None rigthContact = None
if qt.bl: if qt.bl:
blContact = gaugeConf.rpAccessByPlugName( qt.bl.buffers[0], bufferConf.input , ckNet ) blContact = gaugeConf.rpAccessByPlugName( qt.bl.buffers[0], bufferConf.input, ckNet, GaugeConf.OffsetLeft1 )
if qt.br: if qt.br:
brContact = gaugeConf.rpAccessByPlugName( qt.br.buffers[0], bufferConf.input , ckNet ) brContact = gaugeConf.rpAccessByPlugName( qt.br.buffers[0], bufferConf.input, ckNet, GaugeConf.OffsetLeft1 )
if qt.tl: if qt.tl:
tlContact = gaugeConf.rpAccessByPlugName( qt.tl.buffers[0], bufferConf.input , ckNet ) tlContact = gaugeConf.rpAccessByPlugName( qt.tl.buffers[0], bufferConf.input, ckNet, GaugeConf.OffsetLeft1 )
if qt.tr: if qt.tr:
trContact = gaugeConf.rpAccessByPlugName( qt.tr.buffers[0], bufferConf.input , ckNet ) trContact = gaugeConf.rpAccessByPlugName( qt.tr.buffers[0], bufferConf.input, ckNet, GaugeConf.OffsetLeft1 )
flags = GaugeConf.OffsetTop1
yoffset = -1
if qt.bl or qt.tl: if qt.bl or qt.tl:
leafContact = blContact if brContact else tlContact leafContact = blContact if brContact else tlContact
leftSourceContact = gaugeConf.rpAccessByPlugName( qt.buffers[0], bufferConf.output, ckNet , GaugeConf.HAccess|GaugeConf.OffsetBottom1 ) leftSourceContact = gaugeConf.rpAccessByPlugName( qt.buffers[0], bufferConf.output, ckNet , GaugeConf.HAccess|flags )
leftSourceX = gaugeConf.getNearestVerticalTrack ( leftSourceContact.getX(), 0 ) leftSourceX = gaugeConf.getNearestVerticalTrack ( leftSourceContact.getX(), 0 )
leftSourceY = gaugeConf.getNearestHorizontalTrack( leftSourceContact.getY(), 0 ) leftSourceY = gaugeConf.getNearestHorizontalTrack( leftSourceContact.getY(), 0, yoffset )
leftContact = gaugeConf.createContact( ckNet, leafContact.getX(), leftSourceContact.getY(), 0 ) leftContact = gaugeConf.createContact( ckNet, leafContact.getX(), leftSourceContact.getY(), 0 )
leftX = gaugeConf.getNearestVerticalTrack( leftContact.getX(), 0 ) leftX = gaugeConf.getNearestVerticalTrack( leftContact.getX(), 0 )
gaugeConf.setStackPosition( leftSourceContact, leftSourceX, leftSourceY ) gaugeConf.setStackPosition( leftSourceContact, leftSourceX, leftSourceY )
leftContact .setX( leftX ) leftContact .setX( leftX )
leftContact .setY( leftSourceY ) leftContact .setY( leftSourceY )
flags = 0
yoffset = 0
if qt.br or qt.tr: if qt.br or qt.tr:
leafContact = brContact if brContact else trContact leafContact = brContact if brContact else trContact
rightSourceContact = gaugeConf.rpAccessByPlugName( qt.buffers[0], bufferConf.output, ckNet , GaugeConf.HAccess|GaugeConf.OffsetBottom1 ) rightSourceContact = gaugeConf.rpAccessByPlugName( qt.buffers[0], bufferConf.output, ckNet , GaugeConf.HAccess|flags )
rightSourceX = gaugeConf.getNearestVerticalTrack( rightSourceContact.getX(), 0 ) rightSourceX = gaugeConf.getNearestVerticalTrack( rightSourceContact.getX(), 0 )
rightSourceY = gaugeConf.getNearestHorizontalTrack( rightSourceContact.getY(), 0 ) rightSourceY = gaugeConf.getNearestHorizontalTrack( rightSourceContact.getY(), 0, yoffset )
rightContact = gaugeConf.createContact( ckNet, leafContact.getX(), rightSourceContact.getY(), 0 ) rightContact = gaugeConf.createContact( ckNet, leafContact.getX(), rightSourceContact.getY(), 0 )
rightX = gaugeConf.getNearestVerticalTrack( rightContact.getX(), 0 ) rightX = gaugeConf.getNearestVerticalTrack( rightContact.getX(), 0 )
gaugeConf.setStackPosition( rightSourceContact, rightSourceX, rightSourceY ) gaugeConf.setStackPosition( rightSourceContact, rightSourceX, rightSourceY )