Skip to content

Cells Si SOI 220nm C-band and O-band

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_cband'
kwargs

additional arguments.

{}
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.add_fiber_array(component='straight', grating_coupler='grating_coupler_elliptical', gc_port_name='o1', cross_section='strip_cband')
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_cband'
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.

{}
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.add_fiber_single(component='straight', grating_coupler='grating_coupler_elliptical', gc_port_name='o1', cross_section='strip_cband', pitch=70, with_loopback=True, loopback_spacing=100)
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.

{}
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

from cspdk.si220 import cells, PDK

PDK.activate()

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

bend_circular

Circular bend, like the Cornerstone 90 degree bends.

A rib cross-section's slab follows the bend at a constant offset.

Parameters:

Name Type Description Default
radius float | None

in um. Defaults to the cross-section radius.

None
angle float

total angle of the curve.

90
npoints int | None

number of points along the arc. Defaults to gdsfactory's.

None
width float | None

width to use. Defaults to cross_section.width.

None
cross_section CrossSectionSpec

specification (CrossSection, string, CrossSectionFactory dict).

'strip_cband'
allow_min_radius_violation bool

if True allows radius to be smaller than cross_section radius.

False

:noindex:

bend_circular

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.bend_circular(angle=90, cross_section='strip_cband', allow_min_radius_violation=False)
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_cband'
allow_min_radius_violation bool

if True allows radius to be smaller than cross_section radius.

False

:noindex:

bend_euler

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.bend_euler(angle=90, p=0.5, cross_section='strip_cband', allow_min_radius_violation=False)
c.draw_ports()
c.plot()

bend_metal

Return a circular metal-routing bend.

Parameters:

Name Type Description Default
radius float | None

Bend radius. Uses the cross-section radius or width when omitted.

None
angle float

Bend angle in degrees.

90
width float | None

Optional metal width override.

None
cross_section CrossSectionSpec

Metal-routing cross-section specification.

'metal_routing'

:noindex:

bend_metal

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.bend_metal(angle=90, cross_section='metal_routing')
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_cband'
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.bend_s(size=(11, 1.8), cross_section='strip_cband', allow_min_radius_violation=False)
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.bend_s_metal(size=(11, 1.8), cross_section='metal_routing', allow_min_radius_violation=True)
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.compass(size=(4, 2), layer='PAD', port_inclusion=0, port_orientations=(180, 90, 0, -90), auto_rename_ports=True)
c.draw_ports()
c.plot()

coupler

Returns Symmetric coupler.

Parameters:

Name Type Description Default
length float | None

of coupling region in um.

None
gap float

of coupling region in um.

gap_strip
cross_section CrossSectionSpec

optical cross-section selecting the operating band.

'strip_cband'

:noindex:

coupler

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.coupler(gap=0.27, cross_section='strip_cband')
c.draw_ports()
c.plot()

coupler_rib

Returns Symmetric coupler.

Parameters:

Name Type Description Default
length float | None

of coupling region in um.

None
gap float

of coupling region in um.

gap_rib
cross_section CrossSectionSpec

rib cross-section selecting the operating band.

'rib_cband'

:noindex:

coupler_rib

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.coupler_rib(gap=0.27, cross_section='rib_cband')
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_cband'
length_extension float

length extension for the coupler.

10

:noindex:

coupler_ring

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.coupler_ring(length_x=4, gap=0.27, radius=10, bend='bend_euler', straight='straight', cross_section='strip_cband', length_extension=10)
c.draw_ports()
c.plot()

crossing

Return the foundry waveguide crossing for the cross-section's band and type.

The arm profile is the Cornerstone Run-50 one (see CROSSING_PROFILES). Rib crossings get a 5 um straight on each arm and a slab that is the core grown by the cross-section's slab offset, clipped to the arm ends.

Parameters:

Name Type Description Default
cross_section CrossSectionSpec

strip or rib, C- or O-band cross-section.

'strip_cband'

:noindex:

crossing

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.crossing(cross_section='strip_cband')
c.draw_ports()
c.plot()

crossing_rib

Return the foundry rib waveguide crossing for the cross-section's band.

The same geometry as crossing with a rib cross-section.

Parameters:

Name Type Description Default
cross_section CrossSectionSpec

rib C- or O-band cross-section.

'rib_cband'

:noindex:

