Luxtelligence provides a library of components that have been fabricated in the reference material stack, and whose performance has been tested and validated. Here follows a list of the available parametric cells (gdsfactory.Component objects):

Cells#

CPW_pad_linear#

lnoi400.cells.CPW_pad_linear(start_width: float = 80.0, length_straight: float = 10.0, length_tapered: float = 190.0, cross_section: Callable[[...], CrossSection] | CrossSection | dict[str, Any] | str | Transition = 'xs_uni_cpw') Component[source]#

RF access line for high-frequency GSG probes. The probe pad maintains a fixed gap/central conductor ratio across its length, to achieve a good impedance matching

import lnoi400

c = lnoi400.cells.CPW_pad_linear(start_width=80.0, length_straight=10.0, length_tapered=190.0, cross_section='xs_uni_cpw')
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-1.png

L_turn_bend#

lnoi400.cells.L_turn_bend(radius: float = 80.0, p: float = 1.0, with_arc_floorplan: bool = True, cross_section: Callable[[...], CrossSection] | CrossSection | dict[str, Any] | str | Transition = 'xs_rwg1000', **kwargs) Component[source]#

A 90-degrees bend following an Euler path, with linearly-varying curvature (increasing and decreasing).

import lnoi400

c = lnoi400.cells.L_turn_bend(radius=80.0, p=1.0, with_arc_floorplan=True, cross_section='xs_rwg1000')
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-2.png

S_bend_vert#

lnoi400.cells.S_bend_vert(v_offset: float = 25.0, h_extent: float = 100.0, dx_straight: float = 5.0, cross_section: Callable[[...], CrossSection] | CrossSection | dict[str, Any] | str | Transition = 'xs_rwg1000') Component[source]#

A spline bend that bridges a vertical displacement.

import lnoi400

c = lnoi400.cells.S_bend_vert(v_offset=25.0, h_extent=100.0, dx_straight=5.0, cross_section='xs_rwg1000')
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-3.png

U_bend_racetrack#

lnoi400.cells.U_bend_racetrack(v_offset: float = 90.0, p: float = 1.0, with_arc_floorplan: bool = True, cross_section: Callable[[...], CrossSection] | CrossSection | dict[str, Any] | str | Transition = 'xs_rwg3000', **kwargs) Component[source]#

A U-bend with fixed cross-section and dimensions, suitable for building a low-loss racetrack resonator.

import lnoi400

c = lnoi400.cells.U_bend_racetrack(v_offset=90.0, p=1.0, with_arc_floorplan=True, cross_section='xs_rwg3000')
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-4.png

bend_S_spline#

lnoi400.cells.bend_S_spline(size: tuple[float, float] = (100.0, 30.0), cross_section: ~collections.abc.Callable[[...], ~gdsfactory.cross_section.CrossSection] | ~gdsfactory.cross_section.CrossSection | dict[str, ~typing.Any] | str | ~gdsfactory.cross_section.Transition = 'xs_rwg1000', npoints: int = 201, path_method=<function spline_clamped_path>) Component[source]#

A spline bend merging a vertical offset.

import lnoi400

c = lnoi400.cells.bend_S_spline(size=(100.0, 30.0), cross_section='xs_rwg1000', npoints=201)
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-5.png

bend_S_spline_varying_width#

lnoi400.cells.bend_S_spline_varying_width(size: tuple[float, float] = (58, 14.5), cross_section1: ~collections.abc.Callable[[...], ~gdsfactory.cross_section.CrossSection] | ~gdsfactory.cross_section.CrossSection | dict[str, ~typing.Any] | str | ~gdsfactory.cross_section.Transition = None, cross_section2: ~collections.abc.Callable[[...], ~gdsfactory.cross_section.CrossSection] | ~gdsfactory.cross_section.CrossSection | dict[str, ~typing.Any] | str | ~gdsfactory.cross_section.Transition = None, npoints: int = 201, path_method=<function spline_null_curvature>) Component[source]#

A spline bend merging a vertical offset. Can accept arbitrary cross sections. Not tested as a standalone PDK element. Used as a building block for cells with known behaviour.

import lnoi400

c = lnoi400.cells.bend_S_spline_varying_width(size=(58, 14.5), npoints=201)
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-6.png

chip_frame#

lnoi400.cells.chip_frame(size: tuple[float, float] = (10000, 5000), exclusion_zone_width: float = 50, center: tuple[float, float] = None) Component[source]#

Provide the chip extent and the exclusion zone around the chip frame. In the exclusion zone, only the edge couplers routing to the chip facet should be placed. Allowed chip dimensions (in either direction): 5000 um, 10000 um, 20000 um.

import lnoi400

c = lnoi400.cells.chip_frame(size=(10000, 5000), exclusion_zone_width=50)
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-7.png

directional_coupler_balanced#

lnoi400.cells.directional_coupler_balanced(io_wg_sep: float = 30.6, sbend_length: float = 58, central_straight_length: float = 16.92, coupl_wg_sep: float = 0.8, coup_wg_width: float = 0.8, cross_section_io: Callable[[...], CrossSection] | CrossSection | dict[str, Any] | str | Transition = 'xs_rwg1000') Component[source]#

Returns a 50-50 directional coupler. Default parameters give a 50/50 splitting at 1550 nm.

Parameters:
  • io_wg_sep – Separation of the two straights at the input/output, top-to-top.

  • sbend_length – length of the s-bend part.

  • central_straight_length – length of the coupling region.

  • coupl_wg_sep – Distance between two waveguides in the coupling region (side to side).

  • cross_section_io – cross section spec at the i/o (must be defined in tech.py).

  • coup_wg_width – waveguide width at the coupling section.

import lnoi400

c = lnoi400.cells.directional_coupler_balanced(io_wg_sep=30.6, sbend_length=58, central_straight_length=16.92, coupl_wg_sep=0.8, coup_wg_width=0.8, cross_section_io='xs_rwg1000')
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-8.png

double_linear_inverse_taper#

lnoi400.cells.double_linear_inverse_taper(cross_section_start: Callable[[...], CrossSection] | CrossSection | dict[str, Any] | str | Transition = 'xs_swg250', cross_section_end: Callable[[...], CrossSection] | CrossSection | dict[str, Any] | str | Transition = 'xs_rwg1000', lower_taper_length: float = 120.0, lower_taper_end_width: float = 2.05, upper_taper_start_width: float = 0.25, upper_taper_length: float = 240.0, slab_removal_width: float = 20.0, input_ext: float = 0.0) Component[source]#

Inverse taper with two layers, starting from a wire waveguide at the facet and transitioning to a rib waveguide. The tapering profile is linear in both layers.

import lnoi400

c = lnoi400.cells.double_linear_inverse_taper(cross_section_start='xs_swg250', cross_section_end='xs_rwg1000', lower_taper_length=120.0, lower_taper_end_width=2.05, upper_taper_start_width=0.25, upper_taper_length=240.0, slab_removal_width=20.0, input_ext=0.0)
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-9.png

eo_phase_shifter#

lnoi400.cells.eo_phase_shifter(rib_core_width_modulator: float = 2.5, taper_length: float = 100.0, modulation_length: float = 7500.0, rf_central_conductor_width: float = 10.0, rf_ground_planes_width: float = 180.0, rf_gap: float = 4.0, draw_cpw: bool = True) Component[source]#

Phase shifter based on the Pockels effect. The waveguide is located within the gap of a CPW transmission line.

import lnoi400

c = lnoi400.cells.eo_phase_shifter(rib_core_width_modulator=2.5, taper_length=100.0, modulation_length=7500.0, rf_central_conductor_width=10.0, rf_ground_planes_width=180.0, rf_gap=4.0, draw_cpw=True)
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-10.png

heater_resistor#

lnoi400.cells.heater_resistor(path: Path | None = None, width: float = 0.9, offset: float = 0.0) Component[source]#

A resistive wire used as a low-frequency phase shifter, exploiting the thermo-optical effect.

import lnoi400

c = lnoi400.cells.heater_resistor(width=0.9, offset=0.0)
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-11.png

heater_straight_single#

lnoi400.cells.heater_straight_single(length: float = 150.0, width: float = 0.9, offset: float = 0.0, port_contact_width_ratio: float = 3.0, pad_size: tuple[float, float] = (100.0, 100.0), pad_pitch: float | None = None, pad_vert_offset: float = 10.0) Component[source]#

A straight resistive wire used as a low-frequency phase shifter, exploiting the thermo-optical effect. The heater is terminated by wide pads for probing or bonding.

import lnoi400

c = lnoi400.cells.heater_straight_single(length=150.0, width=0.9, offset=0.0, port_contact_width_ratio=3.0, pad_size=(100.0, 100.0), pad_vert_offset=10.0)
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-12.png

mmi1x2_optimized1550#

