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).dup()
c.draw_ports()
c.plot()

(Source code)

bend_euler#

cspdk.si220.cband.cells.bend_euler(radius: float | None = None, angle: float = 90, p: float = 0.5, width: float | None = None, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip', allow_min_radius_violation: bool = False) Component[source]#

Regular degree euler bend.

Parameters:
  • radius – in um. Defaults to cross_section_radius.

  • angle – total angle of the curve.

  • p – Proportion of the curve that is an Euler curve.

  • width – width to use. Defaults to cross_section.width.

  • cross_section – specification (CrossSection, string, CrossSectionFactory dict).

  • allow_min_radius_violation – if True allows radius to be smaller than cross_section radius.

import cspdk

c = cspdk.si220.cband.cells.bend_euler(angle=90.0, p=0.5, cross_section='xs_nc').dup()
c.draw_ports()
c.plot()

(Source code)

bend_euler_nc#

import cspdk

c = cspdk.si220.cband.cells.bend_euler_nc(angle=90.0, p=0.5, cross_section='xs_nc').dup()
c.draw_ports()
c.plot()

(Source code)

bend_euler_no#

import cspdk

c = cspdk.si220.cband.cells.bend_euler_no(angle=90.0, p=0.5, cross_section='xs_no').dup()
c.draw_ports()
c.plot()

(Source code)

bend_s#

cspdk.si220.cband.cells.bend_s(size: tuple[float, float] = (11, 1.8), cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip', width: float | None = None, allow_min_radius_violation: bool = False) Component[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 – in x and y direction.

  • cross_section – spec.

  • width – width of the waveguide. If None, it will use the width of the cross_section.

  • allow_min_radius_violation – allows min radius violations.

import cspdk

c = cspdk.si220.cband.cells.bend_s(size=(15.0, 1.8), cross_section='xs_nc').dup()
c.draw_ports()
c.plot()

(Source code)

compass#

cspdk.si220.cband.cells.compass(size: tuple[float, float] = (4, 2), layer: tuple[int, int] | str | int | LayerEnum = 'PAD', port_type: str | None = None, port_inclusion: float = 0.0, port_orientations: tuple[int, ...] | list[int] | None = (180, 90, 0, -90), auto_rename_ports: bool = True) Component[source]#

Rectangle with ports on each edge (north, south, east, and west).

Parameters:
  • size – rectangle size.

  • layer – tuple (int, int).

  • port_type – optical, electrical.

  • port_inclusion – from edge.

  • port_orientations – list of port_orientations to add. None does not add ports.

  • auto_rename_ports – auto rename ports.

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).dup()
c.draw_ports()
c.plot()

(Source code, png, hires.png, pdf)

_images/cells_sin300-6.png

coupler#

cspdk.si220.cband.cells.coupler(length: float = 20, gap: float = 0.27) Component[source]#

Returns Symmetric coupler.

Parameters:
  • length – of coupling region in um.

  • gap – of coupling region in um.

import cspdk

c = cspdk.si220.cband.cells.coupler(gap=0.236, length=20.0, dy=4.0, dx=20.0, cross_section='xs_nc').dup()
c.draw_ports()
c.plot()

(Source code)

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').dup()
c.draw_ports()
c.plot()

(Source code)

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').dup()
c.draw_ports()
c.plot()

(Source code)

coupler_straight#

import cspdk

c = cspdk.si220.cband.cells.coupler_straight(length=20.0, gap=0.236, cross_section='xs_nc').dup()
c.draw_ports()
c.plot()

(Source code)

die#

cspdk.si220.cband.cells.die(size: tuple[float, float] = (16000.0, 3000.0)) Component[source]#

A die with grating couplers and pads.

Parameters:
  • size – the size of the die, in um.

  • ngratings – the number of grating couplers.

  • npads – the number of pads.

  • grating_pitch – the pitch of the grating couplers, in um.

  • pad_pitch – the pitch of the pads, in um.

  • grating_coupler – the grating coupler component. None skips the grating couplers.

  • cross_section – the cross section.

  • pad – the pad component.

  • layer_floorplan – the layer of the floorplan.

  • edge_to_pad_distance – the distance from the edge to the pads, in um.

  • edge_to_grating_distance – the distance from the edge to the grating couplers, in um.

  • with_loopback – if True, adds a loopback between edge GCs. Only works for rotation = 90 for now.

import cspdk

c = cspdk.si220.cband.cells.die(cross_section='xs_nc').dup()
c.draw_ports()
c.plot()

(Source code)

die_nc#

import cspdk

c = cspdk.si220.cband.cells.die_nc(cross_section='xs_nc').dup()
c.draw_ports()
c.plot()

(Source code)

die_no#

import cspdk

c = cspdk.si220.cband.cells.die_no(cross_section='xs_no').dup()
c.draw_ports()
c.plot()

(Source code)

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).dup()
c.draw_ports()
c.plot()

