Skip to content

Cells Si SOI 340nm

array

An array of components.

Parameters:

Name Type Description Default
component

the component of which to create an array

'pad'
columns int

the number of components to place in the x-direction

6
rows int

the number of components to place in the y-direction

1
add_ports bool

add ports to the component

True
size

Optional x, y size. Overrides columns and rows.

None
centered bool

center the array around the origin.

False
row_pitch float

the pitch between rows.

150
column_pitch float

the pitch between columns.

150

:noindex:

array

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.array(component='pad', columns=6, rows=1, add_ports=True, centered=False, column_pitch=150, row_pitch=150)
c.draw_ports()
c.plot()

bend_circular

A circular bend, as the foundry 90 degree bends.

The SOI340nm strip bends (R = 10 um) and rib bend (R = 100 um) are circular arcs, so this is the default bend for routing and the MZI. An Euler bend (bend_euler) with the same effective radius curves more tightly than the foundry radius.

Parameters:

Name Type Description Default
radius float | None

the radius of the bend; defaults to the cross-section radius.

None
angle float

the angle of the bend (usually 90 degrees).

90.0
width float | None

the width of the waveguide forming the bend.

None
cross_section CrossSectionSpec

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

'xs_sc340'

:noindex:

bend_circular

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.bend_circular(angle=90, cross_section='xs_sc340')
c.draw_ports()
c.plot()

bend_circular_rc

:noindex:

bend_circular_rc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.bend_circular_rc(angle=90, cross_section='xs_rc340')
c.draw_ports()
c.plot()

bend_circular_sc

:noindex:

bend_circular_sc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.bend_circular_sc(angle=90, cross_section='xs_sc340')
c.draw_ports()
c.plot()

bend_circular_so

:noindex:

bend_circular_so

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.bend_circular_so(angle=90, cross_section='xs_so340')
c.draw_ports()
c.plot()

bend_euler

An euler bend.

Parameters:

Name Type Description Default
radius float | None

the effective radius of the bend.

None
angle float

the angle of the bend (usually 90 degrees).

90.0
p float

the fraction of the bend that's represented by a polar bend.

0.5
width float | None

the width of the waveguide forming the bend.

None
cross_section CrossSectionSpec

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

'xs_sc340'

:noindex:

bend_euler

from cspdk.si340 import cells, PDK

PDK.activate()

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

bend_euler_rc

:noindex:

bend_euler_rc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.bend_euler_rc(angle=90, p=0.5, cross_section='xs_rc340')
c.draw_ports()
c.plot()

bend_euler_sc

:noindex:

bend_euler_sc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.bend_euler_sc(angle=90, p=0.5, cross_section='xs_sc340')
c.draw_ports()
c.plot()

bend_euler_so

:noindex:

bend_euler_so

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.bend_euler_so(angle=90, p=0.5, cross_section='xs_so340')
c.draw_ports()
c.plot()

bend_s

An S-bend.

Parameters:

Name Type Description Default
size tuple[float, float]

the width and height of the s-bend.

(20.0, 1.8)
cross_section CrossSectionSpec

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

'xs_sc340'
allow_min_radius_violation bool

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

True
width float | None

waveguide width; defaults to the cross-section width.

None

:noindex:

bend_s

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.bend_s(size=(20, 1.8), cross_section='xs_sc340', 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.0, 2.0)
layer LayerSpec

tuple (int, int).

'PAD'
port_type str | None

optical, electrical.

'electrical'
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.si340 import cells, PDK

PDK.activate()

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

coupler

A coupler.

a coupler is a 2x2 splitter

Parameters:

Name Type Description Default
gap float

the gap between the waveguides forming the straight part of the coupler.

0.236
length float

the length of the coupler.

20.0
dy float

the height of the s-bend.

4.0
dx float

the length of the s-bend.

15.0
cross_section CrossSectionSpec

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

'xs_sc340'

:noindex:

coupler

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.coupler(gap=0.236, length=20, dy=4, dx=15, cross_section='xs_sc340')
c.draw_ports()
c.plot()

coupler_rc

:noindex:

coupler_rc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.coupler_rc(gap=0.236, length=20, dy=4, dx=30, cross_section='xs_rc340')
c.draw_ports()
c.plot()

coupler_sc

:noindex:

coupler_sc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.coupler_sc(gap=0.236, length=20, dy=4, dx=15, cross_section='xs_sc340')
c.draw_ports()
c.plot()

coupler_so

:noindex:

coupler_so

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.coupler_so(gap=0.236, length=20, dy=4, dx=15, cross_section='xs_so340')
c.draw_ports()
c.plot()

coupler_straight

The straight part of a coupler.

Parameters:

Name Type Description Default
length float

the length of the straight part of the coupler.

