Known changes and backwards incompatibilities in 3.10.0

Order differences in polygon vertices and polygon operation results

Due to the update of the shapely and geos libraries to their latest versions, there can be ordering differences:

  • The vertices of polygons resulting from e.g. boolean operations stay identical, but their order can be different in some cases (different vertex chosen as the first one).

  • The results of i3.get_acute_angle_points and i3.get_stub_elements can have a different order, but are otherwise identical.


In Luceda IPKISS 3.11.0, we added a new XOR equivalence test in IP Manager. This allows to test your layouts against geometrical changes, but ignoring any ordering differences.

Removed base classes

As part of cleaning up and improving the performance of IPKISS, several base classes which were not part of the IPKISS API (ipkiss3.all) were removed:

  • ipkiss.aspects.matplotlib_figure.__ShapeMatplotLibFigure__

  • ipkiss.aspects.matplotlib_figure.__ShapeModifierMatplotLibFigure__

  • ipkiss.aspects.matplotlib_figure._ViewLayoutAspectMatplotLibFigure

  • ipkiss.plugins.vfabrication.cross_section._CrossSectionGeometryStructureAspect

  • ipkiss.plugins.vfabrication.cross_section._CrossSectionGeometryWaveguideAspect

  • ipkiss.plugins.vfabrication.cross_section._CrossSectionGeometryTraceTemplateAspect

  • ipkiss.plugins.vfabrication.visualization.LayoutVisualizationAspect

  • ipkiss.plugins.vfabrication.visualizatin.LibraryVisualizationAspect

  • ipkiss.visualization.layer.DisplayLayer

Simplified basic classes

A range of classes was simplified and now only accept IPKISS properties as attributes on their objects. As a consequence, there are a couple of things you cannot do anymore:

  1. Setting vanilla Python attributes on them after creation is not possible. For instance, this won’t work:

    import ipkiss3.all as i3
    layer = i3.ProcessLayer(name="metal2", extension="M2")
    layer.is_not_used = True   # fails, is_not_used is not defined as Property on i3.ProcessLayer
  2. Inheriting and defining vanilla Python attributes on them.

    import ipkiss3.all as i3
    class MyProcessLayer(i3.ProcessLayer):
        def __init__(self, **kwargs):
            self.is_not_used = True   # fails, is_not_used is not defined as Property on i3.ProcessLayer

The classes affected are:

  • SplineRoundingAlgorithm

  • ListCollector, ListStringCollector, NewlineStringCollector, StreamStringCollector, StreamA2BHexCollector

  • FileType

  • GdsiiLayer, GdsiiLayerOutputMap, AutoGdsiiLayerOutputMap, AutoGdsiiLayerInputMap, GdsiiLayerInputMap, UnconstrainedGdsiiPPLayerOutputMap, GdsiiPPLayerOutputMap, GenericGdsiiPPLayerOutputMap, UnconstrainedGdsiiPPLayerInputMap

  • Rule

  • Color, DisplayStyle, CyclicDisplayStyleSet, StipplePattern

  • Filter, ToggledCompoundFilter and all filters.

  • ProcessLayer

  • FixedPrefixNameGenerator, ObjectPrefixNameGenerator

  • Term

  • SMatrixOutput, FileOutput, Port (in device_sim), SimulationGeometry, Macro, MacroFile, EMSimulation

Removed port_angle_decision

The property port_angle_decision was removed from i3.LayoutView. If you want to retrieve e.g. the ports pointing west, in an opening angle different from the default 90 degrees, then use


This will return the ports with an angle between 150.0 and 210.0 degrees.

Third party symbols

Classes and functions from the 3rd party library shapely such as GeometryCollection and Polygon are not exported by ipkiss3.all anymore. If you use these, import them from shapely directly.


Previously, in a StrongPropertyInitializer it was possible to suppress the initialization of a property of a base class with the SUPPRESSED identifier. This is now deprecated and disabled by default. If you need it, then enable the feature explicitly. You will get a deprecation warning.

from import SUPPRESSED, enable_features, FeatureFlags

@enable_features([FeatureFlags.SUPPRESS])    # this needs to be added in order to re-enable the <3.10 support of SUPPRESSED
class Rectangle(i3.StrongPropertyInitializer):
    length = i3.PositiveNumberProperty()
    width = i3.PositiveNumberProperty()

    def __init__(self, length, width, **kwargs):
        super(Rectangle, self).__init__(length=length, width=width, **kwargs)

class Square(Rectangle):
    side = i3.PositiveNumberProperty(default=1.0)

    def __init__(self, side, **kwargs):
        super(Square, self).__init__(side=side, length=SUPPRESSED, width=SUPPRESSED, **kwargs)

    def _default_length(self):
        return self.side

    def _default_width(self):
        return self.side

