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:

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

Views

Layout
Parameters:

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>, optional

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

view_name: str, optional

The name of the view

windows: List with type restriction, allowed types: <class ‘ipkiss3.pcell.trace.window.window._TraceWindow’>, optional

List of Trace Windows that know how to draw themselves relative to the shape of the Trace

core_layer: __Layer__, optional

layer used to define the core of the waveguide

core_width: float and number > 0, optional

width of the waveguide core

pin_shape: Shape, optional

shape to be used for the pins

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports. Default = this template

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

draw_control_shape: optional

draws the control shape on top of the waveguide

width: float and Real, number and number >= 0, optional

grids_per_unit: locked

Number of grid cells per design unit

units_per_grid: locked

Ratio of grid cell and design unit

grid: float and number > 0, locked

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, locked

design unit. Extracted by default from TECH.METRICS.UNIT

Examples

from technologies import silicon_photonics

from ipkiss3.pcell.photonics.waveguide import WindowWaveguideTemplate
from ipkiss3.pcell.trace.window.window import PathTraceWindow
import ipkiss3.all as i3

class MyWgTemplate(WindowWaveguideTemplate):

    class Layout(WindowWaveguideTemplate.Layout):
        core_width = i3.PositiveNumberProperty(doc="Core width of the waveguide")
        cladding_width = i3.PositiveNumberProperty(doc="Cladding width of the waveguide")

        def _default_core_width(self):
            return 0.45

        def _default_cladding_width(self):
            return 4.0

        def _default_cover_layers(self):
            # Layer for Manhattan rectangles (drawn in waveguide bends when the waveguide manhattan parameter = True)
            return []

        def _default_windows(self):
            return [
                PathTraceWindow(layer=i3.TECH.PPLAYER.WG.CORE,
                                start_offset=-0.5 * self.core_width,
                                end_offset=+0.5 * self.core_width),
                PathTraceWindow(layer=i3.TECH.PPLAYER.WG.CLADDING,
                                start_offset=-0.5 * self.cladding_width,
                                end_offset=+0.5 * self.cladding_width)
            ]

# Instantiate the new waveguide template to use it in our waveguide below
wg_tmpl = MyWgTemplate()

wg = i3.RoundedWaveguide(trace_template=wg_tmpl)
wg_lay = wg.Layout(shape=[(0, 0), (10, 0), (10, 10)])

wg_lay.visualize()
../../../_images/index-12.png

Waveguide

A Waveguide is the most basic optical route.

class ipkiss3.all.Waveguide(*args, **kwargs)
Parameters:

trace_template: PCell and _WaveguideTemplate, optional

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

contents: PCell and _Trace, locked

Views

Layout
Parameters:

contents_transformation: GenericNoDistortTransform, optional

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>, optional

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

draw_control_shape: optional

draws the control shape on top of the waveguide

view_name: str, optional

The name of the view

core_layer: __Layer__, optional

layer used to define the core of the waveguide

input_port: TracePort, optional

output_port: TracePort, optional

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports.

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

shape: Shape, optional

Shape from which the Trace is calculated

flatten_contents: optional

if True, it will insert the contents as elements in the layout, rather than as an Instance

center_line_shape: locked

Automatically calculated shape of the center line of the trace

grids_per_unit: locked

Number of grid cells per design unit

units_per_grid: locked

Ratio of grid cell and design unit

grid: float and number > 0, locked

design grid. Extracted by default from TECH.METRICS.GRID

unit: float and number > 0, locked

design unit. Extracted by default from TECH.METRICS.UNIT

RoundedWaveguide

A RoundedWaveguide rounds the waveguide according to a preset rounding_algorithm.

class ipkiss3.all.RoundedWaveguide(*args, **kwargs)
Parameters:

trace_template: PCell and _WaveguideTemplate, optional

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

contents: PCell and _Trace, locked

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

contents_transformation: GenericNoDistortTransform, optional

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>, optional

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

draw_control_shape: optional

draws the control shape on top of the waveguide

manhattan: optional

adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles

rounding_algorithm: optional

rounding algorithm used to generate the bends. Can be circular, spline, …

view_name: str, optional

The name of the view

core_layer: __Layer__, optional

layer used to define the core of the waveguide

bend_radii: list<number > 0>, optional

bend radius for every individual bend

remove_straight_angles: optional

removes the waypoints with straight angles. Set to False if the algorithm uses waypoint-specific information.

reverse_bends: optional

when set to True, it will generate the bends backwards. This has only effect when the bend algorithm is not symmetric.

reverse_individual_bends: list<>, optional

