Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: SiEPIC/SiEPIC_EBeam_PDK
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: v0.4.30
Choose a base ref
...
head repository: SiEPIC/SiEPIC_EBeam_PDK
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: master
Choose a head ref
Loading
Showing with 254 additions and 76 deletions.
  1. BIN Lumerical_EBeam_CML/EBeam/ebeam_wg_integral_1310.ice
  2. +1 −0 Lumerical_EBeam_CML/EBeam/source_data/wg_integral_source_1310/WaveGuideTETMStrip,w=350,h=220.txt
  3. +1 −0 Lumerical_EBeam_CML/EBeam/source_data/wg_integral_source_1310/WaveGuideTETMStrip,w=410,h=220.txt
  4. +22 −0 Lumerical_EBeam_CML/EBeam/source_data/wg_integral_source_1310/wg_strip_lookup_table.xml
  5. +4 −0 docs/components/ebeam/ebeam_terminator/ebeam_terminator.md
  6. +5 −3 docs/components/ebeam/y_branch/y_branch.md
  7. BIN klayout/EBeam/CML/EBeam/ebeam_terminator_te1310.ice
  8. BIN klayout/EBeam/CML/EBeam/ebeam_wg_integral_1310.ice
  9. BIN klayout/EBeam/CML/EBeam/ebeam_y_1310.ice
  10. +1 −0 klayout/EBeam/CML/EBeam/source_data/wg_integral_source_1310/WaveGuideTETMStrip,w=350,h=220.txt
  11. +1 −0 klayout/EBeam/CML/EBeam/source_data/wg_integral_source_1310/WaveGuideTETMStrip,w=410,h=220.txt
  12. +21 −0 klayout/EBeam/CML/EBeam/source_data/wg_integral_source_1310/wg_strip_lookup_table.xml
  13. BIN klayout/EBeam/gds/EBeam/ebeam_terminator_te1310.gds
  14. BIN klayout/EBeam/gds/{EBeam_Beta → EBeam}/ebeam_y_1310.gds
  15. BIN klayout/EBeam/gds/EBeam_Dream/ebeam_dream_FaML_Si_1310_BB.gds
  16. BIN klayout/EBeam/gds/EBeam_Dream/ebeam_dream_FaML_Si_1550_BB.gds
  17. +6 −1 klayout/EBeam/pymacros/__init__.py
  18. +1 −1 klayout/EBeam/pymacros/pcells_EBeam/ebeam_bragg_te1550.py
  19. +1 −1 klayout/EBeam/pymacros/pcells_EBeam_Beta/ebeam_bragg_te1310.py
  20. +130 −66 klayout/EBeam/pymacros/pcells_EBeam_Beta/strip_to_slot.py
  21. +56 −0 klayout/EBeam/pymacros/tests/test_opics.py
  22. +2 −2 klayout/grain.xml
  23. +2 −2 klayout/pyproject.toml
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1.31e-06 2.430388 2.008044 4.498272 4.614749 0.00027334 -0.00608115
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1.31e-06 2.580393 2.084761 4.335297 4.675645 0.00031395 0.00597966
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<lumerical_lookup_table version="1.0" name = "index_table">
<association>
<design>
<value name="height" type="double">3.5e-07</value>
<value name="width" type="double">2.2e-07</value>
</design>
<extracted>
<value name="neff_ng" type="string">WaveGuideTETMStrip,w=350,h=220.txt</value>
</extracted>
</association>

<association>
<design>
<value name="height" type="double">4.1e-07</value>
<value name="width" type="double">2.2e-07</value>
</design>
<extracted>
<value name="neff_ng" type="string">WaveGuideTETMStrip,w=410,h=220.txt</value>
</extracted>
</association>
</lumerical_lookup_table>
4 changes: 4 additions & 0 deletions docs/components/ebeam/ebeam_terminator/ebeam_terminator.md
Original file line number Diff line number Diff line change
@@ -16,6 +16,7 @@ unused ports on components to avoid reflections, refer to Disconnected Waveguide
*Fig. 1: Layout of waveguide terminators*

## Compact Model Information

![alt text](imgs/cml.png)

