This section gives an overview of the waveguide concepts in Ipkiss, and how to use waveguides in a design.
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 paramterized and one can control their parameters (shape, bend radius, …) from within Ipkiss (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.
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.
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.
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.
In IPKISS python script, waveguides can be used in a (sub)circuit in various ways:
Circuitdefines 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
- 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.
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") wg_template.Layout(core_width=0.47, cladding_width=2 * 3.0 + 0.47, core_process=i3.TECH.PROCESS.WG) 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", trace_template=wg_template) # layout layout = wg.Layout(shape=[(0.0, 0.0), (10.0, 0.0), (15.0, 15.0), (30.0, 10.0)], bend_radius=7.0) layout.visualize() # virtual fabrication: top-down and cross-section views layout.visualize_2d() 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.figure() 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, wavelengths[-1]]) plt.title('phase transfer of waveguide') plt.show()
As a result, the several outputs are plotted: layout, cross-section, top-down material view and S-parameters (phase of S21 plotted).