From 81f3b2fa561c2e533760aa3050f339d08508214f Mon Sep 17 00:00:00 2001 From: Jean-Paul Chaput Date: Mon, 2 Jan 2012 21:20:36 +0000 Subject: [PATCH] * ./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. --- cumulus/src/placeandroute.py | 56 +++++++++++++++++------------------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/cumulus/src/placeandroute.py b/cumulus/src/placeandroute.py index 1f66a99c..eab1e717 100644 --- a/cumulus/src/placeandroute.py +++ b/cumulus/src/placeandroute.py @@ -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) )