Release notes IPKISS 3.3.0

The IPKISS 3.3 design platform introduces a new placement engine and full optical netlist extraction.

The placement engine simplifies writing PIC layouts in IPKISS and makes getting started a lot easier. Netlist extraction can be used to verify layout connectivity and run circuit simulations directly from layouts that you’ve built before. In addition, in this release the software documentation has been extended with a samples gallery, new and updated tutorials, and a lot of other small improvements.

Highlights are shown below:

  1. Spec-based device placement
  2. Netlist extraction
  3. Documentation improvements & sample gallery
  4. Full list of improvements and bugfixes (link to online doc)


1. Spec-based device placement

In this release we provide a new way to define layout placement. We focus as much as possible on a declarative and expressive framework that’s easy to understand, use, and share with your colleagues. The framework is based on the idea that components are placed according to a set of specifications (for example, place, join, align, flip).

For example, given the following instances and specifications (this example can also be found in our new sample gallery):

Instances and specifications

This gives us the following placement as result:

Instances and specifications solved

Please check the placement tutorial to get started, or check out the list of possible specs in the API reference.


2. Netlist extraction

In this release, we added an optical netlist extracter which extracts the terms, instances and optical nets from any given IPKISS layout. It’s available as a view to add to your PCell (i3.NetlistFromLayout).

The netlist can then be further processed, either to check for design errors, to compare versus other netlists, or to directly run circuit simulations (layout-driven circuit simulation).

Given the previous example of a MZI with spiral (full example), this is the extracted netlist:

    - delay : <Single instance in netlist of mzi_spiral>
    - splitter : <Single instance in netlist of DC_L6.000>
    - combiner : <Single instance in netlist of DC_L6.000>
    - wg : <Single instance in netlist of mzi_wg>

    - in1
    - out2
    - out1
    - in2

    - splitter:out2-wg:in: <OpticalLink splitter:out2 to wg:in>
    - combiner:out1-out1: <OpticalLink out1 to combiner:out1>
    - combiner:out2-out2: <OpticalLink out2 to combiner:out2>
    - in1-splitter:in1: <OpticalLink in1 to splitter:in1>
    - delay:in-splitter:out1: <OpticalLink delay:in to splitter:out1>
    - combiner:in2-wg:out: <OpticalLink combiner:in2 to wg:out>
    - in2-splitter:in2: <OpticalLink in2 to splitter:in2>
    - combiner:in1-delay:out: <OpticalLink combiner:in1 to delay:out>

And here’s a circuit simulation based on the extracted netlist and the default model parameters:



3. Documentation improvements

  • Various small inaccuracies throughout the documentation have been fixed, and a new landing page was created.
  • The tutorials have been reorganized so it’s easier to reach the relevant content for beginning users.
  • API reference has been extended in several locations.
  • More technology-related documentation. In particular, we documented the required technology keys to build your own PDK.
  • New samples gallery.
  • New layout tutorial.

The most recent version of the documentation is now by default hosted on (without a version number in the URL). If you want to browse old versions of the documentation, you can launch the Luceda Control Center (the version is displayed in the window title), and open the documentation from there by clicking the ‘Luceda documentation’ button.

Go to the Luceda Documentation


4. Full list of improvements and bugfixes


  • New feature: i3.place_insts, and the following specifications: i3.Place, i3.Join, i3.PlaceRelative, i3.AlignV, i3.AlignH, i3.FlipV, i3.FlipH.
  • New feature: i3.NetlistFromLayout now extracts the full optical netlist from layout. See sample in the sample gallery.
  • New feature: i3.extract_terms can be used to create netlist terms corresponding to layout ports.
  • Improvement: RouteManhattan now properly generates routes ports that are spaced closer than the sum of the end and start straight.
  • Improvement: Instance names can now contain the < and > characters (used to expanding instance arrays). Other EDA tools usually support these characters, too.
  • Improvement: An empty SizeInfo() (east=None, west=None, south=None, north=None) now has a valid string representation.
  • Improvement: a flat copy of a full layout view can now be made with LayoutView.flat_copy(). In this way it becomes easier to export a flat version of a layout.
  • Improvement: the performance of the export of shapes to GDS has been optimized.
  • Improvement: defaults created for the port size when exporting to a device simulator, will now always fall within the bounds of the defined material.
  • Improvement: the layoutviews of waveguide templates now have an is_match() method to check that 2 templates have matching layout.
  • Bugfix: Layout.flatten() now takes all instances into account (previously only those inside elements where flattened.
  • Bugfix: SRef.flat_copy(), ARef.flat_copy() and MRef.flat_copy() can now correctly flatten with limited depth (levels!=-1), avoiding instance name conflicts.
  • Bugfix: ‘treat_trace_template_as’ on the transition database was not taken into account when calculating the transition between 2 trace templates of the same type. Now the indirection as defined with treat_trace_template_as will always take precedence unless there is a specific (exact waveguide template class match) in the database.
  • Bugfix: Label.size_info() now returns an empty SizeInfo instead of a point at (0.0, 0.0), and is not taken into account anymore when calculating the SizeInfo of an ElementList, Group or Layout.
  • Bugfix: removed an ambiguity in Waveguide which lead to a wrong model being used in case of a custom defined waveguide with multiple circuit models.
  • Bugfix: Layout.visualize_3d_x_crossection(x_co) and Layout.visualize_3d_y_crossection(y_co) did not work anymore.
  • Bugfix: When flattening (either through flat_copy or with the flatten attribute of SRef/ARef) transformations were not correctly applied in all cases.
  • Bugfix: When exporting a device simulation we now ensure that there’s always material present within the specified bounding box.
  • Fix: Layout.visualize_3d_vtk(), which is not supported anymore, now raises a proper Exception instead of crashing.
  • Bugfix: PathTraceWindow and ExtendedPathTraceWindow could not cope with duplicate points in the centerline shape of the trace.
  • Bugfix: ExtendedPathTraceWindow did not use the start_face_angle and end_face_angle properties to extend the path.
  • Bugfix: Terms, instances and nets were empty when using _generate_netlist to declare the netlist.
  • Improvement: The custom ‘ID property’ was removed on the system fonts. Their identifier in i3.TEXT.FONT can now be obtained from i3.TEXT.FONT.get_id(font).
  • Bugfix: convert_smatrix_units now supports SMatrix1DSweep objects with ‘wavelengths’ (instead of ‘wavelength’) as sweep_parameter_name and with a list (instead of a numpy array) as sweep_parameter_values. As a result, BSplineModel.from_smatrix() can now be used on smatrix results generated by Caphe.
  • Improvement: Updated the heuristic to find the installation folder of the latest version of Lumerical.
  • Improvement: When doing a circuit simulation, the netlist is now validated to ensure there are no unconnected terms, duplicate nets or terms with multiple links. To disable the validation set the validate_netlist keyword argument to False in get_smatrix and get_time_response (see also i3.CircuitModelView).


  • Bugfix: The length of the transitions of connectors could not be set to 0.
  • Bugfix: In MZIWithCells, the extra_length property was not taken into account in certain cases.
  • Bugfix: WgYSplitter and WgYCombiner could not have a bend radius smaller than half the cladding width.
  • Bugfix: In MZIWithCells, the documentation of the extra_length property was wrong (positive values increase the length of the lower arm).
  • Bugfix: SpiralsSingleSpiral, DoubleSpiral, DoubleSpiralWithInCoupling and FixedLengthSpiral can now be used with an ExpandedWaveguideTemplate and with asymmetric bends (e.g. when using SplineRoundingAlgorithm). Note this will slightly change the layout of the spirals: the waveguides are cut in a different position.
  • Bugfix: TemplatedPhaseShifterWaveguide could not be instantiated without overriding its template property.


  • Bugfix: when the environment variables contained unicode strings, evaluation of PCells failed.
  • Bugfix: Rib waveguide transitions couldn’t be instantiated in demolib because of missing tech keys.
  • Bugfix: The position of a Label was incorrectly transformed when exporting to OpenAccess.
  • Bugfix: Reduce runtime dependencies of Ipkiss.eda to fix some DLL conflicts which could cause L-Edit to malfunction.

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