crossing_rib

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.crossing_rib(cross_section='rib_cband')
c.draw_ports()
c.plot()

die

Return the die floorplan (GDS 99), centred on the origin.

The default is the Run-50 full design area, 11470 x 4900 um; die_half is the 5500 x 4900 um half design area.

Parameters:

Name Type Description Default
size tuple[float, float]

Die width and height in micrometres.

(11470.0, 4900.0)

:noindex:

die

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.die(size=(11470, 4900))
c.draw_ports()
c.plot()

die_half

Return the Run-50 half design area floorplan, 5500 x 4900 um.

:noindex:

die_half

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.die_half()
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=(11470.0, 4900.0))

Return the die floorplan (GDS 99), centred on the origin.

The default is the Run-50 full design area, 11470 x 4900 um; die_half is the 5500 x 4900 um half design area.

Parameters:

Name Type Description Default
size tuple[float, float]

Die width and height in micrometres.

(11470.0, 4900.0)

die_half()

Return the Run-50 half design area floorplan, 5500 x 4900 um.

die_with_pads(size=(11470.0, 4900.0), ngratings=16, npads=31, grating_pitch=250.0, pad_pitch=300.0, grating_coupler='grating_coupler_rectangular', cross_section='strip_cband', pad='pad', layer_floorplan='FLOORPLAN', edge_to_pad_distance=50.0, edge_to_grating_distance=420.0, with_loopback=True, pad_size=(150.0, 200.0), pad_offset_x=-115.0, loopback_radius=30.0)

A die with grating couplers and pads: the Run-50 full packaging template.

The defaults reproduce Cell0_SOI220_cband_TE_Full_Packaging_Template: an 11470 x 4900 um floorplan, 16 C-band strip gratings per side at 250 um pitch (y = -1875 ... 1875 um, ports at x = +-4923 um) and 31 pads of 150 x 200 um per side at 300 um pitch (x = -4615 ... 4385 um, y = +-2300 um). With with_loopback the outermost gratings of each side are joined by a loopback waveguide that runs 70 um behind the gratings, with 30 um radius arcs.

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 per side, loopback ones included.

16
npads int

the number of pads per side.

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_cband'
pad ComponentSpec

the pad component.

'pad'
layer_floorplan LayerSpec

the layer of the floorplan.

'FLOORPLAN'
edge_to_pad_distance float

the distance from the top/bottom die edge to the pads, in um.

50.0
edge_to_grating_distance float

the distance from the left/right die edge to the far end of the grating couplers, in um.

420.0
with_loopback bool

if True, joins the outermost grating couplers of each side with a loopback waveguide.

True
pad_size tuple[float, float] | None

size of the pads, passed to pad. None keeps the pad's own size.

(150.0, 200.0)
pad_offset_x float

x of the centre of the pad rows, in um.

-115.0
loopback_radius float

bend radius of the loopback waveguide, in um.

30.0

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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.die_with_pads(size=(11470, 4900), ngratings=16, npads=31, grating_pitch=250, pad_pitch=300, grating_coupler='grating_coupler_rectangular', cross_section='strip_cband', pad='pad', layer_floorplan='FLOORPLAN', edge_to_pad_distance=50, edge_to_grating_distance=420, with_loopback=True, pad_size=(150, 200), pad_offset_x=-115, loopback_radius=30)
c.draw_ports()
c.plot()

graphene_bolometer

Gated graphene bolometric photodetector (310 um x 320 um).

Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_Bolometer.

:noindex:

graphene_bolometer

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.graphene_bolometer()
c.draw_ports()
c.plot()

graphene_bolometer_metallic

Graphene bolometric photodetector with a metallic gate (310 um x 310 um).

Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_Bolometer_metallic.

:noindex:

graphene_bolometer_metallic

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.graphene_bolometer_metallic()
c.draw_ports()
c.plot()

graphene_bolometer_metallic_with_gc

Metallic-gate graphene bolometer between two grating couplers.

Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_Bolometer_metallic_with_GC.

:noindex:

graphene_bolometer_metallic_with_gc

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.graphene_bolometer_metallic_with_gc()
c.draw_ports()
c.plot()

graphene_bolometer_no_gate

Graphene bolometric photodetector without a gate (310 um x 320 um).

Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_Bolometer_no_gate.

:noindex:

graphene_bolometer_no_gate

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.graphene_bolometer_no_gate()
c.draw_ports()
c.plot()

