mirror of https://github.com/VLSIDA/OpenRAM.git
fix pwell pin shape bug
This commit is contained in:
parent
1c6d4eedd1
commit
dbe8a7f1af
|
|
@ -49,6 +49,9 @@ class design(hierarchy_design):
|
||||||
self.add_pin_names(prop.port_map)
|
self.add_pin_names(prop.port_map)
|
||||||
self.add_pin_types(prop.port_types)
|
self.add_pin_types(prop.port_types)
|
||||||
|
|
||||||
|
def debug_writer(self):
|
||||||
|
self.gds_write("/home/jesse/output/direct_rw.gds")
|
||||||
|
|
||||||
(width, height) = utils.get_libcell_size(self.cell_name,
|
(width, height) = utils.get_libcell_size(self.cell_name,
|
||||||
GDS["unit"],
|
GDS["unit"],
|
||||||
layer[prop.boundary_layer])
|
layer[prop.boundary_layer])
|
||||||
|
|
@ -56,7 +59,12 @@ class design(hierarchy_design):
|
||||||
self.pin_map = utils.get_libcell_pins(self.pins,
|
self.pin_map = utils.get_libcell_pins(self.pins,
|
||||||
self.cell_name,
|
self.cell_name,
|
||||||
GDS["unit"])
|
GDS["unit"])
|
||||||
|
import gdsMill
|
||||||
|
reader = self.gds
|
||||||
|
writer = gdsMill.Gds2writer(reader)
|
||||||
|
writer.writeToFile('/home/jesse/output/direct_rw.gds')
|
||||||
|
|
||||||
|
self.gds_write("/home/jesse/output/direct_rw.gds")
|
||||||
self.width = width
|
self.width = width
|
||||||
self.height = height
|
self.height = height
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -148,12 +148,15 @@ def get_gds_pins(pin_names, name, gds_filename, units):
|
||||||
cell[str(pin_name)] = []
|
cell[str(pin_name)] = []
|
||||||
pin_list = cell_vlsi.getPinShape(str(pin_name))
|
pin_list = cell_vlsi.getPinShape(str(pin_name))
|
||||||
for pin_shape in pin_list:
|
for pin_shape in pin_list:
|
||||||
(lpp, boundary) = pin_shape
|
if pin_shape != None:
|
||||||
rect = [vector(boundary[0], boundary[1]),
|
(lpp, boundary) = pin_shape
|
||||||
vector(boundary[2], boundary[3])]
|
rect = [vector(boundary[0], boundary[1]),
|
||||||
# this is a list because other cells/designs
|
vector(boundary[2], boundary[3])]
|
||||||
# may have must-connect pins
|
# this is a list because other cells/designs
|
||||||
cell[str(pin_name)].append(pin_layout(pin_name, rect, lpp))
|
# may have must-connect pins
|
||||||
|
if isinstance(lpp[1], list):
|
||||||
|
lpp = (lpp[0], None)
|
||||||
|
cell[str(pin_name)].append(pin_layout(pin_name, rect, lpp))
|
||||||
|
|
||||||
_GDS_PINS_CACHE[k] = cell
|
_GDS_PINS_CACHE[k] = cell
|
||||||
return dict(cell)
|
return dict(cell)
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ from datetime import *
|
||||||
import numpy as np
|
import numpy as np
|
||||||
import math
|
import math
|
||||||
import debug
|
import debug
|
||||||
|
from tech import use_purpose, no_pin_shape
|
||||||
|
|
||||||
class VlsiLayout:
|
class VlsiLayout:
|
||||||
"""Class represent a hierarchical layout"""
|
"""Class represent a hierarchical layout"""
|
||||||
|
|
@ -215,9 +215,13 @@ class VlsiLayout:
|
||||||
self.deduceHierarchy()
|
self.deduceHierarchy()
|
||||||
# self.traverseTheHierarchy()
|
# self.traverseTheHierarchy()
|
||||||
self.populateCoordinateMap()
|
self.populateCoordinateMap()
|
||||||
|
#only ones with text
|
||||||
for layerNumber in self.layerNumbersInUse:
|
for layerNumber in self.layerNumbersInUse:
|
||||||
self.processLabelPins((layerNumber, None))
|
#if layerNumber not in no_pin_shape:
|
||||||
|
if layerNumber in use_purpose:
|
||||||
|
self.processLabelPins((layerNumber, use_purpose[layerNumber]))
|
||||||
|
else:
|
||||||
|
self.processLabelPins((layerNumber, None))
|
||||||
|
|
||||||
def populateCoordinateMap(self):
|
def populateCoordinateMap(self):
|
||||||
def addToXyTree(startingStructureName = None,transformPath = None):
|
def addToXyTree(startingStructureName = None,transformPath = None):
|
||||||
|
|
@ -903,6 +907,16 @@ def sameLPP(lpp1, lpp2):
|
||||||
if lpp1[1] == None or lpp2[1] == None:
|
if lpp1[1] == None or lpp2[1] == None:
|
||||||
return lpp1[0] == lpp2[0]
|
return lpp1[0] == lpp2[0]
|
||||||
|
|
||||||
|
if isinstance(lpp1[1], list):
|
||||||
|
for i in range(len(lpp1[1])):
|
||||||
|
if lpp1[0] == lpp2[0] and lpp1[1][i] == lpp2[1]:
|
||||||
|
return True
|
||||||
|
|
||||||
|
if isinstance(lpp2[1], list):
|
||||||
|
for i in range(len(lpp2[1])):
|
||||||
|
if lpp1[0] == lpp2[0] and lpp1[1] == lpp2[1][i]:
|
||||||
|
return True
|
||||||
|
|
||||||
return lpp1[0] == lpp2[0] and lpp1[1] == lpp2[1]
|
return lpp1[0] == lpp2[0] and lpp1[1] == lpp2[1]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -135,6 +135,8 @@ layer["m10"] = (29, 0)
|
||||||
layer["text"] = (239, 0)
|
layer["text"] = (239, 0)
|
||||||
layer["boundary"]= (239, 0)
|
layer["boundary"]= (239, 0)
|
||||||
|
|
||||||
|
use_purpose = {}
|
||||||
|
|
||||||
# Layer names for external PDKs
|
# Layer names for external PDKs
|
||||||
layer_names = {}
|
layer_names = {}
|
||||||
layer_names["active"] = "active"
|
layer_names["active"] = "active"
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ layer["text"] = (63, 0)
|
||||||
layer["boundary"] = (63, 0)
|
layer["boundary"] = (63, 0)
|
||||||
layer["blockage"] = (83, 0)
|
layer["blockage"] = (83, 0)
|
||||||
|
|
||||||
|
use_purpose = {}
|
||||||
###################################################
|
###################################################
|
||||||
##END GDS Layer Map
|
##END GDS Layer Map
|
||||||
###################################################
|
###################################################
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,8 @@ layer["m4"] = (31, 0)
|
||||||
layer["text"] = (63, 0)
|
layer["text"] = (63, 0)
|
||||||
layer["boundary"] = (63, 0)
|
layer["boundary"] = (63, 0)
|
||||||
|
|
||||||
|
use_purpose = {}
|
||||||
|
|
||||||
# Layer names for external PDKs
|
# Layer names for external PDKs
|
||||||
layer_names = {}
|
layer_names = {}
|
||||||
layer_names["active"] = "active"
|
layer_names["active"] = "active"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue