From bdea172ebda33261a9c801a8347de77fde95f918 Mon Sep 17 00:00:00 2001 From: Andrew Bishop Date: Mon, 12 Feb 2024 19:00:47 -0800 Subject: [PATCH] Project1 Design --- submissions/ELEC413_AndrewBishop_1.oas | Bin 0 -> 24754 bytes submissions/ELEC413_AndrewBishop_2.oas | Bin 0 -> 25850 bytes .../KLayout Python/EBeam_AndrewB_Cavities.py | 213 ++++++++++++++++++ .../KLayout Python/EBeam_AndrewB_Cavities2.py | 213 ++++++++++++++++++ 4 files changed, 426 insertions(+) create mode 100644 submissions/ELEC413_AndrewBishop_1.oas create mode 100644 submissions/ELEC413_AndrewBishop_2.oas create mode 100644 submissions/KLayout Python/EBeam_AndrewB_Cavities.py create mode 100644 submissions/KLayout Python/EBeam_AndrewB_Cavities2.py diff --git a/submissions/ELEC413_AndrewBishop_1.oas b/submissions/ELEC413_AndrewBishop_1.oas new file mode 100644 index 0000000000000000000000000000000000000000..567b646b1194059fd7b46d8122fc0a36823fc61e GIT binary patch literal 24754 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 b7&zF@fmd7`7M2>;^;KHH1pI$>!NB|%jHo+h literal 0 HcmV?d00001 diff --git a/submissions/KLayout Python/EBeam_AndrewB_Cavities.py b/submissions/KLayout Python/EBeam_AndrewB_Cavities.py new file mode 100644 index 00000000..3b65ab81 --- /dev/null +++ b/submissions/KLayout Python/EBeam_AndrewB_Cavities.py @@ -0,0 +1,213 @@ +''' +Scripted layout for ring resonators using SiEPIC-Tools +in the SiEPIC-EBeam-PDK "EBeam" technology + +by Lukas Chrostowski, 2023 + +Use instructions: + +Run in Python, e.g., VSCode + +pip install required packages: + - klayout, SiEPIC, siepic_ebeam_pdk, numpy + +''' + +designer_name = 'AndrewB' +top_cell_name = 'EBeam_%s_Cavities1' % designer_name +export_type = 'PCell' # static: for fabrication, PCell: include PCells in file + +import pya +from pya import * + +import SiEPIC +from SiEPIC._globals import Python_Env +from SiEPIC.scripts import zoom_out, export_layout +from SiEPIC.verification import layout_check +import os +import numpy + +if Python_Env == 'Script': + try: + # For external Python mode, when installed using pip install siepic_ebeam_pdk + import siepic_ebeam_pdk + except: + # Load the PDK from a folder, e.g, GitHub, when running externally from the KLayout Application + import os, sys + path_GitHub = os.path.expanduser('~/Documents/GitHub/') + sys.path.insert(0,os.path.join(path_GitHub, 'SiEPIC_EBeam_PDK/klayout')) + import siepic_ebeam_pdk + +tech_name = 'EBeam' + +# Example layout function +def cavities(): + + # Import functions from SiEPIC-Tools + from SiEPIC.extend import to_itype + from SiEPIC.scripts import connect_cell, connect_pins_with_waveguide + from SiEPIC.utils.layout import new_layout, floorplan + + # Create a layout for testing a double-bus ring resonator. + # uses: + # - the SiEPIC EBeam Library + # creates the layout in the presently selected cell + # deletes everything first + + # Configure parameter sweep + pol = 'TE' + sweep_n = [45, 60, 75] + period = 0.27 + sweep_dW = [0.05] + # cavity_length = 50_000 + cavity_lengths = [50_000, 100_000, 150_000] + taper_length_um = 20 + + ''' + Create a new layout using the EBeam technology, + with a top cell + and Draw the floor plan + ''' + cell, ly = new_layout(tech_name, top_cell_name, GUI=True, overwrite = True) + floorplan(cell, 605e3, 410e3) + + if SiEPIC.__version__ < '0.5.1': + raise Exception("Errors", "This example requires SiEPIC-Tools version 0.5.1 or greater.") + + # Layer mapping: + LayerSiN = ly.layer(ly.TECHNOLOGY['Si']) + fpLayerN = cell.layout().layer(ly.TECHNOLOGY['FloorPlan']) + TextLayerN = cell.layout().layer(ly.TECHNOLOGY['Text']) + + + # Create a sub-cell for our Ring resonator layout + top_cell = cell + dbu = ly.dbu + cell = cell.layout().create_cell("Cavities") + t = Trans(Trans.R0, 40 / dbu, 12 / dbu) + + # place the cell in the top cell + top_cell.insert(CellInstArray(cell.cell_index(), t)) + + # Import cell from the SiEPIC EBeam Library + cell_ebeam_gc = ly.create_cell("GC_%s_1310_8degOxide_BB" % pol, "EBeam") + # get the length of the grating coupler from the cell + gc_length = cell_ebeam_gc.bbox().width()*dbu + # spacing of the fibre array to be used for testing + GC_pitch = 127 + + #cell_terminator = ly.create_cell("ebeam_terminator_te1310", "EBeam") + + cell_taper_cavity = ly.create_cell('ebeam_taper_te1550', "EBeam", { + 'wg_width1': 0.350, + 'wg_width2': 2.000, + 'wg_length': taper_length_um}) + + cell_y = ly.create_cell('ebeam_y_1310', 'EBeam_Beta') + + # Loop through the parameter sweep + #for i in range(len(sweep_gap)): + # for i in range(len(sweep_period)): + for index_1, n in enumerate(sweep_n): + for index_2, dW in enumerate(sweep_dW): + for index_3, cavity_length in enumerate(cavity_lengths): + + p = period + + i = index_1 + index_2 + index_3 + # place layout at location: + if i==0: + x=0 + else: + # next device is placed at the right-most element + length of the grating coupler + x = inst_bragg1.bbox().right*dbu + gc_length + 10 + + # get the parameters + # n = sweep_n[i] + # p = sweep_period[i] + + # Grating couplers, Ports 0, 1, 2, 3 (from the bottom up) + instGCs = [] + for j in range(0,4): + if j == 1: + instGCs.append(0) + continue; # Don't create the 2nd GC + + t = Trans(Trans.R0, to_itype(x,dbu), j*127/dbu + 3/dbu) + instGCs.append( cell.insert(CellInstArray(cell_ebeam_gc.cell_index(), t)) ) + + # Label for automated measurements, laser on Port 2, detectors on Ports 1, 3, 4 + t = Trans(Trans.R90, to_itype(x,dbu), to_itype(GC_pitch*2,dbu)) + # text = Text ("opt_in_%s_1310_device_%s_FPPeriodn%sp%s" % (pol.upper(), designer_name,n,int(round(p*1000))), t) + text = Text(f"opt_in_{designer_name}_1310_device_n{n}_dW{int(dW*100)}_L{int(cavity_length/10_000)}", t) + text.halign = 1 + cell.shapes(TextLayerN).insert(text).text_size = 5/dbu + + #cell_splitter = ly.create_cell('ebeam_splitter_swg_assist_te1310', "EBeam") + + cell_bragg = ly.create_cell('ebeam_bragg_te1550', "EBeam", { + 'number_of_periods': n, + 'grating_period': p, + 'corrugation_width': dW, + 'wg_width': 0.350, + 'sinusoidal': True}) + + if i == 0: + inst_y = connect_cell(instGCs[2], 'opt1', cell_y, 'opt1') + first_GC2 = instGCs[2] + else: + inst_y = connect_cell(first_GC2, 'opt1', cell_y, 'opt1') + + inst_y.transform(Trans(Trans.R90, 270000 + x*1000, 200000)) + + inst_bragg1 = connect_cell(inst_y, 'opt1', cell_bragg, 'pin1') + + inst_taper_cavity1 = connect_cell(inst_bragg1, 'pin2', cell_taper_cavity, 'pin1') + + inst_taper_cavity2 = connect_cell(inst_taper_cavity1, 'pin1', cell_taper_cavity, 'pin1') + inst_taper_cavity2.transform(Trans(0, -cavity_length)) + + inst_bragg2 = connect_cell(inst_taper_cavity2, 'pin1', cell_bragg, 'pin2') + + # Ring resonator from directional coupler PCells + #cell_dc = ly.create_cell("ebeam_dc_halfring_straight", "EBeam", { "r": r, "w": wg_width, "g": g, "bustype": 0 } ) + #y_ring = GC_pitch*3/2 + # first directional coupler + #t1 = Trans(Trans.R270, to_itype(x+wg_bend_radius, dbu), to_itype(y_ring, dbu)) + #inst_dc1 = cell.insert(CellInstArray(cell_dc.cell_index(), t1)) + # add 2nd directional coupler, snapped to the first one + #inst_dc2 = connect_cell(inst_dc1, 'pin2', cell_dc, 'pin4') + + connect_pins_with_waveguide(inst_taper_cavity1, 'pin2', inst_taper_cavity2, 'pin2', waveguide_type='Multimode Strip TE 1550 nm, w=2000 nm') + + # Create paths for waveguides, with the type defined in WAVEGUIDES.xml in the PDK + waveguide_type='Strip TE 1310 nm, w=350 nm' + + # GC1 to bottom-left of ring pin3 + #connect_pins_with_waveguide(instGCs[1], 'opt1', inst_bragg1, 'pin2', waveguide_type=waveguide_type) + + # GC2 to top-left of ring pin1 + connect_pins_with_waveguide(instGCs[2], 'opt1', inst_y, 'opt2', waveguide_type=waveguide_type) + + # GC0 to top-right of ring + connect_pins_with_waveguide(instGCs[0], 'opt1', inst_bragg2, 'pin1', waveguide_type=waveguide_type) + + # GC3 to bottom-right of ring + connect_pins_with_waveguide(instGCs[3], 'opt1', inst_y, 'opt3', waveguide_type=waveguide_type) + + # Introduce an error, to demonstrate the Functional Verification + # inst_dc2.transform(Trans(1000,-1000)) + + return ly, cell + +ly, cell = cavities() + +# Zoom out +zoom_out(cell) + +# Save +path = os.path.dirname(os.path.realpath(__file__)) +filename = os.path.splitext(os.path.basename(__file__))[0] +file_out = export_layout(cell, path, filename, relative_path = '..', format='oas', screenshot=False) + +print('layout script done') diff --git a/submissions/KLayout Python/EBeam_AndrewB_Cavities2.py b/submissions/KLayout Python/EBeam_AndrewB_Cavities2.py new file mode 100644 index 00000000..0c107147 --- /dev/null +++ b/submissions/KLayout Python/EBeam_AndrewB_Cavities2.py @@ -0,0 +1,213 @@ +''' +Scripted layout for ring resonators using SiEPIC-Tools +in the SiEPIC-EBeam-PDK "EBeam" technology + +by Lukas Chrostowski, 2023 + +Use instructions: + +Run in Python, e.g., VSCode + +pip install required packages: + - klayout, SiEPIC, siepic_ebeam_pdk, numpy + +''' + +designer_name = 'AndrewB' +top_cell_name = 'EBeam_%s_Cavities2' % designer_name +export_type = 'PCell' # static: for fabrication, PCell: include PCells in file + +import pya +from pya import * + +import SiEPIC +from SiEPIC._globals import Python_Env +from SiEPIC.scripts import zoom_out, export_layout +from SiEPIC.verification import layout_check +import os +import numpy + +if Python_Env == 'Script': + try: + # For external Python mode, when installed using pip install siepic_ebeam_pdk + import siepic_ebeam_pdk + except: + # Load the PDK from a folder, e.g, GitHub, when running externally from the KLayout Application + import os, sys + path_GitHub = os.path.expanduser('~/Documents/GitHub/') + sys.path.insert(0,os.path.join(path_GitHub, 'SiEPIC_EBeam_PDK/klayout')) + import siepic_ebeam_pdk + +tech_name = 'EBeam' + +# Example layout function +def cavities(): + + # Import functions from SiEPIC-Tools + from SiEPIC.extend import to_itype + from SiEPIC.scripts import connect_cell, connect_pins_with_waveguide + from SiEPIC.utils.layout import new_layout, floorplan + + # Create a layout for testing a double-bus ring resonator. + # uses: + # - the SiEPIC EBeam Library + # creates the layout in the presently selected cell + # deletes everything first + + # Configure parameter sweep + pol = 'TE' + sweep_n = [45, 60, 75] + period = 0.27 + sweep_dW = [0.04, 0.05, 0.06] + # cavity_length = 50_000 + cavity_lengths = [80_000] + taper_length_um = 20 + + ''' + Create a new layout using the EBeam technology, + with a top cell + and Draw the floor plan + ''' + cell, ly = new_layout(tech_name, top_cell_name, GUI=True, overwrite = True) + floorplan(cell, 605e3, 410e3) + + if SiEPIC.__version__ < '0.5.1': + raise Exception("Errors", "This example requires SiEPIC-Tools version 0.5.1 or greater.") + + # Layer mapping: + LayerSiN = ly.layer(ly.TECHNOLOGY['Si']) + fpLayerN = cell.layout().layer(ly.TECHNOLOGY['FloorPlan']) + TextLayerN = cell.layout().layer(ly.TECHNOLOGY['Text']) + + + # Create a sub-cell for our Ring resonator layout + top_cell = cell + dbu = ly.dbu + cell = cell.layout().create_cell("Cavities") + t = Trans(Trans.R0, 40 / dbu, 12 / dbu) + + # place the cell in the top cell + top_cell.insert(CellInstArray(cell.cell_index(), t)) + + # Import cell from the SiEPIC EBeam Library + cell_ebeam_gc = ly.create_cell("GC_%s_1310_8degOxide_BB" % pol, "EBeam") + # get the length of the grating coupler from the cell + gc_length = cell_ebeam_gc.bbox().width()*dbu + # spacing of the fibre array to be used for testing + GC_pitch = 127 + + #cell_terminator = ly.create_cell("ebeam_terminator_te1310", "EBeam") + + cell_taper_cavity = ly.create_cell('ebeam_taper_te1550', "EBeam", { + 'wg_width1': 0.350, + 'wg_width2': 2.000, + 'wg_length': taper_length_um}) + + cell_y = ly.create_cell('ebeam_y_1310', 'EBeam_Beta') + + # Loop through the parameter sweep + #for i in range(len(sweep_gap)): + # for i in range(len(sweep_period)): + for index_1, n in enumerate(sweep_n): + for index_2, dW in enumerate(sweep_dW): + for index_3, cavity_length in enumerate(cavity_lengths): + + p = period + + i = index_1 + index_2 + index_3 + # place layout at location: + if i==0: + x=0 + else: + # next device is placed at the right-most element + length of the grating coupler + x = inst_bragg1.bbox().right*dbu + gc_length + 10 + + # get the parameters + # n = sweep_n[i] + # p = sweep_period[i] + + # Grating couplers, Ports 0, 1, 2, 3 (from the bottom up) + instGCs = [] + for j in range(0,4): + if j == 1: + instGCs.append(0) + continue; # Don't create the 2nd GC + + t = Trans(Trans.R0, to_itype(x,dbu), j*127/dbu + 3/dbu) + instGCs.append( cell.insert(CellInstArray(cell_ebeam_gc.cell_index(), t)) ) + + # Label for automated measurements, laser on Port 2, detectors on Ports 1, 3, 4 + t = Trans(Trans.R90, to_itype(x,dbu), to_itype(GC_pitch*2,dbu)) + # text = Text ("opt_in_%s_1310_device_%s_FPPeriodn%sp%s" % (pol.upper(), designer_name,n,int(round(p*1000))), t) + text = Text(f"opt_in_{designer_name}_1310_device_n{n}_dW{int(dW*100)}_L{int(cavity_length/10_000)}", t) + text.halign = 1 + cell.shapes(TextLayerN).insert(text).text_size = 5/dbu + + #cell_splitter = ly.create_cell('ebeam_splitter_swg_assist_te1310', "EBeam") + + cell_bragg = ly.create_cell('ebeam_bragg_te1550', "EBeam", { + 'number_of_periods': n, + 'grating_period': p, + 'corrugation_width': dW, + 'wg_width': 0.350, + 'sinusoidal': True}) + + if i == 0: + inst_y = connect_cell(instGCs[2], 'opt1', cell_y, 'opt1') + first_GC2 = instGCs[2] + else: + inst_y = connect_cell(first_GC2, 'opt1', cell_y, 'opt1') + + inst_y.transform(Trans(Trans.R90, 270000 + x*1000, 200000)) + + inst_bragg1 = connect_cell(inst_y, 'opt1', cell_bragg, 'pin1') + + inst_taper_cavity1 = connect_cell(inst_bragg1, 'pin2', cell_taper_cavity, 'pin1') + + inst_taper_cavity2 = connect_cell(inst_taper_cavity1, 'pin1', cell_taper_cavity, 'pin1') + inst_taper_cavity2.transform(Trans(0, -cavity_length)) + + inst_bragg2 = connect_cell(inst_taper_cavity2, 'pin1', cell_bragg, 'pin2') + + # Ring resonator from directional coupler PCells + #cell_dc = ly.create_cell("ebeam_dc_halfring_straight", "EBeam", { "r": r, "w": wg_width, "g": g, "bustype": 0 } ) + #y_ring = GC_pitch*3/2 + # first directional coupler + #t1 = Trans(Trans.R270, to_itype(x+wg_bend_radius, dbu), to_itype(y_ring, dbu)) + #inst_dc1 = cell.insert(CellInstArray(cell_dc.cell_index(), t1)) + # add 2nd directional coupler, snapped to the first one + #inst_dc2 = connect_cell(inst_dc1, 'pin2', cell_dc, 'pin4') + + connect_pins_with_waveguide(inst_taper_cavity1, 'pin2', inst_taper_cavity2, 'pin2', waveguide_type='Multimode Strip TE 1550 nm, w=2000 nm') + + # Create paths for waveguides, with the type defined in WAVEGUIDES.xml in the PDK + waveguide_type='Strip TE 1310 nm, w=350 nm' + + # GC1 to bottom-left of ring pin3 + #connect_pins_with_waveguide(instGCs[1], 'opt1', inst_bragg1, 'pin2', waveguide_type=waveguide_type) + + # GC2 to top-left of ring pin1 + connect_pins_with_waveguide(instGCs[2], 'opt1', inst_y, 'opt2', waveguide_type=waveguide_type) + + # GC0 to top-right of ring + connect_pins_with_waveguide(instGCs[0], 'opt1', inst_bragg2, 'pin1', waveguide_type=waveguide_type) + + # GC3 to bottom-right of ring + connect_pins_with_waveguide(instGCs[3], 'opt1', inst_y, 'opt3', waveguide_type=waveguide_type) + + # Introduce an error, to demonstrate the Functional Verification + # inst_dc2.transform(Trans(1000,-1000)) + + return ly, cell + +ly, cell = cavities() + +# Zoom out +zoom_out(cell) + +# Save +path = os.path.dirname(os.path.realpath(__file__)) +filename = os.path.splitext(os.path.basename(__file__))[0] +file_out = export_layout(cell, path, filename, relative_path = '..', format='oas', screenshot=False) + +print('layout script done')