Cells Si SOI 220nm Cband¶
add_fiber_array¶
Returns component with south routes and grating_couplers.
You can also use pads or other terminations instead of grating couplers.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
component
|
ComponentSpec
|
component spec to connect to grating couplers. |
'straight'
|
grating_coupler
|
spec for route terminations. |
gc
|
|
gc_port_name
|
str
|
grating coupler input port name. |
'o1'
|
cross_section
|
CrossSectionSpec
|
cross_section function. |
'strip'
|
kwargs
|
additional arguments. |
{}
|
.. plot:: :include-source:
import gdsfactory as gf
c = gf.components.crossing()
cc = gf.routing.add_fiber_array(
component=c,
grating_coupler=gf.components.grating_coupler_elliptical_te,
)
cc.plot()
:noindex:

import cspdk
c = cspdk.si220.cband.cells.add_fiber_array(component='straight', grating_coupler='grating_coupler_elliptical', gc_port_name='o1', cross_section='strip').copy()
c.draw_ports()
c.plot()
add_fiber_single¶
Returns component with south routes and grating_couplers.
You can also use pads or other terminations instead of grating couplers.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
component
|
ComponentSpec
|
component spec to connect to grating couplers. |
'straight'
|
grating_coupler
|
spec for route terminations. |
gc
|
|
gc_port_name
|
str
|
grating coupler input port name. |
'o1'
|
cross_section
|
CrossSectionSpec
|
cross_section function. |
'strip'
|
input_port_names
|
list[str] | tuple[str, ...] | None
|
list of input port names to connect to grating couplers. |
None
|
pitch
|
float
|
spacing between fibers. |
70
|
with_loopback
|
bool
|
adds loopback structures. |
True
|
loopback_spacing
|
float
|
spacing between loopback and test structure. |
100.0
|
kwargs
|
additional arguments. |
{}
|
.. plot:: :include-source:
import gdsfactory as gf
c = gf.components.crossing()
cc = gf.routing.add_fiber_single(
component=c,
grating_coupler=gf.components.grating_coupler_elliptical_te,
)
cc.plot()
:noindex:

import cspdk
c = cspdk.si220.cband.cells.add_fiber_single(component='straight', grating_coupler='grating_coupler_elliptical', gc_port_name='o1', cross_section='strip', pitch=70, with_loopback=True, loopback_spacing=100).copy()
c.draw_ports()
c.plot()
add_pads_top¶
Returns new component with ports connected top pads.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
component
|
ComponentSpec
|
component spec to connect to. |
'straight_metal'
|
port_names
|
Strs | None
|
list of port names to connect to pads. |
None
|
cross_section
|
CrossSectionSpec
|
cross_section function. |
'metal_routing'
|
pad_port_name
|
str
|
pad port name. |
'e1'
|
pad
|
ComponentSpec
|
pad function. |
'pad'
|
bend
|
ComponentSpec
|
bend function. |
'wire_corner'
|
straight_separation
|
float
|
from edge to edge. |
15.0
|
pad_pitch
|
float
|
spacing between pads. |
100.0
|
port_type
|
str
|
port type. |
'electrical'
|
allow_width_mismatch
|
bool
|
if True, allows width mismatch. |
True
|
fanout_length
|
float | None
|
length of the fanout. |
80
|
route_width
|
float | list[float]
|
width of the route. |
0
|
kwargs
|
additional arguments. |
{}
|
.. plot:: :include-source:
import gdsfactory as gf
c = gf.c.nxn(
xsize=600,
ysize=200,
north=2,
south=3,
wg_width=10,
layer="M3",
port_type="electrical",
)
cc = gf.routing.add_pads_top(component=c, port_names=("e1", "e4"), fanout_length=50)
cc.plot()
:noindex:

