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 , 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 , 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))