Known changes and backwards incompatibilities in 2026.06.0

Grid snapping of SRefs and ARefs

The GDSII exporter writes positions of SRefs and ARefs using a single snapping step instead of two. This can result in different but in most cases more accurate grid snapping. Consider the following code:

import ipkiss3.all as i3

grids_per_unit = i3.get_grids_per_unit()


class ExampleCell(i3.PCell):
    class Layout(i3.LayoutView):
        n_grid_points_x = i3.PositiveNumberProperty(default=0.6)
        n_grid_points_y = i3.PositiveNumberProperty(default=0.8)

        def generate(self, layout):
            shift_x = self.n_grid_points_x / grids_per_unit
            shift_y = self.n_grid_points_y / grids_per_unit

            layout += i3.SRef(
                name="wg",
                reference=i3.Waveguide(),
                position=(shift_x, shift_y),
                transformation=i3.Translation(translation=(shift_x, shift_y)),
            )

            return layout


lv = ExampleCell().get_default_view(i3.LayoutView)
lv.write_gdsii("example.gds")

lv_imported = i3.GDSCell(filename="example.gds").get_default_view(i3.LayoutView)
position = lv_imported["wg"].position

# On 2026.06: 1.0 2.0
# On 2026.03: 2.0 2.0
print(position.x * grids_per_unit, position.y * grids_per_unit)

Return type of i3.dummy_fill_layout and i3.dummy_fill_layout_box

The functions i3.dummy_fill_layout and i3.dummy_fill_layout_box return a list of dummy ARefs instead of a Layout object. The following will still work as before.

import ipkiss3.all as i3


class ExampleCell(i3.PCell):
    class Layout(i3.LayoutView):
        def generate(self, layout):
            ...
            layout += i3.dummy_fill_layout(layout, filling=[...])  # or i3.dummy_fill_layout_box(...)
            return layout

Connector error handling

The connector error handling logic have been refactored to be more robust and maintainable. This introduces few backward incompatibilities:

  • ConnectorError Change: ConnectorError is no longer a BaseException (it is now a @dataclass). Code that attempts to raise it or catch it via except will break. Error handling is now delegated to its resolve(strict) method.

  • Stricter Initialization: Self-connections and duplicate specs now raise a ValueError immediately during i3.Connector or i3.ConnectSBend initialization. This occurs even if strict=False is used in the layout context.

  • Internal Attribute Refactoring: The self.ports attribute has been removed from i3.Connector and i3.ConnectSBend in favor of self.connect_specs.

  • Invalid names: Starting a name of a connection or an instance with failed_ is not allowed, this prefix is reserved for invalid connections.