Cells Si SOI 220nm Cband#

add_fiber_array#

cspdk.si220.cband.cells.add_fiber_array(component: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'straight', grating_coupler='grating_coupler_elliptical', gc_port_name: str = 'o1', component_name: str | None = None, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip', gc_rotation: float = -90, radius_loopback: float = 10, **kwargs) Component[source]#

Returns component with south routes and grating_couplers.

You can also use pads or other terminations instead of grating couplers.

Parameters:
  • component – component spec to connect to grating couplers.

  • grating_coupler – spec for route terminations.

  • gc_port_name – grating coupler input port name.

  • component_name – optional for the label.

  • cross_section – cross_section function.

  • gc_rotation – fiber coupler rotation in degrees. Defaults to -90.

  • radius_loopback – optional radius of the loopback bend. Defaults to the cross_section.

  • kwargs – additional arguments.

Keyword Arguments:
  • bend – bend spec.

  • straight – straight spec.

  • fanout_length – if None, automatic calculation of fanout length.

  • max_y0_optical – in um.

  • with_loopback – True, adds loopback structures.

  • with_loopback_inside – True, adds loopback structures inside the component.

  • straight_separation – from edge to edge.

  • list_port_labels – None, adds TM labels to port indices in this list.

  • connected_port_list_ids – names of ports only for type 0 optical routing.

  • nb_optical_ports_lines – number of grating coupler lines.

  • force_manhattan – False

  • excluded_ports – list of port names to exclude when adding gratings.

  • grating_indices – list of grating coupler indices.

  • routing_straight – function to route.

  • routing_method – route_single.

  • optical_routing_type – None: auto, 0: no extension, 1: standard, 2: check.

  • input_port_indexes – to connect.

  • pitch – in um.

  • radius – optional radius of the bend. Defaults to the cross_section.

  • route_backwards – route from component to grating coupler or vice-versa.

import gdsfactory as gf

c = gf.components.crossing()
cc = gf.routing.add_fiber_array(
    component=c,
    optical_routing_type=2,
    grating_coupler=gf.components.grating_coupler_elliptical_te,
    with_loopback=False
)
cc.plot()

(Source code)

import cspdk

c = cspdk.si220.cband.cells.add_fiber_array(component='straight', grating_coupler='grating_coupler_elliptical', gc_port_name='o1', cross_section='strip', gc_rotation=-90, radius_loopback=10).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-2.png

add_fiber_single#

cspdk.si220.cband.cells.add_fiber_single(component: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'straight', grating_coupler='grating_coupler_elliptical', gc_port_name: str = 'o1', component_name: str | None = None, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip', taper: str | Callable[[...], Component] | dict[str, Any] | DKCell | None = None, input_port_names: list[str] | tuple[str, ...] | None = None, pitch: float = 70, with_loopback: bool = True, loopback_spacing: float = 100.0, **kwargs) Component[source]#

Returns component with south routes and grating_couplers.

You can also use pads or other terminations instead of grating couplers.

Parameters:
  • component – component spec to connect to grating couplers.

  • grating_coupler – spec for route terminations.

  • gc_port_name – grating coupler input port name.

  • component_name – optional for the label.

  • cross_section – cross_section function.

  • taper – taper spec.

  • input_port_names – list of input port names to connect to grating couplers.

  • pitch – spacing between fibers.

  • with_loopback – adds loopback structures.

  • loopback_spacing – spacing between loopback and test structure.

  • kwargs – additional arguments.

Keyword Arguments:
  • bend – bend spec.

  • straight – straight spec.

  • fanout_length – if None, automatic calculation of fanout length.

  • max_y0_optical – in um.

  • with_loopback – True, adds loopback structures.

  • straight_separation – from edge to edge.

  • list_port_labels – None, adds TM labels to port indices in this list.

  • connected_port_list_ids – names of ports only for type 0 optical routing.

  • nb_optical_ports_lines – number of grating coupler lines.

  • force_manhattan – False

  • excluded_ports – list of port names to exclude when adding gratings.

  • grating_indices – list of grating coupler indices.

  • routing_straight – function to route.

  • routing_method – route_single.

  • optical_routing_type – None: auto, 0: no extension, 1: standard, 2: check.

  • gc_rotation – fiber coupler rotation in degrees. Defaults to -90.

  • input_port_indexes – to connect.

import gdsfactory as gf

c = gf.components.crossing()
cc = gf.routing.add_fiber_array(
    component=c,
    optical_routing_type=2,
    grating_coupler=gf.components.grating_coupler_elliptical_te,
    with_loopback=False
)
cc.plot()

(Source code)

import cspdk

c = cspdk.si220.cband.cells.add_fiber_single(component='straight', grating_coupler='grating_coupler_elliptical', gc_port_name='o1', cross_section='strip', pitch=70, with_loopback=True, loopback_spacing=100.0).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-4.png

add_pads_top#

cspdk.si220.cband.cells.add_pads_top(component: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'straight_metal', port_names: Sequence[str] | None = None, component_name: str | None = None, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'metal_routing', pad_port_name: str = 'e1', pad: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'pad', bend: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'wire_corner', straight_separation: float = 15.0, pad_pitch: float = 100.0, taper: str | Callable[[...], Component] | dict[str, Any] | DKCell | None = None, port_type: str = 'electrical', allow_width_mismatch: bool = True, fanout_length: float | None = 80, route_width: float | list[float] | None = 0, **kwargs) Component[source]#

Returns new component with ports connected top pads.

Parameters:
  • component – component spec to connect to.

  • port_names – list of port names to connect to pads.

  • component_name – optional for the label.

  • cross_section – cross_section function.

  • pad_port_name – pad port name.

  • pad – pad function.

  • bend – bend function.

  • straight_separation – from edge to edge.

  • pad_pitch – spacing between pads.

  • taper – taper function.

  • port_type – port type.

  • allow_width_mismatch – if True, allows width mismatch.

  • fanout_length – length of the fanout.

  • route_width – width of the route.

  • kwargs – additional arguments.

import gdsfactory as gf
c = gf.c.nxn(
    xsize=600,
    ysize=200,
    north=2,
    south=3,
    wg_width=10,
    layer="M3",
    port_type="electrical",
)
cc = gf.routing.add_pads_top(component=c, port_names=("e1", "e4"), fanout_length=50)
cc.plot()

(Source code)

import cspdk

c = cspdk.si220.cband.cells.add_pads_top(component='straight_metal', cross_section='metal_routing', pad_port_name='e1', pad='pad', bend='wire_corner', straight_separation=15.0, pad_pitch=100.0, port_type='electrical', allow_width_mismatch=True, fanout_length=80, route_width=0).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-6.png

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, p=0.5, cross_section='strip', allow_min_radius_violation=False).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-7.png

bend_metal#

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

Regular degree euler bend.

import cspdk

c = cspdk.si220.cband.cells.bend_metal(angle=90, cross_section='metal_routing').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-8.png

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=(11, 1.8), cross_section='strip', allow_min_radius_violation=False).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-9.png

