Skip to content

Cells SiN300

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

import cspdk

c = cspdk.sin300.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_nc'

:noindex:

bend_euler

import cspdk

c = cspdk.sin300.cells.bend_euler(angle=90, p=0.5, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

bend_euler_nc

:noindex:

bend_euler_nc

import cspdk

c = cspdk.sin300.cells.bend_euler_nc(angle=90, p=0.5, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

bend_euler_no

:noindex:

bend_euler_no

import cspdk

c = cspdk.sin300.cells.bend_euler_no(angle=90, p=0.5, cross_section='xs_no').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

(15.0, 1.8)
cross_section CrossSectionSpec

a cross section or its name or a function generating a cross section.

'xs_nc'
allow_min_radius_violation bool

if True, allows the s-bend to have a smaller radius than the minimum radius.

True

:noindex:

bend_s

import cspdk

c = cspdk.sin300.cells.bend_s(size=(15, 1.8), cross_section='xs_nc', 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:

compass

import cspdk

c = cspdk.sin300.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

20.0
cross_section CrossSectionSpec

a cross section or its name or a function generating a cross section.

'xs_nc'

:noindex:

coupler

import cspdk

c = cspdk.sin300.cells.coupler(gap=0.236, length=20, dy=4, dx=20, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

coupler_nc

:noindex:

coupler_nc

import cspdk

c = cspdk.sin300.cells.coupler_nc(gap=0.236, length=20, dy=4, dx=20, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

coupler_no

:noindex:

coupler_no

import cspdk

c = cspdk.sin300.cells.coupler_no(gap=0.236, length=20, dy=4, dx=20, cross_section='xs_no').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_nc'

:noindex:

coupler_straight

import cspdk

c = cspdk.sin300.cells.coupler_straight(length=20, gap=0.236, cross_section='xs_nc').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_nc'

:noindex:

die

import cspdk

c = cspdk.sin300.cells.die(cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

die_nc

:noindex:

die_nc

import cspdk

c = cspdk.sin300.cells.die_nc(cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

die_no

:noindex:

die_no

import cspdk

c = cspdk.sin300.cells.die_no(cross_section='xs_no').copy()
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 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_nc'
radius float | None

the radius of the loopback.

None

:noindex:

grating_coupler_array

import cspdk

c = cspdk.sin300.cells.grating_coupler_array(pitch=127, n=6, cross_section='xs_nc', centered=True, port_name='o1', rotation=-90, straight_to_grating_spacing=10, with_loopback=False).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.343
cross_section

a cross section or its name or a function generating a cross section.

'xs_nc'

:noindex:

grating_coupler_elliptical

import cspdk

c = cspdk.sin300.cells.grating_coupler_elliptical(wavelength=1.55, grating_line_width=0.343, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

grating_coupler_elliptical_nc

:noindex:

grating_coupler_elliptical_nc

import cspdk

c = cspdk.sin300.cells.grating_coupler_elliptical_nc(wavelength=1.55, grating_line_width=0.33, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

grating_coupler_elliptical_no

:noindex:

grating_coupler_elliptical_no

import cspdk

c = cspdk.sin300.cells.grating_coupler_elliptical_no(wavelength=1.31, grating_line_width=0.482, cross_section='xs_no').copy()
c.draw_ports()
c.plot()

grating_coupler_rectangular

A grating coupler with straight and parallel teeth.

Parameters:

Name Type Description Default
period float

the period of the grating

0.66
n_periods int

the number of grating teeth

30
length_taper float

the length of the taper tapering up to the grating

200.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_nc'

:noindex:

grating_coupler_rectangular

import cspdk

c = cspdk.sin300.cells.grating_coupler_rectangular(period=0.66, n_periods=30, length_taper=200, wavelength=1.55, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

grating_coupler_rectangular_nc

:noindex:

grating_coupler_rectangular_nc

import cspdk

c = cspdk.sin300.cells.grating_coupler_rectangular_nc(period=0.66, n_periods=30, length_taper=200, wavelength=1.55, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

grating_coupler_rectangular_no

:noindex:

grating_coupler_rectangular_no

import cspdk

c = cspdk.sin300.cells.grating_coupler_rectangular_no(period=0.964, n_periods=30, length_taper=200, wavelength=1.31, cross_section='xs_no').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 float

the width at the base of the mmi body

5.5
length_taper float

the length of the tapers going towards the mmi body

50.0
length_mmi float

the length of the mmi body

64.7
width_mmi float

the width of the mmi body

12.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_nc'

:noindex:

mmi1x2

import cspdk

c = cspdk.sin300.cells.mmi1x2(width_mmi=12, width_taper=5.5, length_taper=50, length_mmi=64.7, gap_mmi=0.4, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

mmi1x2_nc

:noindex:

mmi1x2_nc

import cspdk

c = cspdk.sin300.cells.mmi1x2_nc(width_mmi=12, width_taper=5.5, length_taper=50, length_mmi=64.7, gap_mmi=0.4, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

mmi1x2_no

:noindex:

mmi1x2_no

import cspdk

c = cspdk.sin300.cells.mmi1x2_no(width_mmi=12, width_taper=5.5, length_taper=50, length_mmi=42, gap_mmi=0.4, cross_section='xs_no').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

5.5
length_taper float

the length of the tapers going towards the mmi body

50.0
length_mmi float

the length of the mmi body

5.5
width_mmi float

the width of the mmi body

12.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_nc'

:noindex:

mmi2x2

import cspdk

c = cspdk.sin300.cells.mmi2x2(width_taper=5.5, length_taper=50, length_mmi=5.5, width_mmi=12, gap_mmi=0.4, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

mmi2x2_nc

:noindex:

mmi2x2_nc

import cspdk

c = cspdk.sin300.cells.mmi2x2_nc(width_taper=5.5, length_taper=50, length_mmi=232, width_mmi=12, gap_mmi=0.4, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

mmi2x2_no

:noindex:

mmi2x2_no

import cspdk

c = cspdk.sin300.cells.mmi2x2_no(width_taper=5.5, length_taper=50, length_mmi=126, width_mmi=12, gap_mmi=0.4, cross_section='xs_no').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_nc'
straight

the name of the default straight of the mzi

'straight_nc'
splitter

the name of the default splitter of the mzi

'mmi1x2_nc'
combiner

the name of the default combiner of the mzi

'mmi2x2_nc'
cross_section CrossSectionSpec

a cross section or its name or a function generating a cross section.

'xs_nc'

:noindex:

mzi

import cspdk

c = cspdk.sin300.cells.mzi(delta_length=10, bend='bend_euler_nc', straight='straight_nc', splitter='mmi1x2_nc', combiner='mmi2x2_nc', cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

mzi_nc

:noindex:

mzi_nc

import cspdk

c = cspdk.sin300.cells.mzi_nc(delta_length=10, bend='bend_euler_nc', straight='straight_nc', splitter='mmi1x2_nc', combiner='mmi2x2_nc', cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

mzi_no

:noindex:

mzi_no

import cspdk

c = cspdk.sin300.cells.mzi_no(delta_length=10, bend='bend_euler_no', straight='straight_no', splitter='mmi1x2_no', combiner='mmi2x2_no', cross_section='xs_no').copy()
c.draw_ports()
c.plot()

pad

An electrical pad.

:noindex:

pad

import cspdk

c = cspdk.sin300.cells.pad().copy()
c.draw_ports()
c.plot()

rectangle

A rectangle.

Parameters:

Name Type Description Default
layer

LAYER.FLOORPLAN.

FLOORPLAN
**kwargs

additional arguments.

{}

:noindex:

rectangle

import cspdk

c = cspdk.sin300.cells.rectangle(layer='FLOORPLAN').copy()
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_nc'
kwargs

additional arguments to pass to the straight function.

{}

:noindex:

straight

import cspdk

c = cspdk.sin300.cells.straight(length=10, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

straight_nc

:noindex:

straight_nc

import cspdk

c = cspdk.sin300.cells.straight_nc(length=10, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

straight_no

:noindex:

straight_no

import cspdk

c = cspdk.sin300.cells.straight_no(length=10, cross_section='xs_no').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_nc
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_nc'

:noindex:

taper

import cspdk

c = cspdk.sin300.cells.taper(length=10, width1=1.2, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

taper_nc

:noindex:

taper_nc

import cspdk

c = cspdk.sin300.cells.taper_nc(length=10, width1=1.2, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()

taper_no

:noindex:

taper_no

import cspdk

c = cspdk.sin300.cells.taper_no(length=10, width1=0.95, cross_section='xs_no').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:

wire_corner

import cspdk

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