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. |
{}
|
:noindex:

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. |
{}
|
:noindex:

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. |
{}
|
:noindex:

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:

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:

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:

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:

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:

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:

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:

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:

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:

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:

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:

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:

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_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 |
(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:

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:

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:

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:

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:

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:

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:

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_with_gc¶
Graphene electro-absorption modulator between two grating couplers.
Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_EAM_with_GC.
:noindex:

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_metallic¶
Metallic-gate graphene photo-thermoelectric detector (210 um x 230 um).
Cornerstone Run 50 cell SOI220_cband_TE_strip_SLG_PTE_metallic.
:noindex:

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:

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:

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:

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:

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 |
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, |
None
|
:noindex:

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:

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:

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_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:

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:

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_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:

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:

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:

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:

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:

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:

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:

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:

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:

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:

from cspdk.si220 import cells, PDK
PDK.activate()
c = cells.pack_doe(do_permutations=False)
c.draw_ports()
c.plot()
pack_doe_grid¶
:noindex:

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:

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_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:

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:

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:

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
|
:noindex:

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:

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:

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:

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:

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:

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:

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:

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:

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:

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:

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:

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:

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:

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 |
None
|
w_slab2
|
float | None
|
the output slab width of the taper. Defaults to |
None
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'strip_cband'
|
:noindex:

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:

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:

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:

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:

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:

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:

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:

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:

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:

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:
