This section gives an overview of the waveguide concepts in Ipkiss, and how to use waveguides in a design.

Waveguides are cells

In IPKISS, optical waveguides are not just drawings, but are full parametric cells that work and behave like any other PCell.

This provides a number of benefits:

  • Waveguides are parametrized and one can control their parameters (shape, bend radius, …) from within IPKISS (Link for Siemens EDA GUI or Python script).

  • Waveguides can be modeled by physical simulations (e.g. mode propagation tools or FDTD) as well as included in circuit simulations in the same fashion as other PCells.

Therefore, waveguides will typically be child cells of larger circuits.

Waveguides are Traces

The concept of waveguides is based on that of Traces. See reference: traces for reference documentation on this. A Trace connects multiple locations on the chip. Optical waveguides are traces in the optical domain, but there can be traces for electrical wiring, RF waveguides, fluidics, and so forth.

Trace Templates

IPKISS decouples the general properties of a trace (or waveguide) from its actual planar shape.

A trace template (or waveguide template in the case of optical waveguides) defines several aspects that govern how the waveguide is formed or extruded along its run length:

  • how the waveguide is drawn (Layout) along the shape of the waveguide,

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

  • and the geometrical cross-section, can be derived from the layout through virtual fabrication.

For this reason, many parametric cells in ipkiss take one or multiple trace_template parameters, which determines the template(s) of the waveguides that are part of that pcell.

Reference documentation for the different basic trace and trace template classes in ipkiss is in reference: traces.

Predefined waveguide templates

The picazzo pcell library contains a number of predefined waveguide templates for wire waveguides (fully etched), rib waveguides (partially etched), slot waveguides, thinned waveguides, and so forth. See picazzo reference: traces for more information.

How to use waveguides in a circuit (IPKISS)

In IPKISS python script, waveguides can be used in a (sub)circuit in various ways:

  • The Circuit defines the waveguides based on route and placement specifications that are provided by the user. The :py:class: ~ipkiss3.pcell.circuit.Circuit can also be used for workflows that need e.g. coupling between the instances, placement, routing and port specifications, by inheriting from this class and providing a more complex behavior in _default_instances, _default_specs, and _default_exposed_ports methods.

  • The user can manually add waveguides to a custom defined pcell in both layout and circuit simulation. See for example the advanced layout tutorial for introductory material on this.

Basic waveguide example

Here is a basic example demonstrating the concepts above:

import si_fab.all as pdk
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate
import numpy as np
import pylab as plt

# waveguide template: wire waveguide from picazzo
# the template defines the cross-section: how it is drawn and what the simulation model properties are
wg_template = WireWaveguideTemplate(name="example_wire_template")
                   cladding_width=2 * 3.0 + 0.47,
wg_t_cm = wg_template.CircuitModel(n_eff=2.4, n_g=4.5)

# waveguide: is extruded form the trace template along a given shape
wg = i3.RoundedWaveguide(name="example_wire_waveguides",
# layout
layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0), (15.0, 15.0), (30.0, 10.0)],


# virtual fabrication: top-down and cross-section views
layout.cross_section(cross_section_path=i3.Shape([(0.0, -5.0), (0.0, 5.0)])).visualize()

# obtain and plot S21
# use a simulation model from layout to take the actual length as on the layout into account.
cm = wg.CircuitModel()
wavelengths=np.linspace(1.54, 1.56, 30)
S = cm.get_smatrix(wavelengths=wavelengths)

plt.plot(wavelengths, np.unwrap(np.angle(S["in", "out"])), 'ro-', linewidth=5, markersize=7)
plt.xlabel('wavelength [um]')
plt.ylabel('phase [radians]')
plt.xlim([wavelengths[0], wavelengths[-1]])
plt.title('phase transfer of waveguide')

As a result, the several outputs are plotted: layout, cross-section, top-down material view and S-parameters (phase of S21 plotted).

Example waveguide

See also