import cspdk
c = cspdk.si220.cband.cells.add_pads_top(component='straight_metal', cross_section='metal_routing', pad_port_name='e1', pad='pad', bend='wire_corner', straight_separation=15, pad_pitch=100, port_type='electrical', allow_width_mismatch=True, fanout_length=80, route_width=0).copy()
c.draw_ports()
c.plot()
bend_euler¶
Regular degree euler bend.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
radius
|
float | None
|
in um. Defaults to cross_section_radius. |
None
|
angle
|
float
|
total angle of the curve. |
90
|
p
|
float
|
Proportion of the curve that is an Euler curve. |
0.5
|
width
|
float | None
|
width to use. Defaults to cross_section.width. |
None
|
cross_section
|
CrossSectionSpec
|
specification (CrossSection, string, CrossSectionFactory dict). |
'strip'
|
allow_min_radius_violation
|
bool
|
if True allows radius to be smaller than cross_section radius. |
False
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.bend_euler(angle=90, p=0.5, cross_section='strip', allow_min_radius_violation=False).copy()
c.draw_ports()
c.plot()
bend_metal¶
Regular degree euler bend.
:noindex:

import cspdk
c = cspdk.si220.cband.cells.bend_metal(angle=90, cross_section='metal_routing').copy()
c.draw_ports()
c.plot()
bend_s¶
Return S bend with bezier curve.
stores min_bend_radius property in self.info['min_bend_radius'] min_bend_radius depends on height and length
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
Size
|
in x and y direction. |
(11, 1.8)
|
cross_section
|
CrossSectionSpec
|
spec. |
'strip'
|
width
|
float | None
|
width of the waveguide. If None, it will use the width of the cross_section. |
None
|
allow_min_radius_violation
|
bool
|
allows min radius violations. |
False
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.bend_s(size=(11, 1.8), cross_section='strip', allow_min_radius_violation=False).copy()
c.draw_ports()
c.plot()
bend_s_metal¶
Return S bend with bezier curve.
stores min_bend_radius property in self.info['min_bend_radius'] min_bend_radius depends on height and length
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
Size
|
in x and y direction. |
(11, 1.8)
|
cross_section
|
CrossSectionSpec
|
spec. |
'metal_routing'
|
width
|
float | None
|
width of the waveguide. If None, it will use the width of the cross_section. |
None
|
allow_min_radius_violation
|
bool
|
allows min radius violations. |
True
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.bend_s_metal(size=(11, 1.8), cross_section='metal_routing', allow_min_radius_violation=True).copy()
c.draw_ports()
c.plot()
compass¶
Rectangle with ports on each edge (north, south, east, and west).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
Size
|
rectangle size. |
(4, 2)
|
layer
|
LayerSpec
|
tuple (int, int). |
'PAD'
|
port_type
|
str | None
|
optical, electrical. |
None
|
port_inclusion
|
float
|
from edge. |
0.0
|
port_orientations
|
Ints | None
|
list of port_orientations to add. None does not add ports. |
(180, 90, 0, -90)
|
auto_rename_ports
|
bool
|
auto rename ports. |
True
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.compass(size=(4, 2), layer='PAD', port_inclusion=0, port_orientations=(180, 90, 0, -90), auto_rename_ports=True).copy()
c.draw_ports()
c.plot()
coupler¶
Returns Symmetric coupler.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
of coupling region in um. |
14.5
|
gap
|
float
|
of coupling region in um. |
gap_strip
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.coupler(length=14.5, gap=0.27).copy()
c.draw_ports()
c.plot()
coupler_rib¶
Returns Symmetric coupler.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
of coupling region in um. |
20
|
gap
|
float
|
of coupling region in um. |
gap_rib
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.coupler_rib(length=20, gap=0.27).copy()
c.draw_ports()
c.plot()
coupler_ring¶
Returns Coupler for ring.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length_x
|
float
|
length of the parallel coupled straight waveguides. |
4
|
gap
|
float
|
gap between for coupler. |
gap_strip
|
radius
|
float
|
for the bend and coupler. |
radius_strip
|
bend
|
ComponentSpec
|
90 degrees bend spec. |
'bend_euler'
|
straight
|
ComponentSpec
|
straight spec. |
'straight'
|
cross_section
|
str
|
cross_section spec. |
'strip'
|
length_extension
|
float
|
length extension for the coupler. |
10
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.coupler_ring(length_x=4, gap=0.27, radius=5, bend='bend_euler', straight='straight', cross_section='strip', length_extension=10).copy()
c.draw_ports()
c.plot()
crossing¶
SOI220nm_1550nm_TE_STRIP_Waveguide_Crossing fixed cell.
:noindex:

crossing_rib¶
SOI220nm_1550nm_TE_RIB_Waveguide_Crossing fixed cell.
:noindex:

die¶
A die.
: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=(16000.0, 1 * 3000.0))
¶
A die.
die_with_pads(size=(11470.0, 4900.0), ngratings=14, npads=31, grating_pitch=250.0, pad_pitch=300.0, grating_coupler='grating_coupler_rectangular', cross_section='strip', pad='pad', layer_floorplan='FLOORPLAN', edge_to_pad_distance=150.0, edge_to_grating_distance=150.0, with_loopback=True)
¶
A die with grating couplers and pads.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
tuple[float, float]
|
the size of the die, in um. |
(11470.0, 4900.0)
|
ngratings
|
int
|
the number of grating couplers. |
14
|
npads
|
int
|
the number of pads. |
31
|
grating_pitch
|
float
|
the pitch of the grating couplers, in um. |
250.0
|
pad_pitch
|
float
|
the pitch of the pads, in um. |
300.0
|
grating_coupler
|
ComponentSpec | None
|
the grating coupler component. None skips the grating couplers. |
'grating_coupler_rectangular'
|
cross_section
|
CrossSectionSpec
|
the cross section. |
'strip'
|
pad
|
ComponentSpec
|
the pad component. |
'pad'
|
layer_floorplan
|
LayerSpec
|
the layer of the floorplan. |
'FLOORPLAN'
|
edge_to_pad_distance
|
float
|
the distance from the edge to the pads, in um. |
150.0
|
edge_to_grating_distance
|
float
|
the distance from the edge to the grating couplers, in um. |
150.0
|
with_loopback
|
bool
|
if True, adds a loopback between edge GCs. Only works for rotation = 90 for now. |
True
|
pad(size=(90.0, 90.0), layer='PAD', port_inclusion=0, port_orientation=0)
¶
Returns rectangular pad with ports.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
tuple[float, float]
|
x, y size. |
(90.0, 90.0)
|
layer
|
LayerSpec
|
pad layer. |
'PAD'
|
bbox_layers
|
list of layers. |
required | |
bbox_offsets
|
Optional offsets for each layer with respect to size. positive grows, negative shrinks the size. |
required | |
port_inclusion
|
float
|
from edge. |
0
|
port_orientation
|
float
|
in degrees. |
0
|
rectangle(size=(4, 2), layer='PAD', centered=False, port_type=None, port_orientations=(180, 90, 0, -90))
¶
Returns a rectangle.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
Size
|
(tuple) Width and height of rectangle. |
(4, 2)
|
layer
|
LayerSpec
|
Specific layer to put polygon geometry on. |
'PAD'
|
centered
|
bool
|
True sets center to (0, 0), False sets south-west to (0, 0). |
False
|
port_type
|
str | None
|
optical, electrical. |
None
|
port_orientations
|
Ints | None
|
list of port_orientations to add. None adds no ports. |
(180, 90, 0, -90)
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.die_with_pads(size=(11470, 4900), ngratings=14, npads=31, grating_pitch=250, pad_pitch=300, grating_coupler='grating_coupler_rectangular', cross_section='strip', pad='pad', layer_floorplan='FLOORPLAN', edge_to_pad_distance=150, edge_to_grating_distance=150, with_loopback=True).copy()
c.draw_ports()
c.plot()
grating_coupler_elliptical¶
A grating coupler with curved but parallel teeth.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
wavelength
|
float
|
the center wavelength for which the grating is designed |
1.55
|
grating_line_width
|
the line width of the grating |
0.315
|
|
cross_section
|
a cross section or its name or a function generating a cross section. |
'strip'
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.grating_coupler_elliptical(wavelength=1.55, grating_line_width=0.315, cross_section='strip').copy()
c.draw_ports()
c.plot()
grating_coupler_rectangular¶
A grating coupler with straight and parallel teeth.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
period
|
the period of the grating |
0.315 * 2
|
|
n_periods
|
int
|
the number of grating teeth |
60
|
length_taper
|
float
|
the length of the taper tapering up to the grating |
350.0
|
wavelength
|
float
|
the center wavelength for which the grating is designed |
1.55
|
cross_section
|
a cross section or its name or a function generating a cross section. |
'strip'
|
:noindex:

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

