Cells SiN300#
array#
import cspdk
c = cspdk.si220.cband.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#
- cspdk.si220.cband.cells.bend_euler(radius=None, angle=90, p=0.5, width=None, cross_section='strip', allow_min_radius_violation=False)[source]#
Regular degree euler bend.
- Parameters:
radius (float | None) – in um. Defaults to cross_section_radius.
angle (float) – total angle of the curve.
p (float) – Proportion of the curve that is an Euler curve.
width (float | None) – width to use. Defaults to cross_section.width.
cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – specification (CrossSection, string, CrossSectionFactory dict).
allow_min_radius_violation (bool) – if True allows radius to be smaller than cross_section radius.
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.bend_euler(angle=90.0, p=0.5, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
bend_euler_nc#
import cspdk
c = cspdk.si220.cband.cells.bend_euler_nc(angle=90.0, p=0.5, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
bend_euler_no#
import cspdk
c = cspdk.si220.cband.cells.bend_euler_no(angle=90.0, p=0.5, cross_section='xs_no').copy()
c.draw_ports()
c.plot()
bend_s#
- cspdk.si220.cband.cells.bend_s(size=(11, 1.8), cross_section='strip', width=None, allow_min_radius_violation=False)[source]#
Return S bend with bezier curve.
stores min_bend_radius property in self.info[‘min_bend_radius’] min_bend_radius depends on height and length
- Parameters:
size (tuple[float, float]) – in x and y direction.
cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – spec.
width (float | None) – width of the waveguide. If None, it will use the width of the cross_section.
allow_min_radius_violation (bool) – allows min radius violations.
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.bend_s(size=(15.0, 1.8), cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
compass#
- cspdk.si220.cband.cells.compass(size=(4, 2), layer='PAD', port_type=None, port_inclusion=0.0, port_orientations=(180, 90, 0, -90), auto_rename_ports=True)[source]#
Rectangle with ports on each edge (north, south, east, and west).
- Parameters:
size (tuple[float, float]) – rectangle size.
layer (tuple[int, int] | str | int | LayerEnum) – tuple (int, int).
port_type (str | None) – optical, electrical.
port_inclusion (float) – from edge.
port_orientations (tuple[int, ...] | list[int] | None) – list of port_orientations to add. None does not add ports.
auto_rename_ports (bool) – auto rename ports.
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.compass(size=(4.0, 2.0), layer='PAD', port_type='electrical', port_inclusion=0.0, port_orientations=(180, 90, 0, -90), auto_rename_ports=True).copy()
c.draw_ports()
c.plot()
(Source code
, png
, hires.png
, pdf
)

coupler#
- cspdk.si220.cband.cells.coupler(length=14.5, gap=0.27)[source]#
Returns Symmetric coupler.
- Parameters:
length (float) – of coupling region in um.
gap (float) – of coupling region in um.
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.coupler(gap=0.236, length=20.0, dy=4.0, dx=20.0, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
coupler_nc#
import cspdk
c = cspdk.si220.cband.cells.coupler_nc(gap=0.236, length=20.0, dy=4.0, dx=20.0, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
coupler_no#
import cspdk
c = cspdk.si220.cband.cells.coupler_no(gap=0.236, length=20.0, dy=4.0, dx=20.0, cross_section='xs_no').copy()
c.draw_ports()
c.plot()
coupler_straight#
import cspdk
c = cspdk.si220.cband.cells.coupler_straight(length=20.0, gap=0.236, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
die#
- cspdk.si220.cband.cells.die(size=(16000.0, 3000.0))[source]#
A die.
- Parameters:
size (tuple[float, float])
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.die(cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
die_nc#
import cspdk
c = cspdk.si220.cband.cells.die_nc(cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
die_no#
import cspdk
c = cspdk.si220.cband.cells.die_no(cross_section='xs_no').copy()
c.draw_ports()
c.plot()
grating_coupler_array#
import cspdk
c = cspdk.si220.cband.cells.grating_coupler_array(pitch=127.0, n=6, cross_section='xs_nc', centered=True, port_name='o1', rotation=-90, straight_to_grating_spacing=10.0, with_loopback=False).copy()
c.draw_ports()
c.plot()
grating_coupler_elliptical#
- cspdk.si220.cband.cells.grating_coupler_elliptical(wavelength=1.55, grating_line_width=0.315, cross_section='strip')[source]#
A grating coupler with curved but parallel teeth.
- Parameters:
wavelength (float) – the center wavelength for which the grating is designed
grating_line_width – the line width of the grating
cross_section – a cross section or its name or a function generating a cross section.
- Return type:
Component
import cspdk
c = cspdk.si220.cband.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#
import cspdk
c = cspdk.si220.cband.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#
import cspdk
c = cspdk.si220.cband.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#
- cspdk.si220.cband.cells.grating_coupler_rectangular(period=0.63, n_periods=60, length_taper=350.0, wavelength=1.55, cross_section='strip')[source]#
A grating coupler with straight and parallel teeth.
- Parameters:
period – the period of the grating
n_periods (int) – the number of grating teeth
length_taper (float) – the length of the taper tapering up to the grating
wavelength (float) – the center wavelength for which the grating is designed
cross_section – a cross section or its name or a function generating a cross section.
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.grating_coupler_rectangular(period=0.66, n_periods=30, length_taper=200.0, wavelength=1.55, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
grating_coupler_rectangular_nc#
import cspdk
c = cspdk.si220.cband.cells.grating_coupler_rectangular_nc(period=0.66, n_periods=30, length_taper=200.0, wavelength=1.55, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
grating_coupler_rectangular_no#
import cspdk
c = cspdk.si220.cband.cells.grating_coupler_rectangular_no(period=0.964, n_periods=30, length_taper=200.0, wavelength=1.31, cross_section='xs_no').copy()
c.draw_ports()
c.plot()
mmi1x2#
- cspdk.si220.cband.cells.mmi1x2(width=None, width_taper=1.5, length_taper=20.0, length_mmi=31.0, width_mmi=6.0, gap_mmi=1.64, cross_section='strip')[source]#
An mmi1x2.
An mmi1x2 is a splitter that splits a single input to two outputs
- Parameters:
width (float | None) – the width of the waveguides connecting at the mmi ports.
width_taper (float) – the width at the base of the mmi body.
length_taper (float) – the length of the tapers going towards the mmi body.
length_mmi (float) – the length of the mmi body.
width_mmi (float) – the width of the mmi body.
gap_mmi (float) – the gap between the tapers at the mmi body.
cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – a cross section or its name or a function generating a cross section.
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.mmi1x2(width_mmi=12.0, width_taper=5.5, length_taper=50.0, length_mmi=64.7, gap_mmi=0.4, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
mmi1x2_nc#
import cspdk
c = cspdk.si220.cband.cells.mmi1x2_nc(width_mmi=12.0, width_taper=5.5, length_taper=50.0, length_mmi=64.7, gap_mmi=0.4, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
mmi1x2_no#
import cspdk
c = cspdk.si220.cband.cells.mmi1x2_no(width_mmi=12.0, width_taper=5.5, length_taper=50.0, length_mmi=42.0, gap_mmi=0.4, cross_section='xs_no').copy()
c.draw_ports()
c.plot()
mmi2x2#
- cspdk.si220.cband.cells.mmi2x2(width=None, width_taper=1.5, length_taper=20.0, length_mmi=42.5, width_mmi=6.0, gap_mmi=0.5, cross_section='strip')[source]#
An mmi2x2.
An mmi2x2 is a 2x2 splitter
- Parameters:
width (float | None) – the width of the waveguides connecting at the mmi ports
width_taper (float) – the width at the base of the mmi body
length_taper (float) – the length of the tapers going towards the mmi body
length_mmi (float) – the length of the mmi body
width_mmi (float) – the width of the mmi body
gap_mmi (float) – the gap between the tapers at the mmi body
cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – a cross section or its name or a function generating a cross section.
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.mmi2x2(width_taper=5.5, length_taper=50.0, length_mmi=5.5, width_mmi=12.0, gap_mmi=0.4, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
mmi2x2_nc#
import cspdk
c = cspdk.si220.cband.cells.mmi2x2_nc(width_taper=5.5, length_taper=50.0, length_mmi=232.0, width_mmi=12.0, gap_mmi=0.4, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
mmi2x2_no#
import cspdk
c = cspdk.si220.cband.cells.mmi2x2_no(width_taper=5.5, length_taper=50.0, length_mmi=126.0, width_mmi=12.0, gap_mmi=0.4, cross_section='xs_no').copy()
c.draw_ports()
c.plot()
mzi#
- cspdk.si220.cband.cells.mzi(delta_length=10, bend='bend_euler', straight='straight', splitter='coupler', combiner=None, port_e1_splitter='o3', port_e0_splitter='o4', port_e1_combiner='o3', port_e0_combiner='o4', cross_section='strip')[source]#
Mzi.
- Parameters:
delta_length (float) – bottom arm vertical extra length.
bend (str | Callable[[...], Component] | dict[str, Any] | DKCell) – 90 degrees bend library.
straight (str | Callable[[...], Component] | dict[str, Any] | DKCell) – straight function.
splitter (str | Callable[[...], Component] | dict[str, Any] | DKCell) – splitter function.
combiner (str | Callable[[...], Component] | dict[str, Any] | DKCell | None) – combiner function.
port_e1_splitter (str) – east top splitter port.
port_e0_splitter (str) – east bot splitter port.
port_e1_combiner (str) – east top combiner port.
port_e0_combiner (str) – east bot combiner port.
cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – for routing (sxtop/sxbot to combiner).
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.mzi(delta_length=10.0, 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#
import cspdk
c = cspdk.si220.cband.cells.mzi_nc(delta_length=10.0, 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#
import cspdk
c = cspdk.si220.cband.cells.mzi_no(delta_length=10.0, bend='bend_euler_no', straight='straight_no', splitter='mmi1x2_no', combiner='mmi2x2_no', cross_section='xs_no').copy()
c.draw_ports()
c.plot()
pad#
- cspdk.si220.cband.cells.pad(size=(90.0, 90.0), layer='PAD', port_inclusion=0, port_orientation=0)[source]#
Returns rectangular pad with ports.
- Parameters:
size (tuple[float, float]) – x, y size.
layer (tuple[int, int] | str | int | LayerEnum) – pad layer.
bbox_layers – list of layers.
bbox_offsets – Optional offsets for each layer with respect to size. positive grows, negative shrinks the size.
port_inclusion (float) – from edge.
port_orientation (float) – in degrees.
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.pad().copy()
c.draw_ports()
c.plot()
(Source code
, png
, hires.png
, pdf
)

rectangle#
- cspdk.si220.cband.cells.rectangle(size=(4, 2), layer='PAD', centered=False, port_type=None, port_orientations=(180, 90, 0, -90))[source]#
Returns a rectangle.
- Parameters:
size (tuple[float, float]) – (tuple) Width and height of rectangle.
layer (tuple[int, int] | str | int | LayerEnum) – Specific layer to put polygon geometry on.
centered (bool) – True sets center to (0, 0), False sets south-west to (0, 0).
port_type (str | None) – optical, electrical.
port_orientations (tuple[int, ...] | list[int] | None) – list of port_orientations to add. None adds no ports.
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.rectangle(layer=<LayerMapCornerstone.FLOORPLAN: 46>).copy()
c.draw_ports()
c.plot()
straight#
- cspdk.si220.cband.cells.straight(length=10, cross_section='strip', width=None, npoints=2)[source]#
Returns a Straight waveguide.
- Parameters:
length (float) – straight length (um).
cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – specification (CrossSection, string or dict).
width (float | None) – width of the waveguide. If None, it will use the width of the cross_section.
npoints (int) – number of points.
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.straight(length=10.0, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
straight_nc#
import cspdk
c = cspdk.si220.cband.cells.straight_nc(length=10.0, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
straight_no#
import cspdk
c = cspdk.si220.cband.cells.straight_no(length=10.0, cross_section='xs_no').copy()
c.draw_ports()
c.plot()
taper#
- cspdk.si220.cband.cells.taper(length=10.0, width1=0.45, width2=None, cross_section='strip')[source]#
Linear taper, which tapers only the main cross section section.
- Parameters:
length (float) – taper length.
width1 (float) – width of the west/left port.
width2 (float | None) – width of the east/right port. Defaults to width1.
cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – specification (CrossSection, string, CrossSectionFactory dict).
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.taper(length=10.0, width1=1.2, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
taper_nc#
import cspdk
c = cspdk.si220.cband.cells.taper_nc(length=10.0, width1=1.2, cross_section='xs_nc').copy()
c.draw_ports()
c.plot()
taper_no#
import cspdk
c = cspdk.si220.cband.cells.taper_no(length=10.0, width1=0.95, cross_section='xs_no').copy()
c.draw_ports()
c.plot()
wire_corner#
- cspdk.si220.cband.cells.wire_corner(cross_section='metal_routing', width=None)[source]#
Returns 45 degrees electrical corner wire.
- Parameters:
cross_section (CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection) – spec.
width (float | None) – optional width. Defaults to cross_section width.
- Return type:
Component
import cspdk
c = cspdk.si220.cband.cells.wire_corner(cross_section='metal_routing').copy()
c.draw_ports()
c.plot()
(Source code
, png
, hires.png
, pdf
)
