Files
mxpic_forge/mxpic/components/gds_devices.py
T
2026-06-06 16:43:26 +08:00

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)