graphene_bolometer_no_gate_with_gc

Ungated graphene bolometer between two grating couplers.

Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_Bolometer_no_gate_with_GC.

:noindex:

graphene_bolometer_no_gate_with_gc

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.graphene_bolometer_no_gate_with_gc()
c.draw_ports()
c.plot()

graphene_bolometer_with_gc

Gated graphene bolometric photodetector between two grating couplers.

Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_Bolometer_with_GC.

:noindex:

graphene_bolometer_with_gc

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.graphene_bolometer_with_gc()
c.draw_ports()
c.plot()

graphene_eam

Double-layer graphene electro-absorption modulator (210 um x 210 um).

Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_EAM.

:noindex:

graphene_eam

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.graphene_eam()
c.draw_ports()
c.plot()

graphene_eam_with_gc

Graphene electro-absorption modulator between two grating couplers.

Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_EAM_with_GC.

:noindex:

graphene_eam_with_gc

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.graphene_eam_with_gc()
c.draw_ports()
c.plot()

graphene_pte

Graphene photo-thermoelectric detector (210 um x 230 um).

Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_PTE.

:noindex:

graphene_pte

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.graphene_pte()
c.draw_ports()
c.plot()

graphene_pte_metallic

Metallic-gate graphene photo-thermoelectric detector (210 um x 230 um).

Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_PTE_metallic.

:noindex:

graphene_pte_metallic

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.graphene_pte_metallic()
c.draw_ports()
c.plot()

graphene_pte_metallic_with_gc

Metallic-gate graphene photo-thermoelectric detector between two gratings.

Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_PTE_metallic_with_GC.

:noindex:

graphene_pte_metallic_with_gc

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.graphene_pte_metallic_with_gc()
c.draw_ports()
c.plot()

graphene_pte_with_gc

Graphene photo-thermoelectric detector between two grating couplers.

Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_PTE_with_GC.

:noindex:

graphene_pte_with_gc

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.graphene_pte_with_gc()
c.draw_ports()
c.plot()

grating_coupler_elliptical

A grating coupler with curved but parallel teeth.

This is not a Cornerstone standard component. grating_line_width is the width of the unetched ridge between two trenches (GDS 6). The Cornerstone deck limits GDS 6 gaps narrower than 350 nm to 20 um length, and the ridges here are arcs longer than that, so they are 350 nm wide (fill factor 0.51 at the 0.685 um period) rather than 315 nm. The wider ridge slightly raises the grating's mean effective index (a few nm red shift of the centre wavelength) and weakens the scattering strength; the period still follows wavelength.

Parameters:

Name Type Description Default
wavelength float

the center wavelength for which the grating is designed

1.55
grating_line_width float

width of the unetched ridge between trenches, in um. Keep it at 0.35 or more to pass the Cornerstone deck.

0.35
cross_section CrossSectionSpec

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

'strip_cband'

:noindex:

grating_coupler_elliptical

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.grating_coupler_elliptical(wavelength=1.55, grating_line_width=0.35, cross_section='strip_cband')
c.draw_ports()
c.plot()

grating_coupler_focusing_apodized

C-band apodized focusing grating coupler for 450 nm strip waveguides.

Cornerstone Run 50 cell SOI220_cband_TE_strip_apodized_GC_focusing_v1p0. The grating lies west of the waveguide port o1 at (0, 0), which points east. The fibre port o2 is at the centre of the teeth, (-42.351, 0).

:noindex:

grating_coupler_focusing_apodized

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.grating_coupler_focusing_apodized()
c.draw_ports()
c.plot()

grating_coupler_rectangular

A grating coupler with straight and parallel teeth (Run-50 standard GC).

With the defaults it is the Run-50 template cell of the band and type of cross_section rotated by 180 degrees: a length_taper linear taper from the waveguide to a width_grating wide waveguide (GDS 3) of length length_grating, with n_periods etched teeth (GDS 6) that overhang the waveguide by grating_overhang on each side. Rib gratings start with a length_straight input waveguide and are surrounded by the slab (GDS 5) of the rib cross-section.

          length_taper    length_grating
       |<------------>|<---------------->|
                     _____________________
                 ___/| | | | | | | | |    |
       o1 ______/    | | | | | | | | |    |  width_grating
                \___ | | | | | | | | |    |
                    \|_|_|_|_|_|_|_|_|____|
                     <> grating_offset

