Skip to content

Cells Si SOI 220nm Cband

add_fiber_array

Returns component with south routes and grating_couplers.

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

Parameters:

Name Type Description Default
component ComponentSpec

component spec to connect to grating couplers.

'straight'
grating_coupler

spec for route terminations.

gc
gc_port_name str

grating coupler input port name.

'o1'
cross_section CrossSectionSpec

cross_section function.

'strip'
kwargs

additional arguments.

{}

.. plot:: :include-source:

import gdsfactory as gf

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

:noindex:

add_fiber_array

import cspdk

c = cspdk.si220.cband.cells.add_fiber_array(component='straight', grating_coupler='grating_coupler_elliptical', gc_port_name='o1', cross_section='strip').copy()
c.draw_ports()
c.plot()

add_fiber_single

Returns component with south routes and grating_couplers.

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

Parameters:

Name Type Description Default
component ComponentSpec

component spec to connect to grating couplers.

'straight'
grating_coupler

spec for route terminations.

gc
gc_port_name str

grating coupler input port name.

'o1'
cross_section CrossSectionSpec

cross_section function.

'strip'
input_port_names list[str] | tuple[str, ...] | None

list of input port names to connect to grating couplers.

None
pitch float

spacing between fibers.

70
with_loopback bool

adds loopback structures.

True
loopback_spacing float

spacing between loopback and test structure.

100.0
kwargs

additional arguments.

{}

.. plot:: :include-source:

import gdsfactory as gf

c = gf.components.crossing()
cc = gf.routing.add_fiber_single(
    component=c,
    grating_coupler=gf.components.grating_coupler_elliptical_te,
)
cc.plot()

:noindex:

add_fiber_single

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

add_pads_top

Returns new component with ports connected top pads.

Parameters:

Name Type Description Default
component ComponentSpec

component spec to connect to.

'straight_metal'
port_names Strs | None

list of port names to connect to pads.

None
cross_section CrossSectionSpec

cross_section function.

'metal_routing'
pad_port_name str

pad port name.

'e1'
pad ComponentSpec

pad function.

'pad'
bend ComponentSpec

bend function.

'wire_corner'
straight_separation float

from edge to edge.

15.0
pad_pitch float

spacing between pads.

100.0
port_type str

port type.

'electrical'
allow_width_mismatch bool

if True, allows width mismatch.

True
fanout_length float | None

length of the fanout.

80
route_width float | list[float]

width of the route.

0
kwargs

additional arguments.

{}

.. plot:: :include-source:

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()

:noindex:

add_pads_top

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, pad_pitch=100, port_type='electrical', allow_width_mismatch=True, fanout_length=80, route_width=0).copy()
c.draw_ports()
c.plot()

bend_euler

Regular degree euler bend.

Parameters:

Name Type Description Default
radius float | None

in um. Defaults to cross_section_radius.

None
angle float

total angle of the curve.

90
p float

Proportion of the curve that is an Euler curve.

0.5
width float | None

width to use. Defaults to cross_section.width.

None
cross_section CrossSectionSpec

specification (CrossSection, string, CrossSectionFactory dict).

'strip'
allow_min_radius_violation bool

if True allows radius to be smaller than cross_section radius.

False

:noindex:

bend_euler

import cspdk

c = cspdk.si220.cband.cells.bend_euler(angle=90, p=0.5, cross_section='strip', allow_min_radius_violation=False).copy()
c.draw_ports()
c.plot()

bend_metal

Regular degree euler bend.

:noindex:

bend_metal

import cspdk

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

bend_s

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:

Name Type Description Default
size Size

in x and y direction.

(11, 1.8)
cross_section CrossSectionSpec

spec.

'strip'
width float | None

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

None
allow_min_radius_violation bool

allows min radius violations.

False

:noindex:

bend_s

import cspdk

c = cspdk.si220.cband.cells.bend_s(size=(11, 1.8), cross_section='strip', allow_min_radius_violation=False).copy()
c.draw_ports()
c.plot()

bend_s_metal

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:

Name Type Description Default
size Size

in x and y direction.

(11, 1.8)
cross_section CrossSectionSpec

