Known backwards incompatibilities 3.1.3

Waveguide circuit models

Before IPKISS 3.1.3, waveguide models did not extract the length from the layout except when you explicitly set the default waveguide model to CapheModelFromLayout, for example:

import ipkiss3.all as i3

Using a zero-length by default was not a sensible default. Now we extract the length from the layout. This means that the Python code above can be ommitted in scripts now. For backward compatibility reasons, CapheModelFromLayout and CapheModel will remain to exist, but we recommend using CircuitModel now, which replaces both views. See also the circuit model tutorial to learn more about the new CircuitModel view.

Subclassing legacy CapheModel

All components in ipkiss and picazzo have both a new CircuitModel and a legacy CapheModel. This ensures that scripts that use the old CapheModel will still be working as before, this way you can gradually transition to using CircuitModel. Both models are made to be equivalent, the only difference is in the way they’re executed.

In some cases however, you might have subclassed from the CapheModel view to extend the default behavior. In this case you’ll need to tell ipkiss to prefer your extended model over the CircuitModel. You can use set_default_view for this, as illustrated in the example below.

import si_fab.all as pdk
from import get_technology
TECH = get_technology()
import ipkiss3.all as i3
from picazzo3.filters.mmi import MM1x2

class MyMMI(MM1x2):
    class CapheModel(MM1x2.CapheModel):
        def _default_back_coupling(self):
           return 0.1

# Required to ensure that the adapted model is used.

mmi = MyMMI()
assert isinstance(mmi.get_default_view(i3.CircuitModelView), MyMMI.CapheModel)


The straight_extension property of ShapeWindowTraceTransition was incorrectly used in previous releases when the trace template types were reversed. This is also the case for the following predefined transitions in picazzo3:

  • WireRibWaveguideTransitionLinear, WireRibWaveguideTransitionFromPortLinear

  • WireRibWireWaveguideTransitionLinear, WireRibWireWaveguideTransitionFromPortLinear

  • WireSocketWaveguideTransitionLinear, WireSocketWaveguideTransitionFromPortLinear

  • ThinnedWireWireWaveguideTransitionLinear, ThinnedWireWireWaveguideTransitionFromPortLinear

In the following example a rib waveguide to wire waveguide transition is created, with and (exaggerated) straight extension set to (1.0, 2.0). WireRibWaveguideTransitionLinear is used and is called with a rib waveguide as the start and a wire waveguide as the end trace template. In ipkiss 3.1.2, the transition would have gotten a 2.0um extension at the start point (rib waveguide) and a 1.0um extension at the end point (strip waveguide), whereas one would expect the reverse. In Ipkiss 3.1.3, the first value of the straight_extension corresponding always to the start point and the second value to the end point of the transition. Designs from before 3.1.3 will therefore render slightly different on 3.1.3 in case straight_extension was used.

import technologies.silicon_photonics
from ipkiss3 import all as i3
from picazzo3.traces.wire_wg import WireWaveguideTemplate
from picazzo3.traces.rib_wg import RibWaveguideTemplate
from picazzo3.traces.rib_wg import WireRibWaveguideTransitionLinear

wg_start = RibWaveguideTemplate()
wg_start.Layout(core_width=1.0, cladding_width=5.0)

wg_end = WireWaveguideTemplate()

trans = WireRibWaveguideTransitionLinear(name="my_rib_wire_transition",
trans_lo = trans.Layout(start_position=(0.0, 0.0),
                        end_position=(6.0, 0.0),
                        straight_extension=(1, 2))