Document vlsiLayout functions in comments

This commit is contained in:
Matt Guthaus 2016-11-18 08:01:19 -08:00
parent c143f62b25
commit 1c9b5c7372
1 changed files with 46 additions and 41 deletions

View File

@ -2,8 +2,6 @@ from gdsPrimitives import *
from datetime import *
import mpmath
import gdsPrimitives
import debug
debug_level=4
class VlsiLayout:
"""Class represent a hierarchical layout"""
@ -15,7 +13,7 @@ class VlsiLayout:
modDate = datetime.now()
self.structures=dict()
self.layerNumbersInUse = []
self.debug = debug
self.debug = False
if name:
self.rootStructureName=name
#create the ROOT structure
@ -260,14 +258,12 @@ class VlsiLayout:
Method to change the root pointer to another layout.
"""
#if self.debug: print "DEBUG: GdsMill vlsiLayout: changeRoot: %s "%newRoot
debug.info(debug_level,"DEBUG: GdsMill vlsiLayout: changeRoot: %s "%newRoot)
if self.debug: print "DEBUG: GdsMill vlsiLayout: changeRoot: %s "%newRoot
# Determine if newRoot exists
# layoutToAdd (default) or nameOfLayout
if (newRoot == 0 | ((newRoot not in self.structures) & ~create)):
#print "ERROR: vlsiLayout.changeRoot: Name of new root [%s] not found and create flag is false"%newRoot
debug.error(debug_level,"ERROR: vlsiLayout.changeRoot: Name of new root [%s] not found and create flag is false"+str(newRoot))
print "ERROR: vlsiLayout.changeRoot: Name of new root [%s] not found and create flag is false"%newRoot
exit(1)
else:
if ((newRoot not in self.structures) & create):
@ -281,15 +277,8 @@ class VlsiLayout:
Method to insert one layout into another at a particular offset.
"""
offsetInLayoutUnits = (self.userUnits(offsetInMicrons[0]),self.userUnits(offsetInMicrons[1]))
#print "addInstance:offsetInLayoutUnits",offsetInLayoutUnits
#offsetInLayoutUnits = ((offsetInMicrons[0]),(offsetInMicrons[1]))
#print "DEBUG: addInstance offsetInLayoutUnits: %f, %f"%(self.userUnits(offsetInMicrons[0]), self.userUnits(offsetInMicrons[1]))
#if self.debug==1:
# print "DEBUG: GdsMill vlsiLayout: addInstance: type %s, nameOfLayout "%type(layoutToAdd),nameOfLayout
# print offsetInMicrons
# print offsetInLayoutUnits
debug.info(debug_level,"DEBUG: GdsMill vlsiLayout: addInstance: type "+str(layoutToAdd.rootStructureName))
debug.info(debug_level,"offset In Microns:"+str(offsetInMicrons)+"offset In LayoutUnits:"+str(offsetInLayoutUnits))
if self.debug==1:
print "DEBUG: GdsMill vlsiLayout: addInstance: type %s, nameOfLayout "%type(layoutToAdd),nameOfLayout
@ -302,10 +291,8 @@ class VlsiLayout:
StructureName = nameOfLayout #layoutToAdd
StructureFound = False
for structure in layoutToAdd.structures:
# if self.debug: print structure, "N","N"
if StructureName in structure:
debug.info(debug_level,"DEBUG: Structure %s Found"+str(StructureName))
#if self.debug: print "DEBUG: Structure %s Found"%StructureName
if self.debug: print "DEBUG: Structure %s Found"%StructureName
StructureFound = True
@ -538,8 +525,7 @@ class VlsiLayout:
heightInBlocks = int(coverageHeight/effectiveBlock)
passFailRecord = []
debug.info(debug_level,"Filling layer:"+str(layerToFill))
#print "Filling layer:",layerToFill
print "Filling layer:",layerToFill
def isThisBlockOk(startingStructureName,coordinates,rotateAngle=None):
#go through every boundary and check
for boundary in self.structures[startingStructureName].boundaries:
@ -585,7 +571,7 @@ class VlsiLayout:
#if its bad, this global tempPassFail will be false
#if true, we can add the block
passFailRecord+=[self.tempPassFail]
debug.info(debug_level,"Percent Complete:"+str(percentDone))
print "Percent Complete:"+str(percentDone)
passFailIndex=0
@ -596,18 +582,18 @@ class VlsiLayout:
if passFailRecord[passFailIndex]:
self.addBox(layerToFill, (blockX,blockY), width=blockSize, height=blockSize)
passFailIndex+=1
debug.info(debug_level,"Done\n\n")
print "Done\n\n"
def readLayoutBorder(self,borderlayer):
for boundary in self.structures[self.rootStructureName].boundaries:
if boundary.drawingLayer==borderlayer:
debug.info(debug_level,"Find border "+str(boundary.coordinates))
if self.debug: print "Find border "+str(boundary.coordinates)
left_bottom=boundary.coordinates[0]
right_top=boundary.coordinates[2]
cellSize=[right_top[0]-left_bottom[0],right_top[1]-left_bottom[1]]
cellSizeMicron=[cellSize[0]*self.units[0],cellSize[1]*self.units[0]]
if not(cellSizeMicron):
debug.error("Error: "+str(self.rootStructureName)+".cell_size information not found yet")
print "Error: "+str(self.rootStructureName)+".cell_size information not found yet"
return cellSizeMicron
def measureSize(self,startStructure):
@ -634,10 +620,10 @@ class VlsiLayout:
StrutureOrgin=[Struture[1][0],Struture[1][1]]
StrutureuVector=[Struture[2][0],Struture[2][1],Struture[2][2]]
StruturevVector=[Struture[3][0],Struture[3][1],Struture[3][2]]
debug.info(debug_level,"Checking Structure: "+str(StrutureName))
debug.info(debug_level,"-Structure Struture Orgin:"+str(StrutureOrgin))
debug.info(debug_level,"-Structure direction: uVector["+str(StrutureuVector)+"]")
debug.info(debug_level,"-Structure direction: vVector["+str(StruturevVector)+"]")
#debug.info(debug_level,"Checking Structure: "+str(StrutureName))
#debug.info(debug_level,"-Structure Struture Orgin:"+str(StrutureOrgin))
#debug.info(debug_level,"-Structure direction: uVector["+str(StrutureuVector)+"]")
#debug.info(debug_level,"-Structure direction: vVector["+str(StruturevVector)+"]")
for boundary in self.structures[str(StrutureName)].boundaries:
left_bottom=boundary.coordinates[0]
@ -665,24 +651,28 @@ class VlsiLayout:
return cellBoundary
def readPin(self,label_name,mod="offset"):
"""
Search for a pin label and return all the largest enclosing rectangle.
"""
label_layer = None
label_coordinate = [None, None]
for Text in self.structures[self.rootStructureName].texts:
debug.info(debug_level,"Check Text object "+str(Text.textString)+" in "+str(self.rootStructureName))
debug.info(debug_level,"Length of text object: "+str(len(Text.textString)))
if Text.textString == label_name or Text.textString == label_name+"\x00":
label_layer = Text.drawingLayer
label_coordinate = Text.coordinates
debug.info(debug_level,"Find label "+str(Text.textString)+" at "+str(Text.coordinates))
pin_boundary=self.readPinInStructureList(label_coordinate, label_layer)
debug.info(debug_level, "Find pin covers "+str(label_name)+" at "+str(pin_boundary))
# Convert to user units
pin_boundary=[pin_boundary[0]*self.units[0],pin_boundary[1]*self.units[0],
pin_boundary[2]*self.units[0],pin_boundary[3]*self.units[0]]
return [label_name, label_layer, pin_boundary]
def readPinInStructureList(self,label_coordinates,layer):
"""
Given the label coordinate, search for enclosing structures on the given layer.
Return the single biggest area rectangle.
"""
label_boundary = [None,None,None,None]
for TreeUnit in self.xyTree:
label_boundary=self.readPinInStruture(label_coordinates,layer,TreeUnit,label_boundary)
@ -690,14 +680,16 @@ class VlsiLayout:
def readPinInStruture(self,label_coordinates,layer,Struture,label_boundary):
"""
"""
StrutureName=Struture[0]
StrutureOrgin=[Struture[1][0],Struture[1][1]]
StrutureuVector=[Struture[2][0],Struture[2][1],Struture[2][2]]
StruturevVector=[Struture[3][0],Struture[3][1],Struture[3][2]]
debug.info(debug_level,"Checking Structure: "+str(StrutureName))
debug.info(debug_level,"-Structure Struture Orgin:"+str(StrutureOrgin))
debug.info(debug_level,"-Structure direction: uVector["+str(StrutureuVector)+"]")
debug.info(debug_level,"-Structure direction: vVector["+str(StruturevVector)+"]")
#debug.info(debug_level,"Checking Structure: "+str(StrutureName))
#debug.info(debug_level,"-Structure Struture Orgin:"+str(StrutureOrgin))
#debug.info(debug_level,"-Structure direction: uVector["+str(StrutureuVector)+"]")
#debug.info(debug_level,"-Structure direction: vVector["+str(StruturevVector)+"]")
for boundary in self.structures[str(StrutureName)].boundaries:
if layer==boundary.drawingLayer:
@ -710,12 +702,16 @@ class VlsiLayout:
result = self.labelInRectangle(label_coordinates[0],MetalBoundary)
if (result):
debug.info(debug_level,"Rectangle(layer"+str(layer)+") at "+str(MetalBoundary))
debug.info(debug_level,"covers label (offset"+str(label_coordinates)+")")
#debug.info(debug_level,"Rectangle(layer"+str(layer)+") at "+str(MetalBoundary))
#debug.info(debug_level,"covers label (offset"+str(label_coordinates)+")")
label_boundary=self.returnBiggerBoundary(MetalBoundary,label_boundary)
return label_boundary
def tranformRectangle(self,orignalRectangle,uVector,vVector):
"""
Transforms the four coordinates of a rectangle in space
and recomputes the left, bottom, right, up values.
"""
LeftBottom=mpmath.matrix([orignalRectangle[0],orignalRectangle[1]])
LeftBottom=self.tranformCoordinate(LeftBottom,uVector,vVector)
@ -730,6 +726,9 @@ class VlsiLayout:
return [Left,Bottom,Right,Up]
def tranformCoordinate(self,Coordinate,uVector,vVector):
"""
Rotate a coordinate in space.
"""
x=Coordinate[0]*uVector[0]+Coordinate[1]*uVector[1]
y=Coordinate[1]*vVector[1]+Coordinate[0]*vVector[0]
tranformCoordinate=[x,y]
@ -737,6 +736,9 @@ class VlsiLayout:
def labelInRectangle(self,label_coordinate,Rectangle):
"""
Checks if a coordinate is within a given rectangle.
"""
coordinate_In_Rectangle_x_range=(label_coordinate[0]>=int(Rectangle[0]))&(label_coordinate[0]<=int(Rectangle[2]))
coordinate_In_Rectangle_y_range=(label_coordinate[1]>=int(Rectangle[1]))&(label_coordinate[1]<=int(Rectangle[3]))
if coordinate_In_Rectangle_x_range & coordinate_In_Rectangle_y_range:
@ -745,14 +747,17 @@ class VlsiLayout:
return False
def returnBiggerBoundary(self,comparedRectangle,label_boundary):
"""
Compares two rectangles and returns the bigger in terms of area.
"""
if label_boundary[0]== None:
label_boundary=comparedRectangle
debug.info(debug_level,"The label_boundary is initialized to "+str(label_boundary))
#debug.info(debug_level,"The label_boundary is initialized to "+str(label_boundary))
else:
area_label_boundary=(label_boundary[2]-label_boundary[0])*(label_boundary[3]-label_boundary[1])
area_comparedRectangle=(comparedRectangle[2]-comparedRectangle[0])*(comparedRectangle[3]-comparedRectangle[1])
if area_label_boundary<=area_comparedRectangle:
label_boundary = comparedRectangle
debug.info(debug_level,"The label_boundary is updated to "+str(label_boundary))
#debug.info(debug_level,"The label_boundary is updated to "+str(label_boundary))
return label_boundary