Parameters:

Name Type Description Default
period float | None

grating period in um. None: 0.63 (C-band) or 0.5 (O-band).

None
n_periods int | None

number of etched teeth. None: 60 (C-band) or 80 (O-band).

None
length_taper float

length of the taper from the waveguide to the grating.

350.0
wavelength float | None

centre wavelength in um, stored in info. None: band centre.

None
cross_section CrossSectionSpec

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

'strip_cband'
fill_factor float

etched fraction of each period (tooth width / period).

0.5
width_grating float

width of the waveguide (GDS 3) under the grating.

10.0
length_grating float

length of the wide waveguide section under the grating.

42.0
grating_offset float | None

distance from the end of the taper to the first tooth. None: 0.342 (C-band) or 1.875 (O-band).

None
grating_overhang float

how far the teeth (GDS 6) extend past the waveguide on each side. The Cornerstone deck needs more than 0.2 um.

0.5
length_straight float | None

input waveguide before the taper. None: 5 um for rib, 0 for strip.

None
slab_taper_start float | None

x where the slab starts to widen (rib only). None: the template value, length_straight (C-band) or length_straight - 0.042 (O-band). The slab taper ends at the miter point of the slab offset.

None

:noindex:

grating_coupler_rectangular

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.grating_coupler_rectangular(length_taper=350, cross_section='strip_cband', fill_factor=0.5, width_grating=10, length_grating=42, grating_overhang=0.5)
c.draw_ports()
c.plot()

grating_coupler_rectangular_rib

:noindex:

grating_coupler_rectangular_rib

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.grating_coupler_rectangular_rib(length_taper=350, cross_section='rib_cband', fill_factor=0.5, width_grating=10, length_grating=42, grating_overhang=0.5)
c.draw_ports()
c.plot()

heater

Return a heater filament with a contact pad at each end.

Drawn like the Cornerstone Heater cell, which the defaults reproduce. The filament runs along x from 0 to length, centred on y = 0, so it sits on a waveguide placed on the x axis. At each end a lead fans out from the filament (width wide) to lead_width over lead_length; it is drawn on both the heater and the pad layer so the two overlap. A taper of pad_taper_length then widens the lead to the pad. As on the foundry cell, a disc of radius width / 2 sits on the inner corner where each lead leaves the filament.

Parameters:

Name Type Description Default
length float

filament length (um).

200.0
width float

filament width (um).

2.0
lead_length float

length of the lead from the filament to the pad taper (um).

50.0
lead_width float

width of the lead at the pad taper (um).

50.0
pad_size Size

pad width and height (um).

(100.0, 100.0)
pad_pitch float

distance between the pad centres (um), centred on the filament.

120.0
pad_taper_length float

length of the taper from the lead to the pad (um); 0 puts the pad on the lead.

30.0
layer_heater LayerSpec

filament layer.

'HEATER'
layer_pad LayerSpec

pad layer.

'PAD'

:noindex:

heater

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.heater(length=200, width=2, lead_length=50, lead_width=50, pad_size=(100, 100), pad_pitch=120, pad_taper_length=30, layer_heater='HEATER', layer_pad='PAD')
c.draw_ports()
c.plot()

laser_full

Full user cell with an integrated 1550 nm laser feeding o1.

Cornerstone Run 50 cell SOI220_Full_LD_DC1550HP01_Integrated.

:noindex:

laser_full

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.laser_full()
c.draw_ports()
c.plot()

laser_full_or_gc

Full user cell with a focusing grating coupler on the laser site feeding o1.

Cornerstone Run 50 cell SOI220_Full_LD_DC1550HP01_Integrated_or_GC.

:noindex:

laser_full_or_gc

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.laser_full_or_gc()
c.draw_ports()
c.plot()

laser_full_with_gc

Full user cell with an integrated laser and a grating coupler feeding o1.

Cornerstone Run 50 cell SOI220_Full_LD_DC1550HP01_Integrated_with_GC.

:noindex:

laser_full_with_gc

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.laser_full_with_gc()
c.draw_ports()
c.plot()

laser_half

Half user cell with an integrated 1550 nm laser feeding o1.

Cornerstone Run 50 cell SOI220_Half_LD_DC1550HP01_Integrated.

:noindex:

laser_half

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.laser_half()
c.draw_ports()
c.plot()

laser_half_or_gc

Half user cell with a focusing grating coupler on the laser site feeding o1.

Cornerstone Run 50 cell SOI220_Half_LD_DC1550HP01_Integrated_or_GC.

:noindex:

laser_half_or_gc

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.laser_half_or_gc()
c.draw_ports()
c.plot()

laser_half_with_gc

Half user cell with an integrated laser and a grating coupler feeding o1.

Cornerstone Run 50 cell SOI220_Half_LD_DC1550HP01_Integrated_with_GC.

:noindex:

laser_half_with_gc

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.laser_half_with_gc()
c.draw_ports()
c.plot()

mmi1x2

An mmi1x2.

An mmi1x2 is a splitter that splits a single input to two outputs. The defaults reproduce the Cornerstone Run-50 1x2 MMI of the band and type.

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 | None

the length of the mmi body. Defaults to the foundry length.

None
width_mmi float

the width of the mmi body.

6.0
gap_mmi float | None

the gap between the tapers at the mmi body. Defaults to the foundry gap.

None
length_straight float | None

straight between each taper and its port. Defaults to 5 um for rib and none for strip.

None
cross_section CrossSectionSpec

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

'strip_cband'

:noindex:

mmi1x2

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.mmi1x2(width_taper=1.5, length_taper=20, width_mmi=6, cross_section='strip_cband')
c.draw_ports()
c.plot()

mmi1x2_rib

:noindex:

mmi1x2_rib

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.mmi1x2_rib(width_taper=1.5, length_taper=20, width_mmi=6, cross_section='rib_cband')
c.draw_ports()
c.plot()

mmi2x2

An mmi2x2.

An mmi2x2 is a 2x2 splitter. The defaults reproduce the Cornerstone Run-50 2x2 MMI of the band and type.

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 | None

the length of the mmi body. Defaults to the foundry length.

None
width_mmi float

the width of the mmi body

6.0
gap_mmi float | None

the gap between the tapers at the mmi body. Defaults to the foundry gap.

None
length_straight float | None

straight between each taper and its port. Defaults to 5 um for rib and none for strip.

None
cross_section CrossSectionSpec

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

'strip_cband'

:noindex:

mmi2x2

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.mmi2x2(width_taper=1.5, length_taper=20, width_mmi=6, cross_section='strip_cband')
c.draw_ports()
c.plot()

mmi2x2_rib

:noindex:

mmi2x2_rib

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.mmi2x2_rib(width_taper=1.5, length_taper=20, width_mmi=6, cross_section='rib_cband')
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_cband'

:noindex:

mzi

from cspdk.si220 import cells, PDK

PDK.activate()

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

mzi_heater_loop

MZI whose arms loop around the outside, with a heater on the upper arm.

The layout of the Cornerstone MZI: the 1x2 splitter faces west with its input (o1) on the east, the 2x2 combiner sits length_x east of the splitter outputs with its free ports (o2 lower, o3 upper) facing west, and each arm leaves the splitter, loops round with four circular bends and enters the combiner from the east. The lower arm is delta_length longer. A heater filament runs along the middle of the upper arm's horizontal straight, with its pads (e1, e2) to the north.

Parameters:

Name Type Description Default
delta_length float

lower arm length minus upper arm length (um).

160.0
length_x float

horizontal arm straight, splitter outputs to combiner ports (um).

616.3
length_y float

vertical straight on the splitter side of the upper arm (um).

35.0
radius float

bend radius (um).

30.0
npoints int | None

points per 90 degree bend. Defaults to the foundry MZI's.

187
splitter ComponentSpec

1x2 splitter.

'mmi1x2'
combiner ComponentSpec

2x2 combiner.

'mmi2x2'
heater_length float

heater filament length (um).

200.0
heater_pad_size Size

heater pad width and height (um).

(200.0, 100.0)
heater_pad_pitch float

distance between the heater pad centres (um).

250.0
cross_section CrossSectionSpec

waveguide cross-section.

'strip_cband'

:noindex:

mzi_heater_loop

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.mzi_heater_loop(delta_length=160, length_x=616.3, length_y=35, radius=30, npoints=187, splitter='mmi1x2', combiner='mmi2x2', heater_length=200, heater_pad_size=(200, 100), heater_pad_pitch=250, cross_section='strip_cband')
c.draw_ports()
c.plot()

mzi_lattice

Return an MZI lattice stage with one input and two outputs.

Parameters:

Name Type Description Default
delta_length float

Difference in length between the two MZI arms.

10.0
bend ComponentSpec

Bend component specification.

'bend_euler'
straight ComponentSpec

Straight component specification.

'straight'
splitter ComponentSpec

One-by-two input splitter component specification.

'mmi1x2'
combiner ComponentSpec

Two-by-two output combiner component specification.

'mmi2x2'
cross_section CrossSectionSpec

Cross section used to route the arms.

'strip_cband'

:noindex:

mzi_lattice

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.mzi_lattice(delta_length=10, bend='bend_euler', straight='straight', splitter='mmi1x2', combiner='mmi2x2', cross_section='strip_cband')
c.draw_ports()
c.plot()

pack_doe

:noindex:

pack_doe

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.pack_doe(do_permutations=False)
c.draw_ports()
c.plot()

pack_doe_grid

:noindex:

pack_doe_grid

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.pack_doe_grid(do_permutations=False, with_text=False)
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

from cspdk.si220 import cells, PDK

PDK.activate()

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

photodiode

Flip-chip InGaAs photodiode site with its contact pads and no waveguide.

Cornerstone Run 50 cell SOI220_PD_FCI300B1_Plain.

:noindex:

photodiode

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.photodiode()
c.draw_ports()
c.plot()

photodiode_integrated

Flip-chip InGaAs photodiode fed by a grating coupler under its active area.

Cornerstone Run 50 cell SOI220_PD_FCI300B1_Integrated. Light enters through the strip waveguide port o1 at the east edge, (537, 0).

:noindex:

photodiode_integrated

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.photodiode_integrated()
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.rectangle(size=(4, 2), layer='PAD', centered=False, port_orientations=(180, 90, 0, -90))
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_cband'
length_extension float | None

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

None

:noindex:

ring_double

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.ring_double(gap=0.27, radius=10, length_x=0.01, length_y=0.01, cross_section='strip_cband')
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_cband'
length_extension float | None

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

None
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.ring_single(gap=0.27, radius=10, length_x=4, length_y=0.6, cross_section='strip_cband', bend='bend_euler', p=0)
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_cband'
spacing float

spacing between the spiral loops.

3
n_loops int

number of loops.

6

:noindex:

spiral

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.spiral(length=100, cross_section='strip_cband', spacing=3, n_loops=6)
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_cband'
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = 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_cband', extra_90_deg_bend=False, allow_min_radius_violation=False)
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_cband'

:noindex:

spiral_racetrack_heater

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.spiral_racetrack_heater(spacing=4, num=8, straight_length=100, cross_section='strip_cband')
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_cband'
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.straight(length=10, cross_section='strip_cband', npoints=2)
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_cband'
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.straight_heater_meander(length=320, heater_width=2.5, spacing=2, cross_section='strip_cband', layer_heater='HEATER', via_stack='via_stack_heater_mtop', n=3)
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
cross_section CrossSectionSpec

optical cross-section selecting the operating band.

'strip_cband'

:noindex:

straight_heater_metal

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.straight_heater_metal(length=320, length_undercut_spacing=6, length_undercut=30, length_straight=0.1, length_straight_input=15, with_undercut=False, cross_section='strip_cband')
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.straight_metal(length=10, cross_section='metal_routing')
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_cband'
width float | None

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

None

:noindex:

straight_rib

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.straight_rib(length=10, cross_section='rib_cband')
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_cband'
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.straight_strip(length=10, cross_section='strip_cband', npoints=2)
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_cband'

:noindex:

taper

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.taper(length=10, width1=0.45, cross_section='strip_cband')
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

from cspdk.si220 import cells, PDK

PDK.activate()

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

taper_mm2sm

Linear taper from a multimode to a single-mode waveguide.

Drawn like the Cornerstone MM2SM tapers, which the C-band defaults reproduce. A rib cross-section adds its slab on each side of the core along the taper.

Parameters:

Name Type Description Default
length float

taper length (um).

450.0
width_mm float

multimode width at port o1 (um).

10.0
width float | None

single-mode width at port o2 (um). Defaults to the cross-section width.

None
cross_section CrossSectionSpec

strip or rib cross-section.

'strip_cband'

:noindex:

taper_mm2sm

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.taper_mm2sm(length=450, width_mm=10, cross_section='strip_cband')
c.draw_ports()
c.plot()

