Skip to content

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:

array

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:

bend_euler

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:

bend_euler_n520

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:

bend_euler_n638

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:

bend_euler_n780

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:

bend_s

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:

compass

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:

coupler

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:

coupler_n520

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:

coupler_n638

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:

coupler_n780

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:

coupler_straight

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:

die

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:

die_frame

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:

die_n520

from cspdk.sin200 import cells, PDK

PDK.activate()

c = cells.die_n520(cross_section='xs_n520')
c.draw_ports()
c.plot()

die_n638

:noindex:

die_n638

from cspdk.sin200 import cells, PDK

PDK.activate()

c = cells.die_n638(cross_section='xs_n638')
c.draw_ports()
c.plot()

die_n780

:noindex:

die_n780

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:

grating_coupler_array

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:

grating_coupler_elliptical

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:

grating_coupler_elliptical_n520

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:

grating_coupler_elliptical_n638

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:

grating_coupler_elliptical_n780

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:

grating_coupler_rectangular

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:

grating_coupler_rectangular_n520

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:

grating_coupler_rectangular_n638

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:

grating_coupler_rectangular_n780

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:

heater

from cspdk.sin200 import cells, PDK

PDK.activate()

c = cells.heater()
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 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:

mmi1x2

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:

mmi1x2_n520

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:

mmi1x2_n638

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:

mmi1x2_n780

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:

mmi2x2

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:

mmi2x2_n520

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:

mmi2x2_n638

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:

mmi2x2_n780

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:

mzi

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:

mzi_n520

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:

mzi_n638

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:

mzi_n780

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:

pad

from cspdk.sin200 import cells, PDK

PDK.activate()

c = cells.pad()
c.draw_ports()
c.plot()

rectangle

A rectangle.

Parameters:

Name Type Description Default
layer

LAYER.FLOORPLAN.

FLOORPLAN
**kwargs

additional arguments.

{}

:noindex:

rectangle

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:

straight

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:

straight_n520

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:

straight_n638

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:

straight_n780

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:

taper

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:

taper_n520

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:

taper_n638

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:

taper_n780

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:

wire_corner

from cspdk.sin200 import cells, PDK

PDK.activate()

c = cells.wire_corner(cross_section='metal_routing')
c.draw_ports()
c.plot()