Better is to rewrite your code so that this feature does not need to be used at all, e.g. by removing the positional arguments.

Removal of IPKISS 2.4 define_ methods inside IPKISS

Several IPKISS classes still used define_<propertyname> methods instead of _default_<propertyname>. This has been changed. If you happen to inherit from one of those classes and override a define_<propertyname> method, your code will still work but you will get a deprecation warning. We plan to remove support for the define_<propertyname> methods entirely in IPKISS 3.11.

For instance, if you inherited from i3.Shape to implement your own type of shape:

class FancyShape(i3.Shape):
   fancy = i3.FloatProperty(default=1.0)

   def define_points(self, pts):
      # calculation
      return pts

Then change this to the following to be future-proof:

   class FancyShape(i3.Shape):
      fancy = i3.FloatProperty(default=1.0)

      def _default_points(self, pts):
         # calculation
         return pts

These are the affected class properties:

In the ipkiss package:

  • Shape.points

  • Shape.size_info

  • ShapeArc.box_size


  • ShapeBend.start_angle

  • ShapeBend.end_angle

  • ShapeEllipse.start_angle

  • ShapeEllipse.end_angle

  • ShapeRectangle.radius

  • ShapeRoundGeneric.radii

  • ShapeGrow.offset

  • ShapeSamplePeriodic.sampling_distances

  • ShapeRoundAdiabaticSplineGeneric.adiabatic_angles_list

  • ShapelyPolygonCollection.canvas_polygon

  • __ShapeModifierStartEndAngle__.start_face_angle

  • __ShapeModifierStartEndAngle__.end_face_angle

  • InputBasic.layer_map

  • InputBasic.filter

  • __ElementsForVFabricationAspect__.elements_per_active_process

  • __ProcessSuperpositionMaterialStackGeometry2DPolygons__.scaler

  • __ProcessSuperpositionMaterialStackGeometry2DPolygons__.canvas_size

  • __VirtualFabrication__.geometry

  • NameCharacterFilter.replace_characters

  • UnitGridContainer.grids_per_unit

  • UnitGridContainer.units_per_grid

  • GdsiiPPLayerInputMap.layer_map

  • GdsiiPPLayerOutputMap.layer_map

  • GenericGdsiiPPLayerInputMap.gdsiilayer_map

  • UnconstrainedGdsiiPPLayerInputMap.layer_process_map

  • UnconstrainedGdsiiPPLayerInputMap.datatype_purpose_map

In the pysics package:

  • __Geometry__.size_info

  • CartesianGeometry1D.width

  • CartesianGeometry2D.height

  • CartesianGeometry2D.thickness

  • __ImageMaterialGeometry2D__.material_grid

  • MaterialStack.solid_height

  • MaterialStack.size_z

  • Waveguide.modes

In the pysimul package:

  • __StructureSimulationVolume__.geometry


  • GaussianVolumeSourceAtPort.north

  • GaussianVolumeSourceAtPort.south

  • ModeProfileContinuousSourceAtPort.north

  • ModeProfileContinuousSourceAtPort.south

  • ModeProfileContinuousSourceAtPort.mode_profile

  • ModeProfileContinuousSourceAtPort.port

  • FluxplaneAtPort.north

  • FluxplaneAtPort.south

  • FluxplaneAtPort.port

  • Probingpoint.point

  • StructureSimulationDefinition.landscape

  • StructureSimulationDefinition.procedure

  • StructureSimulationDefinition.procedure_class

  • __SimulationVolume__.geometry

  • __CamfrGeometryCoordinateConverter__.camfr_box_size_x

  • __CamfrGeometryCoordinateConverter__.camfr_box_size_z

  • SimulationDefinition.landscape

  • SimulationDefinition.procedure

  • SimulationDefinition.saveDatacollectorsImageToFileFunction

  • MatrixModelParameters.wavelengths

UniformLineGrating origin bugfix

In picazzo, the origin property of UniformLineGrating is now correctly taken into account. However, that means if you had specified the origin parameter, it will now actually be correctly used and you may get an offset of the grating within the waveguide socket. That should not affect performance but it can affect any automation scripts (e.g. for testing) which you may have.

Shape face angles

:py:class`i3.BendPath<ipkiss3.all.BendPath>`, :py:class`i3.RelativeBendPath<ipkiss3.all.RelativeBendPath>`, :py:class`i3.ArcPath<ipkiss3.all.ArcPath>` and :py:class`i3.EllipseArcPath<ipkiss3.all.EllipseArcPath>` have their face angles (returned by get_face_angles() set correctly based on the provided input parameters. This change can produce small numerical point differences that might be flagged by a reference test created by Working with Luceda IP Manager. In that case, verify your design and regenerate the reference file.