Cells SiN200 visible¶
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:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.array(component='pad', columns=6, rows=1, add_ports=True, centered=False, column_pitch=150, row_pitch=150)
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_n780'
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.bend_euler(angle=90, p=0.5, cross_section='xs_n780')
c.draw_ports()
c.plot()
bend_euler_n520¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.bend_euler_n520(angle=90, p=0.5, cross_section='xs_n520')
c.draw_ports()
c.plot()
bend_euler_n638¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.bend_euler_n638(angle=90, p=0.5, cross_section='xs_n638')
c.draw_ports()
c.plot()
bend_euler_n780¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.bend_euler_n780(angle=90, p=0.5, cross_section='xs_n780')
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 |
(15.0, 1.8)
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_n780'
|
allow_min_radius_violation
|
bool
|
if True, allows the s-bend to have a smaller radius than the minimum radius. |
True
|
width
|
float | None
|
waveguide width; defaults to the cross-section width. |
None
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.bend_s(size=(15, 1.8), cross_section='xs_n780', allow_min_radius_violation=True)
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:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.compass(size=(4, 2), layer='PAD', port_type='electrical', port_inclusion=0, port_orientations=(180, 90, 0, -90), auto_rename_ports=True)
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 |
25.0
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_n780'
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.coupler(gap=0.236, length=20, dy=4, dx=25, cross_section='xs_n780')
c.draw_ports()
c.plot()
coupler_n520¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.coupler_n520(gap=0.236, length=20, dy=4, dx=25, cross_section='xs_n520')
c.draw_ports()
c.plot()
coupler_n638¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.coupler_n638(gap=0.236, length=20, dy=4, dx=25, cross_section='xs_n638')
c.draw_ports()
c.plot()
coupler_n780¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.coupler_n780(gap=0.236, length=20, dy=4, dx=25, cross_section='xs_n780')
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_n780'
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.coupler_straight(length=20, gap=0.236, cross_section='xs_n780')
c.draw_ports()
c.plot()
die¶
A die template: the 11.47 x 15.45 mm2 user cell (design guidelines 5.1).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_n780'
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.die(cross_section='xs_n780')
c.draw_ports()
c.plot()
die_frame¶
The user-cell floorplan: 11.47 x 15.45 mm2 (design guidelines 5.1).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
Size
|
die frame size (width, height) in um. |
(11470.0, 15450.0)
|
layer_floorplan
|
LayerSpec
|
cell outline layer (GDS 99). |
'FLOORPLAN'
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.die_frame(size=(11470, 15450), layer_floorplan='FLOORPLAN')
c.draw_ports()
c.plot()
die_n520¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.die_n520(cross_section='xs_n520')
c.draw_ports()
c.plot()
die_n638¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.die_n638(cross_section='xs_n638')
c.draw_ports()
c.plot()
die_n780¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.die_n780(cross_section='xs_n780')
c.draw_ports()
c.plot()
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. |
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_n780'
|
|
radius
|
float | None
|
the radius of the loopback. |
None
|
bend
|
ComponentSpec
|
the bend used in the loopback. |
'bend_euler'
|
mirror_grating_coupler
|
bool
|
if True, mirrors the grating couplers. |
False
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.grating_coupler_array(pitch=127, n=6, cross_section='xs_n780', centered=True, port_name='o1', rotation=-90, straight_to_grating_spacing=10, with_loopback=False, bend='bend_euler', mirror_grating_coupler=False)
c.draw_ports()
c.plot()
grating_coupler_elliptical¶
A focusing grating coupler with elliptical trenches (not a foundry cell).
gdsfactory sets the pitch to wavelength / (neff - 1.443 sin(fiber_angle)).
The per-band neff defaults are chosen so that this pitch equals the
foundry rectangular grating pitch (0.668/0.504/0.417 um) at the foundry
fibre angle, and grating_line_width keeps the foundry unetched tooth
width, so the elliptical and rectangular gratings share one design point.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
wavelength
|
float
|
the center wavelength for which the grating is designed |
0.78
|
grating_line_width
|
float
|
width of the unetched SiN line between trenches |
0.334
|
neff
|
float
|
grating effective index used by the gdsfactory ellipse equation |
1.7082
|
fiber_angle
|
float
|
fibre angle in degrees |
22.0
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_n780'
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.grating_coupler_elliptical(wavelength=0.78, grating_line_width=0.334, neff=1.708, fiber_angle=22, cross_section='xs_n780')
c.draw_ports()
c.plot()
grating_coupler_elliptical_n520¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.grating_coupler_elliptical_n520(wavelength=0.52, grating_line_width=0.209, neff=1.788, fiber_angle=22, cross_section='xs_n520')
c.draw_ports()
c.plot()
grating_coupler_elliptical_n638¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.grating_coupler_elliptical_n638(wavelength=0.638, grating_line_width=0.266, neff=1.712, fiber_angle=18, cross_section='xs_n638')
c.draw_ports()
c.plot()
grating_coupler_elliptical_n780¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.grating_coupler_elliptical_n780(wavelength=0.78, grating_line_width=0.334, neff=1.708, fiber_angle=22, cross_section='xs_n780')
c.draw_ports()
c.plot()
grating_coupler_rectangular¶
A grating coupler with straight and parallel teeth.
Draws the Cornerstone SiN200 visible grating couplers: a linear NITRIDE
taper from the waveguide width to a width_slab wide NITRIDE slab, with
n_periods etched trenches on NITRIDE_ETCH (GDS 204, dark field) that
overhang the slab on both sides. Defaults reproduce
SiN200nm_780nm_TE_STRIP_Grating_Coupler.gds exactly: 200 um taper to a
6 um slab, 30 trenches of 0.334 um on a 0.668 um pitch starting 3.594 um
after the taper, 7 um tall, and 9.988 um of slab after the last trench.
o1 is the waveguide port at x=0; o2 (the fibre port) sits at the
centre of the teeth.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
period
|
float
|
grating pitch in um. |
0.668
|
n_periods
|
int
|
number of etched trenches. |
30
|
fill_factor
|
float
|
etched trench width as a fraction of the period. |
0.5
|
length_taper
|
float
|
length of the taper from the waveguide to the slab. |
200.0
|
width_slab
|
float
|
width of the NITRIDE slab under the grating. |
6.0
|
width_grating
|
float
|
height (y extent) of the etched trenches. |
7.0
|
length_start
|
float
|
distance from the end of the taper to the first trench. |
3.594
|
length_end
|
float
|
slab length after the last trench. |
9.988
|
wavelength
|
float
|
centre wavelength in um. |
0.78
|
fiber_angle
|
float
|
fibre angle from vertical in degrees (foundry value). |
22.0
|
cross_section
|
CrossSectionSpec
|
waveguide cross-section at o1. |
'xs_n780'
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.grating_coupler_rectangular(period=0.668, n_periods=30, fill_factor=0.5, length_taper=200, width_slab=6, width_grating=7, length_start=3.594, length_end=9.988, wavelength=0.78, fiber_angle=22, cross_section='xs_n780')
c.draw_ports()
c.plot()
grating_coupler_rectangular_n520¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.grating_coupler_rectangular_n520(period=0.417, n_periods=20, fill_factor=0.499, length_taper=150, width_slab=5, width_grating=6.006, length_start=5.035, length_end=5, wavelength=0.52, fiber_angle=22, cross_section='xs_n520')
c.draw_ports()
c.plot()
grating_coupler_rectangular_n638¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.grating_coupler_rectangular_n638(period=0.504, n_periods=30, fill_factor=0.472, length_taper=150, width_slab=5.5, width_grating=6.5, length_start=3.538, length_end=9.988, wavelength=0.638, fiber_angle=18, cross_section='xs_n638')
c.draw_ports()
c.plot()
grating_coupler_rectangular_n780¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.grating_coupler_rectangular_n780(period=0.668, n_periods=30, fill_factor=0.5, length_taper=200, width_slab=6, width_grating=7, length_start=3.594, length_end=9.988, wavelength=0.78, fiber_angle=22, cross_section='xs_n780')
c.draw_ports()
c.plot()
heater¶
The foundry heater (Heater.gds): a 2 um x 202 um filament with pads.
The filament (GDS 39) runs along x at y = 0.004..2.004 um and lands on two
80 um x 150 um contact pads (GDS 41). Electrical ports e1 (left) and
e2 (right) sit on the top edge of each pad.
:noindex:

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
|
float
|
the width at the base of the mmi body |
1.8
|
length_taper
|
float
|
the length of the tapers going towards the mmi body |
40.0
|
length_mmi
|
float
|
the length of the mmi body |
21.6
|
width_mmi
|
float
|
the width of the mmi body |
4.3
|
gap_mmi
|
float
|
the gap between the tapers at the mmi body |
0.45
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_n780'
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.mmi1x2(width_mmi=4.3, width_taper=1.8, length_taper=40, length_mmi=21.6, gap_mmi=0.45, cross_section='xs_n780')
c.draw_ports()
c.plot()
mmi1x2_n520¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.mmi1x2_n520(width_mmi=3.4, width_taper=1.3, length_taper=40, length_mmi=21.6, gap_mmi=0.4, cross_section='xs_n520')
c.draw_ports()
c.plot()
mmi1x2_n638¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.mmi1x2_n638(width_mmi=3.5, width_taper=1.4, length_taper=40, length_mmi=18.4, gap_mmi=0.35, cross_section='xs_n638')
c.draw_ports()
c.plot()
mmi1x2_n780¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.mmi1x2_n780(width_mmi=4.3, width_taper=1.8, length_taper=40, length_mmi=21.6, gap_mmi=0.45, cross_section='xs_n780')
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.8
|
length_taper
|
float
|
the length of the tapers going towards the mmi body |
40.0
|
length_mmi
|
float
|
the length of the mmi body |
88.0
|
width_mmi
|
float
|
the width of the mmi body |
4.3
|
gap_mmi
|
float
|
the gap between the tapers at the mmi body |
0.45
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_n780'
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.mmi2x2(width_taper=1.8, length_taper=40, length_mmi=88, width_mmi=4.3, gap_mmi=0.45, cross_section='xs_n780')
c.draw_ports()
c.plot()
mmi2x2_n520¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.mmi2x2_n520(width_taper=1.3, length_taper=40, length_mmi=84.8, width_mmi=3.4, gap_mmi=0.4, cross_section='xs_n520')
c.draw_ports()
c.plot()
mmi2x2_n638¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.mmi2x2_n638(width_taper=1.4, length_taper=40, length_mmi=81.6, width_mmi=3.5, gap_mmi=0.35, cross_section='xs_n638')
c.draw_ports()
c.plot()
mmi2x2_n780¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.mmi2x2_n780(width_taper=1.8, length_taper=40, length_mmi=88, width_mmi=4.3, gap_mmi=0.45, cross_section='xs_n780')
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_n780'
|
|
straight
|
the name of the default straight of the mzi |
'straight_n780'
|
|
splitter
|
the name of the default splitter of the mzi |
'mmi1x2_n780'
|
|
combiner
|
the name of the default combiner of the mzi |
'mmi2x2_n780'
|
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'xs_n780'
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.mzi(delta_length=10, bend='bend_euler_n780', straight='straight_n780', splitter='mmi1x2_n780', combiner='mmi2x2_n780', cross_section='xs_n780')
c.draw_ports()
c.plot()
mzi_n520¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.mzi_n520(delta_length=10, bend='bend_euler_n520', straight='straight_n520', splitter='mmi1x2_n520', combiner='mmi2x2_n520', cross_section='xs_n520')
c.draw_ports()
c.plot()
mzi_n638¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.mzi_n638(delta_length=10, bend='bend_euler_n638', straight='straight_n638', splitter='mmi1x2_n638', combiner='mmi2x2_n638', cross_section='xs_n638')
c.draw_ports()
c.plot()
mzi_n780¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.mzi_n780(delta_length=10, bend='bend_euler_n780', straight='straight_n780', splitter='mmi1x2_n780', combiner='mmi2x2_n780', cross_section='xs_n780')
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:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.rectangle(layer='FLOORPLAN')
c.draw_ports()
c.plot()
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_n780'
|
kwargs
|
additional arguments to pass to the straight function. |
{}
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.straight(length=10, cross_section='xs_n780')
c.draw_ports()
c.plot()
straight_n520¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.straight_n520(length=10, cross_section='xs_n520')
c.draw_ports()
c.plot()
straight_n638¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.straight_n638(length=10, cross_section='xs_n638')
c.draw_ports()
c.plot()
straight_n780¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.straight_n780(length=10, cross_section='xs_n780')
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 | None
|
the input width of the taper (defaults to the cross-section width) |
None
|
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_n780'
|
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.taper(length=10, cross_section='xs_n780')
c.draw_ports()
c.plot()
taper_n520¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.taper_n520(length=10, cross_section='xs_n520')
c.draw_ports()
c.plot()
taper_n638¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.taper_n638(length=10, cross_section='xs_n638')
c.draw_ports()
c.plot()
taper_n780¶
:noindex:

from cspdk.sin200 import cells, PDK
PDK.activate()
c = cells.taper_n780(length=10, cross_section='xs_n780')
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:
