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 gives a number of benefits:

  • Waveguides are paramterized and one can control their parameters (shape, bend radius, …) from within Ipkiss (IPKISS.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.flow)

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

  • The PlaceAndAutoRoute placement and routing engine defines the waveguides itself, based on logical links defined by the user.
  • 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.

How to use waveguides in a circuit (Ipkiss.eda)

From the L-Edit GUI, waveguides can be generated by first defining their route and then execute ‘Generate All Waveguides’ from the Luceda menu. A waveguide cell will be instantiated for every waveguide route defined, but the user can still finetune the parameters of the waveguide, like bend radius and shape. See step 3 of the PDK-based design tutorial (route and generate waveguides).

Basic waveguide example

Here is a basic example demonstrating the concepts above:

from technologies import silicon_photonics
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