You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
2.7 KiB
Python
126 lines
2.7 KiB
Python
#!/usr/bin/python
|
|
|
|
from optparse import OptionParser
|
|
import gdspy
|
|
|
|
|
|
usage = '%prog [options] inFile'
|
|
parser = OptionParser(usage=usage)
|
|
(options, args) = parser.parse_args()
|
|
|
|
if len(args) != 1:
|
|
parser.error('Input .gds required.')
|
|
|
|
inFile = args[0]
|
|
|
|
|
|
|
|
gdsii = gdspy.GdsLibrary()
|
|
gdsii.read_gds(inFile)
|
|
|
|
# list of unreferenced cells
|
|
c = gdsii.top_level()
|
|
print(c)
|
|
|
|
LayerNames = {
|
|
'64:5' : 'nwell, label',
|
|
'64:59' : 'pwell, label',
|
|
'67:5' : 'li1, label',
|
|
'68:5' : 'met1, label',
|
|
'83:44' : 'text, label'
|
|
}
|
|
|
|
class Polygon:
|
|
def __init__(self, polygon, layer, datatype, properties=None):
|
|
self.polygon = polygon
|
|
self.layer = layer
|
|
self.datatype = datatype
|
|
self.properties = properties
|
|
|
|
class PolygonSets:
|
|
def __init__(self, properties):
|
|
self.polygons = []
|
|
self.properties = properties
|
|
|
|
maxLayers = 300
|
|
maxTypes = 300
|
|
|
|
numLabels = 0
|
|
numPolygons = 0
|
|
numPolygonSets = 0
|
|
|
|
# layer/type
|
|
labels = []
|
|
for i in range(maxLayers):
|
|
labels.append([])
|
|
for j in range(maxTypes):
|
|
labels[i].append([])
|
|
|
|
polygons = []
|
|
for i in range(maxLayers):
|
|
polygons.append([])
|
|
for j in range(maxTypes):
|
|
polygons[i].append([])
|
|
|
|
for i in range(len(c)):
|
|
|
|
b = c[i].get_bounding_box()
|
|
print(f'Cell {i} {b}')
|
|
|
|
p = c[i].get_dependencies()
|
|
print(f'Dependencies ({len(p)})')
|
|
for pp in p:
|
|
print(p)
|
|
|
|
p = c[i].get_paths()
|
|
print(f'Paths ({len(p)})')
|
|
for pp in p:
|
|
print(pp)
|
|
|
|
p = c[i].get_labels()
|
|
#print(f'Labels ({len(p)})')
|
|
for pp in p:
|
|
labels[pp.layer][pp.texttype].append(pp)
|
|
numLabels += 1
|
|
|
|
#p = c[i].get_datatypes()
|
|
#print(f'Data Types ({len(p)})')
|
|
#for pp in p:
|
|
# print(pp)
|
|
|
|
# print(f'Text Types')
|
|
# bug in source
|
|
# texttypes.update(reference.ref_cell.get_textypes())
|
|
# for l in c[i].get_texttypes():
|
|
# print(l)
|
|
|
|
#p = c[i].get_layers()
|
|
#print(f'Layers ({len(p)})')
|
|
#p = c[i].get_polygons()
|
|
#print(f'Polygons ({len(p)})')
|
|
|
|
# keep these as polygonsets? pp.properties belongs to the set only
|
|
p = c[i].get_polygonsets()
|
|
print(f'Polygon Sets ({len(p)})')
|
|
for pp in p:
|
|
for i in range(len(pp.polygons)):
|
|
numPolygons += 1
|
|
polygons[pp.layers[i]][pp.datatypes[i]].append(
|
|
Polygon(pp.polygons[i], pp.layers[i], pp.datatypes[i])
|
|
)
|
|
numPolygonSets += 1
|
|
|
|
|
|
print(f' Labels: {numLabels}')
|
|
print(f' Polygons: {numPolygons}')
|
|
print(f'PolygonSets: {numPolygonSets}')
|
|
|
|
for i in range(maxLayers):
|
|
for j in range(maxTypes):
|
|
if (len(labels[i][j]) > 0):
|
|
name = LayerNames[f'{i}:{j}']
|
|
print(f'{i:3d}:{j:3d} {name}')
|
|
for k in range(len(labels[i][j])):
|
|
label = labels[i][j][k]
|
|
print(f' {label.text} {label.position}')
|