from typing import Any, Optional from unicodedata import name import nazca as nd import numpy as np import os from .structures 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)