Release notes IPKISS 3.1.0


Ipkiss 3.1 introduces an EDA integrated design flow based on the combination of the Ipkiss framework with the L-Edit layout tool by Mentor Graphics.

  • The Python script UI is ideally suited for component design, component exploration tape-outs, as well as the creation of complex parametric cells and full-fledged circuits. The software ensures that parametric cells can be reused within your organization.
  • The L-Edit based GUI is the path to take if you want to leverage standard EDAfunctionality in combination with specialized photonics design, and need to integrate your design with electronic driver circuits.

Ipkiss 3.1 contains a lot of bugfixes and small improvements compared to Ipkiss 3.0.1. A detailed list can be found below. There are a few changes in Ipkiss 3.1 that introduce a backward incompatibility with Ipkiss 3.0.1. These are explained in more detail in the porting guide (which can be found in the documentation after installation). Please visit the website at to find out more.



Full list of improvements and bugfixes

There are a few changes in Ipkiss 3.1 that that introduce a backward incompatibility with Ipkiss 3.0.1. These are explained in more detail in the porting guide.


  • The installer now works correctly on Windows 10

Samples & documentation

  • New demonstration library (including a technology setup) + associated demonstration projects (samples/demo).
  • Small updates to the trainings and samples (samples/ipkiss3/training and samples/ipkiss3/getting_started).
  • Improved sample for GDSII import in the documentation.
  • Sample on how to find cells in a layout which have a label inside (with a given text). See samples/ipkiss3/samples/advanced/label_layers.
  • Guide on technology: this guide explains you how to build your own technology with Ipkiss.
  • visualize_2d() does not display the image twice anymore in notebooks.


  • Added the decorator @lock_properties() to make all properties of a StrongPropertyInitializer class read-only. See the PCell guide in the documentation for usage.
  • Improvement: RestrictTypeList now has a proper string representation (__str__).
  • Improvement: RestrictRange can now handle float values, even when the range bounds were specified as integers.


  • New functionality: Added capability to specify Caphe time domain models: pure input/output behavior, Ordinary Differential Equations (ODE) and Coupled Mode Theory (CMT) models can be specified. Note: this is still in an early stage. Simulation models are already defined in IPKISS, but the simulation setup is still done in native Caphe and not in Ipkiss.
  • New functionality: Added BoundaryPath element. It is a boundary which keeps a reference to its centre line.
  • Fix: Views (Layout, Netlist) are now compared based on overridden properties, but also overridden view data.
  • Fix: Net is now available in ipkiss3.all.
  • Fix: Automatic transitioning between waveguides is now based on a detailed comparison of the waveguide windows. Note: this may change your design. For example, a PlaceAndAutoRoute component (which uses Connector) may now have less unnecessary transitions.
  • Fix: RouteManhattan will no longer yield solutions with bend radii that are too small. However, this could in some cases lead to a waveguide crossing.
  • Bugfix: Shapes defined with integer coordinates are now converted to float coordinates to avoid rounding errors.
  • Bugfix: ShapeVariableOffset now works properly on simple shapes.
  • Bugfix: Boolean operations on Boundary now correctly take a transformation into account.
  • Bugfix: Layer filters (LayerFilterAllow, LayerFilterDelete) are fixed. They no longer functioned because the class __LayerElement__ was renamed to _LayerElement.
  • Bugfix: Label.size_info() now returns a new empty SizeInfo object (previously, it returned the global EMPTY_SIZE_INFO object).
  • Bugfix: The cross section visualization of a layout view now correctly takes the hierarchy into account.
  • Bugfix: Trace transitions with zero length now have the correct port angles.
  • Bugfix: Rounded waveguides where there is not enough bend space in the first and last section will now throw an error. Previously, this was ignored, which resulted in too small bend radii.
  • Bugfix: ElectricalPort is now correctly transformed if you manually set the angle.
  • Bugfix: Making a copy of a port also copies the position into a separate coordinate object.
  • Bugfix: Small code refactoring to Port, Group, _GroupElement. As a result, a port no longer contains a portlist itself (which is logical).
  • Bugfix: The process parameter was not passed in IoColumn.add_blocktitle. The pattern purpose for the text was hardcoded and is now a parameter as well.
  • Improvement: NameProperty now prints a valid error message when a non-string is assigned.
  • Improvement: Transformable and NoDistortTransformable do no longer take positional arguments (i.e. the __init__ has been removed). This is very unlikely to affect any user code.
  • Improvement: Trace transitions originating from a port now have default zero length. This default behavior keeps containers more compact when no transitions are needed.
  • Improvement: ShapeProperty is now a class, rather than a shortcut function. This should normally not introduce any compatibility problems, unless you have used the internal_member_name attribute.
  • Improvement: The comparison of Trace Templates (and Ipkiss 2.4 Waveguide Definitions) is now more rigorous. As a result, there might be occurences where tapers are removed where trace templates are identical. Also, WgMziGeneric in Picazzo will now add tapers in a more reliable way.
  • Improvement: Waveguides and traces now have a default shape: [(0.0, 0.0), (TECH.WG.SHORT_STRAIGHT, 0.0)].
  • Improvement: the template property of a templated Waveguide now has a default value. More specifically:

    • _TemplatedWaveguide: TECH.PCELLS.WG.DEFAULT.
    • TemplatedWindowsOnWaveguide: WindowsOnWaveguideTemplate(trace_template=TECH.PCELLS.WG.DEFAULT).
  • [Backward incompatible] Change: environment variable IPKISS_LOG_LEVEL has been renamed to LUCEDA_LOG_LEVEL.


  • All Picazzo components now have sensible default values.
  • Added waveguide connectors (picazzo3.wg.connector).
  • Added inline waveguide gratings (picazzo3.wg.grating).
  • Added a logical inline reflector with a Fresnel reflection model (picazzo3.logical.reflector).
  • Added StraightGratingLine for simple grating couplers.
  • Fix: MziWithCells now calculates the combiner transformation taking into account tapering, and the transformations for splitters and combiners can also be manually overruled.
  • Bugfix: MziWithCells now generates a valid MZI arm when the child cell in the arm is specified through inheritance (as a _default_arm1_contents or _default_arm2_contents method)
  • Bugfix: angle_step is now correctly passed in the ring resonators (picazzo.filters.ring), from the ring cell to its constituting waveguides.
  • Bugfix: get_ring_length() of RingRect.Layout and derived ring resonators now reports the complete ring length instead of one quarter of the ring
  • Bugfix: IoFibcoup can now handle west ports routed to east and vice versa, when port labels ("E0", "W1", ...) are used
  • Bugfix: Use of predefined columns from will now work. There was a syntax error before.
  • Bugfix: MMIIdentical now has 3 inputs and 3 outputs by default. There was a circular dependence before.
  • Bugfix: RibMMI classes now use the default rib waveguide templates, instead of the default strip waveguides.
  • Bugfix: Transition of slot waveguides now adjusts to the layers of the slot waveguide template. Before, these layers were hardcoded.
  • Bugfix: Transitions created with AutoTraceTransitionFromPort now have unique names. As a result names of transitions in your design might have changed.
  • Bugfix: RoutePortsAroundCorner now has a one-to-one correspondence between the waveguide instances in Netlist and Layout. Before, the waveguide instances were reordered in the layout, which could lead to a mismatch between layotu and netlist.
  • Bugfix: Trace chains and Spirals were incorrectly connected on netlist level.
  • [Backward incompatible] Improvement: Wire waveguide transitions WireWaveguideTransitionFromPortLinear now have an adaptive length with a minimum of TECH.WG.SHORT_TRANSITION_LENGTH. Note: This will have an effect on your design if you used short tapers between a very wide and a very narrow waveguide. Such short tapers can introduce a large loss, and therefore an adaptive length was introduced: The larger the width mismatch between the two waveguide cores, the longer the taper will be.
  • [Backward incompatible] Added property purpose to ElectricalWireTemplate, with default value TECH.PURPOSE.DRAWING. The original purpose that was used was TECH.PURPOSE.DF.LINE. If your technology used TECH.PURPOSE.DF.LINE for drawing electrical wires, you need to change this default.
  • Improvements to PlaceAndAutoRoute:

    • Added transitions when ports don't match the trace template.
    • Added automatic detection and highlighting of crossing waveguides using the highlight_waveguide_crossings flag.
    • Added the method get_waveguide_crossing_points() on the Layout view.
    • Added the possibility to manually override individual waveguide routes
    • Added min_straight, start_straight, end_straight properties on the Layout view. These influence the behavior of the routing.
    • The links property has a proper restriction. It checks if it's a list, with tuples, and each tuple is exactly size 2.
  • Improvement: in FanoutPorts: When no reference coordinate is specified, the first route will follow a more natural shape. Note: this may change behavior of FanoutPorts. It will only occur when you perform a FanoutPorts on a component where the first ports (the reference port) is at an angle with the output direction, and no reference_coordinate is specified. Now the shortest route to the output direction is used, while originally the waveguide could make a somewhat awkward bend. If you manually specify the reference_coordinate, there is no difference.

  • Improvement: RoutePortsAroundCorner will now sort the ports before generating the routes.
  • Improvement: StraightWgSocket for fiber couplers is now centered around (0,0), rather than starting at (0,0). By default, it now overlays correctly on a straight grating.
  • Improvement: MMI and RibMMI classes now have more sensible defaults for widths and input/output positions.
  • Improvement: Generic ring resonators (RingShape and RingTraces) now have a default circular shape instead of an empty shape.
  • Improvement: ContactHole and Via12 now use "CONTACT" and "VIA12" as name prefix - therefore autogenerated names will change when the name was not manually set.
  • Improvement: PlaceandConnect can now logically connect components with electrical as well as optical terms.
  • Improvement: The ParabolicCrossing has no hard-coded layer purposes anymore. These can now be set using the properties core_purpose, strip_purpose, cladding_purpose and strip_cladding_purpose.
  • Improvement: The generic TraceChain classes now, by default, concatenate 3 right-angle bends. This illustrates the functionality better.
  • Improvement: The default width of the intermediate wire of a Rib-to-Wire transition (WireRibWireWaveguideTransitionLinear) is narrower, resulting in a smoother transition.
  • Improvements to Spirals:

    • The East output section of DoubleSpiralWithIncoupling does not extend as far east as it used to be. It default to TECH.WG.SHORT_STRAIGHT.
    • Spiral loops are now cut in 2 to avoid self-intersecting polygons on export.

Picazzo 2.4

  • Bugfix: TaperDeepPorts and TaperShallowPorts had wrong port names: multiple ports with the same name could result. The port names of the tapered structure are now identical to the port names of the original structure.
  • Removed InWaveguideHeaterDefinition from picazzo.modulators.window_waveguides.

Starting from our extensive validated component library, we can assist you in the creation and validation of new model libraries