* ./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:
parent
65c30178f2
commit
81f3b2fa56
|
@ -387,7 +387,7 @@ def pyAlimHorizontalRail ( cell, ycoord ) :
|
|||
## AlimConnectors ##
|
||||
####################
|
||||
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
|
||||
|
||||
|
@ -410,7 +410,7 @@ def pyAlimConnectors ( cell ) :
|
|||
+ "Please place some instances before the placement of alim connectors.\n"
|
||||
raise err
|
||||
|
||||
metal1 = getDataBase().getTechnology().getLayer ( "METAL1" )
|
||||
metal1 = getDataBase().getTechnology().getLayer("METAL1")
|
||||
string = getVddVss ( cell, 0 )
|
||||
|
||||
if re.search ( "vdd", string ) :
|
||||
|
@ -431,26 +431,24 @@ def pyAlimConnectors ( cell ) :
|
|||
if not netImpair:
|
||||
err = "\n[Stratus ERROR] AlimConnectors : can't get net " + inv_string + ".\n"
|
||||
raise err
|
||||
|
||||
|
||||
for i in range ( nb_lignes + 1 ) :
|
||||
pin_width = DbU_lambda(12)
|
||||
pin_height = DbU_lambda(12)
|
||||
pin_y = i * DbU_lambda(SLICE)
|
||||
pin_x1 = 0 + ( pin_width / 4 )
|
||||
pin_x2 = cell.getAbutmentBox().getWidth() - ( pin_width / 4 )
|
||||
|
||||
if i == 0 :
|
||||
pin_height = pin_height / 2
|
||||
pin_width = pin_width / 2
|
||||
pin_y = pin_y + ( pin_height / 2 )
|
||||
pin_x1 = 0
|
||||
pin_x2 = cell.getAbutmentBox().getWidth()
|
||||
elif i == nb_lignes :
|
||||
pin_height = pin_height / 2
|
||||
pin_width = pin_width / 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
|
||||
if i % 2 :
|
||||
pin_name = str(netImpair.getName()) + "." + str(nb_inv_pins)
|
||||
|
@ -2029,8 +2027,8 @@ def createGrid ( my_tuple ) :
|
|||
def CreateZ ( contact1, contact2 ) :
|
||||
centerX = (contact1.getX() + contact2.getX() ) / 2
|
||||
centerX = centerX - (centerX % DbU_lambda(5))
|
||||
zContact1 = Contact ( net, via5, centerX, contact1.getY(), DbU_lambda(12), DbU_lambda(12) )
|
||||
zContact2 = Contact ( net, via5, centerX, contact2.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(11), DbU_lambda(11) )
|
||||
|
||||
Horizontal ( contact1, zContact1, metal6, contact1.getY(), DbU_lambda(12) )
|
||||
Vertical ( zContact1, zContact2, metal5, zContact1.getX(), DbU_lambda(12) )
|
||||
|
@ -2039,8 +2037,8 @@ def createGrid ( my_tuple ) :
|
|||
def CreateN ( contact1, contact2 ) :
|
||||
centerY = ( contact1.getY() + contact2.getY() ) / 2
|
||||
centerY = centerY - ( centerY % DbU_lambda(5) )
|
||||
nContact1 = Contact ( net, via5, contact1.getX(), centerY, DbU_lambda(12), DbU_lambda(12) )
|
||||
nContact2 = Contact ( net, via5, contact2.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(11), DbU_lambda(11) )
|
||||
|
||||
Vertical ( contact1, nContact1, metal5, contact1.getX(), 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) )
|
||||
|
||||
#Create the Bounding Box grid
|
||||
NEContact = Contact ( net, via5, gridBoundingBox.getXMin(), gridBoundingBox.getYMax() , DbU_lambda(12), DbU_lambda(12) )
|
||||
NWContact = Contact ( net, via5, gridBoundingBox.getXMax(), gridBoundingBox.getYMax() , DbU_lambda(12), DbU_lambda(12) )
|
||||
SEContact = Contact ( net, via5, gridBoundingBox.getXMin(), gridBoundingBox.getYMin() , DbU_lambda(12), DbU_lambda(12) )
|
||||
SWContact = Contact ( net, via5, gridBoundingBox.getXMax(), gridBoundingBox.getYMin() , 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(11), DbU_lambda(11) )
|
||||
SEContact = Contact ( net, via5, gridBoundingBox.getXMin(), gridBoundingBox.getYMin() , DbU_lambda(11), DbU_lambda(11) )
|
||||
SWContact = Contact ( net, via5, gridBoundingBox.getXMax(), gridBoundingBox.getYMin() , DbU_lambda(11), DbU_lambda(11) )
|
||||
northSegment = Segment ( NEContact, NWContact, metal6, DbU_lambda(12) )
|
||||
southSegment = Segment ( SEContact, SWContact, metal6, DbU_lambda(12) )
|
||||
eastSegment = Segment ( NEContact, SEContact, metal5, DbU_lambda(12) )
|
||||
|
@ -2144,7 +2142,7 @@ def createGrid ( my_tuple ) :
|
|||
elif x == gridBoundingBox.getXMax() :
|
||||
gridContact = NEContact
|
||||
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)
|
||||
|
||||
elif y > gridBoundingBox.getYMax() :
|
||||
|
@ -2153,7 +2151,7 @@ def createGrid ( my_tuple ) :
|
|||
elif x == gridBoundingBox.getXMax() :
|
||||
gridBoundingBox = SEContact
|
||||
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)
|
||||
else :
|
||||
raise "\n[Stratus ERROR] RouteCK : bad pad placement.\n"
|
||||
|
@ -2166,7 +2164,7 @@ def createGrid ( my_tuple ) :
|
|||
elif y == gridBoundingBox.getYMax() :
|
||||
gridContact = NWContact
|
||||
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)
|
||||
elif x > gridBoundingBox.getXMax() :
|
||||
if y == gridBoundingBox.getYMin() :
|
||||
|
@ -2174,7 +2172,7 @@ def createGrid ( my_tuple ) :
|
|||
elif y == gridBoundingBox.getYMax() :
|
||||
gridContact = SWContact
|
||||
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)
|
||||
else :
|
||||
raise "\n[Stratus ERROR] RouteCK : bad pad placement.\n"
|
||||
|
@ -2188,7 +2186,7 @@ def createGrid ( my_tuple ) :
|
|||
+ str(DbU_getLambda(gridBoundingBox.getYMax())) + ".\n"
|
||||
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) )
|
||||
|
||||
|
@ -2208,8 +2206,8 @@ def createGrid ( my_tuple ) :
|
|||
x = x - (x % DbU_lambda(5))
|
||||
x = FindPositionForContact(x, northContacts, southContacts)
|
||||
|
||||
contact1 = Contact ( southSegment, via5, x, 0, DbU_lambda(12), DbU_lambda(12))
|
||||
contact2 = Contact ( northSegment, 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(11), DbU_lambda(11))
|
||||
|
||||
Segment ( contact1, contact2, metal5, DbU_lambda(12) )
|
||||
|
||||
|
@ -2220,14 +2218,14 @@ def createGrid ( my_tuple ) :
|
|||
y = y - ( y % DbU_lambda(5) )
|
||||
y = FindPositionForContact ( y, eastContacts, westContacts )
|
||||
|
||||
contact1 = Contact ( westSegment, via5, 0, y, DbU_lambda(12), DbU_lambda(12) )
|
||||
contact2 = Contact ( eastSegment, 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(11), DbU_lambda(11) )
|
||||
|
||||
horizontal = Segment ( contact1, contact2, metal6, DbU_lambda(12) )
|
||||
|
||||
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
|
||||
# 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 <= yDistance + DbU_lambda(10) ): # test pour faire un horizontal
|
||||
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) )
|
||||
layer = metal5
|
||||
else :
|
||||
|
@ -2269,7 +2267,7 @@ def createGrid ( my_tuple ) :
|
|||
gridContact = Contact ( net, via5, xTarget, yContact, DbU_lambda(2), DbU_lambda(2) )
|
||||
else:
|
||||
if yDistance != 0 :
|
||||
if yDistance <= DbU_lambda(15) :
|
||||
if abs(yDistance) <= DbU_lambda(3) :
|
||||
layer = metal6
|
||||
gridContact = Contact ( net, metal6, xContact, yTarget, DbU_lambda(2), DbU_lambda(2) )
|
||||
Contact ( net, via5, xContact, yContact, DbU_lambda(2), DbU_lambda(2) )
|
||||
|
|
Loading…
Reference in New Issue