Cells Si SOI 500nm¶
array¶
An array of components.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
component
|
the component of which to create an array |
'pad'
|
|
columns
|
int
|
the number of components to place in the x-direction |
6
|
rows
|
int
|
the number of components to place in the y-direction |
1
|
add_ports
|
bool
|
add ports to the component |
True
|
size
|
Optional x, y size. Overrides columns and rows. |
None
|
|
centered
|
bool
|
center the array around the origin. |
False
|
row_pitch
|
float
|
the pitch between rows. |
150
|
column_pitch
|
float
|
the pitch between columns. |
150
|
:noindex:

import cspdk
c = cspdk.si500.cells.array(component='pad', columns=6, rows=1, add_ports=True, centered=False, column_pitch=150, row_pitch=150).copy()
c.draw_ports()
c.plot()
bend_euler¶
An euler bend.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
radius
|
float | None
|
the effective radius of the bend. |
None
|
angle
|
float
|
the angle of the bend (usually 90 degrees). |
90.0
|
p
|
float
|
the fraction of the bend that's represented by a polar bend. |
0.5
|
width
|
float | None
|
the width of the waveguide forming the bend. |
None
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
:noindex:

import cspdk
c = cspdk.si500.cells.bend_euler(angle=90, p=0.5, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
bend_euler_rc¶
:noindex:

import cspdk
c = cspdk.si500.cells.bend_euler_rc(angle=90, p=0.5, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
bend_euler_ro¶
:noindex:

import cspdk
c = cspdk.si500.cells.bend_euler_ro(angle=90, p=0.5, cross_section='xs_ro').copy()
c.draw_ports()
c.plot()
bend_s¶
An S-bend.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
tuple[float, float]
|
the width and height of the s-bend. |
(20.0, 1.8)
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
allow_min_radius_violation
|
bool
|
if True, allows the s-bend to have a smaller radius than the minimum radius. |
True
|
:noindex:

import cspdk
c = cspdk.si500.cells.bend_s(size=(20, 1.8), cross_section='xs_rc', allow_min_radius_violation=True).copy()
c.draw_ports()
c.plot()
compass¶
Rectangle with ports on each edge (north, south, east, and west).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
Size
|
rectangle size. |
(4.0, 2.0)
|
layer
|
LayerSpec
|
tuple (int, int). |
'PAD'
|
port_type
|
str | None
|
optical, electrical. |
'electrical'
|
port_inclusion
|
float
|
from edge. |
0.0
|
port_orientations
|
Ints | None
|
list of port_orientations to add. None does not add ports. |
(180, 90, 0, -90)
|
auto_rename_ports
|
bool
|
auto rename ports. |
True
|
:noindex:

import cspdk
c = cspdk.si500.cells.compass(size=(4, 2), layer='PAD', port_type='electrical', port_inclusion=0, port_orientations=(180, 90, 0, -90), auto_rename_ports=True).copy()
c.draw_ports()
c.plot()
coupler¶
A coupler.
a coupler is a 2x2 splitter
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
gap
|
float
|
the gap between the waveguides forming the straight part of the coupler. |
0.236
|
length
|
float
|
the length of the coupler. |
20.0
|
dy
|
float
|
the height of the s-bend. |
4.0
|
dx
|
float
|
the length of the s-bend. |
15.0
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
:noindex:

import cspdk
c = cspdk.si500.cells.coupler(gap=0.236, length=20, dy=4, dx=15, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
coupler_rc¶
:noindex:

import cspdk
c = cspdk.si500.cells.coupler_rc(gap=0.236, length=20, dy=4, dx=15, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
coupler_ro¶
:noindex:

import cspdk
c = cspdk.si500.cells.coupler_ro(gap=0.236, length=20, dy=4, dx=15, cross_section='xs_ro').copy()
c.draw_ports()
c.plot()
coupler_straight¶
The straight part of a coupler.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
the length of the straight part of the coupler. |
20.0
|
gap
|
float
|
the gap between the waveguides forming the straight part of the coupler. |
0.236
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
:noindex:

import cspdk
c = cspdk.si500.cells.coupler_straight(length=20, gap=0.236, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
die¶
A die template.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cross_section
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
:noindex:

die_rc¶
:noindex:

die_ro¶
:noindex:

grating_coupler_array¶
An array of grating couplers.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
pitch
|
float
|
the pitch of the grating couplers |
127.0
|
n
|
int
|
the number of grating couplers |
6
|
centered
|
if True, centers the array around the origin. |
True
|
|
grating_coupler
|
the name of the grating coupler to use in the array. |
None
|
|
port_name
|
port name |
'o1'
|
|
with_loopback
|
if True, adds a loopback between edge GCs. Only works for rotation = 90 for now. |
False
|
|
rotation
|
rotation angle for each reference. |
-90
|
|
straight_to_grating_spacing
|
spacing between the last grating coupler and the loopback. |
10.0
|
|
cross_section
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
|
radius
|
float | None
|
optional radius for routing the loopback. |
None
|
:noindex:

import cspdk
c = cspdk.si500.cells.grating_coupler_array(pitch=127, n=6, cross_section='xs_rc', centered=True, port_name='o1', with_loopback=False, rotation=-90, straight_to_grating_spacing=10).copy()
c.draw_ports()
c.plot()
grating_coupler_elliptical¶
A grating coupler with curved but parallel teeth.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
wavelength
|
float
|
the center wavelength for which the grating is designed. |
1.55
|
grating_line_width
|
the line width of the grating. |
0.315
|
|
cross_section
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
:noindex:

import cspdk
c = cspdk.si500.cells.grating_coupler_elliptical(wavelength=1.55, grating_line_width=0.315, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
grating_coupler_elliptical_rc¶
:noindex:

import cspdk
c = cspdk.si500.cells.grating_coupler_elliptical_rc(wavelength=1.55, grating_line_width=0.315, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
grating_coupler_elliptical_ro¶
:noindex:

import cspdk
c = cspdk.si500.cells.grating_coupler_elliptical_ro(wavelength=1.31, grating_line_width=0.25, cross_section='xs_ro').copy()
c.draw_ports()
c.plot()
grating_coupler_rectangular¶
A grating coupler with straight and parallel teeth.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
period
|
the period of the grating. |
0.57
|
|
n_periods
|
int
|
the number of grating teeth. |
60
|
length_taper
|
float
|
the length of the taper tapering up to the grating. |
350.0
|
wavelength
|
float
|
the center wavelength for which the grating is designed. |
1.55
|
cross_section
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
:noindex:

import cspdk
c = cspdk.si500.cells.grating_coupler_rectangular(period=0.57, n_periods=60, length_taper=350, wavelength=1.55, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
grating_coupler_rectangular_rc¶
:noindex:

import cspdk
c = cspdk.si500.cells.grating_coupler_rectangular_rc(period=0.57, n_periods=60, length_taper=350, wavelength=1.55, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
grating_coupler_rectangular_ro¶
:noindex:

import cspdk
c = cspdk.si500.cells.grating_coupler_rectangular_ro(period=0.57, n_periods=60, length_taper=350, wavelength=1.55, cross_section='xs_ro').copy()
c.draw_ports()
c.plot()
mmi1x2¶
An mmi1x2.
An mmi1x2 is a splitter that splits a single input to two outputs
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
width
|
float | None
|
the width of the waveguides connecting at the mmi ports. |
None
|
width_taper
|
the width at the base of the mmi body. |
1.5
|
|
length_taper
|
the length of the tapers going towards the mmi body. |
20.0
|
|
length_mmi
|
float
|
the length of the mmi body. |
37.5
|
width_mmi
|
the width of the mmi body. |
6.0
|
|
gap_mmi
|
float
|
the gap between the tapers at the mmi body. |
1.47
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
:noindex:

import cspdk
c = cspdk.si500.cells.mmi1x2(width_taper=1.5, length_taper=20, length_mmi=37.5, width_mmi=6, gap_mmi=1.47, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
mmi1x2_rc¶
:noindex:

import cspdk
c = cspdk.si500.cells.mmi1x2_rc(width_taper=1.5, length_taper=20, length_mmi=37.5, width_mmi=6, gap_mmi=1.47, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
mmi1x2_ro¶
:noindex:

import cspdk
c = cspdk.si500.cells.mmi1x2_ro(width_taper=1.5, length_taper=20, length_mmi=37.5, width_mmi=6, gap_mmi=1.47, cross_section='xs_ro').copy()
c.draw_ports()
c.plot()
mmi2x2¶
An mmi2x2.
An mmi2x2 is a 2x2 splitter
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
width
|
float | None
|
the width of the waveguides connecting at the mmi ports. |
None
|
width_taper
|
float
|
the width at the base of the mmi body. |
1.5
|
length_taper
|
float
|
the length of the tapers going towards the mmi body. |
50.2
|
length_mmi
|
float
|
the length of the mmi body. |
5.5
|
width_mmi
|
float
|
the width of the mmi body. |
6.0
|
gap_mmi
|
float
|
the gap between the tapers at the mmi body. |
0.4
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
:noindex:

import cspdk
c = cspdk.si500.cells.mmi2x2(width_taper=1.5, length_taper=50.2, length_mmi=5.5, width_mmi=6, gap_mmi=0.4, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
mmi2x2_rc¶
:noindex:

import cspdk
c = cspdk.si500.cells.mmi2x2_rc(width_taper=1.5, length_taper=50.2, length_mmi=5.5, width_mmi=6, gap_mmi=0.4, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
mmi2x2_ro¶
:noindex:

import cspdk
c = cspdk.si500.cells.mmi2x2_ro(width_taper=1.5, length_taper=50.2, length_mmi=5.5, width_mmi=6, gap_mmi=0.4, cross_section='xs_ro').copy()
c.draw_ports()
c.plot()
mzi¶
A Mach-Zehnder Interferometer.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
delta_length
|
float
|
the difference in length between the upper and lower arms of the mzi. |
10.0
|
bend
|
the name of the default bend of the mzi. |
'bend_euler_rc'
|
|
straight
|
the name of the default straight of the mzi. |
'straight_rc'
|
|
splitter
|
the name of the default splitter of the mzi. |
'mmi1x2_rc'
|
|
combiner
|
the name of the default combiner of the mzi. |
'mmi2x2_rc'
|
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
:noindex:

import cspdk
c = cspdk.si500.cells.mzi(delta_length=10, bend='bend_euler_rc', straight='straight_rc', splitter='mmi1x2_rc', combiner='mmi2x2_rc', cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
mzi_rc¶
:noindex:

import cspdk
c = cspdk.si500.cells.mzi_rc(delta_length=10, bend='bend_euler_rc', straight='straight_rc', splitter='mmi1x2_rc', combiner='mmi2x2_rc', cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
mzi_ro¶
:noindex:

import cspdk
c = cspdk.si500.cells.mzi_ro(delta_length=10, bend='bend_euler_ro', straight='straight_ro', splitter='mmi1x2_ro', combiner='mmi2x2_ro', cross_section='xs_ro').copy()
c.draw_ports()
c.plot()
pad¶
An electrical pad.
:noindex:

rectangle¶
A rectangle.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
layer
|
LAYER.FLOORPLAN. |
FLOORPLAN
|
|
**kwargs
|
additional arguments. |
{}
|
:noindex:

straight¶
A straight waveguide.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
the length of the waveguide. |
10.0
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
kwargs
|
additional arguments to pass to the straight function. |
{}
|
:noindex:

import cspdk
c = cspdk.si500.cells.straight(length=10, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
straight_rc¶
:noindex:

import cspdk
c = cspdk.si500.cells.straight_rc(length=10, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
straight_ro¶
:noindex:

import cspdk
c = cspdk.si500.cells.straight_ro(length=10, cross_section='xs_ro').copy()
c.draw_ports()
c.plot()
taper¶
A taper.
A taper is a transition between two waveguide widths
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
the length of the taper. |
10.0
|
width1
|
float
|
the input width of the taper. |
width_rc
|
width2
|
float | None
|
the output width of the taper (if not given, use port). |
None
|
port
|
Port | None
|
the port (with certain width) to taper towards (if not given, use width2). |
None
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_rc'
|
:noindex:

import cspdk
c = cspdk.si500.cells.taper(length=10, width1=0.45, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
taper_rc¶
:noindex:

import cspdk
c = cspdk.si500.cells.taper_rc(length=10, width1=0.45, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()
taper_ro¶
:noindex:

import cspdk
c = cspdk.si500.cells.taper_ro(length=10, width1=0.4, cross_section='xs_ro').copy()
c.draw_ports()
c.plot()
wire_corner¶
A wire corner.
A wire corner is a bend for electrical routes.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cross_section
|
"metal_routing". |
'metal_routing'
|
|
**kwargs
|
additional arguments. |
{}
|
:noindex:
