Optical waveguides and waveguide templates

In IPKISS, optical waveguides are based on two concepts: the waveguide template, and the waveguide itself. The waveguide template defines all the aspects of the waveguide that can be extracted from its cross section:

  • how the waveguide is drawn along the shape of the waveguide, i.e. the geometrical cross section;

  • the simulation model, e.g. the effective index of the waveguide.

The waveguide is then drawn based on the following properties:

  • the path of the waveguide (through the shape property);

  • how the bending is performed.

For a detailed guide, please check the waveguide guide. For a tutorial, please check out the waveguide tutorial on Luceda Academy.

WindowWaveguideTemplate

Most waveguides can be built using windows. A window is a cross-section in a gdsii layer. By defining several windows the cross section of the waveguide can be defined.

class ipkiss3.all.WindowWaveguideTemplate(*args, **kwargs)

Template PCell for an Optical Waveguide Trace based on TraceWindows.

Parameters
name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Views

Layout = <class 'ipkiss3.pcell.photonics.waveguide.WindowWaveguideTemplate.Layout'>

TraceTemplate

Simple trace template for drawing waveguides.

class ipkiss3.all.TraceTemplate(*args, **kwargs)

Template for a Basic Trace on a chip.

Parameters
name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Views

Layout = <class 'ipkiss3.pcell.trace.trace.TraceTemplate.Layout'>

Waveguide

A Waveguide is the most basic optical route.

class ipkiss3.all.Waveguide(*args, **kwargs)
Parameters
trace_template: PCell and _WaveguideTemplate
external_port_names: str

Dictionary for remapping of the port names of the contents to the external ports

name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Other Parameters
contents: PCell and _Trace, locked

Views

Layout = <class 'ipkiss3.pcell.photonics.waveguide.Waveguide.Layout'>

RoundedWaveguide

A RoundedWaveguide rounds the waveguide according to a preset rounding_algorithm.

class ipkiss3.all.RoundedWaveguide(*args, **kwargs)
Parameters
trace_template: PCell and _WaveguideTemplate
external_port_names: str

Dictionary for remapping of the port names of the contents to the external ports

name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Other Parameters
contents: PCell and _Trace, locked

Views

Layout = <class 'ipkiss3.pcell.photonics.rounded_waveguide.RoundedWaveguide.Layout'>

TaperedWaveguide

A TaperedWaveguide automatically tapers between two waveguide templates: one which is defined for the straight sections (straight_trace_template), and one which is defined for the start, end and bend sections (trace_template).

class ipkiss3.all.TaperedWaveguide(*args, **kwargs)

A Rounded Waveguide that tapers to another template (straight_trace_template) in straight sections

Parameters
straight_trace_template: PCell and _TraceTemplate, required

template for the straight sections.

trace_template: PCell and _TraceTemplate

template for the start, end and bend sections.

external_port_names: str

Dictionary for remapping of the port names of the contents to the external ports

name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Other Parameters
contents: PCell and _Trace, locked

Examples

"""A TaperedWaveguide automatically transitions (=tapers) between different waveguide types."""
from technologies import silicon_photonics  # noqa: F401
import ipkiss3.all as i3
from picazzo3.traces.rib_wg import RibWaveguideTemplate

rib_tmpl = RibWaveguideTemplate()
rib_tmpl.Layout(core_width=0.6)
rib_tmpl_wide = RibWaveguideTemplate()
rib_tmpl_wide.Layout(core_width=1.6)

twg = i3.TaperedWaveguide(trace_template=rib_tmpl, straight_trace_template=rib_tmpl_wide)
lay = twg.Layout(shape=[(0, 0), (30, 0), (30, 60)])
lay.visualize(annotate=True)
../../../_images/index-1.png
"""TaperedWaveguide exposes the same properties as RoundedWaveguide."""

from technologies import silicon_photonics  # noqa: F401
import ipkiss3.all as i3
from picazzo3.traces.rib_wg import RibWaveguideTemplate

rib_tmpl = RibWaveguideTemplate()
rib_tmpl.Layout(core_width=0.6)
rib_tmpl_wide = RibWaveguideTemplate()
rib_tmpl_wide.Layout(core_width=1.6)

twg = i3.TaperedWaveguide(trace_template=rib_tmpl, straight_trace_template=rib_tmpl_wide)
lay = twg.Layout(
    shape=[(0, 0), (50, 0), (75, 50)],
    bend_radius=30,
    # we choose a large angle_step to show how it impacts the discretisation
    angle_step=20,
)
lay.visualize(annotate=True)
../../../_images/index-2.png

Views

Layout = <class 'ipkiss3.pcell.photonics.tapered_waveguide.TaperedWaveguide.Layout'>

TaperedWaveguideTemplate

Trace template used to create TaperedWaveguides.

class ipkiss3.all.TaperedWaveguideTemplate(*args, **kwargs)
Parameters
straight_trace_template: PCell and _TraceTemplate, required

template for the straight sections.

trace_template: PCell and _TraceTemplate, required

template for the start, end and bend sections.

name: String that contains only ISO/IEC 8859-1 (extended ASCII py3) or pure ASCII (py2) characters

The unique name of the pcell

Views

Layout = <class 'ipkiss3.pcell.photonics.tapered_waveguide.TaperedWaveguideTemplate.Layout'>

Using maximum bend radius

It is possible to calculate the maximum bend radius that can be used for each turn in a given shape. This can then be used with RoundedWaveguide to obtain a waveguide which uses the maximum possible radius in each bend.

maximum_bend_radii

Calculate the maximum bend radius for each turn to be made along a control shape