There are a few changes in Ipkiss 3.1 that that introduce a backward incompatibility with Ipkiss 3.0.1. These are explained in more detail in Porting from Ipkiss 3.0.1 to Ipkiss 3.1.
- The installer now works correctly on Windows 10
Samples & documentation¶
- Small updates to the trainings and samples (
samples/ipkiss3/training and samples/ipkiss3/getting_started).
- Improved sample for GDSII import in the documentation.
- Sample on how to find cells in a layout which have a label inside (with a given text). See
- Guide on technology: this guide explains you how to build your own technology with Ipkiss.
visualize_2d()does not display the image twice anymore in notebooks.
- Added the decorator
@lock_properties()to make all properties of a
StrongPropertyInitializerclass read-only. See the PCell guide in the documentation for usage.
RestrictTypeListnow has a proper string representation (
RestrictRangecan now handle float values, even when the range bounds were specified as integers.
- New functionality: Added capability to specify Caphe time domain models: pure input/output behavior, Ordinary Differential Equations (ODE) and Coupled Mode Theory (CMT) models can be specified. Note: this is still in an early stage. Simulation models are already defined in IPKISS, but the simulation setup is still done in native Caphe and not in Ipkiss.
- New functionality: Added
BoundaryPathelement. It is a boundary which keeps a reference to its centre line.
- Fix: Views (Layout, Netlist) are now compared based on overridden properties, but also overridden view data.
Netis now available in
- Fix: Automatic transitioning between waveguides is now based on a detailed comparison of the waveguide windows.
Note: this may change your design. For example, a
PlaceAndAutoRoutecomponent (which uses
Connector) may now have less unnecessary transitions.
RouteManhattanwill no longer yield solutions with bend radii that are too small. However, this could in some cases lead to a waveguide crossing.
- Bugfix: Shapes defined with integer coordinates are now converted to float coordinates to avoid rounding errors.
ShapeVariableOffsetnow works properly on simple shapes.
- Bugfix: Boolean operations on
Boundarynow correctly take a transformation into account.
- Bugfix: Layer filters (
LayerFilterDelete) are fixed. They no longer functioned because the class
__LayerElement__was renamed to
Label.size_info()now returns a new empty
SizeInfoobject (previously, it returned the global
- Bugfix: The cross section visualization of a layout view now correctly takes the hierarchy into account.
- Bugfix: Trace transitions with zero length now have the correct port angles.
- Bugfix: Rounded waveguides where there is not enough bend space in the first and last section will now throw an error. Previously, this was ignored, which resulted in too small bend radii.
ElectricalPortis now correctly transformed if you manually set the angle.
- Bugfix: Making a copy of a port also copies the position into a separate coordinate object.
- Bugfix: Small code refactoring to
_GroupElement. As a result, a port no longer contains a portlist itself (which is logical).
- Bugfix: The process parameter was not passed in IoColumn.add_blocktitle. The pattern purpose for the text was hardcoded and is now a parameter as well.
NamePropertynow prints a valid error message when a non-string is assigned.
NoDistortTransformabledo no longer take positional arguments (i.e. the
__init__has been removed). This is very unlikely to affect any user code.
- Improvement: Trace transitions originating from a port now have default zero length. This default behavior keeps containers more compact when no transitions are needed.
ShapePropertyis now a class, rather than a shortcut function. This should normally not introduce any compatibility problems, unless you have used the
- Improvement: The comparison of Trace Templates (and Ipkiss 2.4 Waveguide Definitions) is now more rigorous. As a result, there might be
occurences where tapers are removed where trace templates are identical. Also,
WgMziGenericin Picazzo will now add tapers in a more reliable way.
- Improvement: Waveguides and traces now have a default shape:
[(0.0, 0.0), (TECH.WG.SHORT_STRAIGHT, 0.0)].
- Improvement: the template property of a templated
Waveguidenow has a default value. More specifically:
- [Backward incompatible] Change: environment variable
IPKISS_LOG_LEVELhas been renamed to
- All Picazzo components now have sensible default values.
- Added waveguide connectors (
- Added inline waveguide gratings (
- Added a logical inline reflector with a Fresnel reflection model (
StraightGratingLinefor simple grating couplers.
MziWithCellsnow calculates the combiner transformation taking into account tapering, and the transformations for splitters and combiners can also be manually overruled.
MziWithCellsnow generates a valid MZI arm when the child cell in the arm is specified through inheritance (as a
angle_stepis now correctly passed in the ring resonators (
picazzo.filters.ring), from the ring cell to its constituting waveguides.
get_ring_length()of RingRect.Layout and derived ring resonators now reports the complete ring length instead of one quarter of the ring
IoFibcoupcan now handle west ports routed to east and vice versa, when port labels (
"W1", ...) are used
- Bugfix: Use of predefined columns from
genericpdk.library.io.columnwill now work. There was a syntax error before.
MMIIdenticalnow has 3 inputs and 3 outputs by default. There was a circular dependence before.
RibMMIclasses now use the default rib waveguide templates, instead of the default strip waveguides.
- Bugfix: Transition of slot waveguides now adjusts to the layers of the slot waveguide template. Before, these layers were hardcoded.
- Bugfix: Transitions created with
AutoTraceTransitionFromPortnow have unique names. As a result names of transitions in your design might have changed.
RoutePortsAroundCornernow has a one-to-one correspondence between the waveguide instances in Netlist and Layout. Before, the waveguide instances were reordered in the layout, which could lead to a mismatch between layotu and netlist.
- Bugfix: Trace chains and Spirals were incorrectly connected on netlist level.
- [Backward incompatible] Improvement: Wire waveguide transitions
WireWaveguideTransitionFromPortLinearnow have an adaptive length with a minimum of
TECH.WG.SHORT_TRANSITION_LENGTH. Note: This will have an effect on your design if you used short tapers between a very wide and a very narrow waveguide. Such short tapers can introduce a large loss, and therefore an adaptive length was introduced: The larger the width mismatch between the two waveguide cores, the longer the taper will be.
- [Backward incompatible] Added property
ElectricalWireTemplate, with default value
TECH.PURPOSE.DRAWING. The original purpose that was used was
TECH.PURPOSE.DF.LINE. If your technology used
TECH.PURPOSE.DF.LINEfor drawing electrical wires, you need to change this default.
- Improvements to
- Added transitions when ports don’t match the trace template.
- Added automatic detection and highlighting of crossing waveguides using the
- Added the method
get_waveguide_crossing_points()on the Layout view.
- Added the possibility to manually override individual waveguide routes
end_straightproperties on the Layout view. These influence the behavior of the routing.
linksproperty has a proper restriction. It checks if it’s a list, with tuples, and each tuple is exactly size 2.
- Improvement: in
FanoutPorts: When no reference coordinate is specified, the first route will follow a more natural shape. Note: this may change behavior of
FanoutPorts. It will only occur when you perform a
FanoutPortson a component where the first ports (the reference port) is at an angle with the output direction, and no
reference_coordinateis specified. Now the shortest route to the output direction is used, while originally the waveguide could make a somewhat awkward bend. If you manually specify the
reference_coordinate, there is no difference.
RoutePortsAroundCornerwill now sort the ports before generating the routes.
StraightWgSocketfor fiber couplers is now centered around (0,0), rather than starting at (0,0). By default, it now overlays correctly on a straight grating.
RibMMIclasses now have more sensible defaults for widths and input/output positions.
- Improvement: Generic ring resonators (
RingTraces) now have a default circular shape instead of an empty shape.
"VIA12"as name prefix - therefore autogenerated names will change when the name was not manually set.
PlaceandConnectcan now logically connect components with electrical as well as optical terms.
- Improvement: The
ParabolicCrossinghas no hard-coded layer purposes anymore. These can now be set using the properties
- Improvement: The generic
TraceChainclasses now, by default, concatenate 3 right-angle bends. This illustrates the functionality better.
- Improvement: The default width of the intermediate wire of a Rib-to-Wire transition (
WireRibWireWaveguideTransitionLinear) is narrower, resulting in a smoother transition.
- Improvements to Spirals:
- The East output section of
DoubleSpiralWithIncouplingdoes not extend as far east as it used to be. It default to
- Spiral loops are now cut in 2 to avoid self-intersecting polygons on export.
- The East output section of
- Bugfix: TaperDeepPorts and TaperShallowPorts had wrong port names: multiple ports with the same name could result. The port names of the tapered structure are now identical to the port names of the original structure.
- Bugfix: the
ipkiss.plugins.electronics.portpackage could not be imported anymore. This is now fixed (for designers that need to run old 2.4 code that uses electronic ports).
- Small syntax fix in
Changes that introduce a backward incompatibility are explained in more detail in Porting from Ipkiss 3.0 to Ipkiss 3.0.1 .
- Improved error message when a property is not valid.
intand numpy booleans (
BoolPropertynow stores its value as a python
- Small, but important change in the behavior of number properties:
- Basic type (
complex) properties (such as
ComplexNumberProperty) always cast the value to the correct type. For example, when 1 is passed to a NumberProperty, it is converted to 1.0.
- [Backward incompatible]
FloatPropertynow accepts integer values (this means now
FloatPropertyare equivalent). The preferred usage is
NumberProperty, as it is used in most places. This casting is done to ensure a consistent user experience. It might, in some very specific cases in your code, result in a changed behavior or a warning.
- Basic type (
- [Backward incompatible] The
_set_bulk) now only accept keyword arguments that correspond to properties of the component. Originally unknown keywords were ignored, but now unknown keywords will raise an exception. This reduces the chances of obscure bugs due to small programming typos.
- Trace transitions describe the interface between two different kinds of trace templates (
ipkiss3.pcell.trace.transition). This is an improvement on the Tapers in Ipkiss 2.4. Linear and Parabolic transitions are available. Trace transitions are stored in a database (
TECH.PCELLS.TRANSITION.AUTO_TRANSITION_DATABASE). Transitions cannot be mixed with ‘tapers’ from Ipkiss 2.4.
vector_match_transformnow has a parameter
mirroredto introduce a mirroring operation.
- In a hierarchical PCell with childcells , it was often needed to explicitly evaluate the child views (or perform
visualize). This has now been fixed. See the porting guide for more details.
- A wrapper
GDSCellto import external GDS files has been added (
- Adding electrical traces and ports (
- Routes have been ported from Ipkiss 2.4 to Ipkiss 3 (
ipkiss3.pcell.routing) * Also available for electrical traces and ports. * Added support for manual routing angles. This can be useful for electrical routing.
- [Future Deprecation]
PortListnow has dict-like methods
items. This makes it similar in use as
TermDict. Use those methods wherever possible to avoid future deprecation.
Port.invert()did not return an object.
- Bugfix in
write_gdsii: grid and unit arguments were ignored and technology defaults taken. The grid and unit arguments are used now upon GDSII export.
- Bugfix in GDSII export: entities with a fixed timestamp (library, structure) can now have a timezone west of UTC.
Upon import, any year
xx<=69is converted to 20xx (Y2K handling) - was
xx<=70before, which includes the unix epoch.
- Bugfix in
+=did not properly support a list of items (
- [Backward incompatible] All occurences of
LayerPropertyhave been removed on picazzo components - the
purposeproperties should be used instead. This affects trace templates, photonic crystals, MMIs and grating couplers.
- [Backward incompatible] Cleanup of technology. Importing the technology is now done using
from technologies import silicon_photonics.
- If you have designs/scripts in IPKISS 3.0 syntax that uses
si_photonics, please change your script to use
- If you have a custom technology that is based on
si_photonics, it will still work with components based on IPKISS 2.4 syntax (in backward compatibility mode). But if you want to use your custom technology in IPKISS3, it is better to base it on the
- If you have designs/scripts in IPKISS 3.0 syntax that uses
- Added trace bundles and waveguide bundles, which group a set of traces/waveguides routed together. The layout can have a covering hull.
- Added electrical wires (
traces.electrical_wire) and contact vias (
- The Y splitters in
picazzo3.wg.splittersnow have a Caphe model (transmission + 3 reflection parameters)
RoutePortAroundCorner. Added a notebook on containers (samples/notebook3/containers). Each type of container also has a ‘generic’ version where the properties of each port can be adjusted.
PlaceAndAutoRoute: the functionality has been separated into individual PCells:
PlaceAndConnect. You can now use this functionality in a granular way. Also, it is now possible to explicitly name the external ports.
- Added MMI filters, models have been added. ‘Shallow’ (picazzo2) has been renamed to ‘Rib’. For example,
ShallowMMI2x2Taperedis now called
- Added Mach-Zehnder Interferometers. A set of circuit simulation samples for the picazzo MZIs can be found under
- Added Curved Grating Couplers. There are 2 classes (
FiberCouplerCurvedGrating). All the functionality previously accessible in picazzo2 is accessible from these 2 classes. Examples in the picazzo reference documentation. There is also a dedicated notebook (
ipkiss3\Curved Grating Couplers.ipynb).
- Added reflection to grating coupler models. The fiber port is now called
- Added Spirals. Includes a bugfix where expanding the spiral in the vertical direction would sometimes be wrong.
Please check the reference documentation, and the dedicated notebook (
IOFibCoupadapter, which allows to automatically connect fiber couplers to a PCell. Many improvements compared to picazzo in 2.4 were added, including better architecture, improved error handling. For an overview of the features, please check the reference documentation, or the notebook (
ipkiss3/IOFibcoup - Routing to fibercouplers.ipynb).
- The models for the directional couplers now include the phase propagation of the arms. Please check the reference documentation for more information.
- Added phase modulator waveguide templates: P(I)N junction based phase modulator, lateral and longitudinal, and a generic base class.
- Added a phase modulator PCell.
- CAMFR: Removed hard-coded wavelength restriction.
- Caphe: fixed bug where setup time for a complex circuit with many levels of hierarchy and many number of ports took a lot of time to load (exponential with the number of hierarchy levels). This is now linear in time.
- Caphe: throw an exception if the type of a property value of a CapheModel changes. Make sure to always use strongly typed properties such as
NumberProperty, or ensure that a
DefinitionPropertyof a CapheModel always returns a value of the same type.
- [Backward incompatible] The IPython Notebooks are now based on version 3 of the notebook framework.
Your old notebooks should work fine when you load them, but you will have to add
%pylab inlineat the beginning. when saved, they will be in the new format.
- Added several new demonstration notebooks on containers, grating couplers, IoFibcoup, ...
Ipkiss 2.4 compatibility¶
- Ipkiss 2.4 Structures now automatically get a netlist, deriving terms for the Structure’s ports. This makes it easier to use a library with Ipkiss 2.4 Structures as children in Ipkiss 3 PCells.
- New technologies (like
silicon_photonics) will only support Ipkiss 3 PCells. If you want to use Ipkiss 2.4 Structures with a new-style technology you need to import the
compat24technology immediately after you have imported your technology.
- Trace transitions should not be mixed with waveguide tapers from Ipkiss 2.4.
Most parts of IPKISS are rewritten in IPKISS 3.0, and new functionality has been added. The most notable changes are summarized below:
- The Caphe circuit solver is now integrated, and circuit simulations can be launched from within Ipkiss
- A new framework for describing PCells and their Views has been written
- Parametric cells can now also contain netlist and circuit model information
- A number of components from the picazzo library were ported to the new syntax and have a netlist and circuit model (picazzo3 library)
- A backward compatibility layer with 2.4 has been foreseen. There are a few Backward incompatible changes (documented).
- The installation infrastructure has been revamped. On Windows, a self-contained installer is available, on Linux packages are available.
- The documentation has been revamped and sufficiently expanded.
Under the hood¶
- A new property framework (strong typing/caching) was adopted.
- IPKISS Reference
- Picazzo Library Reference
- IPKISS.eda user manual
- Indices and tables
- Change Log
- Running Ipkiss 2.4 code in Ipkiss 3
- Porting from Ipkiss 2.4 to Ipkiss 3
- Porting from Ipkiss 3.0 to Ipkiss 3.0.1
- Porting from Ipkiss 3.0.1 to Ipkiss 3.1
- Ipkiss 2.4 Legacy Guides