diff --git a/klayout_dot_config/grain.xml b/klayout_dot_config/grain.xml
index d8376f6b..38d2a7e2 100644
--- a/klayout_dot_config/grain.xml
+++ b/klayout_dot_config/grain.xml
@@ -1,12 +1,12 @@
siepic_ebeam_pdk
- 0.3.38
+ 0.3.39
0.27
SiEPIC EBeam PDK
- A Process Design Kit for Silicon Photonics fabricated using Electron Beam Lithography
- https://github.com/lukasc-ubc/SiEPIC_EBeam_PDK/blob/master/README.md
- https://github.com/lukasc-ubc/SiEPIC_EBeam.git/trunk/klayout_dot_config
+ A Process Design Kit for Silicon Photonics fabricated using Electron Beam Lithography (UW, ANT, SiEPICfab)
+ https://github.com/siepic/SiEPIC_EBeam_PDK/blob/master/README.md
+ https://github.com/siepic/SiEPIC_EBeam.git/trunk/klayout_dot_config
Lukas Chrostowski, Jaspreet Jhoja, Mustafa Hammood, Brett Poulsen, Jonas Flueckiger, Rounak Singh Narde, Chris Zeqin Lu, Nathan Smith, Stefan Preble, Claudio Alarcon-Reyes
GitHub: lukasc-ubc, jaspreetj, mustafacc, bpoulse, jfluecki, rounaksingh, luzeqin, nsmith5, StefanPreble, clalarco
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
@@ -14,6 +14,6 @@
siepic_tools
- 0.3.82
+ 0.3.87
diff --git a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - Bragg Gratings.lym b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - Bragg Gratings.lym
index cf1c157f..81ddbf0a 100644
--- a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - Bragg Gratings.lym
+++ b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - Bragg Gratings.lym
@@ -1,6 +1,6 @@
- Bragg gratings sweep layout
+ Bragg gratings sweep (EBeam)
pymacros
@@ -10,7 +10,7 @@
false
true
-
+ Examples_EBeam
siepic_menu.exlayout.begin
python
@@ -34,7 +34,16 @@ from pya import *
from SiEPIC.extend import to_itype
from SiEPIC.utils import select_paths, get_layout_variables
-dbu=0.001
+'''
+Create a new layout using the EBeam technology,
+with a top cell
+'''
+mw = pya.Application().instance().main_window()
+ly = mw.create_layout('EBeam', 1).layout()
+cell = ly.create_cell('top')
+lv = mw.current_view()
+lv.select_cell(cell.cell_index(), 0)
+dbu = ly.dbu
# linspace function without using numpy, because why not?
def linspace(a, b, n):
diff --git a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - Contra-directional couplers array.lym b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - Contra-directional couplers array.lym
index f7d0ef4d..19cb1e33 100644
--- a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - Contra-directional couplers array.lym
+++ b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - Contra-directional couplers array.lym
@@ -1,6 +1,6 @@
- Contra-directional couplers sweep layout
+ Contra-directional couplers sweep (EBeam)
pymacros
@@ -10,7 +10,7 @@
false
true
-
+ Examples_EBeam
siepic_menu.exlayout.begin
python
@@ -34,6 +34,17 @@
# Import KLayout-Python API
from pya import *
+'''
+Create a new layout using the EBeam technology,
+with a top cell
+'''
+mw = pya.Application().instance().main_window()
+ly = mw.create_layout('EBeam', 1).layout()
+cell = ly.create_cell('top')
+lv = mw.current_view()
+lv.select_cell(cell.cell_index(), 0)
+dbu = ly.dbu
+
# linspace function without using numpy, because why not?
def linspace_without_numpy(a, b, n):
diff --git a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - Layout_Bragg_Spirals.lym b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - Layout_Bragg_Spirals.lym
index c1d72f41..b2b96c4b 100644
--- a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - Layout_Bragg_Spirals.lym
+++ b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - Layout_Bragg_Spirals.lym
@@ -1,6 +1,6 @@
- Spiral bragg grating layout
+ Spiral bragg gratings (EBeam)
pymacros
@@ -9,8 +9,8 @@
false
false
- true
-
+ false
+ Examples_EBeam
siepic_menu.exlayout.begin
python
@@ -24,6 +24,17 @@ I suspect it has something to do with the way exceptions are raised or that the
import pya
from SiEPIC.scripts import path_to_waveguide
+'''
+Create a new layout using the EBeam technology,
+with a top cell
+'''
+mw = pya.Application().instance().main_window()
+ly = mw.create_layout('EBeam', 1).layout()
+cell = ly.create_cell('top')
+lv = mw.current_view()
+lv.select_cell(cell.cell_index(), 0)
+dbu = ly.dbu
+
###############PARAMETERS####################
#Shared Sweep
diff --git a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - MZI.lym b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - MZI.lym
index 4aaf0444..f1943984 100644
--- a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - MZI.lym
+++ b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - MZI.lym
@@ -1,6 +1,6 @@
- MZI designs, by Jaspreet Jhoja
+ MZI design sweep (EBeam)
pymacros
@@ -9,8 +9,8 @@
false
false
- true
-
+ false
+ Examples_EBeam
siepic_menu.exlayout.begin
python
@@ -66,26 +66,16 @@ wg_bend_radius = 5
#change the waveguide width, default: 500nm or 0.5microns
wg_width = 0.5
-lv = pya.Application.instance().main_window().current_view()
-
-
-if lv == None:
- raise Exception("No view selected")
-# Find the currently selected layout.
-ly = pya.Application.instance().main_window().current_view().active_cellview().layout()
-if ly == None:
- raise Exception("No layout")
-# find the currently selected cell:
-cell = pya.Application.instance().main_window().current_view().active_cellview().cell
-if cell == None:
- raise Exception("No cell")
-# fetch the database parameters
-dbu = 1 / ly.dbu
-
-
-# clean all cells within "cell"
-ly.prune_subcells(cell.cell_index(), 10)
-#delete_extra_top_cells(cell)
+'''
+Create a new layout using the EBeam technology,
+with a top cell
+'''
+mw = pya.Application().instance().main_window()
+ly = mw.create_layout('EBeam', 1).layout()
+cell = ly.create_cell('top')
+lv = mw.current_view()
+lv.select_cell(cell.cell_index(), 0)
+dbu = ly.dbu
# Layer mapping:
LayerSi = pya.LayerInfo(1, 0)
@@ -132,8 +122,8 @@ def draw_gc(gc_y_coord, number_of_designs):
#joiner ybranch
cell.insert(pya.CellInstArray(branch_imported, pya.Trans(pya.Trans.R270, ((15+2.75+wg_bend_radius)*dbu), ((gc_y_coord+127+7.5+2.75+wg_bend_radius) * dbu)), pya.Point(0,127*dbu), pya.Point(space*dbu,0), 1, number_of_designs))
-
-#function Drawing L1
+ '''
+ #function Drawing L1
#Comment-Del: add 2.75 to go up and 2.75 to attach tp bottom
points_L1 = [ [15, 127+gc_y_coord+2.75], [wg_bend_radius+15, 127+gc_y_coord+2.75], [wg_bend_radius+15, (127+gc_y_coord+2.75+wg_bend_radius)] ]
L1 = layout_waveguide_abs(cell, LayerSi, points_L1, wg_width, wg_bend_radius)
@@ -141,14 +131,14 @@ def draw_gc(gc_y_coord, number_of_designs):
#instantiate the design for other waveguides
a= pya.CellInstArray(ly.cell_by_name("ROUND_PATH"), pya.Trans(pya.Trans.R0, (space+15)*dbu, (127+gc_y_coord+2.75)*dbu), pya.Point(0,127*dbu), pya.Point(space*dbu,0), 1, number_of_designs-1)
cell.insert(a)
+ '''
#extract coordinates for final attachments to the GC
pt_f_x = wg_bend_radius+15
pt_f_y = 127+gc_y_coord+2.75+wg_bend_radius
-
- #waveguide joining combiner with the output GC
-
+ '''
+ #waveguide joining combiner with the output GC
points_final = [[pt_f_x+2.75, pt_f_y+15],[pt_f_x +2.75, pt_f_y+16+wg_bend_radius], [pt_f_x +2.75+wg_bend_radius+wg_bend_radius, pt_f_y+16+wg_bend_radius],
[pt_f_x +2.75+wg_bend_radius+wg_bend_radius, gc_y_coord], [0,gc_y_coord]]
layout_waveguide_abs(cell, LayerSi, points_final, wg_width, wg_bend_radius)
@@ -156,7 +146,7 @@ def draw_gc(gc_y_coord, number_of_designs):
#instantiate the path for other designs
a = pya.CellInstArray(ly.cell_by_name("ROUND_PATH$1"), pya.Trans(pya.Trans.R0, (space+pt_f_x+2.75)*dbu, (pt_f_y+15)*dbu), pya.Point(0,127*dbu), pya.Point(space*dbu,0), 1, number_of_designs-1)
cell.insert(a)
-
+ '''
def drawL2(dL,n, gc_y_coord):
val = abs(dL-70)
@@ -223,8 +213,10 @@ def drawL2(dL,n, gc_y_coord):
for i in coordedit[2]:
points_L2.insert(12+(coordedit[2].index(i)),i)
# points_L2.pop(7)
+ '''
print ( points_L2)
L2 = layout_waveguide_abs(cell, LayerSi, points_L2, wg_width, wg_bend_radius)
+ '''
# Label for automated measurements, laser on Port 2, detectors on Ports 1, 3, 4
t = pya.Trans(pya.Trans.R0,(space*n)*dbu, gc_y_coord*dbu)
text = pya.Text ("opt_in_TE_1550_device_MZI"+str(n), t)
diff --git a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - mixed waveguide types.lym b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - mixed waveguide types.lym
index e4d2d788..9f32b925 100644
--- a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - mixed waveguide types.lym
+++ b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Example - mixed waveguide types.lym
@@ -1,6 +1,6 @@
- Mixed waveguide types
+ Mixed waveguide types (EBeam)
pymacros
@@ -9,8 +9,8 @@
false
false
- true
-
+ false
+ Examples_EBeam
siepic_menu.exlayout.begin
python
diff --git a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/MZI.lym b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/MZI.lym
index 44d21b5e..dfd1c4b7 100644
--- a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/MZI.lym
+++ b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/MZI.lym
@@ -1,6 +1,6 @@
- Simple MZI
+ MZI (EBeam)
pymacros
@@ -10,7 +10,7 @@
false
true
-
+ Examples_EBeam
siepic_menu.exlayout.begin
python
diff --git a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Test_structures_ring_resonators.lym b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Test_structures_ring_resonators.lym
deleted file mode 100644
index de4cc12c..00000000
--- a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/Test_structures_ring_resonators.lym
+++ /dev/null
@@ -1,171 +0,0 @@
-
-
- Test structures: Double-bus ring resonators
-
- pymacros
-
-
-
- false
- false
-
- true
-
- siepic_menu.exlayout.begin
- python
-
- '''
-Scripted layout for ring resonators using SiEPIC-Tools
-in the SiEPIC-EBeam-PDK "EBeam" technology
-
-by Lukas Chrostowski, 2020
-
-'''
-
-from pya import *
-
-# Example layout function
-def dbl_bus_ring_res():
-
- # 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'
- if pol == 'te':
- sweep_radius = [3, 3, 3, 3, 5, 10, 10, 30]
- sweep_gap = [0.1, 0.12, 0.05, 0.08, 0.05, 0.1, 0.15, 0.20]
- x_offset = 67
- wg_bend_radius = 5
- else:
- sweep_radius = [30, 30, 30, 30, 30, 30, 30, 30, 30]
- sweep_gap = [0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.60, 0.65]
- x_offset = 67
- wg_bend_radius = 15
- wg_width = 0.5
-
- # Import functions from SiEPIC-Tools, and get technology details
- from SiEPIC.utils import get_layout_variables
- TECHNOLOGY, lv, ly, cell = get_layout_variables()
- dbu = ly.dbu
- if TECHNOLOGY['technology_name'] not in 'EBeam':
- raise Exception ('This example needs to be executed in a layout with Technology = EBeam')
-
- if SiEPIC.__version__ < '0.3.71':
- pya.MessageBox.warning("Errors", "This example requires SiEPIC-Tools version 0.3.71 or greater.", pya.MessageBox.Ok)
-
- # Import functions from SiEPIC-Tools
- from SiEPIC.extend import to_itype
- from SiEPIC.scripts import connect_cell, connect_pins_with_waveguide
-
- # clean all cells within the present cell
- ly.prune_subcells(cell.cell_index(), 10)
-
- # Layer mapping:
- LayerSiN = ly.layer(TECHNOLOGY['Si'])
- fpLayerN = cell.layout().layer(TECHNOLOGY['FloorPlan'])
- TextLayerN = cell.layout().layer(TECHNOLOGY['Text'])
-
- # Draw the floor plan
- cell.shapes(fpLayerN).insert(Box(0,0, 610/dbu, 405/dbu))
-
- # Create a sub-cell for our Ring resonator layout
- top_cell = cell
- cell = cell.layout().create_cell("RingResonator")
- if pol == 'te':
- t = Trans(Trans.R0, 40 / dbu, 12 / dbu)
- else:
- # rotate the layout since EBeam TM grating couplers have an angle that is negative
- t = Trans(Trans.R180, 560 / dbu, 393 / 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("ebeam_gc_%s1550" % 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
-
- # Loop through the parameter sweep
- for i in range(len(sweep_gap)):
-
- # 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_dc2.bbox().right*dbu + gc_length + 1
-
- # get the parameters
- r = sweep_radius[i]
- g = sweep_gap[i]
-
- # Grating couplers, Ports 0, 1, 2, 3 (from the bottom up)
- instGCs = []
- for i in range(0,4):
- t = Trans(Trans.R0, to_itype(x,dbu), i*127/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_1550_device_RingDouble%sr%sg%s" % (pol.upper(), pol.upper(),r,int(round(g*1000))), t)
- text.halign = 1
- cell.shapes(TextLayerN).insert(text).text_size = 5/dbu
-
- # Label for automated measurements, laser on Port 1, detectors on Ports 2, 3
- t = Trans(Trans.R0, to_itype(x,dbu), to_itype(GC_pitch*3,dbu))
- text = Text ("opt_in_%s_1550_device_RingDouble%sr%sg%sB" % (pol.upper(), pol.upper(),r,int(round(g*1000))), t)
- text.halign = 1
- cell.shapes(TextLayerN).insert(text).text_size = 5/dbu
-
- # 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')
-
- # Create paths for waveguides, with the type defined in WAVEGUIDES.xml in the PDK
- waveguide_type='Strip TE 1550 nm, w=500 nm'
-
- # GC1 to bottom-left of ring pin3
- connect_pins_with_waveguide(instGCs[1], 'opt1', inst_dc1, 'pin3', waveguide_type=waveguide_type)
-
- # GC2 to top-left of ring pin1
- connect_pins_with_waveguide(instGCs[2], 'opt1', inst_dc1, 'pin1', waveguide_type=waveguide_type)
-
- # GC0 to top-right of ring
- connect_pins_with_waveguide(instGCs[0], 'opt1', inst_dc2, 'pin1', waveguide_type=waveguide_type)
-
- # GC3 to bottom-right of ring
- connect_pins_with_waveguide(instGCs[3], 'opt1', inst_dc2, 'pin3', waveguide_type=waveguide_type)
-
- # Zoom out
- lv.clear_object_selection()
- lv.zoom_fit()
- lv.max_hier()
-
- # Save a screenshot of the layout:
- dir_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "Test_structures_ring_resonators.png")
- lv.save_screenshot(dir_path)
-
- # Save the layout, without PCell info, for fabrication
- save_options = pya.SaveLayoutOptions()
- save_options.write_context_info=False # remove $$$CONTEXT_INFO$$$
- save_options.format='GDS' # standard format
- save_options.format='OASIS' # smaller file size
- save_options.oasis_compression_level=10
- file_out = os.path.join(os.path.dirname(os.path.realpath(__file__)), "Test_structures_ring_resonators.%s" % save_options.format[0:3])
- print("saving output %s: %s" % (save_options.format, file_out) )
- ly.write(file_out,save_options)
-
-dbl_bus_ring_res()
-
-
diff --git a/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/example_Ring_resonator_sweep.lym b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/example_Ring_resonator_sweep.lym
new file mode 100644
index 00000000..89601279
--- /dev/null
+++ b/klayout_dot_config/tech/EBeam/pymacros/Example_scripted_layouts/example_Ring_resonator_sweep.lym
@@ -0,0 +1,173 @@
+
+
+ Double-bus ring resonator sweep (EBeam)
+
+ pymacros
+
+
+
+ false
+ false
+
+ true
+ Examples_EBeam
+ siepic_menu.exlayout.begin
+ python
+
+ '''
+Scripted layout for ring resonators using SiEPIC-Tools
+in the SiEPIC-EBeam-PDK "EBeam" technology
+
+by Lukas Chrostowski, 2020-2022
+
+'''
+
+from pya import *
+
+# Example layout function
+def dbl_bus_ring_res():
+
+ # 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'
+ if pol == 'te':
+ sweep_radius = [3, 3, 3, 3, 5, 10, 10, 30]
+ sweep_gap = [0.1, 0.12, 0.05, 0.08, 0.05, 0.1, 0.15, 0.20]
+ x_offset = 67
+ wg_bend_radius = 5
+ else:
+ sweep_radius = [30, 30, 30, 30, 30, 30, 30, 30, 30]
+ sweep_gap = [0.25, 0.3, 0.35, 0.4, 0.45, 0.5, 0.55, 0.60, 0.65]
+ x_offset = 67
+ wg_bend_radius = 15
+
+ wg_width = 0.5
+
+ '''
+ Create a new layout using the EBeam technology,
+ with a top cell
+ '''
+ mw = pya.Application().instance().main_window()
+ ly = mw.create_layout('EBeam', 1).layout()
+ cell = ly.create_cell('top')
+ lv = mw.current_view()
+ lv.select_cell(cell.cell_index(), 0)
+ dbu = ly.dbu
+
+ if SiEPIC.__version__ < '0.3.71':
+ pya.MessageBox.warning("Errors", "This example requires SiEPIC-Tools version 0.3.71 or greater.", pya.MessageBox.Ok)
+
+ # Import functions from SiEPIC-Tools
+ from SiEPIC.extend import to_itype
+ from SiEPIC.scripts import connect_cell, connect_pins_with_waveguide
+
+ # Layer mapping:
+ LayerSiN = ly.layer(TECHNOLOGY['Si'])
+ fpLayerN = cell.layout().layer(TECHNOLOGY['FloorPlan'])
+ TextLayerN = cell.layout().layer(TECHNOLOGY['Text'])
+
+ # Draw the floor plan
+ cell.shapes(fpLayerN).insert(Box(0,0, 610/dbu, 405/dbu))
+
+ # Create a sub-cell for our Ring resonator layout
+ top_cell = cell
+ cell = cell.layout().create_cell("RingResonator")
+ if pol == 'te':
+ t = Trans(Trans.R0, 40 / dbu, 12 / dbu)
+ else:
+ # rotate the layout since EBeam TM grating couplers have an angle that is negative
+ t = Trans(Trans.R180, 560 / dbu, 393 / 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("ebeam_gc_%s1550" % 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
+
+ # Loop through the parameter sweep
+ for i in range(len(sweep_gap)):
+
+ # 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_dc2.bbox().right*dbu + gc_length + 1
+
+ # get the parameters
+ r = sweep_radius[i]
+ g = sweep_gap[i]
+
+ # Grating couplers, Ports 0, 1, 2, 3 (from the bottom up)
+ instGCs = []
+ for i in range(0,4):
+ t = Trans(Trans.R0, to_itype(x,dbu), i*127/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_1550_device_RingDouble%sr%sg%s" % (pol.upper(), pol.upper(),r,int(round(g*1000))), t)
+ text.halign = 1
+ cell.shapes(TextLayerN).insert(text).text_size = 5/dbu
+
+ # Label for automated measurements, laser on Port 1, detectors on Ports 2, 3
+ t = Trans(Trans.R0, to_itype(x,dbu), to_itype(GC_pitch*3,dbu))
+ text = Text ("opt_in_%s_1550_device_RingDouble%sr%sg%sB" % (pol.upper(), pol.upper(),r,int(round(g*1000))), t)
+ text.halign = 1
+ cell.shapes(TextLayerN).insert(text).text_size = 5/dbu
+
+ # 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')
+
+ # Create paths for waveguides, with the type defined in WAVEGUIDES.xml in the PDK
+ waveguide_type='Strip TE 1550 nm, w=500 nm'
+
+ # GC1 to bottom-left of ring pin3
+ connect_pins_with_waveguide(instGCs[1], 'opt1', inst_dc1, 'pin3', waveguide_type=waveguide_type)
+
+ # GC2 to top-left of ring pin1
+ connect_pins_with_waveguide(instGCs[2], 'opt1', inst_dc1, 'pin1', waveguide_type=waveguide_type)
+
+ # GC0 to top-right of ring
+ connect_pins_with_waveguide(instGCs[0], 'opt1', inst_dc2, 'pin1', waveguide_type=waveguide_type)
+
+ # GC3 to bottom-right of ring
+ connect_pins_with_waveguide(instGCs[3], 'opt1', inst_dc2, 'pin3', waveguide_type=waveguide_type)
+
+ # Zoom out
+ lv.clear_object_selection()
+ lv.zoom_fit()
+ lv.max_hier()
+
+ # Save a screenshot of the layout:
+ dir_path = os.path.join(os.path.dirname(os.path.realpath(__file__)), "Test_structures_ring_resonators.png")
+ lv.save_screenshot(dir_path)
+
+ # Save the layout, without PCell info, for fabrication
+ save_options = pya.SaveLayoutOptions()
+ save_options.write_context_info=False # remove $$$CONTEXT_INFO$$$
+ save_options.format='GDS' # standard format
+ save_options.format='OASIS' # smaller file size
+ save_options.oasis_compression_level=10
+ file_out = os.path.join(os.path.dirname(os.path.realpath(__file__)), "Test_structures_ring_resonators.%s" % save_options.format[0:3])
+ print("saving output %s: %s" % (save_options.format, file_out) )
+ ly.write(file_out,save_options)
+
+dbl_bus_ring_res()
+
+
diff --git a/klayout_dot_config/tech/EBeam/pymacros/SiEPIC_EBeam_Library.lym b/klayout_dot_config/tech/EBeam/pymacros/SiEPIC_EBeam_Library.lym
index ebc0b92c..4deb0aec 100644
--- a/klayout_dot_config/tech/EBeam/pymacros/SiEPIC_EBeam_Library.lym
+++ b/klayout_dot_config/tech/EBeam/pymacros/SiEPIC_EBeam_Library.lym
@@ -157,7 +157,7 @@ class SiEPIC_EBeam_Library(Library):
print("Initializing '%s' Library." % library)
# Set the description
- self.description = "v0.3.37, Components with models"
+ self.description = "v0.3.39, Components with models"
# Save the path, used for loading WAVEGUIDES.XML
import os
diff --git a/klayout_dot_config/tech/EBeam/pymacros/SiEPIC_EBeam_Library_Beta.lym b/klayout_dot_config/tech/EBeam/pymacros/SiEPIC_EBeam_Library_Beta.lym
index 7b736581..4eebf58d 100644
--- a/klayout_dot_config/tech/EBeam/pymacros/SiEPIC_EBeam_Library_Beta.lym
+++ b/klayout_dot_config/tech/EBeam/pymacros/SiEPIC_EBeam_Library_Beta.lym
@@ -178,7 +178,7 @@ class SiEPIC_EBeam_Library_Beta(Library):
print("Initializing '%s' Library." % library)
# Set the description
- self.description = "v0.3.37, Beta components"
+ self.description = "v0.3.39, Beta components"
# Save the path, used for loading WAVEGUIDES.XML
import os