Skip to content

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:

array

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:

bend_euler

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:

bend_euler_rc

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:

bend_euler_ro

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:

bend_s

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:

compass

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:

coupler

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:

coupler_rc

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:

coupler_ro

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:

coupler_straight

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

import cspdk

c = cspdk.si500.cells.die(cross_section='xs_rc').copy()
c.draw_ports()
c.plot()

die_rc

:noindex:

die_rc

import cspdk

c = cspdk.si500.cells.die_rc(cross_section='xs_rc').copy()
c.draw_ports()
c.plot()

die_ro

:noindex:

die_ro

import cspdk

c = cspdk.si500.cells.die_ro(cross_section='xs_ro').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_rc'
radius float | None

optional radius for routing the loopback.

None

:noindex:

grating_coupler_array

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:

grating_coupler_elliptical

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:

grating_coupler_elliptical_rc

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:

grating_coupler_elliptical_ro

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:

grating_coupler_rectangular

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:

grating_coupler_rectangular_rc

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:

grating_coupler_rectangular_ro

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:

mmi1x2

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:

mmi1x2_rc

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:

mmi1x2_ro

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:

mmi2x2

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:

mmi2x2_rc

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:

mmi2x2_ro

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:

mzi

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:

mzi_rc

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:

mzi_ro

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:

pad

import cspdk

c = cspdk.si500.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.si500.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_rc'
kwargs

additional arguments to pass to the straight function.

{}

:noindex:

straight

import cspdk

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

straight_rc

:noindex:

straight_rc

import cspdk

c = cspdk.si500.cells.straight_rc(length=10, cross_section='xs_rc').copy()
c.draw_ports()
c.plot()

straight_ro

:noindex:

straight_ro

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:

taper

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:

taper_rc

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:

taper_ro

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:

wire_corner

import cspdk

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