diff --git a/DFT.md b/DFT.md index d82f118..09f5ea5 100644 --- a/DFT.md +++ b/DFT.md @@ -1,11 +1,15 @@ # Design for Test rules -- All design submissions must follow the Design for Test (DFT) rules. Two optical interfaces are available: surface grating couplers (GC), and facet-attached micro-lenses (FaML) +- All design submissions must follow the Design for Test (DFT) rules. Three optical interfaces are available: surface grating couplers (GC), facet-attached micro-lenses (FaML), and facet-attached vertical emitters (FAVE). ## Grating Couplers -- area maximum: 610 µm wide, 405 µm high +- area design maximum: 1000 µm wide, 500 µm high +- grating coupler cells: + - SiEPIC_EBeam_PDK -> EBeam-SiN -> + - GC_SiN_TE_1310_8degOxide_BB + - GC_SiN_TE_1550_8degOxide_BB - 127 µm pitch, verically aligned, single column, connected circuits - up to 4 grating couplers - opt_in label format: opt_in_TE_1550_device_designerUniqueIndentifier @@ -18,12 +22,32 @@ ## Facet-attached Micro-Lenses (FaML) -- area maximum: 1000 µm wide, 244 µm high +- area design maximum: 1000 µm wide, 500 µm high +- FaML coupler cells: + - SiEPIC_EBeam_PDK -> EBeam-Dream -> + - ebeam_dream_FaML_SiN_1550_BB - 127 µm pitch, verically aligned, single column, connected circuits -- up to 3 lenses +- up to 4 lenses - opt_in label format: opt_in_TE_1550_FaML_designerUniqueIndentifier - opt_in label location: the lens and chip edge (0,0) of the FaML cell at the input - Fiber Array test consists of: - 1 (top FaML): input, laser - 2 (middle FaML): output, to detector - - 3 (bottom FaML): output, to detector + - 3 (middle FaML): output, to detector + - 4 (bottom FaML): output, to detector + +## Facet-attached Vertical Emitters (FAVE) + +- area design maximum: 1000 µm wide, 500 µm high +- FaML coupler cells: + - SiEPIC_EBeam_PDK -> EBeam-Dream -> + - ebeam_dream_FAVE_SiN_1550_BB +- 127 µm pitch, verically aligned, single column, connected circuits +- up to 4 lenses +- opt_in label format: opt_in_TE_1550_FAVE_designerUniqueIndentifier +- opt_in label location: the edge (0,0) of the FAVE cell at the input +- Fiber Array test consists of: + - 1 (top FAVE): input, laser + - 2 (middle FAVE): output, to detector + - 3 (middle FAVE): output, to detector + - 4 (bottom FAVE): output, to detector diff --git a/merge/EBeam_merge.py b/merge/EBeam_merge.py index 82a067c..11d63dd 100644 --- a/merge/EBeam_merge.py +++ b/merge/EBeam_merge.py @@ -18,9 +18,10 @@ tech_name = 'EBeam' top_cell_name = 'EBeam_2024_10_SiN' cell_Width = 1000e3 -cell_Height = 410000 -cell_Gap_Width = 8000 -cell_Gap_Height = 8000 +cell_FaML_width_extra = 100e3 +cell_Height = 500e3 +cell_Gap_Width = 8e3 +cell_Gap_Height = 8e3 chip_Width = 8650000 chip_Height1 = 8490000 chip_Height2 = 8780000 @@ -32,7 +33,7 @@ tr_cutout_y = 8494000 filename_out = 'EBeam' -layers_keep = ['1/5', '4/0', '1/10', '68/0', '81/0', '10/0', '99/0', '26/0', '31/0', '32/0', '33/0', '998/0'] +layers_keep = ['1/5', '4/0', '1/10', '68/0', '81/0', '10/0', '99/0', '26/0', '31/0', '32/0', '33/0', '201/0','998/0'] layer_text = '10/0' layer_SEM = '200/0' layer_SEM_allow = ['edXphot1x', 'ELEC413','SiEPIC_Passives'] # which submission folder is allowed to include SEM images @@ -51,7 +52,7 @@ # KLayout import pya -from pya import * +from pya import Trans, CellInstArray, Text # SiEPIC-Tools import SiEPIC @@ -115,12 +116,18 @@ def log(text): path2 = os.path.abspath(os.path.join(path,"../submissions")) _, _, files = next(os.walk(path2), (None, None, [])) for f in sorted(files): - files_in.append(os.path.join(path2,f)) + if 'FaML' in f: + files_in.append(os.path.join(path2,f)) +for f in sorted(files): + if 'FaML' not in f: + files_in.append(os.path.join(path2,f)) # Create course cells using the folder name under the top cell cell_edXphot1x = layout.create_cell("edX") t = Trans(Trans.R0, 0,0) top_cell.insert(CellInstArray(cell_edXphot1x.cell_index(), t)) +cell_FaML = layout.create_cell("FaML") +top_cell.insert(CellInstArray(cell_FaML.cell_index(), t)) cell_ELEC413 = layout.create_cell("ELEC413") top_cell.insert(CellInstArray(cell_ELEC413.cell_index(), t)) cell_SiEPIC_Passives = layout.create_cell("SiEPIC_Passives") @@ -137,6 +144,7 @@ def log(text): # Origins for the layouts x,y = 110e3,cell_Height+cell_Gap_Height +previous_top_FaML = None import subprocess import pandas as pd @@ -160,16 +168,17 @@ def log(text): layout2 = pya.Layout() layout2.read(f) + course = 'openEBL' if 'ebeam' in basefilename.lower(): course = 'edXphot1x' - elif 'elec413' in basefilename.lower(): + if 'faml' in basefilename.lower(): + course = 'FaML' + if 'elec413' in basefilename.lower(): course = 'ELEC413' - elif 'openebl' in basefilename.lower(): + if 'openebl' in basefilename.lower(): course = 'openEBL' - elif 'siepic_passives' in basefilename.lower(): + if 'siepic_passives' in basefilename.lower(): course = 'SiEPIC_Passives' - else: - course = 'openEBL' cell_course = eval('cell_' + course) log(" - course name: %s" % (course) ) @@ -193,7 +202,15 @@ def log(text): # check that there is one top cell in the layout num_top_cells = len(layout2.top_cells()) if num_top_cells > 1: - log(' - layout should only contain one top cell; contains (%s): %s' % (num_top_cells, [c.name for c in layout2.top_cells()]) ) + log(' - WARNING: layout should only contain one top cell; contains (%s): %s' % (num_top_cells, [c.name for c in layout2.top_cells()]) ) + top_cells = layout2.top_cells() + top_cells.sort(key=lambda x: x.child_instances()) + log(' - top cell (%s) has %s child_instances (highest one); renaming to "top".' % (top_cells[-1].name, top_cells[-1].child_instances()) ) + top_cells[-1].name = 'top' + ''' + for cell in layout2.top_cells(): + log(' - top cell (%s) has %s hierarchy levels' % (cell.name, cell.hierarchy_levels()) ) + ''' if num_top_cells == 0: log(' - layout does not contain a top cell') @@ -258,6 +275,7 @@ def log(text): shapes_to_delete.append( s.shape() ) s.next() for s in shapes_to_delete: + # need to delete the shapes all together, since the list of shapes in the shape recursive iterator changes if you delete one s.delete() # bounding box of the cell @@ -269,24 +287,24 @@ def log(text): t = Trans(Trans.R0, -bbox.left,-bbox.bottom) subcell2.insert(CellInstArray(subcell.cell_index(), t)) - # clip cells - cell2 = layout2.clip(cell.cell_index(), pya.Box(bbox.left,bbox.bottom,bbox.left+cell_Width,bbox.bottom+cell_Height)) + # clip / crop cells + cell2 = layout2.clip(cell.cell_index(), pya.Box(bbox.left,bbox.bottom,bbox.left+cell_Width+(cell_FaML_width_extra if course == 'FaML' else 0),bbox.bottom+cell_Height)) bbox2 = layout2.cell(cell2).bbox() if bbox != bbox2: - log(' - WARNING: Cell was clipped to maximum size of %s X %s' % (cell_Width, cell_Height) ) + log(' - WARNING: Cell was clipped to maximum size of %s X %s' % (cell_Width +(cell_FaML_width_extra if course == 'FaML' else 0), cell_Height) ) log(' - clipped bounding box: %s' % bbox2.to_s() ) - # copy - subcell.copy_tree(layout2.cell(cell2)) - + subcell.copy_tree(cell) + ''' + if course is not 'FaML': + # copy + subcell.copy_tree(layout2.cell(cell2)) + else: + subcell.copy_tree(cell) + ''' + # Check if this cell would overlap with other Floorplans, then move if necessary - def next_position(x, y, subcell, cell_Gap_Height, cell_Gap_Width, chip_Height, cell_Height, cell_Width): - # Measure the height of the cell that was added, and move up - y += cell_Gap_Height - if y + cell_Height > chip_Height: - y = cell_Height + cell_Gap_Height - x += cell_Width + cell_Gap_Width - return x, y + # Get Floorplan regions for the entire chip so far Layer_FP = layout.find_layer(99,0) # or use "layer" iter1 = pya.RecursiveShapeIterator(layout, top_cell, Layer_FP ) @@ -297,23 +315,85 @@ def next_position(x, y, subcell, cell_Gap_Height, cell_Gap_Width, chip_Height, c iter1.next() r1.merge() # print(" - Floorplan merged: %s" % r1) + + # offset for the facet-attached micro lenses + if course == 'FaML': + x_offset = -100e3 + # Find the FaML cells, and make sure they are on a 127 µm pitch + def sub_instances(instance,name): + found_instances = [] + if type(instance) == pya.Cell: + cell = instance + else: + cell = instance.cell() + for inst in cell.each_inst(): + # log(' - looking for FaML instance: %s' % (inst.to_s())) + if inst.cell.name == name: + found_instances.append(inst) + # log(' - Found FaML instance: %s, %s' % (inst.to_s(), inst.cell.name)) + elif inst.cell.child_instances() > 0: + for f in sub_instances(inst,name): + if f.cell.name == name: + found_instances.append(f) + return found_instances + + found_faml_instances = sub_instances(layout2.top_cells()[0], name = 'ebeam_dream_FaML_SiN_1550_BB') + #for f in found_faml_instances: + # log(' - Found FaML instance: %s, %s' % (f.to_s(), f.cell.name)) + found_faml_instances.sort(key=lambda x: -x.cplx_trans.disp.y) + for f in found_faml_instances: + log(' - Found FaML instance (sorted): %s, %s' % (f.to_s(), f.cell.name)) + top_FaML = found_faml_instances[0].cplx_trans.disp.y + + else: + x_offset = 0 + + def next_position(x, y, cell_Gap_Height, cell_Gap_Width, chip_Height, cell_Height, cell_Width): + # Measure the height of the cell that was added, and move up + y += cell_Gap_Height + if y + cell_Height > chip_Height: + y = cell_Height + cell_Gap_Height + x += cell_Width + cell_Gap_Width + return x, y interacting = True while interacting: - r2 = pya.Region(pya.Box(x,y, x+bbox2.width(),y+bbox2.height())) + r2 = pya.Region(pya.Box(x+x_offset,y, x+x_offset+bbox2.width(),y+bbox2.height())) interacting = r2.interacting(r1) if interacting: # print(" - Overlapping Floorplan: %s" % r2.interacting(r1)) - x,y = next_position(x, y, subcell, cell_Gap_Height, cell_Gap_Width, chip_Height2, cell_Height, cell_Width) + x,y = next_position(x, y, cell_Gap_Height, cell_Gap_Width, chip_Height2, cell_Height, cell_Width) + + if course == 'FaML': + # Check and snap to 127 µm pitch + if previous_top_FaML: + FaML_delta = top_FaML+y - previous_top_FaML + log(' - FaML count: %s' % (FaML_delta/127e3) ) + if FaML_delta % 127e3 > 0: + # log(' - Adjancent designs do not have matching FaML pitch: %s error' % (FaML_delta) ) + y_add = 127e3 - FaML_delta % 127e3 + log(' - shifting design up by %s µm, to have matching FaML pitch.' % (y_add/1e3) ) + y += y_add + # Insert cell instance in the chip - t = Trans(Trans.R0, x,y) + t = Trans(Trans.R0, x+x_offset,y) cell_course.insert(CellInstArray(subcell2.cell_index(), t)) - log(' - Placed at position: %s, %s' % (x,y) ) + log(' - Design placed at position: %s, %s' % (x,y) ) + + if course == 'FaML': + # record placement of FaML + previous_top_FaML = found_faml_instances[0].cplx_trans.disp.y + y + log(' - top FaML position: %s' % (previous_top_FaML) ) # Measure the height of the cell that was added, and move up - y += max (cell_Height, subcell.bbox().height()) + cell_Gap_Height + #y += max (cell_Height, subcell.bbox().height()) + cell_Gap_Height + if course == 'FaML': + from math import ceil + y += ceil(subcell.bbox().height()/127e3)*127e3 + else: + y += subcell.bbox().height() + cell_Gap_Height # move right and bottom when we reach the top of the chip if y + cell_Height > chip_Height1 and x == 0: y = cell_Height + cell_Gap_Height @@ -332,6 +412,8 @@ def next_position(x, y, subcell, cell_Gap_Height, cell_Gap_Width, chip_Height, c # Check bottom right cutout #2 for PCM if x + cell_Width > br_cutout2_x and y < br_cutout2_y: y = br_cutout2_y + else: + log(" - WARNING: Top cell not merged (%s)" % cell.name) ''' text_out,opt_in = find_automated_measurement_labels(topcell=top_cell, LayerTextN=layerTextN) diff --git a/submissions/EBeam_LukasChrostowski_MZI1_1550_FaML.oas b/submissions/EBeam_LukasChrostowski_MZI1_1550_FaML.oas index b1c0d88..f144699 100644 Binary files a/submissions/EBeam_LukasChrostowski_MZI1_1550_FaML.oas and b/submissions/EBeam_LukasChrostowski_MZI1_1550_FaML.oas differ diff --git a/submissions/EBeam_LukasChrostowski_MZI2_1550_FaML.oas b/submissions/EBeam_LukasChrostowski_MZI2_1550_FaML.oas index 3d835ec..50eb2d0 100644 Binary files a/submissions/EBeam_LukasChrostowski_MZI2_1550_FaML.oas and b/submissions/EBeam_LukasChrostowski_MZI2_1550_FaML.oas differ diff --git a/submissions/EBeam_LukasChrostowski_MZI_1550_FaML.oas b/submissions/EBeam_LukasChrostowski_MZI_1550_FaML.oas deleted file mode 100644 index f609507..0000000 Binary files a/submissions/EBeam_LukasChrostowski_MZI_1550_FaML.oas and /dev/null differ diff --git a/submissions/EBeam_LukasChrostowski_MZI_loopback_1550_FaML.oas b/submissions/EBeam_LukasChrostowski_MZI_loopback_1550_FaML.oas new file mode 100644 index 0000000..0b99a0c Binary files /dev/null and b/submissions/EBeam_LukasChrostowski_MZI_loopback_1550_FaML.oas differ diff --git a/submissions/EBeam_LukasChrostowski_loopback_1550_FaML.oas b/submissions/EBeam_LukasChrostowski_loopback_1550_FaML.oas index aff4cfe..11437f7 100644 Binary files a/submissions/EBeam_LukasChrostowski_loopback_1550_FaML.oas and b/submissions/EBeam_LukasChrostowski_loopback_1550_FaML.oas differ diff --git a/submissions/KLayout Python/EBeam_LukasChrostowski_MZI_1550_FaML.lyrdb b/submissions/KLayout Python/EBeam_LukasChrostowski_MZI_1550_FaML.lyrdb deleted file mode 100644 index 87fd995..0000000 --- a/submissions/KLayout Python/EBeam_LukasChrostowski_MZI_1550_FaML.lyrdb +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - EBeam_LukasChrostowski_MZI_FaML - - - - - Component - - - - No components found - At minimum, shapes must be inside a cell and inside a DevRec shape. Read more about requirements for components: https://github.com/SiEPIC/SiEPIC-Tools/wiki/Component-and-PCell-Layout - - - - - Shapes outside component - Shapes for device layers need to be inside a component. At minimum, they must be inside a cell and inside a DevRec shape. Read more about requirements for components: https://github.com/SiEPIC/SiEPIC-Tools/wiki/Component-and-PCell-Layout - - - - - Flattened component - SiEPIC-Tools Verification, Netlist extraction, and Simulation only functions on hierarchical layouts, and not on flattened layouts. Add to the discussion here: https://github.com/lukasc-ubc/SiEPIC-Tools/issues/37 - - - - - Overlapping component - Overlapping components (defined as overlapping DevRec layers; touching is ok) - - - - - Invalid Pin - Invalid pin found. Read more about requirements for components: https://github.com/SiEPIC/SiEPIC-Tools/wiki/Component-and-PCell-Layout - - - - - - - Waveguide - - - - Path - Waveguide path: Only 2 points allowed in a path. Convert to a Waveguide if necessary. - - - - - Radius - Not enough space to accommodate the desired bend radius for the waveguide. - - - - - Bend points - Waveguide bend should have more points per circle. - - - - - Manhattan - The first and last waveguide segment need to be Manhattan (vertical or horizontal) so that they can connect to device pins. - - - - - - - Connectivity - - - - Disconnected pin - Disconnected pin - - - - - Mismatched pin - Mismatched pin widths - - - - - - - Design for test - - - - opt_in label: same - Automated test opt_in labels should be unique. - - - - - opt_in label: missing - Automated test opt_in labels are required for measurements on the Text layer. - -Details on the format for the opt_in labels can be found at https://github.com/lukasc-ubc/SiEPIC-Tools/wiki/SiEPIC-Tools-Menu-descriptions#connectivity-layout-check - - - - - opt_in label: too far away - Automated test opt_in labels must be placed at the tip of the grating coupler, namely near the (0,0) point of the cell. - - - - - opt_in label: wavelength - Automated test opt_in labels must have a wavelength for a laser specified in the DFT.xml file: ['1550', '1550', '1310', '1310']. - -Details on the format for the opt_in labels can be found at https://github.com/lukasc-ubc/SiEPIC-Tools/wiki/SiEPIC-Tools-Menu-descriptions#connectivity-layout-check - - - - - opt_in label: polarization - Automated test opt_in labels must have a polarization as specified in the DFT.xml file: ['TE', 'TM', 'TE', 'TM']. - -Details on the format for the opt_in labels can be found at https://github.com/lukasc-ubc/SiEPIC-Tools/wiki/SiEPIC-Tools-Menu-descriptions#connectivity-layout-check - - - - - Grating coupler orientation - The grating coupler is not oriented (rotated) the correct way for automated testing. - - - - - Fibre array configuration - Circuit must be connected such that there is at most 1 Grating Coupler(s) above the opt_in label (laser injection port) and at most 2 Grating Coupler(s) below the opt_in label. -Grating couplers must be on a 127.0 micron pitch, vertically arranged. - - - - - Grating coupler: minimum spacing - The grating coupler spacing (pitch) must be at least 60.0 microns. - - - - - - - - - EBeam_LukasChrostowski_MZI_FaML - - - - - - - - - - 'Design for test'.'opt_in label: too far away' - EBeam_LukasChrostowski_MZI_FaML - false - 1 - - - - polygon: (-1,29;-1,31;1,31;1,29) - polygon: (0,0;0,695;95,695;95,0) - - - - - 'Design for test'.'opt_in label: too far away' - EBeam_LukasChrostowski_MZI_FaML - false - 1 - - - - polygon: (-1,537;-1,539;1,539;1,537) - polygon: (0,0;0,695;95,695;95,0) - - - - diff --git a/submissions/KLayout Python/EBeam_LukasChrostowski_MZI_loopback_1550_FaML.py b/submissions/KLayout Python/EBeam_LukasChrostowski_MZI_loopback_1550_FaML.py new file mode 100644 index 0000000..fe8f02e --- /dev/null +++ b/submissions/KLayout Python/EBeam_LukasChrostowski_MZI_loopback_1550_FaML.py @@ -0,0 +1,116 @@ +''' +--- Simple MZI, tested using Facet-Attached Micro Lenses (FaML) --- + +by Lukas Chrostowski, 2024 + +Example simple script to + - choose the fabrication technology provided by Applied Nanotools, using silicon nitride (SiN) waveguides + - use the SiEPIC-EBeam-PDK technology + - using KLayout and SiEPIC-Tools, with function including connect_pins_with_waveguide and connect_cell + - create a new layout with a top cell, limited a design area of 1000 microns wide by 410 microns high. + - create one Mach-Zehnder Interferometer (MZI) circuit with a small path length difference, and loopback + - export to OASIS for submission to fabrication + - display the layout in KLayout using KLive + + Test plan + - count lenses from the top (top is 1) + - laser input on top lens (1), detector on second (2) + +Use instructions: + +Run in Python, e.g., VSCode + +pip install required packages: + - klayout, SiEPIC, siepic_ebeam_pdk, numpy + +''' + +designer_name = 'LukasChrostowski' +top_cell_name = 'EBeam_%s_MZI1_FaML' % designer_name +export_type = 'static' # static: for fabrication, PCell: include PCells in file +tech_name = 'EBeam' + +import pya +from pya import * + +import SiEPIC +from SiEPIC._globals import Python_Env +from SiEPIC.scripts import connect_cell, connect_pins_with_waveguide, zoom_out, export_layout +from SiEPIC.utils.layout import new_layout, floorplan, FaML_two +from SiEPIC.extend import to_itype +from SiEPIC.verification import layout_check + +import os + +if Python_Env == 'Script': + # For external Python mode, when installed using pip install siepic_ebeam_pdk + import siepic_ebeam_pdk + +print('EBeam_LukasChrostowski_MZI1 layout script') + +from packaging import version +if version.parse(SiEPIC.__version__) < version.parse("0.5.4"): + raise Exception("Errors", "This example requires SiEPIC-Tools version 0.5.4 or greater.") + +''' +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, 230e3, 481e3) + +waveguide_type1='SiN Strip TE 1550 nm, w=750 nm' +waveguide_type_delay='SiN routing TE 1550 nm (compound waveguide)' + +# Load cells from library +cell_ebeam_y = ly.create_cell('ANT_MMI_1x2_te1550_3dB_BB', 'EBeam-SiN') + +####################### +# Circuit #0 – Loopback +####################### +# draw two edge couplers for facet-attached micro-lenses +inst_faml = FaML_two(cell, + label = "opt_in_TE_1550_FaML_%s_Loopback" % designer_name, + y_offset = 50e3+254e3*0, + ) +# loopback waveguide +connect_pins_with_waveguide(inst_faml[0], 'opt1', inst_faml[1], 'opt1', waveguide_type=waveguide_type1) + +####################### +# Circuit #1 – MZI +####################### +# draw two edge couplers for facet-attached micro-lenses +inst_faml = FaML_two(cell, + label = "opt_in_TE_1550_FaML_%s_mzi1" % designer_name, + y_offset = 50e3+254e3, + ) +# Y branches: +instY2 = connect_cell(inst_faml[0], 'opt1', cell_ebeam_y, 'pin1') +instY1 = connect_cell(inst_faml[1], 'opt1', cell_ebeam_y, 'pin1') +# Waveguides: +connect_pins_with_waveguide(instY1, 'pin2', instY2, 'pin3', waveguide_type=waveguide_type1) +connect_pins_with_waveguide(instY1, 'pin3', instY2, 'pin2', waveguide_type=waveguide_type1, turtle_A=[100,-90]) + + +# Zoom out +zoom_out(cell) + +# Export for fabrication, removing PCells +path = os.path.dirname(os.path.realpath(__file__)) +filename, extension = os.path.splitext(os.path.basename(__file__)) +if export_type == 'static': + file_out = export_layout(cell, path, filename, relative_path = '..', format='oas', screenshot=True) +else: + file_out = os.path.join(path,'..',filename+'.oas') + ly.write(file_out) + +# Verify +file_lyrdb = os.path.join(path,filename+'.lyrdb') +num_errors = layout_check(cell = cell, verbose=False, GUI=True, file_rdb=file_lyrdb) +print('Number of errors: %s' % num_errors) + +# Display the layout in KLayout, using KLayout Package "klive", which needs to be installed in the KLayout Application +if Python_Env == 'Script': + from SiEPIC.utils import klive + klive.show(file_out, lyrdb_filename=file_lyrdb, technology=tech_name) diff --git a/submissions/KLayout Python/EBeam_LukasChrostowski_loopback_1550_FaML.py b/submissions/KLayout Python/EBeam_LukasChrostowski_loopback_1550_FaML.py index 162928d..324107a 100644 --- a/submissions/KLayout Python/EBeam_LukasChrostowski_loopback_1550_FaML.py +++ b/submissions/KLayout Python/EBeam_LukasChrostowski_loopback_1550_FaML.py @@ -59,7 +59,7 @@ and Draw the floor plan ''' cell, ly = new_layout(tech_name, top_cell_name, GUI=True, overwrite = True) -floorplan(cell, 200e3, 244e3) +floorplan(cell, 200e3, 227e3) waveguide_type1='SiN Strip TE 1550 nm, w=750 nm' @@ -69,6 +69,7 @@ # draw two edge couplers for facet-attached micro-lenses inst_faml = FaML_two(cell, label = "opt_in_TE_1550_FaML_%s_loopback" % designer_name, + y_offset = 50e3, ) # loopback waveguide connect_pins_with_waveguide(inst_faml[0], 'opt1', inst_faml[1], 'opt1', waveguide_type=waveguide_type1)