Search all shapes for boundary rather than specify structure

This commit is contained in:
mrg 2020-10-08 14:04:19 -07:00
parent 43d2058b3c
commit 3c2e8754e0
5 changed files with 20 additions and 31 deletions

View File

@ -73,7 +73,7 @@ def auto_measure_libcell(pin_list, name, units, lpp):
return cell return cell
def get_gds_size(name, gds_filename, units, lpp, structure = ""): def get_gds_size(name, gds_filename, units, lpp):
""" """
Open a GDS file and return the size from either the Open a GDS file and return the size from either the
bounding box or a border layer. bounding box or a border layer.
@ -83,7 +83,7 @@ def get_gds_size(name, gds_filename, units, lpp, structure = ""):
reader = gdsMill.Gds2reader(cell_vlsi) reader = gdsMill.Gds2reader(cell_vlsi)
reader.loadFromFile(gds_filename) reader.loadFromFile(gds_filename)
measure_result = cell_vlsi.getLayoutBorder(lpp, structure) measure_result = cell_vlsi.getLayoutBorder(lpp)
if not measure_result: if not measure_result:
debug.info(2, "Layout border failed. Trying to measure size for {}".format(name)) debug.info(2, "Layout border failed. Trying to measure size for {}".format(name))
measure_result = cell_vlsi.measureSize(name) measure_result = cell_vlsi.measureSize(name)
@ -91,15 +91,14 @@ def get_gds_size(name, gds_filename, units, lpp, structure = ""):
return measure_result return measure_result
def get_libcell_size(name, units, lpp, structure = ""): def get_libcell_size(name, units, lpp):
""" """
Open a GDS file and return the library cell size from either the Open a GDS file and return the library cell size from either the
bounding box or a border layer. bounding box or a border layer.
""" """
cell_gds = OPTS.openram_tech + "gds_lib/" + str(name) + ".gds" cell_gds = OPTS.openram_tech + "gds_lib/" + str(name) + ".gds"
return(get_gds_size(name, cell_gds, units, lpp, structure)) return(get_gds_size(name, cell_gds, units, lpp))
def get_gds_pins(pin_names, name, gds_filename, units): def get_gds_pins(pin_names, name, gds_filename, units):

View File

@ -41,10 +41,8 @@ class s8_bitcell(bitcell_base.bitcell_base):
if version == "opt1": if version == "opt1":
self.name = "s8sram_cell_opt1" self.name = "s8sram_cell_opt1"
self.border_structure = "s8sram_cell"
elif version == "opt1a": elif version == "opt1a":
self.name = "s8sram_cell_opt1a" self.name = "s8sram_cell_opt1a"
self.border_structure = "s8sram_cell"
bitcell_base.bitcell_base.__init__(self, self.name) bitcell_base.bitcell_base.__init__(self, self.name)
debug.info(2, "Create bitcell") debug.info(2, "Create bitcell")

View File

@ -22,16 +22,12 @@ class s8_col_end(design.design):
if version == "colend": if version == "colend":
self.name = "s8sram16x16_colend" self.name = "s8sram16x16_colend"
structure = "s8sram16x16_colend"
elif version == "colend_p_cent": elif version == "colend_p_cent":
self.name = "s8sram16x16_colend_p_cent" self.name = "s8sram16x16_colend_p_cent"
structure = "s8sram16x16_colend_p_cent\x00"
elif version == "colenda": elif version == "colenda":
self.name = "s8sram16x16_colenda" self.name = "s8sram16x16_colenda"
structure = "s8sram16x16_colenda\x00"
elif version == "colenda_p_cent": elif version == "colenda_p_cent":
self.name = "s8sram16x16_colenda_p_cent" self.name = "s8sram16x16_colenda_p_cent"
structure = "s8sram16x16_colenda_p_cent"
else: else:
debug.error("Invalid type for col_end", -1) debug.error("Invalid type for col_end", -1)
design.design.__init__(self, name=self.name) design.design.__init__(self, name=self.name)

View File

@ -22,18 +22,14 @@ class s8_internal(design.design):
if version == "wlstrap": if version == "wlstrap":
self.name = "s8sram_wlstrap" self.name = "s8sram_wlstrap"
self.structure = "s8sram_wlstrap_ce\x00"
elif version == "wlstrap_p": elif version == "wlstrap_p":
self.name = "s8sram16x16_wlstrap_p" self.name = "s8sram16x16_wlstrap_p"
self.structure = "s8sram16x16_wlstrap_p_ce"
elif version == "wlstrapa": elif version == "wlstrapa":
self.name = "s8sram_wlstrapa" self.name = "s8sram_wlstrapa"
self.structure = "s8sram_wlstrapa_ce"
else: else:
debug.error("Invalid version", -1) debug.error("Invalid version", -1)
design.design.__init__(self, name=self.name) design.design.__init__(self, name=self.name)
(self.width, self.height) = utils.get_libcell_size(self.name, (self.width, self.height) = utils.get_libcell_size(self.name,
GDS["unit"], GDS["unit"],
layer["mem"], layer["mem"])
self.structure)
pin_map = utils.get_libcell_pins(pin_names, self.name, GDS["unit"]) pin_map = utils.get_libcell_pins(pin_names, self.name, GDS["unit"])

View File

@ -597,20 +597,20 @@ class VlsiLayout:
if structure == "": if structure == "":
structure = self.rootStructureName structure = self.rootStructureName
cellSizeMicron = None cellSizeMicron = None
for boundary in self.structures[structure].boundaries:
if sameLPP((boundary.drawingLayer, boundary.purposeLayer),
lpp):
if self.debug:
debug.info(1, "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]]
debug.check(cellSizeMicron,
"Error: "+str(structure)+".cell_size information not found yet")
shapes = self.getAllShapes(lpp)
if len(shapes) != 1:
debug.warning("More than one boundary found in cell: {}".format(structure))
debug.check(len(shapes) != 0,
"Error: "+str(structure)+".cell_size information not found yet")
max_boundary = None
max_area = 0
for boundary in shapes:
new_area = boundaryArea(boundary)
if not max_boundary or new_area > max_area:
max_boundary = boundary
max_area = new_area
cellSizeMicron = [max_boundary[2], max_boundary[3]]
return cellSizeMicron return cellSizeMicron
def measureSize(self, startStructure): def measureSize(self, startStructure):