bend_s_metal#

cspdk.si220.cband.cells.bend_s_metal(size: tuple[float, float] = (11, 1.8), cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'metal_routing', width: float | None = None, allow_min_radius_violation: bool = True) 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_metal(size=(11, 1.8), cross_section='metal_routing', allow_min_radius_violation=True).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-10.png

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, 2), layer='PAD', 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_si220_cband-11.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(length=20, gap=0.27).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-12.png

coupler_rib#

cspdk.si220.cband.cells.coupler_rib(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_rib(length=20, gap=0.27).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-13.png

coupler_ring#

cspdk.si220.cband.cells.coupler_ring(length_x: float = 4, gap: float = 0.27, radius: float = 5, bend: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'bend_euler', straight: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'straight', cross_section: str = 'strip', length_extension: float = 10) Component[source]#

Returns Coupler for ring.

Parameters:
  • length_x – length of the parallel coupled straight waveguides.

  • gap – gap between for coupler.

  • radius – for the bend and coupler.

  • bend – 90 degrees bend spec.

  • straight – straight spec.

  • cross_section – cross_section spec.

  • length_extension – length extension for the coupler.

import cspdk

c = cspdk.si220.cband.cells.coupler_ring(length_x=4, gap=0.27, radius=5, bend='bend_euler', straight='straight', cross_section='strip', length_extension=10).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-14.png

crossing#

cspdk.si220.cband.cells.crossing() Component[source]#

SOI220nm_1550nm_TE_STRIP_Waveguide_Crossing fixed cell.

import cspdk

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

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

_images/cells_si220_cband-15.png

crossing_rib#

cspdk.si220.cband.cells.crossing_rib() Component[source]#

SOI220nm_1550nm_TE_RIB_Waveguide_Crossing fixed cell.

import cspdk

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

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

_images/cells_si220_cband-16.png

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(size=(16000.0, 3000.0)).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-17.png

die_with_pads#

cspdk.si220.cband.cells.die_with_pads(size: tuple[float, float] = (11470.0, 4900.0), ngratings: int = 14, npads: int = 31, grating_pitch: float = 250.0, pad_pitch: float = 300.0, grating_coupler: str | Callable[[...], Component] | dict[str, Any] | DKCell | None = 'grating_coupler_rectangular', cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip', pad: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'pad', layer_floorplan: tuple[int, int] | str | int | LayerEnum = 'FLOORPLAN', edge_to_pad_distance: float = 150.0, edge_to_grating_distance: float = 150.0, with_loopback: bool = True) 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_with_pads(size=(11470.0, 4900.0), ngratings=14, npads=31, grating_pitch=250.0, pad_pitch=300.0, grating_coupler='grating_coupler_rectangular', cross_section='strip', pad='pad', layer_floorplan='FLOORPLAN', edge_to_pad_distance=150.0, edge_to_grating_distance=150.0, with_loopback=True).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-18.png

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.315, cross_section='strip').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-19.png

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.63, n_periods=60, length_taper=350.0, wavelength=1.55, cross_section='strip').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-20.png

