289 lines
13 KiB
Python
289 lines
13 KiB
Python
|
|
from ..gds_devices import gds_lib_load
|
|
import nazca as nd
|
|
from ..routing import Route
|
|
|
|
from ..electronics import PADs
|
|
|
|
IMECAS_LAYER_MAP = {
|
|
|
|
(10,2): 'STRIP_COR',
|
|
(10,3): 'STRIP_CLD',
|
|
(10,4): 'STRIP_TRE',
|
|
|
|
(11,2): 'SRIB_COR',
|
|
(11,3): 'SRIB_CLD',
|
|
(11,4): 'SRIB_TRE',
|
|
|
|
(12,2): 'RIB_COR',
|
|
(12,3): 'RIB_CLD',
|
|
(12,4): 'RIB_TRE',
|
|
|
|
(31,0): 'METAL',
|
|
(34,0): 'METAL_2',
|
|
(36,0): 'PAD',
|
|
(80,0): 'DETCH',
|
|
|
|
|
|
}
|
|
|
|
class Template(gds_lib_load) :
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "IMECAS-templete"
|
|
cell_name = "IMECASTEST"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False,cellsreused=["IMECASTEST"],layermap=IMECAS_LAYER_MAP)
|
|
|
|
class EC_TE_1550(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "EdegeCoupler_0_18_0_45"
|
|
cell_name = "EdegeCoupler_0_18_0_45"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False,
|
|
cellsreused=["EdegeCoupler_0_18_0_45"],layermap=IMECAS_LAYER_MAP)
|
|
self.w_wg = 0.45
|
|
self.add_pin(pin_name='g1', xya=(220.00000,2.089,0), width=0.45)
|
|
self.add_pin(pin_name='a0', xya=(0,0,0))
|
|
|
|
|
|
class GC_TE_1550(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "FGC_C_TE_WG450"
|
|
cell_name = "FGC_C_TE_WG450"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False,
|
|
cellsreused=["FGC_C_TE_WG450"],layermap=IMECAS_LAYER_MAP)
|
|
self.w_wg = 0.45
|
|
self.add_pin(pin_name='g1', xya=(43.91100,15,0), width=0.45)
|
|
self.add_pin(pin_name='a0', xya=(0,0,0))
|
|
|
|
class GC_TM_1550(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "FGC_C_TM_WG450"
|
|
cell_name = "FGC_C_TM_WG450"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False,
|
|
cellsreused=["FGC_C_TM_WG450"],layermap=IMECAS_LAYER_MAP)
|
|
self.w_wg = 0.45
|
|
self.add_pin(pin_name='g1', xya=(44.40100,15,0), width=0.45)
|
|
self.add_pin(pin_name='a0', xya=(0,0,0))
|
|
|
|
class GC_TE_1310(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "FGC_O_TE_WG380"
|
|
cell_name = "FGC_O_TE_WG380"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False,
|
|
cellsreused=["FGC_O_TE_WG380"],layermap=IMECAS_LAYER_MAP)
|
|
self.w_wg = 0.45
|
|
self.add_pin(pin_name='g1', xya=(46.00000,15,0), width=0.38)
|
|
self.add_pin(pin_name='a0', xya=(0,0,0))
|
|
|
|
class GC_TM_1310(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "FGC_O_TM_WG380"
|
|
cell_name = "FGC_O_TM_WG380"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False,
|
|
cellsreused=["FGC_O_TM_WG380"],layermap=IMECAS_LAYER_MAP)
|
|
self.w_wg = 0.45
|
|
self.add_pin(pin_name='g1', xya=(45.35500,15,0), width=0.38)
|
|
self.add_pin(pin_name='a0', xya=(0,0,0))
|
|
|
|
class DC_TE_1550(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "DC_C_TE_3dB"
|
|
cell_name = "DC_C_TE_3dB"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False,
|
|
cellsreused=["DC_C_TE_3dB"],layermap=IMECAS_LAYER_MAP)
|
|
self.w_wg = 0.45
|
|
self.add_pin(pin_name='a1', xya=(0,62.225,180), width=0.45)
|
|
self.add_pin(pin_name='a2', xya=(0, 2.225,180), width=0.45)
|
|
self.add_pin(pin_name='b1', xya=(67.33700,62.225,0), width=0.45)
|
|
self.add_pin(pin_name='b2', xya=(67.33700, 2.225,0), width=0.45)
|
|
self.add_pin(pin_name='a0', xya=(0,32.225,180))
|
|
self.add_pin(pin_name='b0', xya=(67.33700,32.225,0))
|
|
|
|
class MMI_2x2_TE_1550(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "MMI2x2_C_SE_WG450"
|
|
cell_name = "MMI2x2_C_SE_WG450"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False,
|
|
cellsreused=["MMI2x2_C_SE_WG450"],layermap=IMECAS_LAYER_MAP)
|
|
self.w_wg = 0.45
|
|
self.add_pin(pin_name='a1', xya=(0,11.325,180), width=0.45)
|
|
self.add_pin(pin_name='a2', xya=(0, 8.675,180), width=0.45)
|
|
self.add_pin(pin_name='b1', xya=(157.20000,11.325,0), width=0.45)
|
|
self.add_pin(pin_name='b2', xya=(157.20000, 8.675,0), width=0.45)
|
|
self.add_pin(pin_name='a0', xya=(157.20000/2,10, 0))
|
|
self.add_pin(pin_name='b0', xya=(157.20000/2,10,180))
|
|
|
|
class MMI_1x2_TE_1550(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "MMI1X2_C_WG450"
|
|
cell_name = "MMI1X2_C_WG450"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False,
|
|
cellsreused=["MMI1X2_C_WG450"],layermap=IMECAS_LAYER_MAP)
|
|
self.w_wg = 0.45
|
|
self.length = 12.41900
|
|
self.add_pin(pin_name='a1', xya=(0,3,180), width=0.45)
|
|
self.add_pin(pin_name='b1', xya=(12.41900,3.5,0), width=0.45)
|
|
self.add_pin(pin_name='b2', xya=(12.41900,2.5,0), width=0.45)
|
|
self.add_pin(pin_name='a0', xya=(12.41900/2,3, 0))
|
|
self.add_pin(pin_name='b0', xya=(12.41900/2,3,180))
|
|
|
|
class MMI_2x2_TE_1310(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "MMI2x2_O_WG380"
|
|
cell_name = "MMI2x2_O_WG380"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False,
|
|
cellsreused=["MMI2x2_O_WG380"],layermap=IMECAS_LAYER_MAP)
|
|
self.w_wg = 0.45
|
|
self.add_pin(pin_name='a1', xya=(0,4,180), width=0.38)
|
|
self.add_pin(pin_name='a2', xya=(0, 3,180), width=0.38)
|
|
self.add_pin(pin_name='b1', xya=(25.30000,4,0), width=0.38)
|
|
self.add_pin(pin_name='b2', xya=(25.30000,3,0), width=0.38)
|
|
self.add_pin(pin_name='a0', xya=(25.30000/2,3.5, 0))
|
|
self.add_pin(pin_name='b0', xya=(25.30000/2,3.5,180))
|
|
|
|
class MMI_1x2_TE_1310(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "MMI1x2_O_WG380"
|
|
cell_name = "MMI1x2_O_WG380"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False,
|
|
cellsreused=["MMI1x2_O_WG380"],layermap=IMECAS_LAYER_MAP)
|
|
self.w_wg = 0.45
|
|
self.add_pin(pin_name='a1', xya=(0,4,180), width=0.38)
|
|
self.add_pin(pin_name='b1', xya=(16.67800,4.5,0), width=0.38)
|
|
self.add_pin(pin_name='b2', xya=(16.67800,3.5,0), width=0.38)
|
|
self.add_pin(pin_name='a0', xya=(16.67800/2,3, 0))
|
|
self.add_pin(pin_name='b0', xya=(16.67800/2,3,180))
|
|
|
|
class Ybranch_TE(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "Ybranch_C_TE"
|
|
cell_name = "Ybranch_C_TE"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False,
|
|
cellsreused=["Ybranch_C_TE"],layermap=IMECAS_LAYER_MAP)
|
|
self.w_wg = 0.45
|
|
self.add_pin(pin_name='a1', xya=(0,4,180), width=0.45)
|
|
self.add_pin(pin_name='b1', xya=(14.00000,4.875,0), width=0.45)
|
|
self.add_pin(pin_name='b2', xya=(14.00000,2.225,0), width=0.45)
|
|
self.add_pin(pin_name='a0', xya=(14.00000/2,3.05, 0))
|
|
self.add_pin(pin_name='b0', xya=(14.00000/2,3.05,180))
|
|
|
|
class CRX_TE_1550(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "Crossing_C_TE"
|
|
cellname = "Crossing_C_TE"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cellname, rename=cellname+"_WithPin", instantiate=False,cellsreused=["Crossing_C_TE"],layermap=IMECAS_LAYER_MAP)
|
|
self.length = 5
|
|
self.width = 5
|
|
self.w_wg = 0.45
|
|
self.xs = 'strip'
|
|
self.L_arm = 9.96400/2
|
|
self.add_pin(pin_name='a1',xya=( 0 ,4.982 ,180),width=self.w_wg)
|
|
self.add_pin(pin_name='b1',xya=( 9.96400,4.982 ,0),width=self.w_wg)
|
|
self.add_pin(pin_name='a2',xya=( 4.982 ,9.96400,90),width=self.w_wg)
|
|
self.add_pin(pin_name='b2',xya=( 4.982 ,0 ,-90),width=self.w_wg)
|
|
|
|
def generate_test_gds(self,gc,num=5,dX_gc2gc=400,w_end=0.2,L_end=10):
|
|
with nd.Cell(instantiate=False) as C:
|
|
|
|
if (isinstance(gc,nd.Cell)):
|
|
gc_cell = gc
|
|
elif (hasattr(gc,'cell')):
|
|
gc_cell = gc.cell
|
|
else :
|
|
raise Exception("ERROR: In <mxpiv::passive::cross::generate_test_gds>, <gc> is not recongized")
|
|
|
|
dL = self.L_arm*2
|
|
|
|
dX = dL*1.75
|
|
|
|
pic_strip = Route(radius=10,width=self.w_wg,xs=self.xs)
|
|
|
|
gc_In = gc_cell.put('g1',-dX_gc2gc/2,0,180)
|
|
pin_pre = gc_In.pin['g1']
|
|
for _idx_ in range(0,num):
|
|
inst = self.cell.put('a0',_idx_*dX - (num/2 - 1/2)*dX)
|
|
pic_strip.strt_p2p(pin1=pin_pre,pin2=inst.pin['a1'],arrow=False).put()
|
|
pin_pre = inst.pin['b1']
|
|
|
|
nd.taper(length=L_end/2,width1=self.w_wg,width2=w_end,xs=self.xs).put(inst.pin['b2'])
|
|
nd.strt(length=L_end/2,width=w_end,xs=self.xs).put()
|
|
nd.taper(length=L_end/2,width1=self.w_wg,width2=w_end,xs=self.xs).put(inst.pin['a2'])
|
|
nd.strt(length=L_end/2,width=w_end,xs=self.xs).put()
|
|
|
|
gc_Out = gc_cell.put('g1', dX_gc2gc/2,0,0)
|
|
pic_strip.strt_p2p(pin1=pin_pre,pin2=gc_Out.pin['g1'],arrow=False).put()
|
|
return C
|
|
|
|
|
|
class CRX_TE_1310(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "Crossing_O_TE"
|
|
cellname = "Crossing_O_TE"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cellname, rename=cellname+"_WithPin", instantiate=False,cellsreused=["Crossing_O_TE"],layermap=IMECAS_LAYER_MAP)
|
|
self.length = 5
|
|
self.width = 5
|
|
self.w_wg = 0.38
|
|
self.xs = 'strip'
|
|
self.L_arm = 11.8280/2
|
|
self.add_pin(pin_name='a1',xya=( 0 ,5.914 ,180),width=self.w_wg)
|
|
self.add_pin(pin_name='b1',xya=( 11.8280,5.914 ,0),width=self.w_wg)
|
|
self.add_pin(pin_name='a2',xya=( 5.914 ,11.8280,90),width=self.w_wg)
|
|
self.add_pin(pin_name='b2',xya=( 5.914 ,0 ,-90),width=self.w_wg)
|
|
|
|
def generate_test_gds(self,gc,num=5,dX_gc2gc=400,w_end=0.2,L_end=10):
|
|
with nd.Cell(instantiate=False) as C:
|
|
|
|
if (isinstance(gc,nd.Cell)):
|
|
gc_cell = gc
|
|
elif (hasattr(gc,'cell')):
|
|
gc_cell = gc.cell
|
|
else :
|
|
raise Exception("ERROR: In <mxpiv::passive::cross::generate_test_gds>, <gc> is not recongized")
|
|
|
|
dL = self.L_arm*2
|
|
|
|
dX = dL*1.75
|
|
|
|
pic_strip = Route(radius=10,width=self.w_wg,xs=self.xs)
|
|
|
|
gc_In = gc_cell.put('g1',-dX_gc2gc/2,0,180)
|
|
pin_pre = gc_In.pin['g1']
|
|
for _idx_ in range(0,num):
|
|
inst = self.cell.put('a0',_idx_*dX - (num/2 - 1/2)*dX)
|
|
pic_strip.strt_p2p(pin1=pin_pre,pin2=inst.pin['a1'],arrow=False).put()
|
|
pin_pre = inst.pin['b1']
|
|
|
|
nd.taper(length=L_end/2,width1=self.w_wg,width2=w_end,xs=self.xs).put(inst.pin['b2'])
|
|
nd.strt(length=L_end/2,width=w_end,xs=self.xs).put()
|
|
nd.taper(length=L_end/2,width1=self.w_wg,width2=w_end,xs=self.xs).put(inst.pin['a2'])
|
|
nd.strt(length=L_end/2,width=w_end,xs=self.xs).put()
|
|
|
|
gc_Out = gc_cell.put('g1', dX_gc2gc/2,0,0)
|
|
pic_strip.strt_p2p(pin1=pin_pre,pin2=gc_Out.pin['g1'],arrow=False).put()
|
|
return C
|
|
|
|
class EC_TE_1550(gds_lib_load):
|
|
def __init__(self,pdk_path: str="IMECAS_PDK2.1") -> None:
|
|
lib_path = pdk_path
|
|
lib_name = "EdegeCoupler_0_18_0_45"
|
|
cell_name = "EdegeCoupler_0_18_0_45"
|
|
super().__init__(lib_path=lib_path, lib_name=lib_name, cell_name=cell_name, rename=cell_name+"_WithPin", instantiate=False, cellsreused=["EdegeCoupler_0_18_0_45"],layermap=IMECAS_LAYER_MAP)
|
|
self.w_wg = 0.45
|
|
self.add_pin(pin_name='g1', xya=(220.00000,2.089,0), width=0.45)
|
|
self.add_pin(pin_name='a0', xya=(0,0,0))
|
|
|
|
|