*Fig. 2: Compact Model*
@@ -33,3 +34,6 @@ unused ports on components to avoid reflections, refer to Disconnected Waveguide
- 3D-FDTD (Lumerical FDTD Solutions)
- Eigenmode expansion propagator (MODE Solutions)

- ebeam_terminator_te1550: Simulated using 3D-FDTD
- ebeam_terminator_te1310: estimated reflection set at -30 dB

8 changes: 5 additions & 3 deletions docs/components/ebeam/y_branch/y_branch.md
Original file line number Diff line number Diff line change
@@ -3,7 +3,7 @@
## Component Name

- ebeam_y_1550
- ebeam_y_1310 (EBeam_Beta)
- ebeam_y_1310

## Description

@@ -24,8 +24,10 @@ device were taken from the journal paper below, and implemented in EBeam lithogr

- Support for TE polarization
- Operating at 1550 nm wavelength
- Performance:
- Excess Loss is < 1 dB
- Performance:
- Excess Loss is < 1 dB
- Operating at 1310 nm wavelength: model excess loss set at 0.2 dB, with no back reflections


## Parameters

Binary file not shown.
Binary file not shown.
Binary file added klayout/EBeam/CML/EBeam/ebeam_y_1310.ice
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1.31e-06 2.430388 2.008044 4.498272 4.614749 0.00027334 -0.00608115
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
1.31e-06 2.580393 2.084761 4.335297 4.675645 0.00031395 0.00597966
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<lumerical_lookup_table version="1.0" name = "index_table">
<association>
<design>
<value name="height" type="double">3.5e-07</value>
<value name="width" type="double">2.2e-07</value>
</design>
<extracted>
<value name="neff_ng" type="string">WaveGuideTETMStrip,w=350,h=220.txt</value>
</extracted>
</association>
<association>
<design>
<value name="height" type="double">4.1e-07</value>
<value name="width" type="double">2.2e-07</value>
</design>
<extracted>
<value name="neff_ng" type="string">WaveGuideTETMStrip,w=410,h=220.txt</value>
</extracted>
</association>
</lumerical_lookup_table>
Binary file modified klayout/EBeam/gds/EBeam/ebeam_terminator_te1310.gds
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
7 changes: 6 additions & 1 deletion klayout/EBeam/pymacros/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# $autorun

version = "0.4.30"
version = "0.4.34"

print('SiEPIC-EBeam-PDK Python module: pymacros, v%s' % version)

@@ -19,3 +19,8 @@
load_klayout_library(tech, 'EBeam-ANT', "v%s, ANT components" % version, 'gds/ANT','', verbose=verbose)


# Load OPICS simulation library
import sys, os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
import opics_ebeam