grating_coupler_rectangular_rib#

cspdk.si220.cband.cells.grating_coupler_rectangular_rib(*, period=0.5, n_periods: int = 60, length_taper: float = 350.0, wavelength: float = 1.55, cross_section='rib') Component#

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_rib(period=0.5, n_periods=60, length_taper=350.0, wavelength=1.55, cross_section='rib').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-21.png

heater#

cspdk.si220.cband.cells.heater() Component[source]#

Heater fixed cell.

import cspdk

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

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

_images/cells_si220_cband-22.png

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_taper=1.5, length_taper=20.0, length_mmi=31.0, width_mmi=6.0, gap_mmi=1.64, cross_section='strip').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-23.png

mmi1x2_rib#

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

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_rib(width_taper=1.5, length_taper=20.0, length_mmi=32.7, width_mmi=6.0, gap_mmi=1.64, cross_section='rib').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-24.png

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=1.5, length_taper=20.0, length_mmi=42.5, width_mmi=6.0, gap_mmi=0.5, cross_section='strip').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-25.png

mmi2x2_rib#

cspdk.si220.cband.cells.mmi2x2_rib(width: float | None = None, width_taper: float = 1.5, length_taper: float = 20.0, *, length_mmi: float = 44.8, width_mmi: float = 6.0, gap_mmi: float = 0.53, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'rib') Component#

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_rib(width_taper=1.5, length_taper=20.0, length_mmi=44.8, width_mmi=6.0, gap_mmi=0.53, cross_section='rib').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-26.png

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, bend='bend_euler', straight='straight', splitter='coupler', port_e1_splitter='o3', port_e0_splitter='o4', port_e1_combiner='o3', port_e0_combiner='o4', cross_section='strip').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-27.png

pack_doe#

cspdk.si220.cband.cells.pack_doe(doe: str | Callable[[...], Component] | dict[str, Any] | DKCell, settings: dict[str, tuple[Any, ...]], do_permutations: bool = False, function: str | Callable[[...], Component] | dict[str, Any] | None = None, **kwargs) Component[source]#

Packs a component DOE (Design of Experiment) using pack.

Parameters:
  • doe – function to return Components.

  • settings – component settings.

  • do_permutations – for each setting.

  • function – to apply (add padding, grating couplers).

  • kwargs – for pack.

Keyword Arguments:
  • spacing – Minimum distance between adjacent shapes.

  • aspect_ratio – (width, height) ratio of the rectangular bin.

  • max_size – Limits the size into which the shapes will be packed.

  • sort_by_area – Pre-sorts the shapes by area.

  • density – Values closer to 1 pack tighter but require more computation.

  • precision – Desired precision for rounding vertex coordinates.

  • text – Optional function to add text labels.

  • text_prefix – for labels. For example. ‘A’ for ‘A1’, ‘A2’…

  • text_offsets – relative to component size info anchor. Defaults to center.

  • text_anchors – relative to component (ce cw nc ne nw sc se sw center cc).

  • name_prefix – for each packed component (avoids the Unnamed cells warning). Note that the suffix contains a uuid so the name will not be deterministic.

  • rotation – for each component in degrees.

  • h_mirror – horizontal mirror in y axis (x, 1) (1, 0). This is the most common.

  • v_mirror – vertical mirror using x axis (1, y) (0, y).

