65 lines
2.2 KiB
Python
65 lines
2.2 KiB
Python
from typing import Any, Optional
|
|
from unicodedata import name
|
|
import nazca as nd
|
|
import numpy as np
|
|
|
|
import os
|
|
from .geometry import *
|
|
|
|
|
|
class gds_lib_load:
|
|
def __init__(self,lib_path: Optional[str]=None,lib_name: Optional[str]=None,cell_name: Optional[str]=None,rename: Optional[str]=None, instantiate: bool=True,layermap: Any=None,cellsreused: Any=None) -> None:
|
|
self.lib_name = lib_name
|
|
self.rename = rename
|
|
if (rename==None) : instantiate = False
|
|
with nd.Cell(name=rename,instantiate=instantiate) as C:
|
|
if (lib_path[-1]!="\\"):
|
|
lib_path=lib_path+"\\"
|
|
lib_name_gds=lib_name+".gds"
|
|
lib_name_txt=lib_name+".txt"
|
|
|
|
nd.load_gds(filename=lib_path+lib_name_gds,
|
|
cellname=cell_name,newcellname=cell_name,
|
|
cellsreused=cellsreused,layermap=layermap,instantiate=True,
|
|
scale=1.00).put(0,0,0)
|
|
|
|
if (os.path.isfile(lib_path+lib_name_txt)):
|
|
f= open(lib_path+lib_name+'.txt',"r")
|
|
str = f.read()
|
|
exec(str)
|
|
f.close()
|
|
self.cell = C
|
|
|
|
def add_pin(self,pin_name=None,xya=(0,0,0),width=0.45,xs=None):
|
|
self.cell._put_pin(name=pin_name,connect=xya,xs=xs,width=width)
|
|
|
|
|
|
def generate_gds_lib(name,cell,with_txt=True):
|
|
|
|
with nd.Cell(name=name) as C:
|
|
|
|
inst = cell.put(0,0,0)
|
|
|
|
if (with_txt==True):
|
|
if (os.path.exists("pdk_gds_lib")==False):
|
|
os.mkdir("pdk_gds_lib")
|
|
|
|
filename = "pdk_gds_lib" + "\\" + name
|
|
print(name)
|
|
f = open(filename+".txt","w")
|
|
ins_final = ""
|
|
for pins in inst.ic_pins() :
|
|
pin_name = pins[0] ## tuple first
|
|
pin_pos = np.array(pins[1].xya())
|
|
pin_width = np.array(pins[1].width)
|
|
if (pin_width == None):
|
|
pin_width = 0
|
|
ins = pin_name+"= ["+str(pin_pos[0])+","+str(pin_pos[1])+","+str(pin_pos[2])+","+str(pin_width)+"] ; \n"
|
|
ins_final = ins_final+ins
|
|
f.write(ins_final)
|
|
f.close()
|
|
|
|
nd.export_gds(filename=filename+'.gds',topcells=C)
|
|
|
|
|