(Source code)

grating_coupler_elliptical#

cspdk.si220.cband.cells.grating_coupler_elliptical(wavelength: float = 1.55, grating_line_width=0.315, cross_section='strip') Component[source]#

A grating coupler with curved but parallel teeth.

Parameters:
  • wavelength – 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.

import cspdk

c = cspdk.si220.cband.cells.grating_coupler_elliptical(wavelength=1.55, grating_line_width=0.343, cross_section='xs_nc').dup()
c.draw_ports()
c.plot()

(Source code)

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').dup()
c.draw_ports()
c.plot()

(Source code)

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').dup()
c.draw_ports()
c.plot()

(Source code)

grating_coupler_rectangular#

cspdk.si220.cband.cells.grating_coupler_rectangular(period=0.63, n_periods: int = 60, length_taper: float = 350.0, wavelength: float = 1.55, cross_section='strip') Component[source]#

A grating coupler with straight and parallel teeth.

Parameters:
  • period – the period of the grating

  • n_periods – the number of grating teeth

  • length_taper – the length of the taper tapering up to the grating

  • wavelength – the center wavelength for which the grating is designed

  • cross_section – a cross section or its name or a function generating a cross section.

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').dup()
c.draw_ports()
c.plot()

(Source code)

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').dup()
c.draw_ports()
c.plot()

(Source code)

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').dup()
c.draw_ports()
c.plot()

(Source code)

mmi1x2#

cspdk.si220.cband.cells.mmi1x2(width: float | None = None, width_taper: float = 1.5, length_taper: float = 20.0, length_mmi: float = 31.0, width_mmi: float = 6.0, gap_mmi: float = 1.64, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip') Component[source]#

An mmi1x2.

An mmi1x2 is a splitter that splits a single input to two outputs

Parameters:
  • width – the width of the waveguides connecting at the mmi ports.

  • width_taper – the width at the base of the mmi body.

  • length_taper – the length of the tapers going towards the mmi body.

  • length_mmi – the length of the mmi body.

  • width_mmi – the width of the mmi body.

  • gap_mmi – the gap between the tapers at the mmi body.

  • cross_section – a cross section or its name or a function generating a cross section.

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').dup()
c.draw_ports()
c.plot()

(Source code)

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').dup()
c.draw_ports()
c.plot()

(Source code)

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').dup()
c.draw_ports()
c.plot()

(Source code)

mmi2x2#

cspdk.si220.cband.cells.mmi2x2(width: float | None = None, width_taper: float = 1.5, length_taper: float = 20.0, length_mmi: float = 42.5, width_mmi: float = 6.0, gap_mmi: float = 0.5, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip') Component[source]#

An mmi2x2.

An mmi2x2 is a 2x2 splitter

Parameters:
  • width – the width of the waveguides connecting at the mmi ports

  • width_taper – the width at the base of the mmi body

  • length_taper – the length of the tapers going towards the mmi body

  • length_mmi – the length of the mmi body

  • width_mmi – the width of the mmi body

  • gap_mmi – the gap between the tapers at the mmi body

  • cross_section – a cross section or its name or a function generating a cross section.

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').dup()
c.draw_ports()
c.plot()

(Source code)

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').dup()
c.draw_ports()
c.plot()

(Source code)

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').dup()
c.draw_ports()
c.plot()

(Source code)

mzi#

cspdk.si220.cband.cells.mzi(delta_length: float = 10, bend: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'bend_euler', straight: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'straight', splitter: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'coupler', combiner: str | Callable[[...], Component] | dict[str, Any] | DKCell | None = None, port_e1_splitter: str = 'o3', port_e0_splitter: str = 'o4', port_e1_combiner: str = 'o3', port_e0_combiner: str = 'o4', cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip') Component[source]#

Mzi.

Parameters:
  • delta_length – bottom arm vertical extra length.

  • bend – 90 degrees bend library.

  • straight – straight function.

  • splitter – splitter function.

  • combiner – combiner function.

  • port_e1_splitter – east top splitter port.

  • port_e0_splitter – east bot splitter port.

  • port_e1_combiner – east top combiner port.

  • port_e0_combiner – east bot combiner port.

  • cross_section – for routing (sxtop/sxbot to combiner).

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').dup()
c.draw_ports()
c.plot()

(Source code)

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').dup()
c.draw_ports()
c.plot()

(Source code)

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').dup()
c.draw_ports()
c.plot()

(Source code)

pad#

cspdk.si220.cband.cells.pad(size: tuple[float, float] = (90.0, 90.0), layer: tuple[int, int] | str | int | LayerEnum = 'PAD', port_inclusion: float = 0, port_orientation: float = 0) Component[source]#

Returns rectangular pad with ports.

Parameters:
  • size – x, y size.

  • layer – 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 – from edge.

  • port_orientation – in degrees.

import cspdk

c = cspdk.si220.cband.cells.pad().dup()
c.draw_ports()
c.plot()

(Source code, png, hires.png, pdf)

_images/cells_sin300-30.png

rectangle#

cspdk.si220.cband.cells.rectangle(size: tuple[float, float] = (4, 2), layer: tuple[int, int] | str | int | LayerEnum = 'PAD', centered: bool = False, port_type: str | None = None, port_orientations: tuple[int, ...] | list[int] | None = (180, 90, 0, -90)) Component[source]#

Returns a rectangle.

Parameters:
  • size – (tuple) Width and height of rectangle.

  • layer – Specific layer to put polygon geometry on.

  • centered – True sets center to (0, 0), False sets south-west to (0, 0).

  • port_type – optical, electrical.

  • port_orientations – list of port_orientations to add. None adds no ports.

import cspdk

c = cspdk.si220.cband.cells.rectangle(layer=<LayerMapCornerstone.FLOORPLAN: 46>).dup()
c.draw_ports()
c.plot()

(Source code)

straight#

cspdk.si220.cband.cells.straight(length: float = 10, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip', width: float | None = None, npoints: int = 2) Component[source]#

Returns a Straight waveguide.

Parameters:
  • length – straight length (um).

  • cross_section – specification (CrossSection, string or dict).

  • width – width of the waveguide. If None, it will use the width of the cross_section.

  • npoints – number of points.

import cspdk

c = cspdk.si220.cband.cells.straight(length=10.0, cross_section='xs_nc').dup()
c.draw_ports()
c.plot()

(Source code)

straight_nc#

import cspdk

c = cspdk.si220.cband.cells.straight_nc(length=10.0, cross_section='xs_nc').dup()
c.draw_ports()
c.plot()

(Source code)

straight_no#

import cspdk

c = cspdk.si220.cband.cells.straight_no(length=10.0, cross_section='xs_no').dup()
c.draw_ports()
c.plot()

(Source code)

taper#

cspdk.si220.cband.cells.taper(length: float = 10.0, width1: float = 0.45, width2: float | None = None, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip') Component[source]#

Linear taper, which tapers only the main cross section section.

Parameters:
  • length – taper length.

  • width1 – width of the west/left port.

  • width2 – width of the east/right port. Defaults to width1.

  • cross_section – specification (CrossSection, string, CrossSectionFactory dict).

import cspdk

c = cspdk.si220.cband.cells.taper(length=10.0, width1=1.2, cross_section='xs_nc').dup()
c.draw_ports()
c.plot()

(Source code)

taper_nc#

import cspdk

c = cspdk.si220.cband.cells.taper_nc(length=10.0, width1=1.2, cross_section='xs_nc').dup()
c.draw_ports()
c.plot()

(Source code)

taper_no#

import cspdk

c = cspdk.si220.cband.cells.taper_no(length=10.0, width1=0.95, cross_section='xs_no').dup()
c.draw_ports()
c.plot()

(Source code)

wire_corner#

cspdk.si220.cband.cells.wire_corner(cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'metal_routing', width: float | None = None) Component[source]#

Returns 45 degrees electrical corner wire.

Parameters:
  • cross_section – spec.

  • width – optional width. Defaults to cross_section width.

import cspdk

c = cspdk.si220.cband.cells.wire_corner(cross_section='metal_routing').dup()
c.draw_ports()
c.plot()

(Source code, png, hires.png, pdf)

_images/cells_sin300-38.png