Spiral with Tapered Waveguides and Spline Bends

If you want to reduce losses you can use spline bends and broader waveguide for the straight sections.

# Importing silicon_photonics technology and IPKISS

import technologies.silicon_photonics
from ipkiss3 import all as i3
from picazzo3.wg.spirals import FixedLengthSpiral
from picazzo3.traces.rib_wg.trace import RibWaveguideTemplate
from picazzo3.traces.wire_wg.trace import WireWaveguideTemplate

Defining the Spline Rounding Algorithm

In order to create a custom rounding algorithm we need to inherit from spline import ShapeRoundAdiabaticSpline and override the defaults of the bend radius and the adiabatic angles.

class RA(i3.ShapeRoundAdiabaticSpline):

    def _default_radius(self):
        return 5.0

    def _default_adiabatic_angles(self):
        return (45.0, 45.0)

Defining the trace template

We take a basic template from the picazzo and derive a TaperedWaveguideTemplate version of it, which does two things:

  • flaring out to a different width, with a specified taper length and minimum lengths for the narrow and wider waveguides.
  • creating bends using a given rounding algorithm
wg_tmpl = WireWaveguideTemplate()
    cladding_width=2 * 2.0 + 0.45,

wg_tmpl_wide = RibWaveguideTemplate()

tapered_wg_tmpl = i3.TaperedWaveguideTemplate(name="tapered_wg_tmpl",

tapered_wg_tmpl.Layout(bend_radius=5.0,        # shortest radius of curvature in the bend
                       rounding_algorithm=RA,  # use splines instead of circular arcs: smoother transition
                       taper_length=10.0,      # length of the taper between the regular waveguide and the expanded waveguide
                       #min_expanded_length=1.0, # minimum length of the expanded section. If shorter, don't expand

Defining a spiral

Now we build the spiral using the TaperedWaveguideTemplate. By using this specific trace template, the resulting generated waveguide will be of the i3.TaperedWaveguide type.

spiral = FixedLengthSpiral(total_length=4000.0,
spiral_lo = spiral.Layout(incoupling_length=10.0,
                          stub_direction="V",  # either H or V

print("The length of the spiral is {} um".format(spiral_lo.trace_length()))


The length of the spiral is 4000.0 um