when set to True, it will generate the individual bends backwards. This has only effect when the bend algorithm is not symmetric.Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes

rounding_algorithms: optional

rounding algorithm for every individual bend. Can be circular, spline, … Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes

input_port: TracePort, optional

output_port: TracePort, optional

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports.

shape: Shape, optional

Shape from which the Trace is calculated

flatten_contents: optional

if True, it will insert the contents as elements in the layout, rather than as an Instance

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

center_line_shape: locked

Automatically calculated shape of the center line of the trace

grid: float and number > 0, locked

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: locked

Number of grid cells per design unit

units_per_grid: locked

Ratio of grid cell and design unit

unit: float and number > 0, locked

design unit. Extracted by default from TECH.METRICS.UNIT

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, optional

template for the start, end and bend sections.

external_port_names: optional

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

cell_instances: _PCellInstanceDict, optional

name: optional

The unique name of the pcell

contents: PCell and _Trace, locked

Examples

"""TaperedWaveguide exposes the same properties as RoundedWaveguide.
"""

from technologies import silicon_photonics
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-22.png
"""A TaperedWaveguide automatically transitions (=tapers) between different waveguide types.
"""
from technologies import silicon_photonics
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-32.png

Views

Layout
Parameters:

angle_step: float and number > 0, optional

angle step for rounding

control_shape_layer: __Layer__, optional

layer on which the control shape is drawn

core_layer: __Layer__, optional

layer used to define the core of the waveguide

cover_layers: List with type restriction, allowed types: <class ‘ipkiss.primitives.layer.Layer’>, optional

layers that can be used to generate additional coverage of the trace (e.g. manhattan corners)

draw_control_shape: optional

draws the control shape on top of the waveguide

input_port: TracePort, optional

manhattan: optional

adds rectangular blocks in the bends to avoid as much as possible non-manhattan angles

output_port: TracePort, optional

remove_straight_angles: optional

Remove waypoints with straight angles. When set to None, it will only remove straight angles when all the expansion parameters are calculated automatically

rounding_algorithm: optional

rounding algorithm used to generate the bends. Can be circular, spline, …

straight_section_lengths: list<number >= 0>, optional

A list of lengths for the straight_template sections of each path segment.Length of list must be identical to number of segments

straight_section_positions: list<fraction>, optional

A list of relative positions for the straight_template sections of each path segment. Length of list must be identical to number of segments.Each position is a number between 0 (closest to first waypoint) and 1 (closest to last waypoint).0.5 will place the expanded section in the middle of the segment.

taper_lengths: list<number >= 0>, optional

Lengths of the tapers for each section. Length of list must be identical to number of segments.

trace_template_for_ports: _TraceTemplate.Layout, optional

Trace template to be used for the ports.

view_name: str, optional

The name of the view

flatten_waveguides: optional

If true, all waveguides will be flattened one level to reduce hierarchy

min_straight_section_length: float and Real, number and number >= 0, optional

minimum_length of the straight sections.

taper_length: optional

length of the taper between the regular waveguide and the expanded waveguide. Ignored if taper_lengths is set. If None, the default taper lengths for each transition are chosen for each transition.

contents_transformation: GenericNoDistortTransform, optional

bend_radii: list<number > 0>, optional

bend radius for every individual bend

reverse_bends: optional

when set to True, it will generate the bends backwards. This has only effect when the bend algorithm is not symmetric.

reverse_individual_bends: list<>, optional

when set to True, it will generate the individual bends backwards. This has only effect when the bend algorithm is not symmetric.Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes

rounding_algorithms: optional

rounding algorithm for every individual bend. Can be circular, spline, … Should have length equal to the shape for closed shapes, but equal to shape-2 for open shapes

shape: Shape, optional

Shape from which the Trace is calculated

flatten_contents: optional

if True, it will insert the contents as elements in the layout, rather than as an Instance

end_straight: float and Real, number and number >= 0, optional

The length of the straight end section of the route

min_straight: float and Real, number and number >= 0, optional

The minimum length of any straight sections in the route

start_straight: float and Real, number and number >= 0, optional

The length of the straight start section of the route

bend_radius: float and number > 0, optional

bend radius for the auto-generated bends

center_line_shape: locked

Automatically calculated shape of the center line of the trace

grid: float and number > 0, locked

design grid. Extracted by default from TECH.METRICS.GRID

grids_per_unit: locked

Number of grid cells per design unit

unit: float and number > 0, locked

design unit. Extracted by default from TECH.METRICS.UNIT

units_per_grid: locked

Ratio of grid cell and design unit

min_length_for_taper: float and Real, number and number >= 0, locked

minimum length needed to use tapering