2 changes: 1 addition & 1 deletion klayout/EBeam/pymacros/pcells_EBeam/ebeam_bragg_te1550.py
Original file line number Diff line number Diff line change
@@ -22,7 +22,7 @@ def __init__(self):
self.param(
"grating_period", self.TypeDouble, "Grating period (microns)", default=0.317
)
self.param("fill_factor", self.TypeDouble, "Grating fill factor", default=0.5)
# self.param("fill_factor", self.TypeDouble, "Grating fill factor", default=0.5)
self.param(
"corrugation_width",
self.TypeDouble,
Original file line number Diff line number Diff line change
@@ -22,7 +22,7 @@ def __init__(self):
self.param(
"grating_period", self.TypeDouble, "Grating period (microns)", default=0.270
)
self.param("fill_factor", self.TypeDouble, "Grating fill factor", default=0.35)
# self.param("fill_factor", self.TypeDouble, "Grating fill factor", default=0.35)
self.param(
"corrugation_width",
self.TypeDouble,
196 changes: 130 additions & 66 deletions klayout/EBeam/pymacros/pcells_EBeam_Beta/strip_to_slot.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,26 @@
import pya
from SiEPIC.utils import get_technology_by_name
from pya import *


class strip_to_slot(pya.PCellDeclarationHelper):
import os
from pya import (
PCellDeclarationHelper,
Point,
DPoint,
Path,
Polygon,
Text,
Box,
LayerInfo,
Trans,
CellInstArray,
Library,
)
from math import pi, acos, sqrt
from SiEPIC.extend import to_itype
from SiEPIC.utils import arc_wg_xy, get_technology_by_name
from SiEPIC.utils.layout import new_layout
from SiEPIC.scripts import zoom_out
from SiEPIC._globals import PIN_LENGTH as pin_length, Python_Env


class strip_to_slot(PCellDeclarationHelper):
"""
The PCell declaration for the strip_to_slot.
draft by Lukas Chrostowski july 24, 2017
@@ -13,12 +30,16 @@ class strip_to_slot(pya.PCellDeclarationHelper):
updated by Lukas Chrostowski, 2021/12
- reduce the curved waveguide section, longer device for lower loss
- simulated using EME to give 99% efficiency
updated by Mustafa Hammood, 2025/02
- refactored redundant code, added in-cell execution
- added optional theta for slot curve (via *radius*)
"""

def __init__(self):
super(strip_to_slot, self).__init__()
TECHNOLOGY = get_technology_by_name("EBeam")
# declare the parameters
# declare parameters
self.param("silayer", self.TypeLayer, "Si Layer", default=TECHNOLOGY["Si"])
self.param("r", self.TypeDouble, "Radius", default=15)
self.param("w", self.TypeDouble, "Waveguide Width", default=0.5)
@@ -38,95 +59,138 @@ def __init__(self):
self.param("textl", self.TypeLayer, "Text Layer", default=LayerInfo(10, 0))

def display_text_impl(self):
# Provide a descriptive text for the cell
return (
"Strip_To_Slot(rails="
+ ("%.3f" % self.rails)
+ ",slot="
+ ("%g" % (self.slot))
+ ", slot="
+ ("%g" % self.slot)
+ ")"
)

def can_create_from_shape_impl(self):
return False

def produce_impl(self):
# This is the main part of the implementation: create the layout

from SiEPIC.extend import to_itype
from SiEPIC.utils import arc_wg_xy

# fetch the parameters
dbu = self.layout.dbu
ly = self.layout
cell = self.cell
shapes = self.cell.shapes

LayerSi = self.silayer
LayerSiN = ly.layer(LayerSi)
LayerSiN = ly.layer(self.silayer)
LayerPinRecN = ly.layer(self.pinrec)
LayerDevRecN = ly.layer(self.devrec)

# Use to_itype() to prevent rounding errors
# Convert parameters to internal units
w = to_itype(self.w, dbu)
r = to_itype(self.r, dbu)
slot = to_itype(self.slot, dbu)
rails = to_itype(self.rails, dbu)
taper = to_itype(self.taper, dbu)
# draw the quarter-circle
wt = to_itype(self.wt, dbu)
offset = to_itype(self.offset, dbu)

# Draw the **curved arc** for the slot converter
x = 0
y = r + rails / 2 + w + slot
theta = (acos((r - offset) / r) / (2 * pi)) * 360
arc_width = sqrt(r**2 - (r - offset) ** 2)
self.cell.shapes(LayerSiN).insert(
arc_wg_xy(x, y, r + rails / 2 - wt / 2, wt, 270, 270 + theta)
)

t = Trans(Trans.R0, x, y)
# self.cell.shapes(LayerSiN).insert(Path(arc(r, 270, 360), rails).transformed(t).simple_polygon())
self.cell.shapes(LayerSiN).insert(arc_wg_xy(x, y, r, rails, 270, 360))
# **Taper polygon**
pts = [
Point.from_dpoint(DPoint(0, w)),
Point.from_dpoint(DPoint(0, 0)),
Point.from_dpoint(DPoint(-taper, w - rails)),
Point.from_dpoint(DPoint(-taper, w)),
]
shapes(LayerSiN).insert(Polygon(pts))

# **Top left half waveguide** (slot side)
wg1 = Polygon(
[
Point.from_dpoint(DPoint(-taper, w + slot)),
Point.from_dpoint(DPoint(-taper, w + slot + rails)),
Point.from_dpoint(DPoint(0, w + slot + wt)),
Point.from_dpoint(DPoint(0, w + slot)),
]
)
shapes(LayerSiN).insert(wg1)

pts = []
pts.append(Point.from_dpoint(DPoint(0, w)))
pts.append(Point.from_dpoint(DPoint(0, 0)))
pts.append(Point.from_dpoint(DPoint(-taper, w - rails)))
pts.append(Point.from_dpoint(DPoint(-taper, w)))
polygon = Polygon(pts)
shapes(LayerSiN).insert(polygon)
# **Bus waveguide**
wg2 = Box(0, 0, arc_width + wt, w)
shapes(LayerSiN).insert(wg2)

# **Pins**
pin_path1 = Path(
[
Point(-taper + pin_length, w + slot / 2),
Point(-taper - pin_length, w + slot / 2),
],
2 * rails + slot,
)
shapes(LayerPinRecN).insert(pin_path1)
text1 = Text("opt1", Trans(Trans.R0, -taper, w))
text1.text_size = 0.5 / dbu
shapes(LayerPinRecN).insert(text1)

pin_path2 = Path(
[
Point(arc_width + wt - pin_length, w / 2),
Point(arc_width + wt + pin_length, w / 2),
],
w,
)
shapes(LayerPinRecN).insert(pin_path2)
text2 = Text("opt2", Trans(Trans.R0, arc_width + wt, w / 2))
text2.text_size = 0.5 / dbu
shapes(LayerPinRecN).insert(text2)

# Create the top left 1/2 waveguide
wg1 = Box(-taper, w + slot, 0, w + rails + slot)
shapes(LayerSiN).insert(wg1)
# **Device recognition layer**
dev = Box(-taper, -w / 2 - w, arc_width + wt, y - r + offset)
shapes(LayerDevRecN).insert(dev)

from SiEPIC.utils import arc_wg_xy

# Create the waveguide
wg1 = Box(0, 0, r + w, w)
shapes(LayerSiN).insert(wg1)
class test_lib(Library):
def __init__(self):
tech = "EBeam"
library = tech + "test_lib"
self.technology = tech
self.layout().register_pcell("strip_to_slot", strip_to_slot())
self.register(library)

# Pin on the slot waveguide side:
shapes(LayerPinRecN).insert(
pya.Path(
[
pya.Point(-taper + 0.05 / dbu, w + slot / 2),
pya.Point(-taper - 0.05 / dbu, w + slot / 2),
],
2 * rails + slot,
)
)
shapes(LayerPinRecN).insert(
pya.Text("opt1", pya.Trans(pya.Trans.R0, -taper, w))
).text_size = 0.5 / dbu

# Pin on the bus waveguide side:
shapes(LayerPinRecN).insert(
pya.Path(
[
pya.Point(r + w - 0.05 / dbu, w / 2),
pya.Point(r + w + 0.05 / dbu, w / 2),
],
w,
)

if __name__ == "__main__":
print("Test layout for: Strip to Slot")

if Python_Env == "Script":
# For external Python mode, when installed using pip install siepic_ebeam_pdk
import siepic_ebeam_pdk

# load the test library, and technology
t = test_lib()
tech = t.technology

# Create a new layout for the chip floor plan
topcell, ly = new_layout(tech, "test", GUI=True, overwrite=True)

# instantiate the cell
library = tech + "test_lib"

# Create a strip_to_slot PCell
pcell = ly.create_cell("strip_to_slot", library, {})
t = Trans(Trans.R0, 0, 0)
topcell.insert(CellInstArray(pcell.cell_index(), t))

# Display the layout in KLayout, using KLayout Package "klive", which needs to be installed in the KLayout Application
if Python_Env == "Script":
from SiEPIC.scripts import export_layout

path = os.path.dirname(os.path.realpath(__file__))
file_out = export_layout(
topcell, path, filename="strip_to_slot", relative_path="", format="oas"
)
shapes(LayerPinRecN).insert(
pya.Text("opt2", pya.Trans(pya.Trans.R0, r + w, w / 2))
).text_size = 0.5 / dbu
from SiEPIC.utils import klive

# Create the device recognition layer -- make it 1 * wg_width away from the waveguides.
dev = Box(-taper, -w / 2 - w, r + w, y)
shapes(LayerDevRecN).insert(dev)
klive.show(file_out, technology=tech)
Loading