taper_rib_to_strip

Rib-to-strip transition: the slab narrows to the core width.

Drawn like the Cornerstone rib-to-strip taper, which the C-band defaults reproduce: length_rib of rib, a slab taper of length ending as wide as the core, then length_strip of strip. Port o1 is rib, o2 strip.

Parameters:

Name Type Description Default
length float

slab taper length (um).

50.0
length_rib float

rib straight before the taper (um).

5.0
length_strip float

strip straight after the taper (um).

5.0
width float | None

core width (um). Defaults to the cross-section width.

None
cross_section CrossSectionSpec

rib cross-section giving the slab.

'rib_cband'

:noindex:

taper_rib_to_strip

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.taper_rib_to_strip(length=50, length_rib=5, length_strip=5, cross_section='rib_cband')
c.draw_ports()
c.plot()

taper_strip_to_ridge

A taper between strip and ridge.

This is a transition between two distinct cross sections. The slab starts as wide as the core, like the Cornerstone rib-to-strip taper, so it never draws a slab narrower than the 250 nm minimum feature size.

Parameters:

Name Type Description Default
length float

the length of the taper.

10.0
width1 float | None

the input width of the taper. Defaults to the cross-section width.

None
width2 float | None

the output width of the taper. Defaults to the cross-section width.

None
w_slab1 float | None

the input slab width of the taper. Defaults to width1.

None
w_slab2 float | None

the output slab width of the taper. Defaults to width2 plus the rib slab on each side.

None
cross_section CrossSectionSpec

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

'strip_cband'

:noindex:

taper_strip_to_ridge

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.taper_strip_to_ridge(length=10, cross_section='strip_cband')
c.draw_ports()
c.plot()

text_rectangular

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

The default layer is the label layer (GDS 100), which Cornerstone merges into the dark-field silicon etch; its rules (250 nm width and gap) suit the font. Heater pads (GDS 41) need 10 um gaps, i.e. size >= 10 for text on PAD.

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.

'LBL'

:noindex:

text_rectangular

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.text_rectangular(text='abc', size=3, justify='left', layer='LBL')
c.draw_ports()
c.plot()

text_rectangular_multi_layer

Returns rectangular text in different layers.

The default draws the text as a rib (waveguide and slab layers), which passes the Cornerstone deck at the default 3 um pixel size.

Parameters:

Name Type Description Default
text str

string of text.

'abc'
layers LayerSpecs

list of layers to replicate the text.

('WG', 'SLAB')
text_factory ComponentSpec

function to create the text Components.

'text_rectangular'
kwargs Any

keyword arguments for text_factory.

{}

:noindex:

text_rectangular_multi_layer

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.text_rectangular_multi_layer(text='abc', layers=('WG', 'SLAB'), text_factory='text_rectangular')
c.draw_ports()
c.plot()

trans_rib10

:noindex:

trans_rib10

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.trans_rib10(length=10, cross_section='strip_cband')
c.draw_ports()
c.plot()

trans_rib20

:noindex:

trans_rib20

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.trans_rib20(length=20, cross_section='strip_cband')
c.draw_ports()
c.plot()

trans_rib50

:noindex:

trans_rib50

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.trans_rib50(length=50, cross_section='strip_cband')
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.via_stack_heater_mtop(size=(20, 10))
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.wire_corner(cross_section='metal_routing')
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.wire_corner45(cross_section='metal_routing', radius=10, with_corner90_ports=True)
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

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.wire_corner45_straight(cross_section='metal_routing')
c.draw_ports()
c.plot()

ysplitter

1x2 Y-splitter (40 um x 20 um) for the cross-section's band.

The Cornerstone Run 50 cell SOI220_cband_TE_strip_1x2_Ysplitter (450 nm strip) or SOI220_oband_TE_strip_1x2_Ysplitter (400 nm strip). o1 is the input at (0, 0); o2 and o3 are the outputs at (40, 10) and (40, -10).

Parameters:

Name Type Description Default
cross_section CrossSectionSpec

strip C- or O-band cross-section. The foundry has no rib Y-splitter.

'strip_cband'

:noindex:

ysplitter

from cspdk.si220 import cells, PDK

PDK.activate()

c = cells.ysplitter(cross_section='strip_cband')
c.draw_ports()
c.plot()