spec.

'metal_routing'
width float | None

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

None
allow_min_radius_violation bool

allows min radius violations.

True

:noindex:

bend_s_metal

import cspdk

c = cspdk.si220.cband.cells.bend_s_metal(size=(11, 1.8), cross_section='metal_routing', 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, 2)
layer LayerSpec

tuple (int, int).

'PAD'
port_type str | None

optical, electrical.

None
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.si220.cband.cells.compass(size=(4, 2), layer='PAD', port_inclusion=0, port_orientations=(180, 90, 0, -90), auto_rename_ports=True).copy()
c.draw_ports()
c.plot()

coupler

Returns Symmetric coupler.

Parameters:

Name Type Description Default
length float

of coupling region in um.

14.5
gap float

of coupling region in um.

gap_strip

:noindex:

coupler

import cspdk

c = cspdk.si220.cband.cells.coupler(length=14.5, gap=0.27).copy()
c.draw_ports()
c.plot()

coupler_rib

Returns Symmetric coupler.

Parameters:

Name Type Description Default
length float

of coupling region in um.

20
gap float

of coupling region in um.

gap_rib

:noindex:

coupler_rib

import cspdk

c = cspdk.si220.cband.cells.coupler_rib(length=20, gap=0.27).copy()
c.draw_ports()
c.plot()

coupler_ring

Returns Coupler for ring.

Parameters:

Name Type Description Default
length_x float

length of the parallel coupled straight waveguides.

4
gap float

gap between for coupler.

gap_strip
radius float

for the bend and coupler.

radius_strip
bend ComponentSpec

90 degrees bend spec.

'bend_euler'
straight ComponentSpec

straight spec.

'straight'
cross_section str

cross_section spec.

'strip'
length_extension float

length extension for the coupler.

10

:noindex:

coupler_ring

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

crossing

SOI220nm_1550nm_TE_STRIP_Waveguide_Crossing fixed cell.

:noindex:

crossing

import cspdk

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

crossing_rib

SOI220nm_1550nm_TE_RIB_Waveguide_Crossing fixed cell.

:noindex:

crossing_rib

import cspdk

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

die

A die.

:noindex:

die

import cspdk

c = cspdk.si220.cband.cells.die(size=(16000, 3000)).copy()
c.draw_ports()
c.plot()

die_with_pads

A die with grating couplers and pads.

compass(size=(4, 2), layer='PAD', port_type=None, port_inclusion=0.0, port_orientations=(180, 90, 0, -90), auto_rename_ports=True)

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

Parameters:

Name Type Description Default
size Size

rectangle size.

(4, 2)
layer LayerSpec

tuple (int, int).

'PAD'
port_type str | None

optical, electrical.

None
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

die(size=(16000.0, 1 * 3000.0))

A die.

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)

A die with grating couplers and pads.

Parameters:

Name Type Description Default
size tuple[float, float]

the size of the die, in um.

(11470.0, 4900.0)
ngratings int

the number of grating couplers.

14
npads int

the number of pads.

31
grating_pitch float

the pitch of the grating couplers, in um.

250.0
pad_pitch float

the pitch of the pads, in um.

300.0
grating_coupler ComponentSpec | None

the grating coupler component. None skips the grating couplers.

'grating_coupler_rectangular'
cross_section CrossSectionSpec

the cross section.

'strip'
pad ComponentSpec

the pad component.

'pad'
layer_floorplan LayerSpec

the layer of the floorplan.

'FLOORPLAN'
edge_to_pad_distance float

the distance from the edge to the pads, in um.

150.0
edge_to_grating_distance float

the distance from the edge to the grating couplers, in um.

150.0
with_loopback bool

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

True

pad(size=(90.0, 90.0), layer='PAD', port_inclusion=0, port_orientation=0)

Returns rectangular pad with ports.

Parameters:

Name Type Description Default
size tuple[float, float]

x, y size.

(90.0, 90.0)
layer LayerSpec

pad layer.

'PAD'
bbox_layers

list of layers.

required
bbox_offsets

Optional offsets for each layer with respect to size. positive grows, negative shrinks the size.

