Known changes and backwards incompatibilities in 3.11.0

Numpy version upgrade to 1.23

The bundled version of the numpy package has been upgraded to 1.23 which brings many enhancements and performance improvements. As a result of the removal of several deprecated functions and features you might have to adapt to your scripts to be compatible with this version. For more information on the changes we refer to the release note pages of the numpy package.

We strongly encourage to solve any deprecation warnings when applicable as future versions of IPKISS will update to newer versions of numpy.

Warning

Numpy 1.22 has added support for AVX-512 instructions when the CPU supports it (currently only supported on Linux). While this can provide a significant performance boost it can also result in small numerical differences that can lead to differences in your designs.

To avoid these differences you can set the NPY_DISABLE_CPU_FEATURES environment variable in your IDE to disable the use of these instructions.

export NPY_DISABLE_CPU_FEATURES="AVX512F,AVX512CD,AVX512_SKX,AVX512_CLX,AVX512_CNL,AVX512_ICL"

Symbol and terms position from the symbol’s center.

Symbol positioning is changed from bottom-left to on its center (to be more in line with other EDA and CAD tools). This means that when loading a saved schematic, all the symbols will be shifted a bit.

Symbol positioning change.

Similarly the terms of each symbol are now positioned relative to the symbol’s center. This will only affect the term position values in the Symbol View editor.

Term positioning change.

Library version

The outlined changes required us to update the iclib files and their version, a change that will automatically happen once you open your project/libraries.

For more information on the iclib version, what it means, etc, please check versioning information.

Straight lengths are now adhering to minimum length.

Wide straight generation has changed in i3.TaperedWaveguide, it will by default no longer generate straight waveguides smaller than the minimum length specified by the min_straight_section_length parameter (defaults to i3.TECH.WG.EXPANDED_STRAIGHT). This affects i3.TaperedWaveguide and i3.ConnectManhattanTapered.

Wide straight change.

The only place where this is intentionally ignored is in AWG bundles (i.e., RectangularTaperedWaveguideArray and TaperedWaveguideBundle, because there we want each waveguide path in the bundle to have a taper).

TimeProperty

The i3.TimeProperty is now storing a Python datetime object instead of a floating point.

  • TimeProperty will still accept floating point time values (seconds since January 1st 1970) but automatically convert them into a datetime object.

  • If your code is reading out a TimeProperty, you will now get a datetime object. If you are using this to compare to another TimeProperty value, this will keep on working. If you want the float value instead, you can convert with datetime.timestamp.

Unique port names when using connectors

Intermediate ports must now always have a unique name assigned to them. Ports without a name cannot be used in a connector. Where previously this code would work,

import si_fab.all as pdk
import ipkiss3.all as i3

input_port = i3.OpticalPort(position=(5.0, 0.0))
output_port = i3.OpticalPort(position=(25.0, 5.0), angle_deg=180.0)

my_circuit = i3.Circuit(
  specs=[
    i3.ConnectBend(input_port, output_port, bend_radius=10.0)
  ]
)

circuit_layout = my_circuit.Layout()
circuit_layout.visualize(annotate=True)

this now needs to be changed into something like this.

import si_fab.all as pdk
import ipkiss3.all as i3

input_port = i3.OpticalPort(name="in", position=(5.0, 0.0))
output_port = i3.OpticalPort(name="out", position=(25.0, 5.0), angle_deg=180.0)

my_circuit = i3.Circuit(
  specs=[
    i3.ConnectBend(input_port, output_port, bend_radius=10.0)
  ]
)

circuit_layout = my_circuit.Layout()
circuit_layout.visualize(annotate=True)

This decision was motivated by the following arguments:

  • Naming every ports makes debugging your code easier. Port names are used in error messages and therefore make identifying problematic code easier.

  • Port names are used to name the waveguide created by a connector. Proper port names result in proper waveguide names.

  • Named port are easier to connect to when doing routing.

  • Port names need to be unique, therefore autogenerated ports name used properties of the port to construct a name. These names were rather cryptic and hard to read.

Netlist from TaperedWaveguide now generated from layout

Netlist generation has changed for i3.TaperedWaveguide, it is now autogenerated from the layout using i3.NetlistFromLayout. The names of the instances inside the cell may change because of this. This change was made to support waveguides using fixed bends. The majority of users should not be impacted by this change. It is only relevant if you directly want to access the terms or instances inside a TaperedWaveguide cell after creation.