* ./cumulus:

- Bug: In placeandroute.py/createGrid(), VIAs of the big clock grid must
        have the same width as the wires (12l). But due to the layer extension
        the VIA side must be of 11l.
    - Bug: In placeandroute.py/createGrid(), wires connecting cell clock pin
        to the clock trunk must respect the preferred routing direction.
        The only exception being when the wire is completly enclosed under
        the trunk wire. This is for the obstacle stage of the detailed router.
This commit is contained in:
Jean-Paul Chaput 2012-01-02 21:20:36 +00:00
parent 65c30178f2
commit 81f3b2fa56
1 changed files with 27 additions and 29 deletions

View File

@ -387,7 +387,7 @@ def pyAlimHorizontalRail ( cell, ycoord ) :
## AlimConnectors ## ## AlimConnectors ##
#################### ####################
def pyAlimConnectors ( cell ) : def pyAlimConnectors ( cell ) :
'''This function creates the connectors in Alu 1 at the periphery of the core''' '''Creates the METAL1 connectors on the east & west sides of the core'''
global nb_lignes, nb_vdd_pins, nb_vss_pins global nb_lignes, nb_vdd_pins, nb_vss_pins
@ -410,7 +410,7 @@ def pyAlimConnectors ( cell ) :
+ "Please place some instances before the placement of alim connectors.\n" + "Please place some instances before the placement of alim connectors.\n"
raise err raise err
metal1 = getDataBase().getTechnology().getLayer ( "METAL1" ) metal1 = getDataBase().getTechnology().getLayer("METAL1")
string = getVddVss ( cell, 0 ) string = getVddVss ( cell, 0 )
if re.search ( "vdd", string ) : if re.search ( "vdd", string ) :
@ -432,25 +432,23 @@ def pyAlimConnectors ( cell ) :
err = "\n[Stratus ERROR] AlimConnectors : can't get net " + inv_string + ".\n" err = "\n[Stratus ERROR] AlimConnectors : can't get net " + inv_string + ".\n"
raise err raise err
for i in range ( nb_lignes + 1 ) : for i in range ( nb_lignes + 1 ) :
pin_width = DbU_lambda(12) pin_width = DbU_lambda(12)
pin_height = DbU_lambda(12) pin_height = DbU_lambda(12)
pin_y = i * DbU_lambda(SLICE) pin_y = i * DbU_lambda(SLICE)
pin_x1 = 0 + ( pin_width / 4 )
pin_x2 = cell.getAbutmentBox().getWidth() - ( pin_width / 4 )
if i == 0 : if i == 0 :
pin_height = pin_height / 2 pin_height = pin_height / 2
pin_width = pin_width / 2 pin_width = pin_width / 2
pin_y = pin_y + ( pin_height / 2 ) pin_y = pin_y + ( pin_height / 2 )
pin_x1 = 0
pin_x2 = cell.getAbutmentBox().getWidth()
elif i == nb_lignes : elif i == nb_lignes :
pin_height = pin_height / 2 pin_height = pin_height / 2
pin_width = pin_width / 2 pin_width = pin_width / 2
pin_y = pin_y - ( pin_height / 2 ) pin_y = pin_y - ( pin_height / 2 )
pin_x1 = 0
pin_x2 = cell.getAbutmentBox().getWidth() pin_x1 = 0 + ( pin_width / 2 )
pin_x2 = cell.getAbutmentBox().getWidth() - ( pin_width / 2 )
# Ligne impaire # Ligne impaire
if i % 2 : if i % 2 :
pin_name = str(netImpair.getName()) + "." + str(nb_inv_pins) pin_name = str(netImpair.getName()) + "." + str(nb_inv_pins)
@ -2029,8 +2027,8 @@ def createGrid ( my_tuple ) :
def CreateZ ( contact1, contact2 ) : def CreateZ ( contact1, contact2 ) :
centerX = (contact1.getX() + contact2.getX() ) / 2 centerX = (contact1.getX() + contact2.getX() ) / 2
centerX = centerX - (centerX % DbU_lambda(5)) centerX = centerX - (centerX % DbU_lambda(5))
zContact1 = Contact ( net, via5, centerX, contact1.getY(), DbU_lambda(12), DbU_lambda(12) ) zContact1 = Contact ( net, via5, centerX, contact1.getY(), DbU_lambda(11), DbU_lambda(11) )
zContact2 = Contact ( net, via5, centerX, contact2.getY(), DbU_lambda(12), DbU_lambda(12) ) zContact2 = Contact ( net, via5, centerX, contact2.getY(), DbU_lambda(11), DbU_lambda(11) )
Horizontal ( contact1, zContact1, metal6, contact1.getY(), DbU_lambda(12) ) Horizontal ( contact1, zContact1, metal6, contact1.getY(), DbU_lambda(12) )
Vertical ( zContact1, zContact2, metal5, zContact1.getX(), DbU_lambda(12) ) Vertical ( zContact1, zContact2, metal5, zContact1.getX(), DbU_lambda(12) )
@ -2039,8 +2037,8 @@ def createGrid ( my_tuple ) :
def CreateN ( contact1, contact2 ) : def CreateN ( contact1, contact2 ) :
centerY = ( contact1.getY() + contact2.getY() ) / 2 centerY = ( contact1.getY() + contact2.getY() ) / 2
centerY = centerY - ( centerY % DbU_lambda(5) ) centerY = centerY - ( centerY % DbU_lambda(5) )
nContact1 = Contact ( net, via5, contact1.getX(), centerY, DbU_lambda(12), DbU_lambda(12) ) nContact1 = Contact ( net, via5, contact1.getX(), centerY, DbU_lambda(11), DbU_lambda(11) )
nContact2 = Contact ( net, via5, contact2.getX(), centerY, DbU_lambda(12), DbU_lambda(12) ) nContact2 = Contact ( net, via5, contact2.getX(), centerY, DbU_lambda(11), DbU_lambda(11) )
Vertical ( contact1, nContact1, metal5, contact1.getX(), DbU_lambda(12) ) Vertical ( contact1, nContact1, metal5, contact1.getX(), DbU_lambda(12) )
Horizontal ( nContact1, nContact2, metal6, nContact1.getY(), DbU_lambda(12) ) Horizontal ( nContact1, nContact2, metal6, nContact1.getY(), DbU_lambda(12) )
@ -2102,10 +2100,10 @@ def createGrid ( my_tuple ) :
gridBoundingBox.inflate ( DbU_lambda(15) ) gridBoundingBox.inflate ( DbU_lambda(15) )
#Create the Bounding Box grid #Create the Bounding Box grid
NEContact = Contact ( net, via5, gridBoundingBox.getXMin(), gridBoundingBox.getYMax() , DbU_lambda(12), DbU_lambda(12) ) NEContact = Contact ( net, via5, gridBoundingBox.getXMin(), gridBoundingBox.getYMax() , DbU_lambda(11), DbU_lambda(11) )
NWContact = Contact ( net, via5, gridBoundingBox.getXMax(), gridBoundingBox.getYMax() , DbU_lambda(12), DbU_lambda(12) ) NWContact = Contact ( net, via5, gridBoundingBox.getXMax(), gridBoundingBox.getYMax() , DbU_lambda(11), DbU_lambda(11) )
SEContact = Contact ( net, via5, gridBoundingBox.getXMin(), gridBoundingBox.getYMin() , DbU_lambda(12), DbU_lambda(12) ) SEContact = Contact ( net, via5, gridBoundingBox.getXMin(), gridBoundingBox.getYMin() , DbU_lambda(11), DbU_lambda(11) )
SWContact = Contact ( net, via5, gridBoundingBox.getXMax(), gridBoundingBox.getYMin() , DbU_lambda(12), DbU_lambda(12) ) SWContact = Contact ( net, via5, gridBoundingBox.getXMax(), gridBoundingBox.getYMin() , DbU_lambda(11), DbU_lambda(11) )
northSegment = Segment ( NEContact, NWContact, metal6, DbU_lambda(12) ) northSegment = Segment ( NEContact, NWContact, metal6, DbU_lambda(12) )
southSegment = Segment ( SEContact, SWContact, metal6, DbU_lambda(12) ) southSegment = Segment ( SEContact, SWContact, metal6, DbU_lambda(12) )
eastSegment = Segment ( NEContact, SEContact, metal5, DbU_lambda(12) ) eastSegment = Segment ( NEContact, SEContact, metal5, DbU_lambda(12) )
@ -2144,7 +2142,7 @@ def createGrid ( my_tuple ) :
elif x == gridBoundingBox.getXMax() : elif x == gridBoundingBox.getXMax() :
gridContact = NEContact gridContact = NEContact
else : else :
gridContact = Contact(southSegment, via5, x, 0, DbU_lambda(12), DbU_lambda(12)) gridContact = Contact(southSegment, via5, x, 0, DbU_lambda(11), DbU_lambda(11))
southContacts.append(x) southContacts.append(x)
elif y > gridBoundingBox.getYMax() : elif y > gridBoundingBox.getYMax() :
@ -2153,7 +2151,7 @@ def createGrid ( my_tuple ) :
elif x == gridBoundingBox.getXMax() : elif x == gridBoundingBox.getXMax() :
gridBoundingBox = SEContact gridBoundingBox = SEContact
else : else :
gridContact = Contact(northSegment, via5, x, 0, DbU_lambda(12), DbU_lambda(12)) gridContact = Contact(northSegment, via5, x, 0, DbU_lambda(11), DbU_lambda(11))
northContacts.append(x) northContacts.append(x)
else : else :
raise "\n[Stratus ERROR] RouteCK : bad pad placement.\n" raise "\n[Stratus ERROR] RouteCK : bad pad placement.\n"
@ -2166,7 +2164,7 @@ def createGrid ( my_tuple ) :
elif y == gridBoundingBox.getYMax() : elif y == gridBoundingBox.getYMax() :
gridContact = NWContact gridContact = NWContact
else : else :
gridContact = Contact(eastSegment, via5, 0, y, DbU_lambda(12), DbU_lambda(12)) gridContact = Contact(eastSegment, via5, 0, y, DbU_lambda(11), DbU_lambda(11))
eastContacts.append(y) eastContacts.append(y)
elif x > gridBoundingBox.getXMax() : elif x > gridBoundingBox.getXMax() :
if y == gridBoundingBox.getYMin() : if y == gridBoundingBox.getYMin() :
@ -2174,7 +2172,7 @@ def createGrid ( my_tuple ) :
elif y == gridBoundingBox.getYMax() : elif y == gridBoundingBox.getYMax() :
gridContact = SWContact gridContact = SWContact
else : else :
gridContact = Contact(westSegment, via5, 0, y, DbU_lambda(12), DbU_lambda(12)) gridContact = Contact(westSegment, via5, 0, y, DbU_lambda(11), DbU_lambda(11))
westContacts.append(y) westContacts.append(y)
else : else :
raise "\n[Stratus ERROR] RouteCK : bad pad placement.\n" raise "\n[Stratus ERROR] RouteCK : bad pad placement.\n"
@ -2188,7 +2186,7 @@ def createGrid ( my_tuple ) :
+ str(DbU_getLambda(gridBoundingBox.getYMax())) + ".\n" + str(DbU_getLambda(gridBoundingBox.getYMax())) + ".\n"
raise err raise err
compContact = Contact ( net, via5, x, y, DbU_lambda(12), DbU_lambda(12) ) compContact = Contact ( net, via5, x, y, DbU_lambda(11), DbU_lambda(11) )
Segment ( compContact, gridContact, layer , DbU_lambda(12) ) Segment ( compContact, gridContact, layer , DbU_lambda(12) )
@ -2208,8 +2206,8 @@ def createGrid ( my_tuple ) :
x = x - (x % DbU_lambda(5)) x = x - (x % DbU_lambda(5))
x = FindPositionForContact(x, northContacts, southContacts) x = FindPositionForContact(x, northContacts, southContacts)
contact1 = Contact ( southSegment, via5, x, 0, DbU_lambda(12), DbU_lambda(12)) contact1 = Contact ( southSegment, via5, x, 0, DbU_lambda(11), DbU_lambda(11))
contact2 = Contact ( northSegment, via5, x, 0, DbU_lambda(12), DbU_lambda(12)) contact2 = Contact ( northSegment, via5, x, 0, DbU_lambda(11), DbU_lambda(11))
Segment ( contact1, contact2, metal5, DbU_lambda(12) ) Segment ( contact1, contact2, metal5, DbU_lambda(12) )
@ -2220,14 +2218,14 @@ def createGrid ( my_tuple ) :
y = y - ( y % DbU_lambda(5) ) y = y - ( y % DbU_lambda(5) )
y = FindPositionForContact ( y, eastContacts, westContacts ) y = FindPositionForContact ( y, eastContacts, westContacts )
contact1 = Contact ( westSegment, via5, 0, y, DbU_lambda(12), DbU_lambda(12) ) contact1 = Contact ( westSegment, via5, 0, y, DbU_lambda(11), DbU_lambda(11) )
contact2 = Contact ( eastSegment, via5, 0, y, DbU_lambda(12), DbU_lambda(12) ) contact2 = Contact ( eastSegment, via5, 0, y, DbU_lambda(11), DbU_lambda(11) )
horizontal = Segment ( contact1, contact2, metal6, DbU_lambda(12) ) horizontal = Segment ( contact1, contact2, metal6, DbU_lambda(12) )
yList.append ( y ) yList.append ( y )
for x in xList : Contact ( horizontal, via5, x, 0, DbU_lambda(12), DbU_lambda(12) ) for x in xList : Contact ( horizontal, via5, x, 0, DbU_lambda(11), DbU_lambda(11) )
# Connection to the grid # Connection to the grid
# Cette liste contient les contacts qui sont deja crees # Cette liste contient les contacts qui sont deja crees
@ -2257,7 +2255,7 @@ def createGrid ( my_tuple ) :
if xDistance != 0 or yDistance != 0 : if xDistance != 0 or yDistance != 0 :
if ( xDistance <= yDistance + DbU_lambda(10) ): # test pour faire un horizontal if ( xDistance <= yDistance + DbU_lambda(10) ): # test pour faire un horizontal
if xDistance != 0 : if xDistance != 0 :
if xDistance <= DbU_lambda(15) : if abs(xDistance) <= DbU_lambda(3) :
gridContact = Contact ( net, metal5, xTarget, yContact, DbU_lambda(2), DbU_lambda(2) ) gridContact = Contact ( net, metal5, xTarget, yContact, DbU_lambda(2), DbU_lambda(2) )
layer = metal5 layer = metal5
else : else :
@ -2269,7 +2267,7 @@ def createGrid ( my_tuple ) :
gridContact = Contact ( net, via5, xTarget, yContact, DbU_lambda(2), DbU_lambda(2) ) gridContact = Contact ( net, via5, xTarget, yContact, DbU_lambda(2), DbU_lambda(2) )
else: else:
if yDistance != 0 : if yDistance != 0 :
if yDistance <= DbU_lambda(15) : if abs(yDistance) <= DbU_lambda(3) :
layer = metal6 layer = metal6
gridContact = Contact ( net, metal6, xContact, yTarget, DbU_lambda(2), DbU_lambda(2) ) gridContact = Contact ( net, metal6, xContact, yTarget, DbU_lambda(2), DbU_lambda(2) )
Contact ( net, via5, xContact, yContact, DbU_lambda(2), DbU_lambda(2) ) Contact ( net, via5, xContact, yContact, DbU_lambda(2), DbU_lambda(2) )