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
andi3.get_stub_elements
can have a different order, but are otherwise identical.
Note
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:
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
Inheriting and defining vanilla Python attributes on them.
import ipkiss3.all as i3 class MyProcessLayer(i3.ProcessLayer): def __init__(self, **kwargs): super().__init__(**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
my_layout_view.get_west_ports(angle_decision=60.0)
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.
Disabled SUPPRESSED
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 ipcore.properties.initializer 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.center
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
__StructureSimulationVolume__.name
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 IP Manager Reference. In that case, verify your design and regenerate the reference file.