import cspdk

c = cspdk.si220.cband.cells.pack_doe(do_permutations=False).dup()
c.draw_ports()
c.plot()

(Source code)

pack_doe_grid#

cspdk.si220.cband.cells.pack_doe_grid(doe: str | Callable[[...], Component] | dict[str, Any] | DKCell, settings: dict[str, tuple[Any, ...]], do_permutations: bool = False, function: str | Callable[[...], Component] | dict[str, Any] | None = None, with_text: bool = False, **kwargs) Component[source]#

Packs a component DOE (Design of Experiment) using grid.

Parameters:
  • doe – function to return Components.

  • settings – component settings.

  • do_permutations – for each setting.

  • function – to apply to component (add padding, grating couplers).

  • with_text – includes text label.

  • kwargs – for grid.

Keyword Arguments:
  • spacing – between adjacent elements on the grid, can be a tuple for different distances in height and width.

  • separation – If True, guarantees elements are separated with fixed spacing if False, elements are spaced evenly along a grid.

  • shape – x, y shape of the grid (see np.reshape). If no shape and the list is 1D, if np.reshape were run with (1, -1).

  • align_x – {‘x’, ‘xmin’, ‘xmax’} for x (column) alignment along.

  • align_y – {‘y’, ‘ymin’, ‘ymax’} for y (row) alignment along.

  • edge_x – {‘x’, ‘xmin’, ‘xmax’} for x (column) (ignored if separation = True).

  • edge_y – {‘y’, ‘ymin’, ‘ymax’} for y (row) (ignored if separation = True).

  • rotation – for each component in degrees.

  • h_mirror – horizontal mirror y axis (x, 1) (1, 0). most common mirror.

  • v_mirror – vertical mirror using x axis (1, y) (0, y).

import cspdk

c = cspdk.si220.cband.cells.pack_doe_grid(do_permutations=False, with_text=False).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(size=(90.0, 90.0), layer='PAD', port_inclusion=0, port_orientation=0).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-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(size=(4, 2), layer='PAD', centered=False, port_orientations=(180, 90, 0, -90)).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-31.png

ring_double#