import cspdk
c = cspdk.si220.cband.cells.grating_coupler_rectangular_rib(period=0.5, n_periods=60, length_taper=350, wavelength=1.55, cross_section='rib').copy()
c.draw_ports()
c.plot()
heater¶
Heater fixed cell.
:noindex:

mmi1x2¶
An mmi1x2.
An mmi1x2 is a splitter that splits a single input to two outputs
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
width
|
float | None
|
the width of the waveguides connecting at the mmi ports. |
None
|
width_taper
|
float
|
the width at the base of the mmi body. |
1.5
|
length_taper
|
float
|
the length of the tapers going towards the mmi body. |
20.0
|
length_mmi
|
float
|
the length of the mmi body. |
31.0
|
width_mmi
|
float
|
the width of the mmi body. |
6.0
|
gap_mmi
|
float
|
the gap between the tapers at the mmi body. |
1.64
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'strip'
|
:noindex:

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

import cspdk
c = cspdk.si220.cband.cells.mmi1x2_rib(width_taper=1.5, length_taper=20, length_mmi=32.7, width_mmi=6, gap_mmi=1.64, cross_section='rib').copy()
c.draw_ports()
c.plot()
mmi2x2¶
An mmi2x2.
An mmi2x2 is a 2x2 splitter
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
width
|
float | None
|
the width of the waveguides connecting at the mmi ports |
None
|
width_taper
|
float
|
the width at the base of the mmi body |
1.5
|
length_taper
|
float
|
the length of the tapers going towards the mmi body |
20.0
|
length_mmi
|
float
|
the length of the mmi body |
42.5
|
width_mmi
|
float
|
the width of the mmi body |
6.0
|
gap_mmi
|
float
|
the gap between the tapers at the mmi body |
0.5
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'strip'
|
:noindex:

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

import cspdk
c = cspdk.si220.cband.cells.mmi2x2_rib(width_taper=1.5, length_taper=20, length_mmi=44.8, width_mmi=6, gap_mmi=0.53, cross_section='rib').copy()
c.draw_ports()
c.plot()
mzi¶
Mzi.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
delta_length
|
float
|
bottom arm vertical extra length. |
10
|
bend
|
ComponentSpec
|
90 degrees bend library. |
'bend_euler'
|
straight
|
ComponentSpec
|
straight function. |
'straight'
|
splitter
|
ComponentSpec
|
splitter function. |
'coupler'
|
combiner
|
ComponentSpec | None
|
combiner function. |
None
|
port_e1_splitter
|
str
|
east top splitter port. |
'o3'
|
port_e0_splitter
|
str
|
east bot splitter port. |
'o4'
|
port_e1_combiner
|
str
|
east top combiner port. |
'o3'
|
port_e0_combiner
|
str
|
east bot combiner port. |
'o4'
|
cross_section
|
CrossSectionSpec
|
for routing (sxtop/sxbot to combiner). |
'strip'
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.mzi(delta_length=10, bend='bend_euler', straight='straight', splitter='coupler', port_e1_splitter='o3', port_e0_splitter='o4', port_e1_combiner='o3', port_e0_combiner='o4', cross_section='strip').copy()
c.draw_ports()
c.plot()
pack_doe¶
:noindex:

import cspdk
c = cspdk.si220.cband.cells.pack_doe(do_permutations=False).copy()
c.draw_ports()
c.plot()
pack_doe_grid¶
:noindex:

import cspdk
c = cspdk.si220.cband.cells.pack_doe_grid(do_permutations=False, with_text=False).copy()
c.draw_ports()
c.plot()
pad¶
Returns rectangular pad with ports.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
tuple[float, float]
|
x, y size. |
(90.0, 90.0)
|
layer
|
LayerSpec
|
pad layer. |
'PAD'
|
bbox_layers
|
list of layers. |
required | |
bbox_offsets
|
Optional offsets for each layer with respect to size. positive grows, negative shrinks the size. |
required | |
port_inclusion
|
float
|
from edge. |
0
|
port_orientation
|
float
|
in degrees. |
0
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.pad(size=(90, 90), layer='PAD', port_inclusion=0, port_orientation=0).copy()
c.draw_ports()
c.plot()
rectangle¶
Returns a rectangle.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
Size
|
(tuple) Width and height of rectangle. |
(4, 2)
|
layer
|
LayerSpec
|
Specific layer to put polygon geometry on. |
'PAD'
|
centered
|
bool
|
True sets center to (0, 0), False sets south-west to (0, 0). |
False
|
port_type
|
str | None
|
optical, electrical. |
None
|
port_orientations
|
Ints | None
|
list of port_orientations to add. None adds no ports. |
(180, 90, 0, -90)
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.rectangle(size=(4, 2), layer='PAD', centered=False, port_orientations=(180, 90, 0, -90)).copy()
c.draw_ports()
c.plot()
ring_double¶
Returns a double bus ring.
two couplers (ct: top, cb: bottom) connected with two vertical straights (sl: left, sr: right)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
gap
|
float
|
gap between for coupler. |
gap_strip
|
gap_top
|
float | None
|
gap for the top coupler. Defaults to gap. |
None
|
gap_bot
|
float | None
|
gap for the bottom coupler. Defaults to gap. |
None
|
radius
|
float
|
for the bend and coupler. |
10.0
|
length_x
|
float
|
ring coupler length. |
0.01
|
length_y
|
float
|
vertical straight length. |
0.01
|
bend
|
90 degrees bend spec. |
required | |
straight
|
straight spec. |
required | |
coupler_ring
|
ring coupler spec. |
required | |
coupler_ring_top
|
top ring coupler spec. Defaults to coupler_ring. |
required | |
cross_section
|
CrossSectionSpec
|
cross_section spec. |
'strip'
|
length_extension
|
float
|
straight length extension at the end of the coupler bottom ports. |
10.0
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.ring_double(gap=0.27, radius=10, length_x=0.01, length_y=0.01, cross_section='strip', length_extension=10).copy()
c.draw_ports()
c.plot()
ring_single¶
Returns a single ring.
ring coupler (cb: bottom) connects to two vertical straights (sl: left, sr: right), two bends (bl, br) and horizontal straight (wg: top)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
gap
|
float
|
gap between for coupler. |
gap_strip
|
radius
|
float
|
for the bend and coupler. |
10.0
|
length_x
|
float
|
ring coupler length. |
4.0
|
length_y
|
float
|
vertical straight length. |
0.6
|
cross_section
|
CrossSectionSpec
|
cross_section spec. |
'strip'
|
length_extension
|
float
|
straight length extension at the end of the coupler bottom ports. |
10.0
|
bend
|
ComponentSpec
|
bend type for the ring. Defaults to "bend_euler". |
'bend_euler'
|
p
|
float
|
percentage of the bend that is euler. 1 means full euler, 0 means full circular. |
0
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.ring_single(gap=0.27, radius=10, length_x=4, length_y=0.6, cross_section='strip', length_extension=10, bend='bend_euler', p=0).copy()
c.draw_ports()
c.plot()
spiral¶
Returns a spiral double (spiral in, and then out).
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
length of the spiral straight section. |
100
|
cross_section
|
CrossSectionSpec
|
cross_section component. |
'strip'
|
spacing
|
float
|
spacing between the spiral loops. |
3
|
n_loops
|
int
|
number of loops. |
6
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.spiral(length=100, cross_section='strip', spacing=3, n_loops=6).copy()
c.draw_ports()
c.plot()
spiral_racetrack¶
Returns Racetrack-Spiral.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
min_radius
|
float | None
|
smallest radius in um. |
None
|
straight_length
|
float
|
length of the straight segments in um. |
20.0
|
spacings
|
Floats
|
space between the center of neighboring waveguides in um. |
(2, 2, 3, 3, 2, 2)
|
straight
|
ComponentSpec
|
factory to generate the straight segments. |
'straight'
|
bend
|
ComponentSpec
|
factory to generate the bend segments. |
'bend_euler'
|
bend_s
|
ComponentSpec
|
factory to generate the s-bend segments. |
'bend_s'
|
cross_section
|
CrossSectionSpec
|
cross-section of the waveguides. |
'strip'
|
cross_section_s
|
CrossSectionSpec | None
|
cross-section of the s bend waveguide (optional). |
None
|
extra_90_deg_bend
|
bool
|
if True, we add an additional straight + 90 degree bent at the output, so the output port is looking down. |
False
|
allow_min_radius_violation
|
bool
|
if True, will allow the s-bend to have a smaller radius than the minimum radius. |
False
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.spiral_racetrack(straight_length=20, spacings=(2, 2, 3, 3, 2, 2), straight='straight', bend='bend_euler', bend_s='bend_s', cross_section='strip', extra_90_deg_bend=False, allow_min_radius_violation=False).copy()
c.draw_ports()
c.plot()
spiral_racetrack_heater¶
Returns spiral racetrack with a heater above.
based on https://doi.org/10.1364/OL.400230 .
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
spacing
|
float
|
center to center spacing between the waveguides. |
4.0
|
num
|
int
|
number of spiral loops. |
8
|
straight_length
|
float
|
length of the straight segments. |
100
|
cross_section
|
CrossSectionSpec
|
cross_section. |
'strip'
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.spiral_racetrack_heater(spacing=4, num=8, straight_length=100, cross_section='strip').copy()
c.draw_ports()
c.plot()
straight¶
Returns a Straight waveguide.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
straight length (um). |
10
|
cross_section
|
CrossSectionSpec
|
specification (CrossSection, string or dict). |
'strip'
|
width
|
float | None
|
width of the waveguide. If None, it will use the width of the cross_section. |
None
|
npoints
|
int
|
number of points. |
2
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.straight(length=10, cross_section='strip', npoints=2).copy()
c.draw_ports()
c.plot()
straight_heater_meander¶
Returns a meander based heater.
based on SungWon Chung, Makoto Nakai, and Hossein Hashemi, Low-power thermo-optic silicon modulator for large-scale photonic integrated systems Opt. Express 27, 13430-13459 (2019) https://www.osapublishing.org/oe/abstract.cfm?URI=oe-27-9-13430
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
phase shifter length. |
320.0
|
heater_width
|
float
|
width of the heater. |
2.5
|
spacing
|
float
|
waveguide spacing (center to center). |
2
|
cross_section
|
CrossSectionSpec
|
for waveguide. |
'strip'
|
layer_heater
|
LayerSpec
|
for top heater, if None, it does not add a heater. |
'HEATER'
|
via_stack
|
ComponentSpec | None
|
for the heater to via_stack metal. |
'via_stack_heater_mtop'
|
n
|
int | None
|
number of meanders. |
3
|
port_orientation1
|
float | None
|
orientation of the first port. None for all orientations. |
90
|
port_orientation2
|
float | None
|
orientation of the second port. None for all orientations. |
90
|
radius
|
float | None
|
radius of the meander. |
None
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.straight_heater_meander(length=320, heater_width=2.5, spacing=2, cross_section='strip', layer_heater='HEATER', via_stack='via_stack_heater_mtop', n=3, port_orientation1=90, port_orientation2=90).copy()
c.draw_ports()
c.plot()
straight_heater_metal¶
Returns a thermal phase shifter.
dimensions from https://doi.org/10.1364/OE.27.010456
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
phase shifter length. |
320.0
|
length_undercut_spacing
|
float
|
spacing between the waveguide and the undercut. |
6.0
|
length_undercut
|
float
|
undercut length. |
30.0
|
length_straight
|
float
|
straight length. |
0.1
|
length_straight_input
|
float
|
straight length input. |
15.0
|
with_undercut
|
bool
|
isolation trenches for higher efficiency. |
False
|
port_orientation1
|
int | None
|
orientation of the first port. None for all orientations. |
90
|
port_orientation2
|
int | None
|
orientation of the second port. None for all orientations. |
90
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.straight_heater_metal(length=320, length_undercut_spacing=6, length_undercut=30, length_straight=0.1, length_straight_input=15, with_undercut=False, port_orientation1=90, port_orientation2=90).copy()
c.draw_ports()
c.plot()
straight_metal¶
Returns a Straight waveguide.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
straight length (um). |
10
|
cross_section
|
CrossSectionSpec
|
specification (CrossSection, string or dict). |
'metal_routing'
|
width
|
float | None
|
width of the waveguide. If None, it will use the width of the cross_section. |
None
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.straight_metal(length=10, cross_section='metal_routing').copy()
c.draw_ports()
c.plot()
straight_rib¶
Returns a Straight waveguide.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
straight length (um). |
10
|
cross_section
|
CrossSectionSpec
|
specification (CrossSection, string or dict). |
'rib'
|
width
|
float | None
|
width of the waveguide. If None, it will use the width of the cross_section. |
None
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.straight_rib(length=10, cross_section='rib').copy()
c.draw_ports()
c.plot()
straight_strip¶
Returns a Straight waveguide.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
straight length (um). |
10
|
cross_section
|
CrossSectionSpec
|
specification (CrossSection, string or dict). |
'strip'
|
width
|
float | None
|
width of the waveguide. If None, it will use the width of the cross_section. |
None
|
npoints
|
int
|
number of points. |
2
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.straight_strip(length=10, cross_section='strip', npoints=2).copy()
c.draw_ports()
c.plot()
taper¶
Linear taper, which tapers only the main cross section section.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
taper length. |
10.0
|
width1
|
float
|
width of the west/left port. |
width
|
width2
|
float | None
|
width of the east/right port. Defaults to width1. |
None
|
cross_section
|
CrossSectionSpec
|
specification (CrossSection, string, CrossSectionFactory dict). |
'strip'
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.taper(length=10, width1=0.45, cross_section='strip').copy()
c.draw_ports()
c.plot()
taper_metal¶
Linear taper, which tapers only the main cross section section.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
taper length. |
10.0
|
width1
|
float
|
width of the west/left port. |
width_metal
|
width2
|
float | None
|
width of the east/right port. Defaults to width1. |
None
|
cross_section
|
CrossSectionSpec
|
specification (CrossSection, string, CrossSectionFactory dict). |
'metal_routing'
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.taper_metal(length=10, width1=10, cross_section='metal_routing').copy()
c.draw_ports()
c.plot()
taper_strip_to_ridge¶
A taper between strip and ridge.
This is a transition between two distinct cross sections
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
length
|
float
|
the length of the taper. |
10.0
|
width1
|
float
|
the input width of the taper. |
0.5
|
width2
|
float
|
the output width of the taper. |
0.5
|
w_slab1
|
float
|
the input slab width of the taper. |
0.2
|
w_slab2
|
float
|
the output slab width of the taper. |
10.45
|
cross_section
|
CrossSectionSpec
|
a cross section or its name or a function generating a cross section. |
'strip'
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.taper_strip_to_ridge(length=10, width1=0.5, width2=0.5, w_slab1=0.2, w_slab2=10.45, cross_section='strip').copy()
c.draw_ports()
c.plot()
text_rectangular¶
Pixel based font, guaranteed to be manhattan, without acute angles.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
string. |
'abc'
|
size
|
float
|
pixel size. |
3
|
justify
|
str
|
left, right or center. |
'left'
|
layer
|
LayerSpec
|
for text. |
'PAD'
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.text_rectangular(text='abc', size=3, justify='left', layer='PAD').copy()
c.draw_ports()
c.plot()
text_rectangular_multi_layer¶
Returns rectangular text in different layers.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
text
|
str
|
string of text. |
'abc'
|
layers
|
LayerSpecs
|
list of layers to replicate the text. |
('WG', 'PAD')
|
text_factory
|
ComponentSpec
|
function to create the text Components. |
'text_rectangular'
|
kwargs
|
Any
|
keyword arguments for text_factory. |
{}
|
:noindex:

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

import cspdk
c = cspdk.si220.cband.cells.trans_rib10(length=10, width1=0.5, width2=0.5, w_slab1=0.2, w_slab2=10.45, cross_section='strip').copy()
c.draw_ports()
c.plot()
trans_rib20¶
:noindex:

import cspdk
c = cspdk.si220.cband.cells.trans_rib20(length=20, width1=0.5, width2=0.5, w_slab1=0.2, w_slab2=10.45, cross_section='strip').copy()
c.draw_ports()
c.plot()
trans_rib50¶
:noindex:

import cspdk
c = cspdk.si220.cband.cells.trans_rib50(length=50, width1=0.5, width2=0.5, w_slab1=0.2, w_slab2=10.45, cross_section='strip').copy()
c.draw_ports()
c.plot()
via_stack_heater_mtop¶
Rectangular via array stack.
You can use it to connect different metal layers or metals to silicon. You can use the naming convention via_stack_layerSource_layerDestination contains 4 ports (e1, e2, e3, e4)
also know as Via array http://www.vlsi-expert.com/2017/12/vias.html
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
size
|
Size
|
of the layers. |
(20.0, 10.0)
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.via_stack_heater_mtop(size=(20, 10)).copy()
c.draw_ports()
c.plot()
wire_corner¶
Returns 45 degrees electrical corner wire.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cross_section
|
CrossSectionSpec
|
spec. |
'metal_routing'
|
width
|
float | None
|
optional width. Defaults to cross_section width. |
None
|
radius
|
float | None
|
ignored. |
None
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.wire_corner(cross_section='metal_routing').copy()
c.draw_ports()
c.plot()
wire_corner45¶
Returns 90 degrees electrical corner wire.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
cross_section
|
CrossSectionSpec
|
spec. |
'metal_routing'
|
radius
|
float
|
in um. |
10
|
width
|
float | None
|
optional width. Defaults to cross_section width. |
None
|
layer
|
LayerSpec | None
|
optional layer. |
None
|
with_corner90_ports
|
bool
|
if True, adds ports at 90 degrees. |
True
|
:noindex:

import cspdk
c = cspdk.si220.cband.cells.wire_corner45(cross_section='metal_routing', radius=10, with_corner90_ports=True).copy()
c.draw_ports()
c.plot()
wire_corner45_straight¶
Returns 90 degrees electrical corner wire.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
width
|
float | None
|
of the wire. |
None
|
radius
|
float | None
|
of the corner. Defaults to width. |
None
|
cross_section
|
CrossSectionSpec
|
metal_routing. |
'metal_routing'
|
:noindex:
