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.
Contents
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.
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)
"""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)
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.
Calculate the maximum bend radius for each turn to be made along a control shape |