siepic
siepic#
SiEPIC models compatible with SAX circuits.
This package contains parameterized models of PIC components from the SiEPIC Electron Beam Lithography Process Development Kit (PDK) from the University of British Columbia (UBC), which is licensed under the terms of the MIT License.
See their repository for more details ( https://github.com/SiEPIC/SiEPIC_EBeam_PDK).
Usage:
from simphony.libraries import siepic
wg = siepic.waveguide()
- bidirectional_coupler(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, thickness: float = 220, width: float = 500) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']] [source]
SiEPIC EBeam PDK bidirectional coupler model.
A bidirectional coupler optimized for TE polarized light at 1550nm.
The bidirectional coupler has 4 ports, labeled as pictured. Its efficiently splits light that is input from one port into the two outputs on the opposite side (with a corresponding pi/2 phase shift). Additionally, it efficiently interferes lights from two adjacent inputs, efficiently splitting the interfered signal between the two ports on the opposing side.
- Parameters
thickness (float, optional) – Waveguide thickness, in nanometers (default 220). Valid values are 210, 220, or 230 nanometers.
width (float, optional) – Waveguide width, in nanometers (default 500). Valid values are 480, 500, or 520 nanometers.
Notes
See also the PDK documentation: https://github.com/SiEPIC/SiEPIC_EBeam_PDK/blob/master/Documentation/SiEPIC_EBeam_PDK%20-%20Components%20with%20Models.docx
- directional_coupler(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, gap: float = 200, coupling_length: float = 10.0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']] [source]
A directional coupler optimized for TE polarized light at 1550nm.
The directional coupler has 4 ports, labeled as pictured. Its efficiently splits light that is input from one port into the two outputs on the opposite side (with a corresponding pi/2 phase shift). Additionally, it efficiently interferes lights from two adjacent inputs, efficiently splitting the interfered signal between the two ports on the opposing side.
- Parameters
gap (float, optional) – Coupling gap distance, in nanometers (default 200).
coupling_length (float, optional) – Length of coupler, in microns (default 10).
Notes
Sorted matrix of valid parameter combinations for directional couplers:
gap
coupling_length
200
0
200
2.5
200
5
200
7.5
200
10
200
12.5
200
15
200
17.5
200
20
200
22.5
200
25
200
27.5
200
30
200
32.5
200
35
200
37.5
200
40
200
42.5
200
45
200
47.5
- grating_coupler(wl: Union[float, jax.Array] = 1.55, pol: Literal['te', 'tm'] = 'te', thickness: float = 220.0, dwidth: float = 0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']] [source]
SiEPIC EBeam PDK grating coupler optimized for TE polarizations at 1550nm.
The grating coupler efficiently couples light from a fiber array positioned above the chip into the circuit. For the TE mode, the angle is -25 degrees [needs citation].
- Parameters
wl (float or Array) – The wavelengths to evaluate at in microns.
pol ({"te", "tm"}) – Polarization of the input/output modes.
thickness ({210.0, 220.0, 230.0}) – Thickness of the grating coupler silicon in nm. Useful for simulating manufacturing variability.
dwidth ({-20.0, 0.0, 20.0}) – Change in width from nominal of the gratings. Representative of manufacturing variability. Must be one of -20, 0, or 20.
- Raises
ValueError – If pol is not ‘te’ or ‘tm’.
ValueError – If thickness is not one of 210, 220, or 230.
ValueError – If dwidth is not one of -20, 0, or 20.
Notes
See also the PDK documentation: https://github.com/SiEPIC/SiEPIC_EBeam_PDK/blob/master/Documentation/SiEPIC_EBeam_PDK%20-%20Components%20with%20Models.docx
- half_ring(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, pol: Literal['te', 'tm'] = 'te', gap: float = 50, radius: float = 5, width: float = 500, thickness: float = 220, coupling_length: float = 0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']] [source]
A half-ring resonator optimized for TE polarized light at 1550nm.
The halfring has 4 ports, labeled as pictured.
- Parameters
pol (str, optional) – Polarization of the halfring. Must be either ‘te’ (default) or ‘tm’.
gap (float, optional) – Coupling distance between ring and straight waveguide in nanometers (default 50).
radius (float, optional) – Ring radius in microns (default 5).
width (float, optional) – Waveguide width in nanometers (default 500).
thickness (float, optional) – Waveguide thickness in nanometers (default 220).
coupling_length (float, optional) – Length of the straight segment of the directional coupling edge, turns ring into a racetrack resonator, in microns (default 0).
Notes
Sorted matrix of valid parameter combinations for half rings:
pol
coupling_length
width
thickness
radius
gap
te
0
480
210
3
70
te
0
480
210
3
80
te
0
480
210
3
100
te
0
480
210
3
120
te
0
480
210
5
70
te
0
480
210
5
80
te
0
480
210
5
120
te
0
480
210
10
120
te
0
480
210
10
170
te
0
480
230
3
70
te
0
480
230
3
80
te
0
480
230
3
100
te
0
480
230
3
120
te
0
480
230
5
70
te
0
480
230
5
80
te
0
480
230
5
120
te
0
480
230
10
120
te
0
480
230
10
170
te
0
500
220
3
50
te
0
500
220
3
60
te
0
500
220
3
80
te
0
500
220
3
100
te
0
500
220
5
50
te
0
500
220
5
60
te
0
500
220
5
100
te
0
500
220
10
100
te
0
500
220
10
150
te
0
500
220
18
200
te
0
520
210
3
30
te
0
520
210
3
40
te
0
520
210
3
60
te
0
520
210
3
80
te
0
520
210
5
30
te
0
520
210
5
40
te
0
520
210
5
80
te
0
520
210
10
80
te
0
520
210
10
130
te
0
520
230
3
30
te
0
520
230
3
40
te
0
520
230
3
60
te
0
520
230
3
80
te
0
520
230
5
30
te
0
520
230
5
40
te
0
520
230
5
80
te
0
520
230
10
80
te
0
520
230
10
130
te
4
500
220
10
200
tm
0
480
210
5
320
tm
0
480
230
5
320
tm
0
500
220
5
300
tm
0
520
210
5
280
tm
0
520
230
5
280
- taper(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, w1: float = 0.5, w2: float = 1.0, length: float = 10.0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']] [source]
A taper component that adiabatically transitions between two waveguide widths.
This taper is simulated for TE operation at 1550 nanometers.
- Parameters
w1 (float, optional) – Width of the input waveguide in microns (default 0.5).
w2 (float, optional) – Width of the output waveguide in microns (default 1).
length (float, optional) – Length of the taper in microns (default 10).
Notes
Sorted matrix of valid parameter combinations for adiabatic tapers:
w1
w2
length
0.4
1
1
0.4
1
2
0.4
1
3
0.4
1
4
0.4
1
5
0.4
1
6
0.4
1
7
0.4
1
8
0.4
1
9
0.4
1
10
0.4
1
11
0.4
1
12
0.4
1
13
0.4
1
14
0.4
1
15
0.4
1
16
0.4
1
17
0.4
1
18
0.4
1
19
0.4
1
20
0.4
2
1
0.4
2
2
0.4
2
3
0.4
2
4
0.4
2
5
0.4
2
6
0.4
2
7
0.4
2
8
0.4
2
9
0.4
2
10
0.4
2
11
0.4
2
12
0.4
2
13
0.4
2
14
0.4
2
15
0.4
2
16
0.4
2
17
0.4
2
18
0.4
2
19
0.4
2
20
0.4
3
1
0.4
3
2
0.4
3
3
0.4
3
4
0.4
3
5
0.4
3
6
0.4
3
7
0.4
3
8
0.4
3
9
0.4
3
10
0.4
3
11
0.4
3
12
0.4
3
13
0.4
3
14
0.4
3
15
0.4
3
16
0.4
3
17
0.4
3
18
0.4
3
19
0.4
3
20
0.5
1
1
0.5
1
2
0.5
1
3
0.5
1
4
0.5
1
5
0.5
1
6
0.5
1
7
0.5
1
8
0.5
1
9
0.5
1
10
0.5
1
11
0.5
1
12
0.5
1
13
0.5
1
14
0.5
1
15
0.5
1
16
0.5
1
17
0.5
1
18
0.5
1
19
0.5
1
20
0.5
2
1
0.5
2
2
0.5
2
3
0.5
2
4
0.5
2
5
0.5
2
6
0.5
2
7
0.5
2
8
0.5
2
9
0.5
2
10
0.5
2
11
0.5
2
12
0.5
2
13
0.5
2
14
0.5
2
15
0.5
2
16
0.5
2
17
0.5
2
18
0.5
2
19
0.5
2
20
0.5
3
1
0.5
3
2
0.5
3
3
0.5
3
4
0.5
3
5
0.5
3
6
0.5
3
7
0.5
3
8
0.5
3
9
0.5
3
10
0.5
3
11
0.5
3
12
0.5
3
13
0.5
3
14
0.5
3
15
0.5
3
16
0.5
3
17
0.5
3
18
0.5
3
19
0.5
3
20
0.6
1
1
0.6
1
2
0.6
1
3
0.6
1
4
0.6
1
5
0.6
1
6
0.6
1
7
0.6
1
8
0.6
1
9
0.6
1
10
0.6
1
11
0.6
1
12
0.6
1
13
0.6
1
14
0.6
1
15
0.6
1
16
0.6
1
17
0.6
1
18
0.6
1
19
0.6
1
20
0.6
2
1
0.6
2
2
0.6
2
3
0.6
2
4
0.6
2
5
0.6
2
6
0.6
2
7
0.6
2
8
0.6
2
9
0.6
2
10
0.6
2
11
0.6
2
12
0.6
2
13
0.6
2
14
0.6
2
15
0.6
2
16
0.6
2
17
0.6
2
18
0.6
2
19
0.6
2
20
0.6
3
1
0.6
3
2
0.6
3
3
0.6
3
4
0.6
3
5
0.6
3
6
0.6
3
7
0.6
3
8
0.6
3
9
0.6
3
10
0.6
3
11
0.6
3
12
0.6
3
13
0.6
3
14
0.6
3
15
0.6
3
16
0.6
3
17
0.6
3
18
0.6
3
19
0.6
3
20
- terminator(wl: Union[float, jax.Array, numpy.ndarray, numpy.bool_, numpy.number, bool, int, complex] = 1.55, pol: Literal['te', 'tm'] = 'te') Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']] [source]
A terminator component that dissipates light into free space optimized for TE polarized light at 1550 nanometers.
The terminator dissipates excess light into free space. If you have a path where the light doesn’t need to be measured but you don’t want it reflecting back into the circuit, you can use a terminator to release it from the circuit.
- Parameters
pol (str, optional) – Polarization of the grating coupler. Must be either ‘te’ (default) or ‘tm’.
- waveguide(wl: Union[float, jax.Array] = 1.55, pol: Literal['te', 'tm'] = 'te', length: float = 0.0, width: float = 500.0, height: float = 220.0, loss: float = 0.0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']] [source]
Model for an waveguide optimized for TE polarized light at 1550 nanometers.
A waveguide easily connects other optical components within a circuit.
- Parameters
pol (str, optional) – Polarization of the grating coupler. Must be either ‘te’ (default) or ‘tm’.
length (float, optional) – Waveguide length in microns (default 0).
width (float, optional) – Waveguide width in nanometers (default 500).
height (float, optional) – Waveguide height in nanometers (default 220).
loss (float, optional) – Loss of the waveguide in dB/cm (default 0).
sigma_ne (float, optional) – Standard deviation of the effective index for monte carlo simulations (default 0.05).
sigma_ng (float, optional) – Standard deviation of the group velocity for monte carlo simulations (default 0.05).
sigma_nd (float, optional) – Standard deviation of the group dispersion for monte carlo simulations (default 0.0001).
Notes
The sigma_ values in the parameters are used for monte carlo simulations.
Sorted matrix of valid parameter combinations for waveguides:
height
width
210
400
210
420
210
440
210
460
210
480
210
500
210
520
210
540
210
560
210
580
210
600
210
640
210
680
210
720
210
760
210
800
210
840
210
880
210
920
210
960
210
1000
210
1040
210
1080
210
1120
210
1160
210
1200
210
1240
210
1280
210
1320
210
1360
210
1400
210
1500
210
1600
210
1700
210
1800
210
1900
210
2000
210
2100
210
2200
210
2300
210
2400
210
2500
210
2600
210
2700
210
2800
210
2900
210
3000
210
3100
210
3200
210
3300
210
3400
210
3500
220
400
220
420
220
440
220
460
220
480
220
500
220
520
220
540
220
560
220
580
220
600
220
640
220
680
220
720
220
760
220
800
220
840
220
880
220
920
220
960
220
1000
220
1040
220
1080
220
1120
220
1160
220
1200
220
1240
220
1280
220
1320
220
1360
220
1400
220
1500
220
1600
220
1700
220
1800
220
1900
220
2000
220
2100
220
2200
220
2300
220
2400
220
2500
220
2600
220
2700
220
2800
220
2900
220
3000
220
3100
220
3200
220
3300
220
3400
220
3500
230
400
230
420
230
440
230
460
230
480
230
500
230
520
230
540
230
560
230
580
230
600
230
640
230
680
230
720
230
760
230
800
230
840
230
880
230
920
230
960
230
1000
230
1040
230
1080
230
1120
230
1160
230
1200
230
1240
230
1280
230
1320
230
1360
230
1400
230
1500
230
1600
230
1700
230
1800
230
1900
230
2000
230
2100
230
2200
230
2300
230
2400
230
2500
230
2600
230
2700
230
2800
230
2900
230
3000
230
3100
230
3200
230
3300
230
3400
230
3500
- y_branch(wl: Union[float, jax.Array] = 1.55, pol: Literal['te', 'tm'] = 'te', thickness: float = 220.0, width: float = 500.0) Dict[Tuple[str, str], jaxtyping.Complex[Array, '...']] [source]
SiEPIC EBeam PDK Y-branch model.
A y-branch efficiently splits the input 50/50 between the two outputs. It can also be used as a combiner if used in the opposite direction, combining and interfering the light from two inputs into the one output.
- Parameters
pol (str, optional) – Polarization of the y-branch. Must be either ‘te’ (default) or ‘tm’.
thickness (float, optional) – Waveguide thickness, in nanometers (default 220). Valid values are 210, 220, or 230 nanometers. Useful for simulating manufacturing variability.
width (float, optional) – Waveguide width, in nanometers (default 500 nanometers). Valid values are 480, 500, or 520 nanometers.
Notes
See also the PDK documentation: https://github.com/SiEPIC/SiEPIC_EBeam_PDK/blob/master/Documentation/SiEPIC_EBeam_PDK%20-%20Components%20with%20Models.docx