Skip to content

Cells Si SOI 220nm Oband

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.oband.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.oband.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] | None

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.oband.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.oband.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.oband.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.oband.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.oband.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.oband.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.

20
gap float

of coupling region in um.

gap_strip

:noindex:

coupler

import cspdk

c = cspdk.si220.oband.cells.coupler(length=20, 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.oband.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.oband.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_1310nm_TE_STRIP_Waveguide_Crossing fixed cell.

:noindex:

crossing

import cspdk

c = cspdk.si220.oband.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.oband.cells.crossing_rib().copy()
c.draw_ports()
c.plot()

die

A die with grating couplers and pads.

Parameters:

Name Type Description Default
size tuple[float, float]

the size of the die, in um.

(16000.0, 1 * 3000.0)
ngratings

the number of grating couplers.

required
npads

the number of pads.

required
grating_pitch

the pitch of the grating couplers, in um.

required
pad_pitch

the pitch of the pads, in um.

required
grating_coupler

the grating coupler component. None skips the grating couplers.

required
cross_section

the cross section.

required
pad

the pad component.

required
layer_floorplan

the layer of the floorplan.

required
edge_to_pad_distance

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

required
edge_to_grating_distance

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

required
with_loopback

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

required

:noindex:

die

import cspdk

c = cspdk.si220.oband.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 with grating couplers and pads.

Parameters:

Name Type Description Default
size tuple[float, float]

the size of the die, in um.

(16000.0, 1 * 3000.0)
ngratings

the number of grating couplers.

required
npads

the number of pads.

required
grating_pitch

the pitch of the grating couplers, in um.

required
pad_pitch

the pitch of the pads, in um.

required
grating_coupler

the grating coupler component. None skips the grating couplers.

required
cross_section

the cross section.

required
pad

the pad component.

required
layer_floorplan

the layer of the floorplan.

required
edge_to_pad_distance

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

required
edge_to_grating_distance

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

required
with_loopback

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

required

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.oband.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.oband.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.25 * 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.oband.cells.grating_coupler_rectangular(period=0.5, 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.oband.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.oband.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.

40.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.oband.cells.mmi1x2(width_taper=1.5, length_taper=20, length_mmi=40, 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.oband.cells.mmi1x2_rib(width_taper=1.5, length_taper=20, length_mmi=40.8, width_mmi=6, gap_mmi=1.55, 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

53.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.53
cross_section CrossSectionSpec

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

'strip'

:noindex:

mmi2x2

import cspdk

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

mmi2x2_rib

:noindex:

mmi2x2_rib

import cspdk

c = cspdk.si220.oband.cells.mmi2x2_rib(width_taper=1.5, length_taper=20, length_mmi=55, 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.oband.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

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

Parameters:

Name Type Description Default
doe ComponentSpec

function to return Components.

required
settings dict[str, tuple[Any, ...]]

component settings.

required
do_permutations bool

for each setting.

False
function CellSpec | None

to apply (add padding, grating couplers).

None
kwargs

for pack.

{}

Other Parameters:

Name Type Description
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).

:noindex:

import cspdk

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

pack_doe_grid

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

Parameters:

Name Type Description Default
doe ComponentSpec

function to return Components.

required
settings dict[str, tuple[Any, ...]]

component settings.

required
do_permutations bool

for each setting.

False
function CellSpec | None

to apply to component (add padding, grating couplers).

None
with_text bool

includes text label.

False
kwargs

for grid.

{}

Other Parameters:

Name Type Description
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).

:noindex:

import cspdk

c = cspdk.si220.oband.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.oband.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.oband.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'

:noindex:

ring_double

import cspdk

c = cspdk.si220.oband.cells.ring_double(gap=0.27, radius=10, length_x=0.01, length_y=0.01, cross_section='strip').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'
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.oband.cells.ring_single(gap=0.27, radius=10, length_x=4, length_y=0.6, cross_section='strip', 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.oband.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.oband.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.oband.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.oband.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.

None
port_orientation2 float | None

orientation of the second port. None for all orientations.

None
radius float | None

radius of the meander.

None

:noindex:

straight_heater_meander

import cspdk

c = cspdk.si220.oband.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).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.

None
port_orientation2 int | None

orientation of the second port. None for all orientations.

None

:noindex:

straight_heater_metal

import cspdk

c = cspdk.si220.oband.cells.straight_heater_metal(length=320, length_undercut_spacing=6, length_undercut=30, length_straight=0.1, length_straight_input=15, with_undercut=False).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.oband.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.oband.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.oband.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.oband.cells.taper(length=10, width1=0.4, 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.oband.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.oband.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.oband.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.oband.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.oband.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.oband.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.oband.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.oband.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.oband.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

ignored.

10
width float | None

optional width. Defaults to cross_section width.

None
layer LayerSpec | None

ignored.

None
with_corner90_ports bool

if True, adds ports at 90 degrees.

True

:noindex:

wire_corner45

import cspdk

c = cspdk.si220.oband.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.oband.cells.wire_corner45_straight(cross_section='metal_routing').copy()
c.draw_ports()
c.plot()