20.0
gap float

the gap between the waveguides forming the straight part of the coupler.

0.236
cross_section CrossSectionSpec

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

'xs_sc340'

:noindex:

coupler_straight

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.coupler_straight(length=20, gap=0.236, cross_section='xs_sc340')
c.draw_ports()
c.plot()

die

A die template.

Parameters:

Name Type Description Default
cross_section

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

'xs_sc340'

:noindex:

die

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.die(cross_section='xs_sc340')
c.draw_ports()
c.plot()

die_rc

:noindex:

die_rc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.die_rc(cross_section='xs_rc340')
c.draw_ports()
c.plot()

die_sc

:noindex:

die_sc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.die_sc(cross_section='xs_sc340')
c.draw_ports()
c.plot()

die_so

:noindex:

die_so

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.die_so(cross_section='xs_so340')
c.draw_ports()
c.plot()

grating_coupler_array

An array of grating couplers.

Parameters:

Name Type Description Default
pitch float

the pitch of the grating couplers

127.0
n int

the number of grating couplers

6
centered

if True, centers the array around the origin.

True
grating_coupler

the name of the grating coupler to use in the array.

None
port_name

port name

'o1'
with_loopback

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

False
rotation

rotation angle for each reference.

-90
straight_to_grating_spacing

spacing between the last grating coupler and the loopback.

10.0
cross_section

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

'xs_sc340'
radius float | None

optional radius for routing the loopback.

None

:noindex:

grating_coupler_array

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.grating_coupler_array(pitch=127, n=6, cross_section='xs_sc340', centered=True, port_name='o1', with_loopback=False, rotation=-90, straight_to_grating_spacing=10)
c.draw_ports()
c.plot()

grating_coupler_elliptical

A grating coupler with curved but parallel teeth.

grating_line_width is the width of the unetched ridge between two trenches (GDS 6). The CORNERSTONE SOI pre-DRC deck limits GDS 6 gaps narrower than 350 nm to 20 um length, and the ridges here are longer arcs, so they are 350 nm wide (as for si220). The optics are not re-optimised for the wider ridge: the period still follows wavelength with the same neff, so the centre wavelength and coupling efficiency shift somewhat (most at O-band, where the ridge fill factor rises from about 43% to 60%); simulate the grating before relying on its passband.

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

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

'xs_sc340'
trenches_extra_angle float

how far the trenches extend past the grating region, in degrees. Each trench must reach 200 nm beyond GDS 3; at O-band the 9 deg default falls short for the first trenches, so _so uses 11.

9.0

:noindex:

grating_coupler_elliptical

from cspdk.si340 import cells, PDK

PDK.activate()

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

grating_coupler_elliptical_rc

:noindex:

grating_coupler_elliptical_rc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.grating_coupler_elliptical_rc(wavelength=1.55, grating_line_width=0.35, cross_section='xs_rc340', trenches_extra_angle=9)
c.draw_ports()
c.plot()

grating_coupler_elliptical_sc

:noindex:

grating_coupler_elliptical_sc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.grating_coupler_elliptical_sc(wavelength=1.55, grating_line_width=0.35, cross_section='xs_sc340', trenches_extra_angle=9)
c.draw_ports()
c.plot()

grating_coupler_elliptical_so

:noindex:

grating_coupler_elliptical_so

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.grating_coupler_elliptical_so(wavelength=1.31, grating_line_width=0.35, cross_section='xs_so340', trenches_extra_angle=11)
c.draw_ports()
c.plot()

grating_coupler_rectangular

A grating coupler with straight and parallel teeth.

Defaults reproduce SOI340nm_1550nm_TE_STRIP_Grating_Coupler: a 350 um linear taper from the waveguide to a 10 um wide, 42 um long grating section with 60 teeth, each 0.325 um etched (GDS layer 6, 140 nm deep) at a 0.59 um period and 11 um tall, the first 2.697 um after the taper.

Parameters:

Name Type Description Default
period float

the period of the grating.

0.59
n_periods int

the number of grating teeth.

60
fill_factor float

etched tooth width (GDS layer 6) as a fraction of the period.

0.5508
length_taper float

the length of the taper tapering up to the grating.

350.0
width_grating float

the width of the waveguide under the grating.

10.0
length_grating float

the length of the full-width waveguide after the taper.

42.0
grating_offset float

distance from the end of the taper to the first tooth.

2.697
teeth_overhang float

how far the teeth extend beyond each side of the waveguide.

0.5
wavelength float

the center wavelength for which the grating is designed.

1.55
cross_section CrossSectionSpec

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

'xs_sc340'

:noindex:

grating_coupler_rectangular

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.grating_coupler_rectangular(period=0.59, n_periods=60, fill_factor=0.551, length_taper=350, width_grating=10, length_grating=42, grating_offset=2.697, teeth_overhang=0.5, wavelength=1.55, cross_section='xs_sc340')
c.draw_ports()
c.plot()

grating_coupler_rectangular_rc

:noindex:

grating_coupler_rectangular_rc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.grating_coupler_rectangular_rc(period=0.59, n_periods=60, fill_factor=0.551, length_taper=350, width_grating=10, length_grating=42, grating_offset=2.697, teeth_overhang=0.5, wavelength=1.55, cross_section='xs_rc340')
c.draw_ports()
c.plot()

grating_coupler_rectangular_sc

:noindex:

grating_coupler_rectangular_sc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.grating_coupler_rectangular_sc(period=0.59, n_periods=60, fill_factor=0.551, length_taper=350, width_grating=10, length_grating=42, grating_offset=2.697, teeth_overhang=0.5, wavelength=1.55, cross_section='xs_sc340')
c.draw_ports()
c.plot()

grating_coupler_rectangular_so

:noindex:

grating_coupler_rectangular_so

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.grating_coupler_rectangular_so(period=0.47, n_periods=60, fill_factor=0.468, length_taper=350, width_grating=10, length_grating=42, grating_offset=9.83, teeth_overhang=0.5, wavelength=1.31, cross_section='xs_so340')
c.draw_ports()
c.plot()

mmi1x2

An mmi1x2.

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

Parameters:

Name Type Description Default
width float | None

the width of the waveguides connecting at the mmi ports.

None
width_taper

the width at the base of the mmi body.

1.5
length_taper

the length of the tapers going towards the mmi body.

20.0
length_mmi float

the length of the mmi body.

34.7
width_mmi

the width of the mmi body.

6.0
gap_mmi float

the gap between the tapers at the mmi body.

1.65
cross_section CrossSectionSpec

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

'xs_sc340'

:noindex:

mmi1x2

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.mmi1x2(width_taper=1.5, length_taper=20, length_mmi=34.7, width_mmi=6, gap_mmi=1.65, cross_section='xs_sc340')
c.draw_ports()
c.plot()

mmi1x2_rc

:noindex:

mmi1x2_rc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.mmi1x2_rc(width_taper=1.5, length_taper=20, length_mmi=34.7, width_mmi=6, gap_mmi=1.65, cross_section='xs_rc340')
c.draw_ports()
c.plot()

mmi1x2_sc

:noindex:

mmi1x2_sc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.mmi1x2_sc(width_taper=1.5, length_taper=20, length_mmi=34.7, width_mmi=6, gap_mmi=1.65, cross_section='xs_sc340')
c.draw_ports()
c.plot()

mmi1x2_so

:noindex:

mmi1x2_so

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.mmi1x2_so(width_taper=1.5, length_taper=20, length_mmi=42.6, width_mmi=6, gap_mmi=1.51, cross_section='xs_so340')
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.

46.5
width_mmi float

the width of the mmi body.

6.0
gap_mmi float

the gap between the tapers at the mmi body.

0.53
cross_section CrossSectionSpec

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

'xs_sc340'

:noindex:

mmi2x2

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.mmi2x2(width_taper=1.5, length_taper=20, length_mmi=46.5, width_mmi=6, gap_mmi=0.53, cross_section='xs_sc340')
c.draw_ports()
c.plot()

mmi2x2_rc

:noindex:

mmi2x2_rc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.mmi2x2_rc(width_taper=1.5, length_taper=20, length_mmi=46.5, width_mmi=6, gap_mmi=0.53, cross_section='xs_rc340')
c.draw_ports()
c.plot()

mmi2x2_sc

:noindex:

mmi2x2_sc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.mmi2x2_sc(width_taper=1.5, length_taper=20, length_mmi=46.5, width_mmi=6, gap_mmi=0.53, cross_section='xs_sc340')
c.draw_ports()
c.plot()

mmi2x2_so

:noindex:

mmi2x2_so

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.mmi2x2_so(width_taper=1.5, length_taper=20, length_mmi=57, width_mmi=6, gap_mmi=0.5, cross_section='xs_so340')
c.draw_ports()
c.plot()

mzi

A Mach-Zehnder Interferometer.

Parameters:

Name Type Description Default
delta_length float

the difference in length between the upper and lower arms of the mzi.

10.0
bend

the name of the default bend of the mzi.

'bend_circular_sc'
straight

the name of the default straight of the mzi.

'straight_sc'
splitter

the name of the default splitter of the mzi.

'mmi1x2_sc'
combiner

the name of the default combiner of the mzi.

'mmi2x2_sc'
cross_section CrossSectionSpec

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

'xs_sc340'

:noindex:

mzi

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.mzi(delta_length=10, bend='bend_circular_sc', straight='straight_sc', splitter='mmi1x2_sc', combiner='mmi2x2_sc', cross_section='xs_sc340')
c.draw_ports()
c.plot()

mzi_rc

:noindex:

mzi_rc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.mzi_rc(delta_length=10, bend='bend_circular_rc', straight='straight_rc', splitter='mmi1x2_rc', combiner='mmi2x2_rc', cross_section='xs_rc340')
c.draw_ports()
c.plot()

mzi_sc

:noindex:

mzi_sc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.mzi_sc(delta_length=10, bend='bend_circular_sc', straight='straight_sc', splitter='mmi1x2_sc', combiner='mmi2x2_sc', cross_section='xs_sc340')
c.draw_ports()
c.plot()

mzi_so

:noindex:

mzi_so

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.mzi_so(delta_length=10, bend='bend_circular_so', straight='straight_so', splitter='mmi1x2_so', combiner='mmi2x2_so', cross_section='xs_so340')
c.draw_ports()
c.plot()

pad

An electrical pad.

:noindex:

pad

from cspdk.si340 import cells, PDK

PDK.activate()

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

rectangle

A rectangle.

Parameters:

Name Type Description Default
layer

LAYER.FLOORPLAN.

FLOORPLAN
**kwargs

additional arguments.

{}

:noindex:

rectangle

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.rectangle(layer='FLOORPLAN')
c.draw_ports()
c.plot()

straight

A straight waveguide.

Parameters:

Name Type Description Default
length float

the length of the waveguide.

10.0
cross_section CrossSectionSpec

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

'xs_sc340'
kwargs

additional arguments to pass to the straight function.

{}

:noindex:

straight

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.straight(length=10, cross_section='xs_sc340')
c.draw_ports()
c.plot()

straight_rc

:noindex:

straight_rc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.straight_rc(length=10, cross_section='xs_rc340')
c.draw_ports()
c.plot()

straight_sc

:noindex:

straight_sc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.straight_sc(length=10, cross_section='xs_sc340')
c.draw_ports()
c.plot()

straight_so

:noindex:

straight_so

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.straight_so(length=10, cross_section='xs_so340')
c.draw_ports()
c.plot()

taper

A taper.

A taper is a transition between two waveguide widths

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 (if not given, use port).

None
port Port | None

the port (with certain width) to taper towards (if not given, use width2).

None
cross_section CrossSectionSpec

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

'xs_sc340'

:noindex:

taper

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.taper(length=10, cross_section='xs_sc340')
c.draw_ports()
c.plot()

taper_rc

:noindex:

taper_rc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.taper_rc(length=10, width1=0.8, cross_section='xs_rc340')
c.draw_ports()
c.plot()

taper_rib_to_strip

A rib (o1) to strip (o2) transition.

Matches SOI340nm_1550nm_TE_RIB_to_STRIP: over 200 um the waveguide (GDS layer 3) tapers linearly from 0.8 to 0.45 um and the rib protect slab (GDS layer 5) from 10.8 um down to the 0.45 um strip.

Place it explicitly between xs_rc340 and xs_sc340 waveguides. It is not an automatic layer transition: both cross-sections are drawn on WG, and gdsfactory selects auto-tapers by port layer, which cannot tell a rib port from a strip port.

Parameters:

Name Type Description Default
length float

the length of the transition.

200.0
width_rib float

the rib waveguide width at o1.

width_rc
width_strip float

the strip waveguide width at o2.

width_sc
width_slab float

the slab (rib protect) width at o1.

width_rc + 2 * width_slab
cross_section_rib CrossSectionSpec

the cross section of o1.

'xs_rc340'
cross_section_strip CrossSectionSpec

the cross section of o2.

'xs_sc340'

:noindex:

taper_rib_to_strip

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.taper_rib_to_strip(length=200, width_rib=0.8, width_strip=0.45, width_slab=10.8, cross_section_rib='xs_rc340', cross_section_strip='xs_sc340')
c.draw_ports()
c.plot()

taper_sc

:noindex:

taper_sc

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.taper_sc(length=10, width1=0.45, cross_section='xs_sc340')
c.draw_ports()
c.plot()

taper_so

:noindex:

taper_so

from cspdk.si340 import cells, PDK

PDK.activate()

c = cells.taper_so(length=10, width1=0.4, cross_section='xs_so340')
c.draw_ports()
c.plot()

wire_corner

A wire corner.

A wire corner is a bend for electrical routes.

Parameters:

Name Type Description Default
cross_section

"metal_routing".

'metal_routing'
**kwargs

additional arguments.

{}

:noindex:

wire_corner

from cspdk.si340 import cells, PDK

PDK.activate()

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