cspdk.si220.cband.cells.ring_double(gap: float = 0.27, gap_top: float | None = None, gap_bot: float | None = None, radius: float = 10.0, length_x: float = 0.01, length_y: float = 0.01, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip', length_extension: float = 10.0) Component[source]#

Returns a double bus ring.

two couplers (ct: top, cb: bottom) connected with two vertical straights (sl: left, sr: right)

Parameters:
  • gap – gap between for coupler.

  • gap_top – gap for the top coupler. Defaults to gap.

  • gap_bot – gap for the bottom coupler. Defaults to gap.

  • radius – for the bend and coupler.

  • length_x – ring coupler length.

  • length_y – vertical straight length.

  • bend – 90 degrees bend spec.

  • straight – straight spec.

  • coupler_ring – ring coupler spec.

  • coupler_ring_top – top ring coupler spec. Defaults to coupler_ring.

  • cross_section – cross_section spec.

  • length_extension – straight length extension at the end of the coupler bottom ports.

import cspdk

c = cspdk.si220.cband.cells.ring_double(gap=0.27, radius=10.0, length_x=0.01, length_y=0.01, cross_section='strip', length_extension=10.0).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-32.png

ring_single#

cspdk.si220.cband.cells.ring_single(gap: float = 0.27, radius: float = 10.0, length_x: float = 4.0, length_y: float = 0.6, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip', length_extension: float = 10.0) Component[source]#

Returns a single ring.

ring coupler (cb: bottom) connects to two vertical straights (sl: left, sr: right), two bends (bl, br) and horizontal straight (wg: top)

Parameters:
  • gap – gap between for coupler.

  • radius – for the bend and coupler.

  • length_x – ring coupler length.

  • length_y – vertical straight length.

  • coupler_ring – ring coupler spec.

  • bend – 90 degrees bend spec.

  • straight – straight spec.

  • coupler_ring – ring coupler spec.

  • cross_section – cross_section spec.

  • length_extension – straight length extension at the end of the coupler bottom ports.

          xxxxxxxxxxxxx
      xxxxx           xxxx
    xxx                   xxx
  xxx                       xxx
 xx                           xxx
 x                             xxx
xx                              xx▲
xx                              xx│length_y
xx                              xx▼
xx                             xx
 xx          length_x          x
  xx     ◄───────────────►    x
   xx                       xxx
     xx                   xxx
      xxx──────▲─────────xxx
               │gap
       o1──────▼─────────o2
import cspdk

c = cspdk.si220.cband.cells.ring_single(gap=0.27, radius=10.0, length_x=4.0, length_y=0.6, cross_section='strip', length_extension=10.0).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-33.png

spiral#

cspdk.si220.cband.cells.spiral(length: float = 100, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip', spacing: float = 3, n_loops: int = 6) Component[source]#

Returns a spiral double (spiral in, and then out).

Parameters:
  • length – length of the spiral straight section.

  • cross_section – cross_section component.

  • spacing – spacing between the spiral loops.

  • n_loops – number of loops.

import cspdk

c = cspdk.si220.cband.cells.spiral(length=100, cross_section='strip', spacing=3, n_loops=6).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-34.png

spiral_racetrack#

cspdk.si220.cband.cells.spiral_racetrack(min_radius: float | None = None, straight_length: float = 20.0, spacings: Sequence[float] = (2, 2, 3, 3, 2, 2), straight: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'straight', bend: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'bend_euler', bend_s: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'bend_s', cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip', cross_section_s: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection | None = None, extra_90_deg_bend: bool = False, allow_min_radius_violation: bool = False) Component[source]#

Returns Racetrack-Spiral.

Parameters:
  • min_radius – smallest radius in um.

  • straight_length – length of the straight segments in um.

  • spacings – space between the center of neighboring waveguides in um.

  • straight – factory to generate the straight segments.

  • bend – factory to generate the bend segments.

  • bend_s – factory to generate the s-bend segments.

  • cross_section – cross-section of the waveguides.

  • cross_section_s – cross-section of the s bend waveguide (optional).

  • extra_90_deg_bend – if True, we add an additional straight + 90 degree bent at the output, so the output port is looking down.

  • allow_min_radius_violation – if True, will allow the s-bend to have a smaller radius than the minimum radius.

import cspdk

c = cspdk.si220.cband.cells.spiral_racetrack(straight_length=20.0, spacings=(2, 2, 3, 3, 2, 2), straight='straight', bend='bend_euler', bend_s='bend_s', cross_section='strip', extra_90_deg_bend=False, allow_min_radius_violation=False).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-35.png

spiral_racetrack_heater#

cspdk.si220.cband.cells.spiral_racetrack_heater(spacing: float = 4.0, num: int = 8, straight_length: float = 100, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip') Component[source]#

Returns spiral racetrack with a heater above.

based on https://doi.org/10.1364/OL.400230 .

Parameters:
  • spacing – center to center spacing between the waveguides.

  • num – number of spiral loops.

  • straight_length – length of the straight segments.

  • cross_section – cross_section.

import cspdk

c = cspdk.si220.cband.cells.spiral_racetrack_heater(spacing=4.0, num=8, straight_length=100, cross_section='strip').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-36.png

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, cross_section='strip', npoints=2).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-37.png

straight_heater_meander#

cspdk.si220.cband.cells.straight_heater_meander(length: float = 320.0, heater_width: float = 2.5, spacing: float = 2, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip', layer_heater: tuple[int, int] | str | int | LayerEnum = 'HEATER', via_stack: str | Callable[[...], Component] | dict[str, Any] | DKCell | None = 'via_stack_heater_mtop', n: int | None = 3, port_orientation1: float | None = None, port_orientation2: float | None = None, radius: float | None = None) Component[source]#

Returns a meander based heater.

based on SungWon Chung, Makoto Nakai, and Hossein Hashemi, Low-power thermo-optic silicon modulator for large-scale photonic integrated systems Opt. Express 27, 13430-13459 (2019) https://www.osapublishing.org/oe/abstract.cfm?URI=oe-27-9-13430

Parameters:
  • length – phase shifter length.

  • heater_width – width of the heater.

  • spacing – waveguide spacing (center to center).

  • cross_section – for waveguide.

  • layer_heater – for top heater, if None, it does not add a heater.

  • via_stack – for the heater to via_stack metal.

  • n – number of meanders.

  • port_orientation1 – orientation of the first port. None for all orientations.

  • port_orientation2 – orientation of the second port. None for all orientations.

  • radius – radius of the meander.

import cspdk

c = cspdk.si220.cband.cells.straight_heater_meander(length=320.0, heater_width=2.5, spacing=2, cross_section='strip', layer_heater='HEATER', via_stack='via_stack_heater_mtop', n=3).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-38.png

straight_heater_metal#

cspdk.si220.cband.cells.straight_heater_metal(length: float = 320.0, length_undercut_spacing: float = 6.0, length_undercut: float = 30.0, length_straight: float = 0.1, length_straight_input: float = 15.0, with_undercut: bool = False, port_orientation1: int | None = None, port_orientation2: int | None = None) Component[source]#

Returns a thermal phase shifter.

dimensions from https://doi.org/10.1364/OE.27.010456

Parameters:
  • length – phase shifter length.

  • length_undercut_spacing – spacing between the waveguide and the undercut.

  • length_undercut – undercut length.

  • length_straight – straight length.

  • length_straight_input – straight length input.

  • with_undercut – isolation trenches for higher efficiency.

  • port_orientation1 – orientation of the first port. None for all orientations.

  • port_orientation2 – orientation of the second port. None for all orientations.

import cspdk

c = cspdk.si220.cband.cells.straight_heater_metal(length=320.0, length_undercut_spacing=6.0, length_undercut=30.0, length_straight=0.1, length_straight_input=15.0, with_undercut=False).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-39.png

straight_metal#

cspdk.si220.cband.cells.straight_metal(length: float = 10, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'metal_routing', width: float | None = None) 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.

import cspdk

c = cspdk.si220.cband.cells.straight_metal(length=10, cross_section='metal_routing').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-40.png

straight_rib#

cspdk.si220.cband.cells.straight_rib(length: float = 10, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'rib', width: float | None = None) 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.

import cspdk

c = cspdk.si220.cband.cells.straight_rib(length=10, cross_section='rib').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-41.png

straight_strip#

cspdk.si220.cband.cells.straight_strip(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_strip(length=10, cross_section='strip', npoints=2).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-42.png

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=0.45, cross_section='strip').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-43.png

taper_metal#

cspdk.si220.cband.cells.taper_metal(length: float = 10.0, width1: float = 10, width2: float | None = None, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'metal_routing') 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_metal(length=10.0, width1=10, cross_section='metal_routing').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-44.png

taper_strip_to_ridge#

cspdk.si220.cband.cells.taper_strip_to_ridge(length: float = 10.0, width1: float = 0.5, width2: float = 0.5, w_slab1: float = 0.2, w_slab2: float = 10.45, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip') Component[source]#

A taper between strip and ridge.

This is a transition between two distinct cross sections

Parameters:
  • length – the length of the taper.

  • width1 – the input width of the taper.

  • width2 – the output width of the taper.

  • w_slab1 – the input slab width of the taper.

  • w_slab2 – the output slab width of the taper.

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

import cspdk

c = cspdk.si220.cband.cells.taper_strip_to_ridge(length=10.0, width1=0.5, width2=0.5, w_slab1=0.2, w_slab2=10.45, cross_section='strip').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-45.png

text_rectangular#

cspdk.si220.cband.cells.text_rectangular(text: str = 'abc', size: float = 3, justify: str = 'left', layer: tuple[int, int] | str | int | LayerEnum = 'PAD') Component[source]#

Pixel based font, guaranteed to be manhattan, without acute angles.

Parameters:
  • text – string.

  • size – pixel size.

  • justify – left, right or center.

  • layer – for text.

import cspdk

c = cspdk.si220.cband.cells.text_rectangular(text='abc', size=3, justify='left', layer='PAD').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-46.png

text_rectangular_multi_layer#

cspdk.si220.cband.cells.text_rectangular_multi_layer(text: str = 'abc', layers: Sequence[tuple[int, int] | str | int | LayerEnum] = ('WG', 'PAD'), text_factory: str | Callable[[...], Component] | dict[str, Any] | DKCell = 'text_rectangular', **kwargs: Any) Component[source]#

Returns rectangular text in different layers.

Parameters:
  • text – string of text.

  • layers – list of layers to replicate the text.

  • text_factory – function to create the text Components.

  • kwargs – keyword arguments for text_factory.

import cspdk

c = cspdk.si220.cband.cells.text_rectangular_multi_layer(text='abc', layers=('WG', 'PAD'), text_factory='text_rectangular').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-47.png

trans_rib10#

cspdk.si220.cband.cells.trans_rib10(*, length: float = 10, width1: float = 0.5, width2: float = 0.5, w_slab1: float = 0.2, w_slab2: float = 10.45, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip') Component#

A taper between strip and ridge.

This is a transition between two distinct cross sections

Parameters:
  • length – the length of the taper.

  • width1 – the input width of the taper.

  • width2 – the output width of the taper.

  • w_slab1 – the input slab width of the taper.

  • w_slab2 – the output slab width of the taper.

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

import cspdk

c = cspdk.si220.cband.cells.trans_rib10(length=10, width1=0.5, width2=0.5, w_slab1=0.2, w_slab2=10.45, cross_section='strip').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-48.png

trans_rib20#

cspdk.si220.cband.cells.trans_rib20(*, length: float = 20, width1: float = 0.5, width2: float = 0.5, w_slab1: float = 0.2, w_slab2: float = 10.45, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip') Component#

A taper between strip and ridge.

This is a transition between two distinct cross sections

Parameters:
  • length – the length of the taper.

  • width1 – the input width of the taper.

  • width2 – the output width of the taper.

  • w_slab1 – the input slab width of the taper.

  • w_slab2 – the output slab width of the taper.

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

import cspdk

c = cspdk.si220.cband.cells.trans_rib20(length=20, width1=0.5, width2=0.5, w_slab1=0.2, w_slab2=10.45, cross_section='strip').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-49.png

trans_rib50#

cspdk.si220.cband.cells.trans_rib50(*, length: float = 50, width1: float = 0.5, width2: float = 0.5, w_slab1: float = 0.2, w_slab2: float = 10.45, cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'strip') Component#

A taper between strip and ridge.

This is a transition between two distinct cross sections

Parameters:
  • length – the length of the taper.

  • width1 – the input width of the taper.

  • width2 – the output width of the taper.

  • w_slab1 – the input slab width of the taper.

  • w_slab2 – the output slab width of the taper.

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

import cspdk

c = cspdk.si220.cband.cells.trans_rib50(length=50, width1=0.5, width2=0.5, w_slab1=0.2, w_slab2=10.45, cross_section='strip').dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-50.png

via_stack_heater_mtop#

cspdk.si220.cband.cells.via_stack_heater_mtop(size: tuple[float, float] = (20.0, 10.0)) Component[source]#

Rectangular via array stack.

You can use it to connect different metal layers or metals to silicon. You can use the naming convention via_stack_layerSource_layerDestination contains 4 ports (e1, e2, e3, e4)

also know as Via array http://www.vlsi-expert.com/2017/12/vias.html

Parameters:

size – of the layers.

import cspdk

c = cspdk.si220.cband.cells.via_stack_heater_mtop(size=(20.0, 10.0)).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-51.png

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_si220_cband-52.png

wire_corner45#

cspdk.si220.cband.cells.wire_corner45(cross_section: CrossSection | str | dict[str, Any] | Callable[[...], CrossSection] | SymmetricalCrossSection | DCrossSection = 'metal_routing', radius: float = 10, width: float | None = None, layer: tuple[int, int] | str | int | LayerEnum | None = None, with_corner90_ports: bool = True) Component[source]#

Returns 90 degrees electrical corner wire.

Parameters:
  • cross_section – spec.

  • radius – ignored.

  • width – optional width. Defaults to cross_section width.

  • layer – ignored.

  • with_corner90_ports – if True, adds ports at 90 degrees.

import cspdk

c = cspdk.si220.cband.cells.wire_corner45(cross_section='metal_routing', radius=10, with_corner90_ports=True).dup()
c.draw_ports()
c.plot()

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

_images/cells_si220_cband-53.png