lnoi400.cells.mmi1x2_optimized1550(width_mmi: float = 6.0, length_mmi: float = 26.75, width_taper: float = 1.5, length_taper: float = 25.0, port_ratio: float = 0.55, cross_section: Callable[[...], CrossSection] | CrossSection | dict[str, Any] | str | Transition = 'xs_rwg1000', **kwargs) Component[source]#

MMI1x2 with layout optimized for maximum transmission at 1550 nm.

import lnoi400

c = lnoi400.cells.mmi1x2_optimized1550(width_mmi=6.0, length_mmi=26.75, width_taper=1.5, length_taper=25.0, port_ratio=0.55, cross_section='xs_rwg1000')
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-13.png

mmi2x2_optimized1550#

lnoi400.cells.mmi2x2_optimized1550(width_mmi: float = 5.0, length_mmi: float = 76.5, width_taper: float = 1.5, length_taper: float = 25.0, port_ratio: float = 0.7, cross_section: Callable[[...], CrossSection] | CrossSection | dict[str, Any] | str | Transition = 'xs_rwg1000', **kwargs) Component#

MMI2x2 with layout optimized for maximum transmission at 1550 nm.

import lnoi400

c = lnoi400.cells.mmi2x2_optimized1550(width_mmi=5.0, length_mmi=76.5, width_taper=1.5, length_taper=25.0, port_ratio=0.7, cross_section='xs_rwg1000')
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-14.png

mmi2x2optimized1550#

lnoi400.cells.mmi2x2optimized1550(width_mmi: float = 5.0, length_mmi: float = 76.5, width_taper: float = 1.5, length_taper: float = 25.0, port_ratio: float = 0.7, cross_section: Callable[[...], CrossSection] | CrossSection | dict[str, Any] | str | Transition = 'xs_rwg1000', **kwargs) Component[source]#

MMI2x2 with layout optimized for maximum transmission at 1550 nm.

import lnoi400

c = lnoi400.cells.mmi2x2optimized1550(width_mmi=5.0, length_mmi=76.5, width_taper=1.5, length_taper=25.0, port_ratio=0.7, cross_section='xs_rwg1000')
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-15.png

mzm_unbalanced#

lnoi400.cells.mzm_unbalanced(modulation_length: float = 7500.0, length_imbalance: float = 100.0, lbend_tune_arm_reff: float = 75.0, rf_pad_start_width: float = 80.0, rf_central_conductor_width: float = 10.0, rf_ground_planes_width: float = 180.0, rf_gap: float = 4.0, rf_pad_length_straight: float = 10.0, rf_pad_length_tapered: float = 190.0, bias_tuning_section_length: float = 700.0, with_heater: bool = False, heater_offset: float = 1.2, heater_width: float = 1.0, heater_pad_size: tuple[float, float] = (75.0, 75.0), **kwargs) Component[source]#

Mach-Zehnder modulator based on the Pockels effect with an applied RF electric field. The modulator works in a differential push-pull configuration driven by a single GSG line.

import lnoi400

c = lnoi400.cells.mzm_unbalanced(modulation_length=7500.0, length_imbalance=100.0, lbend_tune_arm_reff=75.0, rf_pad_start_width=80.0, rf_central_conductor_width=10.0, rf_ground_planes_width=180.0, rf_gap=4.0, rf_pad_length_straight=10.0, rf_pad_length_tapered=190.0, bias_tuning_section_length=700.0, with_heater=False, heater_offset=1.2, heater_width=1.0, heater_pad_size=(75.0, 75.0))
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-16.png

straight_rwg1000#

lnoi400.cells.straight_rwg1000(length: float = 10.0, **kwargs) Component[source]#

Straight single-mode waveguide.

import lnoi400

c = lnoi400.cells.straight_rwg1000(length=10.0)
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-17.png

straight_rwg3000#

lnoi400.cells.straight_rwg3000(length: float = 10.0, **kwargs) Component[source]#

Straight multimode waveguide.

import lnoi400

c = lnoi400.cells.straight_rwg3000(length=10.0)
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-18.png

uni_cpw_straight#

lnoi400.cells.uni_cpw_straight(length: float = 3000.0, cross_section: Callable[[...], CrossSection] | CrossSection | dict[str, Any] | str | Transition = 'xs_uni_cpw', bondpad: str | Callable[[...], Component] | dict[str, Any] | KCell = 'CPW_pad_linear') Component[source]#

A CPW transmission line for microwaves, with a uniform cross section.

import lnoi400

c = lnoi400.cells.uni_cpw_straight(length=3000.0, cross_section='xs_uni_cpw', bondpad='CPW_pad_linear')
c.plot()

(Source code, png, hires.png, pdf)

_images/cells-19.png