required
port_inclusion float

from edge.

0
port_orientation float

in degrees.

0

rectangle(size=(4, 2), layer='PAD', centered=False, port_type=None, port_orientations=(180, 90, 0, -90))

Returns a rectangle.

Parameters:

Name Type Description Default
size Size

(tuple) Width and height of rectangle.

(4, 2)
layer LayerSpec

Specific layer to put polygon geometry on.

'PAD'
centered bool

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

False
port_type str | None

optical, electrical.

None
port_orientations Ints | None

list of port_orientations to add. None adds no ports.

(180, 90, 0, -90)

:noindex:

die_with_pads

import cspdk

c = cspdk.si220.cband.cells.die_with_pads(size=(11470, 4900), ngratings=14, npads=31, grating_pitch=250, pad_pitch=300, grating_coupler='grating_coupler_rectangular', cross_section='strip', pad='pad', layer_floorplan='FLOORPLAN', edge_to_pad_distance=150, edge_to_grating_distance=150, with_loopback=True).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.

'strip'

:noindex:

grating_coupler_elliptical

import cspdk

c = cspdk.si220.cband.cells.grating_coupler_elliptical(wavelength=1.55, grating_line_width=0.315, cross_section='strip').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.315 * 2
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.

'strip'

:noindex:

grating_coupler_rectangular

import cspdk

c = cspdk.si220.cband.cells.grating_coupler_rectangular(period=0.63, n_periods=60, length_taper=350, wavelength=1.55, cross_section='strip').copy()
c.draw_ports()
c.plot()

grating_coupler_rectangular_rib

:noindex:

grating_coupler_rectangular_rib

import cspdk

c = cspdk.si220.cband.cells.grating_coupler_rectangular_rib(period=0.5, n_periods=60, length_taper=350, wavelength=1.55, cross_section='rib').copy()
c.draw_ports()
c.plot()

heater

Heater fixed cell.

:noindex:

heater

import cspdk

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

mmi1x2

An mmi1x2.

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

Parameters:

Name Type Description Default
width float | None

the width of the waveguides connecting at the mmi ports.

None
width_taper float

the width at the base of the mmi body.

1.5
length_taper float

the length of the tapers going towards the mmi body.

20.0
length_mmi float

the length of the mmi body.

31.0
width_mmi float

the width of the mmi body.

6.0
gap_mmi float

the gap between the tapers at the mmi body.

1.64
cross_section CrossSectionSpec

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

'strip'

:noindex:

mmi1x2

import cspdk

c = cspdk.si220.cband.cells.mmi1x2(width_taper=1.5, length_taper=20, length_mmi=31, width_mmi=6, gap_mmi=1.64, cross_section='strip').copy()
c.draw_ports()
c.plot()

mmi1x2_rib

:noindex:

mmi1x2_rib

import cspdk

c = cspdk.si220.cband.cells.mmi1x2_rib(width_taper=1.5, length_taper=20, length_mmi=32.7, width_mmi=6, gap_mmi=1.64, cross_section='rib').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

20.0
length_mmi float

the length of the mmi body

42.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.5
cross_section CrossSectionSpec

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

'strip'

:noindex:

mmi2x2

import cspdk

c = cspdk.si220.cband.cells.mmi2x2(width_taper=1.5, length_taper=20, length_mmi=42.5, width_mmi=6, gap_mmi=0.5, cross_section='strip').copy()
c.draw_ports()
c.plot()

mmi2x2_rib

:noindex:

mmi2x2_rib

import cspdk

c = cspdk.si220.cband.cells.mmi2x2_rib(width_taper=1.5, length_taper=20, length_mmi=44.8, width_mmi=6, gap_mmi=0.53, cross_section='rib').copy()
c.draw_ports()
c.plot()

mzi

Mzi.

Parameters:

Name Type Description Default
delta_length float

bottom arm vertical extra length.

10
bend ComponentSpec

90 degrees bend library.

'bend_euler'
straight ComponentSpec

straight function.

'straight'
splitter ComponentSpec

splitter function.

'coupler'
combiner ComponentSpec | None

combiner function.

None
port_e1_splitter str

east top splitter port.

'o3'
port_e0_splitter str

east bot splitter port.

'o4'
port_e1_combiner str

east top combiner port.

'o3'
port_e0_combiner str

east bot combiner port.

'o4'
cross_section CrossSectionSpec

for routing (sxtop/sxbot to combiner).

'strip'

:noindex:

mzi

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

pack_doe

:noindex:

pack_doe

import cspdk

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

pack_doe_grid

:noindex:

pack_doe_grid

import cspdk

c = cspdk.si220.cband.cells.pack_doe_grid(do_permutations=False, with_text=False).copy()
c.draw_ports()
c.plot()

pad

Returns rectangular pad with ports.

Parameters:

Name Type Description Default
size tuple[float, float]

x, y size.

(90.0, 90.0)
layer LayerSpec

pad layer.

'PAD'
bbox_layers

list of layers.

required
bbox_offsets

Optional offsets for each layer with respect to size. positive grows, negative shrinks the size.

required
port_inclusion float

from edge.

0
port_orientation float

in degrees.

0

:noindex:

pad

import cspdk

c = cspdk.si220.cband.cells.pad(size=(90, 90), layer='PAD', port_inclusion=0, port_orientation=0).copy()
c.draw_ports()
c.plot()

rectangle

Returns a rectangle.

Parameters:

Name Type Description Default
size Size

(tuple) Width and height of rectangle.

(4, 2)
layer LayerSpec

Specific layer to put polygon geometry on.

'PAD'
centered bool

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

False
port_type str | None

optical, electrical.

None
port_orientations Ints | None

list of port_orientations to add. None adds no ports.

(180, 90, 0, -90)

:noindex:

rectangle

import cspdk

c = cspdk.si220.cband.cells.rectangle(size=(4, 2), layer='PAD', centered=False, port_orientations=(180, 90, 0, -90)).copy()
c.draw_ports()
c.plot()

ring_double

Returns a double bus ring.

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

Parameters:

Name Type Description Default
gap float

gap between for coupler.

gap_strip
gap_top float | None

gap for the top coupler. Defaults to gap.

None
gap_bot float | None

gap for the bottom coupler. Defaults to gap.

None
radius float

for the bend and coupler.

10.0
length_x float

ring coupler length.

0.01
length_y float

vertical straight length.

0.01
bend

90 degrees bend spec.

required
straight

straight spec.

required
coupler_ring

ring coupler spec.

required
coupler_ring_top

top ring coupler spec. Defaults to coupler_ring.

required
cross_section CrossSectionSpec

cross_section spec.

'strip'
length_extension float

straight length extension at the end of the coupler bottom ports.

10.0

:noindex:

ring_double

import cspdk

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

ring_single

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:

Name Type Description Default
gap float

gap between for coupler.

gap_strip
radius float

for the bend and coupler.

10.0
length_x float

ring coupler length.

4.0
length_y float

vertical straight length.

0.6
cross_section CrossSectionSpec

cross_section spec.

'strip'
length_extension float

straight length extension at the end of the coupler bottom ports.

10.0
bend ComponentSpec

bend type for the ring. Defaults to "bend_euler".

'bend_euler'
p float

percentage of the bend that is euler. 1 means full euler, 0 means full circular.

0
                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

:noindex:

ring_single

import cspdk

c = cspdk.si220.cband.cells.ring_single(gap=0.27, radius=10, length_x=4, length_y=0.6, cross_section='strip', length_extension=10, bend='bend_euler', p=0).copy()
c.draw_ports()
c.plot()

spiral

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

Parameters:

Name Type Description Default
length float

length of the spiral straight section.

100
cross_section CrossSectionSpec

cross_section component.

'strip'
spacing float

spacing between the spiral loops.

3
n_loops int

number of loops.

6

:noindex:

spiral

import cspdk

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

spiral_racetrack

Returns Racetrack-Spiral.

Parameters:

Name Type Description Default
min_radius float | None

smallest radius in um.

None
straight_length float

length of the straight segments in um.

20.0
spacings Floats

space between the center of neighboring waveguides in um.

(2, 2, 3, 3, 2, 2)
straight ComponentSpec

factory to generate the straight segments.

'straight'
bend ComponentSpec

factory to generate the bend segments.

'bend_euler'
bend_s ComponentSpec

factory to generate the s-bend segments.

'bend_s'
cross_section CrossSectionSpec

cross-section of the waveguides.

'strip'
cross_section_s CrossSectionSpec | None

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

None
extra_90_deg_bend bool

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

False
allow_min_radius_violation bool

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

False

:noindex:

spiral_racetrack

import cspdk

c = cspdk.si220.cband.cells.spiral_racetrack(straight_length=20, 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).copy()
c.draw_ports()
c.plot()

spiral_racetrack_heater

Returns spiral racetrack with a heater above.

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

Parameters:

Name Type Description Default
spacing float

center to center spacing between the waveguides.

4.0
num int

number of spiral loops.

8
straight_length float

length of the straight segments.

100
cross_section CrossSectionSpec

cross_section.

'strip'

:noindex:

spiral_racetrack_heater

import cspdk

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

straight

Returns a Straight waveguide.

Parameters:

Name Type Description Default
length float

straight length (um).

10
cross_section CrossSectionSpec

specification (CrossSection, string or dict).

'strip'
width float | None

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

None
npoints int

number of points.

2

:noindex:

straight

import cspdk

c = cspdk.si220.cband.cells.straight(length=10, cross_section='strip', npoints=2).copy()
c.draw_ports()
c.plot()

straight_heater_meander

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:

Name Type Description Default
length float

phase shifter length.

320.0
heater_width float

width of the heater.

2.5
spacing float

waveguide spacing (center to center).

2
cross_section CrossSectionSpec

for waveguide.

'strip'
layer_heater LayerSpec

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

'HEATER'
via_stack ComponentSpec | None

for the heater to via_stack metal.

'via_stack_heater_mtop'
n int | None

number of meanders.

3
port_orientation1 float | None

orientation of the first port. None for all orientations.

90
port_orientation2 float | None

orientation of the second port. None for all orientations.

90
radius float | None

radius of the meander.

None

:noindex:

straight_heater_meander

import cspdk

c = cspdk.si220.cband.cells.straight_heater_meander(length=320, heater_width=2.5, spacing=2, cross_section='strip', layer_heater='HEATER', via_stack='via_stack_heater_mtop', n=3, port_orientation1=90, port_orientation2=90).copy()
c.draw_ports()
c.plot()

straight_heater_metal

Returns a thermal phase shifter.

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

Parameters:

Name Type Description Default
length float

phase shifter length.

320.0
length_undercut_spacing float

spacing between the waveguide and the undercut.

6.0
length_undercut float

undercut length.

30.0
length_straight float

straight length.

0.1
length_straight_input float

straight length input.

15.0
with_undercut bool

isolation trenches for higher efficiency.

False
port_orientation1 int | None

orientation of the first port. None for all orientations.

90
port_orientation2 int | None

orientation of the second port. None for all orientations.

90

:noindex:

straight_heater_metal

import cspdk

c = cspdk.si220.cband.cells.straight_heater_metal(length=320, length_undercut_spacing=6, length_undercut=30, length_straight=0.1, length_straight_input=15, with_undercut=False, port_orientation1=90, port_orientation2=90).copy()
c.draw_ports()
c.plot()

straight_metal

Returns a Straight waveguide.

Parameters:

Name Type Description Default
length float

straight length (um).

10
cross_section CrossSectionSpec

specification (CrossSection, string or dict).

'metal_routing'
width float | None

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

None

:noindex:

straight_metal

import cspdk

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

straight_rib

Returns a Straight waveguide.

Parameters:

Name Type Description Default
length float

straight length (um).

10
cross_section CrossSectionSpec

specification (CrossSection, string or dict).

'rib'
width float | None

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

None

:noindex:

straight_rib

import cspdk

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

straight_strip

Returns a Straight waveguide.

Parameters:

Name Type Description Default
length float

straight length (um).

10
cross_section CrossSectionSpec

specification (CrossSection, string or dict).

'strip'
width float | None

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

None
npoints int

number of points.

2

:noindex:

straight_strip

import cspdk

c = cspdk.si220.cband.cells.straight_strip(length=10, cross_section='strip', npoints=2).copy()
c.draw_ports()
c.plot()

taper

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

Parameters:

Name Type Description Default
length float

taper length.

10.0
width1 float

width of the west/left port.

width
width2 float | None

width of the east/right port. Defaults to width1.

None
cross_section CrossSectionSpec

specification (CrossSection, string, CrossSectionFactory dict).

'strip'

:noindex:

taper

import cspdk

c = cspdk.si220.cband.cells.taper(length=10, width1=0.45, cross_section='strip').copy()
c.draw_ports()
c.plot()

taper_metal

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

Parameters:

Name Type Description Default
length float

taper length.

10.0
width1 float

width of the west/left port.

width_metal
width2 float | None

width of the east/right port. Defaults to width1.

None
cross_section CrossSectionSpec

specification (CrossSection, string, CrossSectionFactory dict).

'metal_routing'

:noindex:

taper_metal

import cspdk

c = cspdk.si220.cband.cells.taper_metal(length=10, width1=10, cross_section='metal_routing').copy()
c.draw_ports()
c.plot()

taper_strip_to_ridge

A taper between strip and ridge.

This is a transition between two distinct cross sections

Parameters:

Name Type Description Default
length float

the length of the taper.

10.0
width1 float

the input width of the taper.

0.5
width2 float

the output width of the taper.

0.5
w_slab1 float

the input slab width of the taper.

0.2
w_slab2 float

the output slab width of the taper.

10.45
cross_section CrossSectionSpec

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

'strip'

:noindex:

taper_strip_to_ridge

import cspdk

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

text_rectangular

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

Parameters:

Name Type Description Default
text str

string.

'abc'
size float

pixel size.

3
justify str

left, right or center.

'left'
layer LayerSpec

for text.

'PAD'

:noindex:

text_rectangular

import cspdk

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

text_rectangular_multi_layer

Returns rectangular text in different layers.

Parameters:

Name Type Description Default
text str

string of text.

'abc'
layers LayerSpecs

list of layers to replicate the text.

('WG', 'PAD')
text_factory ComponentSpec

function to create the text Components.

'text_rectangular'
kwargs Any

keyword arguments for text_factory.

{}

:noindex:

text_rectangular_multi_layer

import cspdk

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

trans_rib10

:noindex:

trans_rib10

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

trans_rib20

:noindex:

trans_rib20

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

trans_rib50

:noindex:

trans_rib50

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

via_stack_heater_mtop

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:

Name Type Description Default
size Size

of the layers.

(20.0, 10.0)

:noindex:

via_stack_heater_mtop

import cspdk

c = cspdk.si220.cband.cells.via_stack_heater_mtop(size=(20, 10)).copy()
c.draw_ports()
c.plot()

wire_corner

Returns 45 degrees electrical corner wire.

Parameters:

Name Type Description Default
cross_section CrossSectionSpec

spec.

'metal_routing'
width float | None

optional width. Defaults to cross_section width.

None
radius float | None

ignored.

None

:noindex:

wire_corner

import cspdk

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

wire_corner45

Returns 90 degrees electrical corner wire.

Parameters:

Name Type Description Default
cross_section CrossSectionSpec

spec.

'metal_routing'
radius float

in um.

10
width float | None

optional width. Defaults to cross_section width.

None
layer LayerSpec | None

optional layer.

None
with_corner90_ports bool

if True, adds ports at 90 degrees.

True

:noindex:

wire_corner45

import cspdk

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

wire_corner45_straight

Returns 90 degrees electrical corner wire.

Parameters:

Name Type Description Default
width float | None

of the wire.

None
radius float | None

of the corner. Defaults to width.

None
cross_section CrossSectionSpec

metal_routing.

'metal_routing'

:noindex:

wire_corner45_straight

import cspdk

c = cspdk.si220.cband.cells.wire_corner45_straight(cross_section='metal_routing').copy()
c.draw_ports()
c.plot()