# Changelog¶

## IPKISS Photonics Design Platform¶

### IPKISS Photonics Design Platform 3.8.0¶

#### IPKISS¶

• New Feature: Analyze transmission spectra and calculate spectral measures such as insertion loss, FSR (Free Spectral Range), crosstalk, and so on: i3.SpectrumAnalyzer and i3.Spectrum.
• New feature: Added i3.circuit_sim.map_terms to map Terms of predefined models to desired names.
• New Feature: Waveguide model i3.cml.WG2 with polynomial dependence of effective index and loss on wavelength.
• New Feature: Connect multiple start and end ports with a manhattan waveguide bundle using i3.ConnectManhattanBundle and i3.SBendFanout.
• Improvement: Compact models are organized in 1 location in a CML library which includes documentation.
• Improvement: Added a new parameter use_effective_radius to i3.EulerRoundingAlgorithm. By default all rounding algorithms interpret their radius parameter as the minimum radius of curvature, which could lead to some confusing behavior when using Euler bends. Setting use_effective_radius to True causes the radius to be interpreted as the effective radius instead.
• Improvement: A list or other sequence can be passed as parameter values of a CompactModel and will be converted internally to a numpy array.
• Improvement: Clarified in the documentation that the default trace template used by FanoutPorts is TECH.PCELLS.WG.DEFAULT. The trace_template property can be set to None to use the trace templates of the ports of the contents.
• Bugfix: i3.TaperedWaveguide now supports cases where there are no straight sections if the available distances between control points are filled by the bends.
• Bugfix: Ensure the unit and grid parameters of a LayoutCell and a cell read from GDSII are recognized as parameters, since a GDSII file can have a different grid or unit. In this way, GDSCell can be used within the IPKISS Link for Siemens EDA.
• Bugfix: modified_copy() can now be used correctly on a transformation (e.g. Rotation). Previously, not all properties of the original transformation were copied.
• Bugfix: i3.NetlistFromLayout now supports array references (ARef) correctly. An error in the array indexing was fixed. See Netlist extraction with array references for more information.
• Bugfix: The convex_hull() method of LayoutView now correctly takes the instances (hierarchy) into account.
• Bugfix: The use of i3.H and i3.V controlpoints could in certain cases violate the set bend radius. This has been fixed.
• Bugfix: The mpl_figure() method of Shape and ShapeModifiers was broken. These methodes can be used again for plotting Shapes and modified Shapes (such as the output of ShapeRound).
• Bugfix: Fixed a bug in the generation of S-bends with ConnectBend that in certain cases would add extra duplicate points.

#### Caphe¶

• Bugfix: input_signals now properly accept integer indices when doing time-domain simulations.

### IPKISS Photonics Design Platform 3.7.1¶

#### IPKISS¶

• New Feature: i3.LayoutView now contains optical port attributes like optical_north_ports, get_optical_ports_from_labels, …
• New Feature: Control points for manhattan routes can now be placed relative to the start and end port using i3.START and i3.END, respectively. A control point can also be placed relative to the previous one by using i3.PREV.
• New Feature: Use the Euler bend algorithm for rounding using i3.EulerRoundingAlgorithm.
• New Feature: Extract the peaks in a power spectrum using i3.spectrum_peaks.
• New Feature: Shortcut functions i3.signal_power and i3.signal_power_dB to calculate the power (linear or in dB) for each wavelength/frequency in a spectrum.
• Improvement: Picazzo W1 waveguides now have a reproducible default port trace template name.
• Improvement: When a layout is exported to GDSII that contains cells with the same name originating from different libraries, renaming is done in the GDSII file to avoid name collisions. This happens mostly when reading cells or circuits from multiple GDSII files and writing them out again to a larger design file. Previously, the GDSII file contained multiple cells with the same name, which is now avoided. If all cell layouts with the same name are identical, then a single cell is exported without renaming. In this way, unique versions of fixed foundry PDK cells can be kept.
• Improvement: The creation time of a cell (in an IPKISS script) is now stored on the cell (created attribute) and written to GDSII file.
• Improvement: We standardized the Touchstone exporter format so that we can import S-parameters into IPKISS that preserve the port order/names. Please check import_touchstone_smatrix for an example and more information.
• Change: Exported Touchstone files for the “IPKISS Link for Ansys Lumerical” no longer contain references to “Lumerical” in the port mapping. They use the standard IPKISS Touchstone format.
• Bugfix: Duplicate cell definitions in GDSII files are now avoided.
• Bugfix: TemplatedRoundedWaveguide had a wrong trace_template property value when created by calling a RoundedWaveguideTemplate.
• Bugfix: The process property of OpticalPort is now read-only. Since this property refers to the process of its trace_template, setting it could lead to undesired modification of the trace template.
• Bugfix: The shape cutting algorithm now correctly cuts a shape with a hole when the hole touches the top of the shape.
• Cleanup: Removed the ipkiss 2.4 compatibility layer, including i3.Structure, i3.InOpticalPort, i3.OutOpticalPort, waveguide definitions, ipkiss.plugins.photonics and ipkiss.plugins.electronics. These have been replaced by native ipkiss3 primitives and properties. See Porting from Ipkiss 3.7 to Ipkiss 3.7.1.

### IPKISS Photonics Design Platform 3.7¶

#### IPCORE¶

• Improvement: i3.AliasProperty now has a deprecated attribute which can be used to log a deprecation warning when the property is used.
• Improvement: added repr and str representation of IdStringProperty.
• Removal: The deprecated RestrictedProperty and PropertyDescriptor were removed. If you are still using these, simply replace by i3.DefinitionProperty.
• Removal: The deprecated RestrictedListProperty and ListPropertyDescriptor were removed. If you are still using these, simply replace by i3.ListDefinitionProperty.
• Removal: The internal_member_name argument to all properties was removed, except on SetFunctionProperty which was the only property using it. See Removal internal_member_name for backwards compatibility notes.

#### IPKISS AWG Designer¶

• Bugfix: some flattened AWG instances raised an error when trying to serialise them to a file using pickle.
• Bugfix: the (legacy) RectangularExpandedAWG did not have its expanded sections as close as possible to the 90 degree bends.

#### Documentation¶

• Improvement: Added ShapeWedge, ShapeRadialWedge, and ShapeDodecagon to the IPKISS reference documentation.

### IPKISS Photonics Design Platform 3.6¶

#### IPKISS¶

• Improvement: ipkiss3.all.place_insts() now supports placement and alignment of electrical ports.
• Improvement: the flattening of contents of the splitter/combiner in MZIWaveguides can now be disabled by setting flatten_contents=False as a Layout parameter. This is useful if you’re using devices from a foundry PDK which should not be flattened.
• New Feature: ipkiss3.all.RouteManhattan now has an optional control_points property to force the route to pass through these points
• Improvement: Layout.visualize() now annotates labels (‘i3.Label’) by default. Added ‘labels’ parameter to enable/disable label visualization using True/False.
• Bugfix: ipkiss3.all.get_stub_elements() now limits the length of side of the stub to half of the smallest side, instead of half of the longest side, when limit_stub_length=True.
• Improvement: NumpyArrayProperty also accepts instances of collections.Sequence such as list, tuple and range objects, which are then automatically converted to a numpy array.
• Bugfix: ipkiss3.all.Shape.area() now correctly calculates the area of the shape if the shape is not symmetric around (0, 0).
• Improvement: function shapely_geom_to_shape has moved to ipkiss3.algorithms.shapely_geom_to_shape().
• Improvements in ipkiss3.all.GDSCell:
• Now throws an exception if the GDSII file contains multiple top-level cells but the cell_name parameter was not provided.
• When name is provided but not cell_name and the GDSII file contains 1 top-level cell, that top-level cell will be loaded and (re)named as specified, even if the original name in the GDSII is different.
• Bugfix: i3.route_to_parallel_line miscalculated some routes where the input and output angle deviated with minute amounts. This method is used in i3.RouteToLine.
• New Feature: The i3.Connector base class can be used to create your own connectors. Connectors are used to connect two optical ports with a waveguide using a predefined algorithm.
• Bugfix: The taper_lengths property has been moved from _TaperedWaveguide.Layout to TaperedWaveguide.Layout. TaperedWaveguideBundle.Layout now doesn’t allow setting the taper_lengths property anymore, as it should be.
• Bugfix: i3.TaperedWaveguide and its helper functions now allow setting min_straight_section_length to 0.
• Bugfix: The angle_step property of ipkiss3.all.TaperedWaveguide is now correctly taken into account.
• Bugfix: Facet angles of a bend section in ipkiss3.all.TaperedWaveguide are now correctly set.
• Bugfix: When a hierarchical cell is flattened labels are properly transformed.
##### Caphe¶
• Bugfix: Fixed the model cache to pick up the correct models according to the simulation type. Running frequency and time domain simulations in the same script will now give correct results.

#### IPKISS Link for Dassault Systèmes Simulia¶

• Improvement: the colors defined on IPKISS’ materials are now also applied to the corresponding materials defined in solver_material_map.
• Moved CST Studio Suite macros from Luceda Academy to IPKISS: ipkiss3.all.device_sim.cst_macros:

#### IPKISS AWG Designer¶

• Improvement: the contour calculated by get_star_coupler_extended_contour now also includes the outermost points of the star couplers’ multi apertures on all layers. This will result in changes to the layout of your star couplers.
• Bugfix: get_layout_params_1xM_demux now correctly prints ‘Effective # channels’ when the verbose argument is set to True and unit is set to ‘wavelength’.
• Bugfix: Straight sections are added to both sides of the fanout in every waveguide array to circumvent snapping issues. The lengths of those sections are technology dependent and by default are set to TECH.WG.SHORT_STRAIGHT. This behavior is more in line to how the AWGs were drawn in IPKISS < 3.5, but will result in changes to the layout of your AWGs.
• Improvement: For each waveguide array fanout route properties can be controlled with the fanout_route_properties parameter in its LayoutView.

### IPKISS Photonics Design Platform 3.5¶

The IPKISS AWG Designer module (formerly known as Filter Toolbox - AWG Designer) has been integrated as a part of the IPKISS Photonics Design Platform. Upon installing IPKISS, you can now use the awg_designer module (it still requires a valid license).

#### Ipkiss¶

• New Feature: i3.device_sim.camfr_mode_fields and i3.device_sim.camfr_guided_modes can be used to calculate and debug the neff indices of material stacks.
• New Feature: Added i3.TaperedWaveguide and i3.TaperedWaveguideTemplate to Ipkiss.
• New Feature: i3.device_sim.camfr_compute_stack_neff is added for convenient calculation of a MaterialStack effective index.
• New Feature: MaterialStack.visualize method can be used to plot the material stack.
• New Feature: MaterialStack.clip_copy creates a new material stack by limiting or extending the current one.
• New Feature: i3.get_stub_elements to get the elements that need to be added and subtracted, to remove acute angles in a layout.
• New Feature: Stub the acute angles of a Layout for given layers with i3.stub_acute_angles.
• New Feature: Acute angle detection function i3.get_acute_angle_points for layouts.
• New Feature: Get all the elements in a layout for given layers with i3.get_layer_elements.
• Improvement: Improved shape cutting algorithm for turning a Shapely geometry in to an Ipkiss i3.Shape, in both speed and result.
• Improvement: i3.merge_elements added for convenient merge of elements on the same layer.
• Improvement: i3.device_sim.camfr_stack_expr_for_structure now works with dispersive materials. This requires a mapping of each MaterialStack used in the virtual fabrication to an effective material. This overrides the previous use of the effective_index_epsilon.
• Improvement: In i3.device_sim.camfr_stack_expr_for_structure rectangular shapes are now represented exactly. In other cases the discretisation is controlled with the discretisation_resolution parameter, while ensuring that the discretised structure respects the structure symmetry.
• Improvement: i3.subtract_elements added for convenient subtraction of elements on the same layer.
• Improvement: i3.IoColumn.add_blocktitle() did not follow hierarchical naming by default, which could sometimes result in name conflicts when combining multiple GDS files. Users can now also give a custom name to the TitleBlock.
• Bugfix: In layout view of PlaceAndAutoRoute ‘waveguide_shapes’ and ‘waveguides’ lengths are verified to be the same.
• Bugfix: route_to_line gave wrong results in some edge cases.
• Bugfix: Creating a new MaterialStackFactory object did not reset class attributes. This could result in problems after using visualize_2d.
• Deprecation: legacy Caphe models, deprecated since Ipkiss 3.1.3, are removed. CapheSModelView, CapheTModelView, CapheModelFromSMatrix were removed. Refer to Circuit models: Basics and Circuit models: Advanced for defining simulation models and Circuit models based on S-parameter data for how to create models from existing S-parameter data.
• Deprecation: ExpandedWaveguide and ExpandedWaveguideTemplate have been deprecated in favor of TaperedWaveguide and TaperedWaveguideTemplate.

#### Picazzo¶

• Improvement: the deprecated Caphe models and CapheModel views were removed from all picazzo components. Please use the CircuitModel view instead.
• Improvement: WaveguideReflector has a valid circuit model, using a BSpline fit of the effective indices of the waveguides
• Bugfix: unused coupler_straights property has been removed from RingRectWrappedNotchFilter, RingRectWrapped180DropFilter, RingRectSBendNotchFilter and RingRectSBend180DropFilter

#### Documentation¶

• Improvement: the netlist extraction, spiral with tapered waveguides and diskresonator example have been retargeted to the technologies.silicon_photonics technology so they can be run with no external dependencies.
• Removed: The examples of a CWDM filter, athermal mzi, Archimedan Spiral, MZI Lattice and Variability Analysis have been removed.
• Reorganized documentation: IPKISS.eda and AWG Designer are organized under the Modules section.

#### IPKISS AWG Designer¶

The IPKISS AWG Designer is integrated as a module inside Ipkiss. Check out the IPKISS AWG Designer documentation.

• Change: the module filter_tb has been renamed to awg_designer. The API of filter_tb has been largely unchanged and kept backward compatible, although some patterns are deprecated in favor of a simpler approach to building AWGs. For more information see the Porting Guide.
• Change: the ArrayedWaveguideGrating class behavior changed: it doesn’t define the transformations of the star couplers, instead you can provide the input star coupler, output star coupler, a waveguide array, and the AWG will make sure they are properly connected. This makes it simpler to compose AWGs and define new waveguide arrays. The old AWG class is still available as LegacyArrayedWaveguideGrating for users that created their own AWG classes. Please check the Porting Guide for more information.
• Improvement: camfr_aperture_simulation tries to compute an effective index of each stack automatically.
• Improvement: material_stack_to_material_map and core_z_window are added as properties of aperture view FieldModelFromCamfr. Former allows providing a desired mapping between MaterialStacks and a set of Material models. Latter gives an optional range over which the automatic computation of the effective indices is performed (see above).
• Bugfix: multipass simulation in the slab engine was disfunctional (n_o_passes parameter not taken into account).
• Bugfix: conversion between wavelength and frequency spacings was off for wide wavelength bands
• Bugfix: FSR specified in wavelength was not taken into account properly in awg_designer.all.get_layout_params_1xM_demux_um(), which was noticeable over wide wavelength bands.
• Improvement: it is now possible to specify the virtual fabrication process flow to use in awg_designer.slabsim_integration.aperture.OpenAperture.FieldModelFromCamfr.
• Improvement: awg_designer.sample_designs.awg.demux1xM.awg_1xm.get_apertures_with_dummies() can now be used to generate the list of apertures together with dummy apertures for matching. This can be used to create custom AWG layout algorithms.
• Bugfix: When specified the R_input parameter is now properly passed to the input star couplers
• Removed: the delta_wavelength and delta_frequency functions have been removed as approximations during conversion can lead to hard to track design errors.
• Improvement: generate the list of apertures together with dummy apertures for matching along with their angles with awg_designer.all.get_apertures_angles_with_dummies().
• Improvement: get the MultiApertures and the individual transformations for the apertures needed to make a StarCoupler with awg_designer.all.get_star_coupler_apertures().
• New Feature: get the free propagation region contour shape which fits the slab area that can be extended along the aperture circles with awg_designer.all.get_star_coupler_extended_contour(). This method is an improved version of the original get_hull_shape.
• New Feature: fanout algorithm for routing a selection of ports to a desired place.
• New Feature: awg_designer.all.ArrayedWaveguideGrating for composing AWG that consist of 2 starcouplers and a waveguide array.
• New Feature: awg_designer.all.RectangularWaveguideArray for creating a U-Shaped Rectangular Waveguide Array that can be used to compose an AWG with ArrayedWaveguideGrating.
• New Feature: awg_designer.all.SWaveguideArray for creating a S-Shaped Waveguide Array that can be used to compose an AWG with ArrayedWaveguideGrating.
• New Feature: awg_designer.all.RectangularTaperedWaveguideArray for creating a U-shaped rectangular waveguide array with a different trace template in the straight sections. Can be used with ArrayedWaveguideGrating to create an AWG.

## Previous IPKISS versions¶

### Ipkiss 3.4.1¶

#### Ipkiss¶

• Bugfix: The cover layer of a curved TraceBundle could give strange shapes when the traces of the trace bundle are not aligned and parallel.

#### Ipkiss.eda¶

• New Feature: A possibility to quickly join the net connected instances. The netlist can be defined in S-Edit and exported via Publish to SDL, or defined in a separate Spice file. Macro is triggered via ‘Luceda -> SDL -> Join’ and can be used with L-Edit >= 2020.3.
• Bugfix: Ports of array instances can now be connected

#### Documentation¶

• Clarified that the results returned from a time-domain simulation (CircuitModelView.get_time_response()) also contains the signals of the Excitations in the circuit.

### Ipkiss 3.4¶

#### Installation¶

• During the installation of IPKISS, the installer sets the LUCEDA_PYEVAL environment variable (default option = on). For more info, check IPKISS environment variables.

#### Ipkiss¶

• New function: i3.polyval(coefficients, x_array) implements a fast polynomial evaluation which can take both discrete numbers as well as 1D or multidimensional arrays as input. This function can be used inside i3.CompactModel, see Polynomial dependent variables and coefficients.
• Improvement: GDSCell now has a layer_map attribute, this allows you to specify a custom GDS input layer map.
• Improvement: The cover layer of a TraceBundle no longer has zero-width spikes (present in some cases), which caused some DRC checkers to crash.
• Improvement: When IPKISS is imported, matplotlib is no longer loaded, improving the IPKISS import time. Matplotlib is now only imported when necessary.
• Improvement: Updated matplotlib 1.5.3 to 2.2.3.
• Improvement: There is no longer an exponential increase in time with increasing number of PCells stored in i3.Library.
• Improvement: IPKISS 3.4 is now compatible with Ansys Lumerical 2020 and later.
• Improvement: GDSCell: better error message in case a certain cell is not found in the GDS.
• Improvement: Properties which are defined on a PCell and are locked (locked=True), are now also locked on views (LayoutView, NetlistView, …).
• Bugfix: Magnification now takes magnification_center into account.
• Bugfix: The heuristic for calculating the default height of a port-monitor is now only invoked when this information is not specified.
• Bugfix: CST Studio Suite ® exporter: z_max of the simulation bounding box is now correctly used.
• Bugfix: i3.device_sim.CSTTDSimulation and i3.device_sim.LumericalFDTDSimulation objects could not be reloaded after pickling to a file.
• Bugfix: Shape.encloses() would sometimes give the wrong answer if the points of the shape were defined counterclockwise and inclusion was set to True.
• Bugfix: BSplineSModel.from_smatrix() can now handle S-parameter sweeps with multimode terms.
• Bugfix: BoundaryCutFilter (used in the GDSII output of most PDKs) did not preserve the transformation of the Boundary being cut
• Bugfix: place_insts can now Join and Align ports with names equal to the instances they connect and align to.
• Bugfix: place_insts will now correctly honor the specs in more complex situations.
• Bugfix: i3.NetlistFromLayout: unconnected ports will no longer be extracted in the netlist. A warning is given when unconnected ports are present.
• Bugfix: SplineRoundingAlgorithm will no longer give an error when pickled. This means it can now be used from IPKISS.eda enabled applications such as L-Edit.
• Change: ‘created’, ‘modified’ and ‘comment’ were removed as Properties on i3.PCell, but are kept as object attributes on LayoutViews imported from GDSII. The time of writing to GDSII is now used as timestamp by default, rather than the time of instantiating the Python PCell object. See Timestamps: created, modified for further information.
• Change: The ‘unit’, ‘grid’, ‘grids_per_unit’, ‘units_per_grid’ properties of LayoutView are now locked to the TECH settings. These were rarely used. If you need a custom unit and/or grid for a specific LayoutView, you can still override its _default_unit and/or _default_grid methods.
• Removed the defunct ‘genericpdk’ package.

#### Ipkiss.eda¶

• Significant improvements in performance and stability. More specifically:
• The startup time of IPKISS inside an EDA tool is significantly reduced.
• No timeouts occur when instantiating large parametric designs.
• Waveguide generation is faster and more responsive.
• L-Edit can be launched directly from the start menu, it doesn’t have to be launched through the Luceda Control Center.
• Several synchronization issues when saving a design in L-Edit have been fixed.
• Improvement: Waveguide routes are now defined as functions that take start_port, end_port and shape as input, and return a (shape, waveguide) tuple. It’s now also documented how to add them to the technology: Routing settings.
• Improvement: A Tanner exporter has been introduced in the <pdkname>.cfg file. This exporter specifies that you want to use the autoload.tanner which loads the IPKISS.eda macros in L-Edit. If you want to make a custom autoload.tanner you must use the files exporter to copy it to the right location (<pdkname>/openaccess/<pdkname>/autoload.tanner) and not use the Tanner exporter in the <pdkname>.cfg file.
• Improvement: A daily rotating log file is now used. The location of the log files is by default in %APPDATA%\luceda\logs on Windows and $HOME\.luceda\logs on Linux. • Change: The location of the log files can now be overridden using the LUCEDA_LOG_DIR environment variable. LUCEDA_IPKISSEDA_LOGFILE is not used anymore. • Bugfix: The library name as defined in libs.def does not have to be the same name as the IPKISS library to import. • Bugfix: A custom technology location (other than pdkname/technology) is now supported in the lib.yml Contents File generated by IPKISS.eda, when specified in the <pdkname>.cfg Config File. As a result, a custom technology location can now effectively be used. • Bugfix: Extra files can now be copied to the exported OpenAccess database using the files exporter in the <pdkname>.cfg file. This is useful for copying tool-specific settings data or scripts which need to be in the same location as the OA data. Previously there was an interaction which caused lib.defs not to be generated. This has been fixed. • Change in L-Edit: Waveguide instance naming has changed, they are now called wg0, wg1, … This does not have an effect on generated GDS files, only on the instance names inside L-Edit. #### Documentation¶ #### Backward compatibility notes¶ • IPKISS.eda: the following combinations are valid: • PDKs built with IPKISS <= 3.3 can be used with L-Edit <= 2018. • PDKs built with IPKISS >= 3.4 can be used with L-Edit >= 2019. • The “Luceda -> Pin propagation” macro will no longer generate nets in the layout. • For PDK developers: waveguide routes for use in EDA tools are now defined as functions. They need to return a (shape, waveguide) tuple. See also Routing settings. • The LUCEDA_IPKISSEDA_LOGFILE environment variable has been deprecated and replaced by LUCEDA_LOG_DIR. A daily rotating file log is now used, and the LUCEDA_LOG_DIR environment variable now controls the directory where the logs should be stored. When not set, %APPDATA%\luceda\logs (typically C:\users\yourusername\AppData\Roaming\luceda\logs) on Windows or $HOME/.luceda/logs on Linux will be used.
• This is the last release to still support old-style CapheModels. Defining old-style models (CircuitModelView) will be disabled in the next IPKISS version. New-style models are easier to create, faster to compile, and more robust. If you haven’t done yet, please check Porting circuit models and user code from Ipkiss 3.1.2 to Ipkiss 3.1.3 on how to convert your models from old style to new style.

### Ipkiss 3.3¶

This release features a new layout placement engine and full optical netlist extraction. The new placement engine is based on the idea that a photonic integrated circuit (PIC) can be described by its instances and a list of specifications (for example, place, join, align, flip). This reduces the need to manually define and reason about layout transformations. Please check out the new layout tutorial and i3.place_insts.

Note

There are a few small changes in Ipkiss behavior, related to improvements or bugfixes in this release:

• NetlistFromLayout: now extracts the full netlist.
• Spirals: due to a layout improvement the exact position where waveguides are cut has changed. The overall shape has not changed.
• Autotransition database: slight change in behavior to make it more intuitive.

#### Documentation¶

• Various small inaccuracies throughout the documentation have been fixed, and a new landing page is created.
• The tutorials are reorganized so it’s easier to reach the relevant content for beginning users.
• API reference is extended in several locations.
• More technology-related documentation. In particular, we documented the required TECH keys that are required when creating your own PDK.
• New sample gallery.
• New layout tutorial.

#### Ipkiss¶

• New feature: i3.place_insts, and the following specifications: i3.Place, i3.Join, i3.AlignV, i3.AlignH, i3.FlipV, i3.FlipH.
• New feature: i3.NetlistFromLayout now extracts the full optical netlist from layout.
• New feature: i3.extract_terms can be used to create netlist terms corresponding to layout ports.
• Improvement: RouteManhattan now properly generates routes ports that are spaced closer than the sum of the end and start straight.
• Improvement: Instance names can now contain the < and > characters (used to expanding instance arrays). Other EDA tools usually support these characters, too.
• Improvement: An empty SizeInfo() (east=None, west=None, south=None, north=None) now has a valid string representation.
• Improvement: a flat copy of a full layout view can now be made with LayoutView.flat_copy(). In this way it becomes easier to export a flat version of a layout.
• Improvement: the performance of the export of shapes to GDS has been optimized.
• Improvement: defaults created for the port size when exporting to a device simulator, will now always fall within the bounds of the defined material.
• Improvement: the layoutviews of waveguide templates now have an is_match() method to check that 2 templates have matching layout.
• Bugfix: Layout.flatten() now takes all instances into account (previously only those inside elements where flattened.
• Bugfix: SRef.flat_copy(), ARef.flat_copy() and MRef.flat_copy() can now correctly flatten with limited depth (levels!=-1), avoiding instance name conflicts.
• Bugfix: ‘treat_trace_template_as’ on the transition database was not taken into account when calculating the transition between 2 trace templates of the same type. Now the indirection as defined with treat_trace_template_as will take precedence unless there is a specific (exact waveguide template class match) in the database.
• Bugfix: Label.size_info() now returns an empty SizeInfo instead of a point at (0.0, 0.0), and is not taken into account anymore when calculating the SizeInfo of an ElementList, Group or Layout.
• Bugfix: removed an ambiguity in Waveguide which lead to a wrong model being used in case of a custom defined waveguide with multiple circuit models.
• Bugfix: Layout.visualize_3d_x_crossection(x_co) and Layout.visualize_3d_y_crossection(y_co) did not work anymore.
• Bugfix: When flattening (either through flat_copy or with the flatten attribute of SRef/ARef) transformations were not correctly applied in all cases.
• Bugfix: When exporting a device simulation we now ensure that there’s always material present within the specified bounding box.
• Fix: Layout.visualize_3d_vtk(), which is not supported anymore, now raises a proper Exception instead of crashing.
• Bugfix: PathTraceWindow and ExtendedPathTraceWindow could not cope with duplicate points in the centerline shape of the trace.
• Bugfix: ExtendedPathTraceWindow did not use the start_face_angle and end_face_angle properties to extend the path.
• Bugfix: Terms, instances and nets were empty when using _generate_netlist to declare the netlist.
• Improvement: The custom ‘ID property’ was removed on the system fonts. Their identifier in i3.TEXT.FONT can now be obtained from i3.TEXT.FONT.get_id(font).
• Bugfix: convert_smatrix_units now supports SMatrix1DSweep objects with ‘wavelengths’ (instead of ‘wavelength’) as sweep_parameter_name and with a list (instead of a numpy array) as sweep_parameter_values. As a result, BSplineModel.from_smatrix() can now be used on smatrix results generated by Caphe.
• Improvement: Updated the heuristic to find the installation folder of the latest version of Lumerical.
• Improvement: When doing a circuit simulation, the netlist is now validated to ensure there are no unconnected terms, duplicate nets or terms with multiple links. To disable the validation set the validate_netlist keyword argument to False in get_smatrix and get_time_response (see also i3.CircuitModelView).

#### Picazzo¶

• Bugfix: The length of the transitions of connectors could not be set to 0.
• Bugfix: In MZIWithCells, the extra_length property was not taken into account in certain cases.
• Bugfix: WgYSplitter and WgYCombiner could not have a bend radius smaller than half the cladding width.
• Bugfix: In MZIWithCells, the documentation of the extra_length property was wrong (positive values increase the length of the lower arm).
• Bugfix: Spirals SingleSpiral, DoubleSpiral, DoubleSpiralWithInCoupling and FixedLengthSpiral can now be used with an ExpandedWaveguideTemplate and with asymmetric bends (e.g. when using SplineRoundingAlgorithm). Note this will slightly change the layout of the spirals: the waveguides are cut in a different position.
• Bugfix: TemplatedPhaseShifterWaveguide could not be instantiated without overriding its template property.
• Bugfix: FixedLengthSpiralRounded will now correctly pass angle_step to traces.

#### Ipkiss.eda¶

• Bugfix: when the environment variables contained unicode strings, evaluation of PCells failed.
• Bugfix: Rib waveguide transitions couldn’t be instantiated in demolib because of missing tech keys.
• Bugfix: The position of a Label was incorrectly transformed when exporting to OpenAccess.
• Bugfix: Reduce runtime dependencies of Ipkiss.eda to fix some DLL conflicts which could cause L-Edit to malfunction.

### Ipkiss 3.2.1¶

This is a small bugfix release.

#### General¶

• Small documentation and sample fixes.

#### Ipkiss¶

• Material visualization opacity (display style’s alpha attribute) is now taken into account when exporting devices to Lumerical FDTD and CST Studio Suite ®.
• Material visualization opacity of air and silicon dioxide in silicon_photonics technology changed.
• The visualize_2d() method of a Layout view now accepts a process_flow argument instead to specify the virtual fabrication process flow. Specifying vfabrication_process_flow will still work but process_flow will take preference if specified.

#### Documentation¶

• The technology guide was updated to reflect the changes in 3.2, which added the process_layer_map property on VFabricationProcessFlow and removed the implicit assumptions about mask and process layers in the definition of the virtual fabrication:
• The corresponding drawn layer does not need to be a PPLayer anymore
• A PPLayer used as drawn layer does not need to have the same name as the process layer anymore
• A PPLayer used as drawn layer does not need to have the .ALL attribute anymore to specify the final mask layer. Now any layer or boolean operation between layers can be specified directly in process_layer_map.

### Ipkiss 3.2¶

The main feature of this release is the automated 3D virtual fabrication and link from IPKISS to physical device simulation tools. Support for CST Studio Suite ® (part of the Simulia product by Dassault Systems) and FDTD Solutions (from Lumerical) is built-in, i.e., users don’t need to install any additional packages. It also introduces generation of circuit models based on S-matrix data (simulation or measurement-based).

Get started here: physical device simulation, and here: models from S-parameters.

Note

In this release we fixed two small layout bugs that may affect layout generation:

• ShapeArc
• route_to_parallel_line

Please check the layout changes in 3.2.0 for more details, or the changelog below.

#### General¶

• Added the joblib package. Amongst others this package makes it easy to save and load data to file with support for large (numpy) matrices and file compression. See e.g. Loading S-matrices from a binary file.

#### Ipkiss¶

• New feature: physical device simulation link with CST Studio Suite ® (part of the Simulia product by Dassault Systems) and FDTD Solutions (from Lumerical). Tutorial link: physical device simulation.
• New feature: Layers can now be subtracted from each other (Layer1 - Layer2) to form new generated layers (e.g. for virtual fabrication definition).
• New feature: VFabricationProcessFlow has a new property process_layer_map which can be used to explicitly map process layers to generated mask layers.
• New feature: Support for reading S-parameters from/to Touchstone files (Touchstone version 1). Use i3.circuit_sim.SMatrix1DSweep.from_touchstone.
• New feature: i3.circuit_sim.SMatrix1DSweep now has a passivity and reciprocity check.
• Improvement: The virtual fabrication does not depend on the undocumented ‘ALL’ property of ProcessPurposeLayers. For backwards compatibility reasons, if ‘ALL’ is present it will be used for constructing the process_layer_map property of VFabricationProcessFlow. As a result, it has become easier to write virtual fabrication process definitions which are independent of the TECH tree.
• Improvement: Added support for importing GDSII properties, silently ignoring them. As a result Ipkiss now has improved compatibility with GDSII files exported from certain 3rd party tools.
• Improvement: Port labels are now properly visualized when they fall at the edge of the layout.
• Improvement: Ipkiss is now able to read and work with GDSII files that contain PCell context from KLayout.
• Improvement: Ipkiss can now merge multiple GDS files that have identical PDK cells, these cells are now identified and reused without renaming them with a prefix.
• Bugfix: SizeInfo.expand_to_grid() works again.
• Bugfix: the .visualize() method of a LayoutView now correctly accepts the canvas_size argument when no box argument is specified.
• Bugfix: In ShapeArc: if end_angle < start_angle, and the angle difference is not a multiple of angle_step, the final calculated path did not perfectly cover the full arc. The bugfix results in a slightly different calculation of curves which could cause a small numeric deviation in your designs drawn in a previous version of Ipkiss. Please check if your designs still behave correctly.
• Bugfix: ShapeRoundAdiabaticSpline could not cope with straight angles.
• Bugfix: route_to_parallel_line: the maximum s-bend angle (max_s_bend_angle) was never used to route between two parallel lines - a slightly smaller value was erroneously used instead. The bugfix results in a slightly different calculation of routes. Please check if your designs still behave correctly.
• Bugfix: In ElectricalWireTraceTemplate, the width of the wire is no longer hard-coded, it can now be chosen.
• Bugfix: If 2 MaterialStacks have a common base but a different number of layers, they are not considered equal anymore.
• Bugfix: Boolean operations between a Boundary and a Path or between two Paths yielded the wrong result.
• Bugfix: Virtual fabrication could generate sub-grid slivers for certain complex layouts, e.g. in AWG star couplers.

#### Ipcore¶

• Improvement: Documentation generation: correctly identify required/optional/locked properties. They are ordered: first required properties, then optional ones, then locked ones.

#### Luceda control center¶

• Launching of PyCharm uses the default IDE settings. This results in more predictable behavior: PyCharm will behave the same, whether started from the control center, or from another location (start menu/terminal/…). Users will need to set up the IPKISS Python interpreter so PyCharm can find it. Once set up it can be made available for all projects. See setting up a Python editor.

#### Ipkiss.eda¶

• Bugfix: A StringProperty with a RestrictValueList restriction can now correctly be used in IPKISS.eda (OpenAccess and L-Edit).
• Improvement: The L-Edit launch script has been improved, to make it more reliable.

#### Documentation¶

• New: Tutorial on physical device simulation.
• New: Tutorial on circuit model generation from existing S-parameter data.
• New: Guide on boolean operations.
• General cleanup.

### Ipkiss 3.1.3¶

This release features an updated syntax and backend for defining circuit simulation models for simulation with our circuit simulator Caphe. Get started here: circuit model tutorial. For more details check the Caphe section below.

Note

This release is fully compatible with Ipkiss 3.1.2, with two small exceptions:

• the straight_extension property on transitions between different types of waveguides was previously not correctly handled.
• waveguide lengths are now taken directly from the layout without having to set the view to ‘CapheModelFromLayout’.

Please check the known backwards incompatibilities in 3.1.3.

#### General¶

• The Luceda Control Center has been refreshed, and includes a PyCharm launcher. The PyCharm IDE (Python editor) is used for setting up design projects and writing IPKISS code.
• PyCharm IDE support: when launched from the Luceda Control Center, the IPKISS / Python interpreter is set up for the user. For more info, please follow the PyCharm tutorial.
• Samples: The samples are now by default installed in the folder <USER_HOME>/luceda/samples/ipkiss_version. PyCharm suggests new projects to be created in the <USER_HOME>/luceda/projects folder.
• Samples: demolib contains a list of compact models, as an illustration for the new features in Ipkiss 3.1.3.
• Doc: several improvements in the reference / API documentation.

#### Ipcore¶

• Bugfix in documentation generation: running compile_doc twice caused the doc to contain two sections of ‘Parameters’. With the latest numpydoc this is not allowed.

#### Ipkiss¶

• Improvement: Path elements with a variable extension are now supported and read from or written to GDSII: e.g. Path(…, path_type=PATH_TYPE.VARIABLE, extension=(1.0, 2.0)).
• Improvement for Label elements exported to and imported from GDSII, for better interoperability with third party tools.
• Before, Ipkiss exported and imported Label elements to GDSII TEXT elements with ‘texttype’ (layer datatype) fixed to 0. This works fine when only using Ipkiss but could give problems when combining multiple tools.
• The GDSII layer datatype is now preserved during export and import of Label elements to GDSII file TEXT elements.
• Label element height is now handled identically during GDSII export and import: specified as a magnification on the GDSII TEXT element. Note that not all third party tools support this, since this is just an interpretation of GDSII.
• Bugfix: the straight_extension property of ShapeWindowTraceTransition is now reversed if the start and end trace templates are reversed, so the first value always refers to the start point and the second value to the end point.
• Bugfix: GDSII STRCLASS records (used by Calma/Cadence only) are now ignored without raising an exception.
• Improvement: in GDSCell it is now possible to ignore undefined layers in the technology’s import layer map. This is controlled with the ignore_undefined_layers property of GDSCell.Layout.
• Bugfix: TraceTransitionFromPort wrongly swapped the trace templates of the input and output port if reverse_templates=True
• Bugfix: you can now properly compare pplayers, for example, if my_layer is TECH.PPLAYER.WG.CORE (this was previously not possible as layers could be created twice when the tech is not fully setup).
• Explicitly set edgecolor during visualization of layout primitives. This fixes layout visualization for recent versions of matplotlib.
• Improvement: pysics.basics.environment.Environment is now available from ipkiss3.all.
• Improvement: ConnectComponents can now be imported with a minimal technology tree. It’s now also available from ipkiss3.all.
• Internal refactoring: CapheModelInstance is removed in favor of ModelInstance. ModelInstance can refer both to a CircuitModelView and to a CircuitModelView.
• Waveguide models by default take their length from the layout.

#### Caphe¶

• Strongly improved syntax for defining compact models. See the circuit model tutorial to get started.
• Proper multimode support. See also the tutorial on how to define multimode models.
• We use the numba package for compilation of new style models. As a result, model compilation is much faster and robust, it accelerates a subset of Python and Numpy.
• The simulation and model syntax are better separated from the simulation engine. This results in improved maintenance, robustness and performance.
• Debug mode for debugging compact models interactively.
• Better exception handling, causing no crashes when interrupting a simulation.
• Reduced message verbosity when compiling models.
• Backward compatibility has been ensured as much as possible, allowing for an easy transition from the old to the new style models. See also porting from 3.1.2 to 3.1.3.

#### Picazzo¶

• Bugfix: the straight_extension parameter of the transitions between different trace templates (WireWaveguideTemplate->RibWaveguideTemplate, WireWaveguideTemplate->SocketWaveguideTemplate, WireWaveguideTemplate->ThinnedWireWaveguideTemplate) is now reversed if the trace templates were specified in reverse order.
• Bugfix: the straight_extension parameter was not taken into account in SlottedWireWaveguideTransitionLinear and SlottedWireWaveguideTransitionLinearFromPort.
• Bugfix: The width property trace templates that refer to other templates raised an exception.
• Bugfix: PlaceAndConnect can now correctly identify broken links in circuits with links between electrical ports
• Bugfix: in the containers that add rounded waveguides (FanoutPorts, RoutePortsEastWest, RoutePortsAroundCorner): the angle_step is now applied to the generated waveguides correctly, instead of defaulting to the technology value.
• The bugfix on TraceTransitionFromPort (see above) corrects the ports of WireRibWaveguideTransitionFromPortLinear, WireRibWireWaveguideTransitionFromPortLinear, SlottedWireWaveguideTransitionFromPortLinear, WireSocketWaveguideTransitionFromPortLinear, ThinnedWireWireWaveguideTransitionFromPortLinear.
• Remove absolute imports throughout picazzo, which caused some user code to fail if it has similar named Python files (cell.py).

#### Ipkiss.eda¶

• Improvement: A PDK is now allowed more fine-grained control over the way waveguides are generated inside the EDA tool (triggered when using the ‘generate all waveguides’ macro). The existing TECH.ROUTING.WAVEGUIDE_GENERATION_GUIDE_LAYERS (typically in the ipkiss/pdk_name/technology/routing.py part of the PDK) now accepts a {layer: (routing_fn, wg_generation_fn)} item. layer is the IPKISS layer used for drawing the waveguide control shape. routing_fn is a function that transforms a start + end port into a shape, and wg_generation_fn returns an IPKISS layout view based on the shape (either calculated using the routing_fn, or manually drawn by the user on the waveguide control shape layer).
• Bugfix (regression between 3.1.1 and 3.1.2): Label elements could not be exported anymore to OpenAccess.
• Bugfix: openaccess libraries that refer to a technology now always load the technologies in the correct order. Previously, this could lead to problems when working with multiple open libraries, where pcell evaluation / waveguide generation would fail.
• Improvement: Spaces and parentheses are filtered from Ipkiss color names upon export to display.drf files. Colors and stipples are now sorted by name.
• Improvement: Waveguide routing layers (TECH.ROUTING.WAVEGUIDE_GENERATION_GUIDE_LAYERS) can now use reserved purposes (DRAWING, …)

### Ipkiss 3.1.2¶

This is a minor release featuring bugfixes and small improvements.

Note

This release is fully compatible with Ipkiss 3.1.1, with one small exception: previously one could override a ChildCellProperty in a derived class with a LockedProperty, now this is not possible anymore; instead it will raise an exception. Please check the known backwards incompatibilities in 3.1.2. Upgrading is recommended.

#### Installation & Getting Started¶

• Most of the packages that are bundled with IPKISS have received small updates. Ipkiss now ships with numpy 1.11.3 and scipy 0.19. One major update is conda (the package manager used to install / update packages), which is now version 4.3.
• When configuring your code editor, you’re no longer required to set the ‘PATH’ environment variable.

#### Ipcore¶

• Many improvements and bugfixes to the internal caching. These also result in an average performance increase of 25% in Ipkiss.

#### Ipkiss¶

• Bugfix: equality check of Library objects (Library.__eq__ operator, e.g. lib1==lib2) is fixed.
• Bugfix: missing imports for compiled ShapeWaveguideTransition.CapheModel (numpy exp and pi).
• Bugfix: SizeInfo.snap_to_grid contained dysfunctional code, raising an exception.
• Bugfix: importing ipkiss no longer modifies PYTHONPATH (it removed the string ‘.’, which changes the behavior of scripts which rely on packages / modules being present in the current working directory).
• Improvement: snap the virtual fabrication canvas to the technology grid, to avoid small slivers at the edge of the simulation window.
• Improvement: GDSCell is now available in ipkiss3.all and does not need to be imported separately anymore.
• Bugfix: virtual fabrication: fix error message when a material stack cannot be found.
• Bugfix: Boundaries with coincidal edges can now be virtually fabricated.
• Bugfix: MRef.size_info was dysfunctional (using SizeInfo without importing it).
• Improvement: visualizations no longer specify the matplotlib figure number, this enables the use of %matplotlib notebook magic in notebooks and using matplotlib interactive mode.
• Improvement: not operation on layers is now supported in virtual fabrication.

#### Pysics¶

• Bugfix: MaterialStackGeometry2D.consolidate() was dysfunctional (typo fixed).

#### Picazzo¶

• Bugfix: ThinnedWireWireWaveguideTransitionLinear was not always using the correct start trace template.
• Bugfix: Ring resonators could raise a validation error even if a valid value was specified for coupler_spacings.

#### Ipkiss.eda¶

• Bugfix: The transformation of Group and PolygonText elements is now taken into account when exporting to OpenAccess.
• Bugfix: The transformation of a Path element is now taken into account when exporting to OpenAccess.

#### Ipkiss 2.4 Compatibility¶

• Bugfix: technologies.compat24.picazzo24 could not be imported if a technology already contained TECH.PURPOSE.NO_FILL.

#### Documentation¶

• Added a guide on waveguides, which explains the basic concept and how to use them.
• Added examples for ChildCellProperty and ChildCellListProperty.

### Ipkiss 3.1.1¶

This is a minor release featuring bugfixes and small improvements.

#### Ipkiss¶

• New feature: shapes for performing spline fitting of a control shape: ShapeFitClampedCubicSpline and ShapeFitClampedCubicSpline. See Spline Shapes.
• Improvement: extra type check when adding transitions to an AutoTransitionDatabase.
• Improvement: You can now label ports in the visualization of the Layout. The Layout visualize method has a new keyword annotate (default: False).
• Improvement: AutoTransitionDatabase can now resolve multiple ‘aliases’ of trace templates. This makes it much easier to define customized trace templates that are a variation of existing trace templates. The transitions will be correctly resolved.
• The Layout view of a TraceTemplate now has a method cross_section() which returns a 2D geometry of the waveguide cross section.
• Change: cross section geometries now have a method visualize(). Use this instead of figure_2d().show() (which will still work).
• Bugfix: the interface with the Caphe circuit simulator can now handle electrical ports.
• Bugfix: fixed RadialLine.
• Bugfix: a component with a SMatrixView can now be simulated repeatedly.
• Bugfix: StrongPropertyInitializer objects, and in particular PCells and Views, can now be pickled.
• Bugfix: Views with properties that have a numpy array as value can now be properly compared (view1 == view2).
• Bugfix: When the original shape is an empty shape or a shape with length == 0.0, shape modifiers now return an empty points array instead of raising an exception.
• Improvement: Our packages are now compatible with numpy 1.11, this is now the default numpy shipped with the installer. If you have your own packages that are compiled against an older numpy version, you might have to reinstall a version for numpy 1.11.
• Improvement: The example silicon_photonics technology now uses an improved color scheme for materials (when using visualize_2d).

#### Ipkiss-caphe interface¶

• Bugfix: calculating the S-matrix of circuits containing nonlinear models no longer fails. The result will be the linear contribution of the scattering matrix (i.e., defined by _calculate_S in each CapheModel).
• Bugfix: CapheModelFromSMatrix accidentally reset the view of the associated PCell, resulting in an empty smatrix or an infinite recursion, depending on the model. This no longer happens.
• Bugfix: Testbenches that have no terms in the top-level netlist can now also be converted to a native caphe circuit.

#### Picazzo¶

• Improvement: PlaceAndConnect draws flylines for logical connections that are not properly connected in the layout. Flylines are drawn on the TECH.PPLAYER.ERROR.GENERIC layer.
• Bugfix: thinned waveguide templates (ThinnedWaveguideTemplate) and rib waveguide templates (RibWaveguideTemplate) are correctly identified when using automated transitions such as with AutoTransitionPorts.
• Bugfix: thinned waveguide templates (ThinnedWaveguideTemplate) now correctly interprete and pass along their properties.
• Bugfix: IoFibcoup now raises a proper exception when a fiber coupler without an East Port is used.
• Bugfix: IoFibcoup now handles fiber couplers with multiple waveguide ports (e.g. 2D couplers) correctly.

#### Samples & documentation¶

• Added MMIs to demolib (samples\demo\libraries).
• Docfix: Layout elements like Circle and Rectangle only accept Layer objects for the layer argument, not an integer.

### Ipkiss 3.1.0¶

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.

#### Installation¶

• The installer now works correctly on Windows 10

#### Samples & documentation¶

• New demonstration library (including a technology setup) + associated demonstration projects (samples/demo).
• Small updates to the trainings and samples (samples/ipkiss3/training and samples/ipkiss3/getting_started).
• Improved samples for GDSII import in the documentation (see the sample gallery).
• Sample on how to find cells in a layout which have a label inside (with a given text). See samples/ipkiss3/samples/advanced/label_layers.
• 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.

#### Ipcore¶

• Added the decorator @lock_properties() to make all properties of a StrongPropertyInitializer class read-only. See the PCell guide in the documentation for usage.
• Improvement: RestrictTypeList now has a proper string representation (__str__).
• Improvement: RestrictRange can now handle float values, even when the range bounds were specified as integers.

#### Ipkiss¶

• 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 BoundaryPath element. 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.
• Fix: Net is now available in ipkiss3.all.
• 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 PlaceAndAutoRoute component (which uses Connector) may now have less unnecessary transitions.
• Fix: RouteManhattan will 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.
• Bugfix: ShapeVariableOffset now works properly on simple shapes.
• Bugfix: Boolean operations on Boundary now correctly take a transformation into account.
• Bugfix: Layer filters (LayerFilterAllow, LayerFilterDelete) are fixed. They no longer functioned because the class __LayerElement__ was renamed to _LayerElement.
• Bugfix: Label.size_info() now returns a new empty SizeInfo object (previously, it returned the global EMPTY_SIZE_INFO object).
• 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.
• Bugfix: ElectricalPort is 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 Port, Group, _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.
• Improvement: NameProperty now prints a valid error message when a non-string is assigned.
• Improvement: Transformable and NoDistortTransformable do 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.
• Improvement: ShapeProperty is now a class, rather than a shortcut function. This should normally not introduce any compatibility problems, unless you have used the internal_member_name attribute.
• 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, WgMziGeneric in 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 Waveguide now has a default value. More specifically:
• _TemplatedWaveguide: TECH.PCELLS.WG.DEFAULT.
• TemplatedWindowsOnWaveguide: WindowsOnWaveguideTemplate(trace_template=TECH.PCELLS.WG.DEFAULT).
• [Backward incompatible] Change: environment variable IPKISS_LOG_LEVEL has been renamed to LUCEDA_LOG_LEVEL.

#### Picazzo¶

• All Picazzo components now have sensible default values.
• Added waveguide connectors (picazzo3.wg.connector).
• Added inline waveguide gratings (picazzo3.wg.grating).
• Added a logical inline reflector with a Fresnel reflection model (picazzo3.logical.reflector).
• Added StraightGratingLine for simple grating couplers.
• Fix: MziWithCells now calculates the combiner transformation taking into account tapering, and the transformations for splitters and combiners can also be manually overruled.
• Bugfix: MziWithCells now generates a valid MZI arm when the child cell in the arm is specified through inheritance (as a _default_arm1_contents or _default_arm2_contents method)
• Bugfix: angle_step is now correctly passed in the ring resonators (picazzo.filters.ring), from the ring cell to its constituting waveguides.
• Bugfix: get_ring_length() of RingRect.Layout and derived ring resonators now reports the complete ring length instead of one quarter of the ring
• Bugfix: IoFibcoup can now handle west ports routed to east and vice versa, when port labels ("E0", "W1", …) are used
• Bugfix: Use of predefined columns from genericpdk.library.io.column will now work. There was a syntax error before.
• Bugfix: MMIIdentical now has 3 inputs and 3 outputs by default. There was a circular dependence before.
• Bugfix: RibMMI classes 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 AutoTraceTransitionFromPort now have unique names. As a result names of transitions in your design might have changed.
• Bugfix: RoutePortsAroundCorner now 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 WireWaveguideTransitionFromPortLinear now 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 purpose to 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.LINE for drawing electrical wires, you need to change this default.
• Improvements to PlaceAndAutoRoute:
• Added transitions when ports don’t match the trace template.
• Added automatic detection and highlighting of crossing waveguides using the highlight_waveguide_crossings flag.
• Added the method get_waveguide_crossing_points() on the Layout view.
• Added the possibility to manually override individual waveguide routes
• Added min_straight, start_straight, end_straight properties on the Layout view. These influence the behavior of the routing.
• The links property 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 FanoutPorts on a component where the first ports (the reference port) is at an angle with the output direction, and no reference_coordinate is 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.
• Improvement: RoutePortsAroundCorner will now sort the ports before generating the routes.
• Improvement: StraightWgSocket for fiber couplers is now centered around (0,0), rather than starting at (0,0). By default, it now overlays correctly on a straight grating.
• Improvement: MMI and RibMMI classes now have more sensible defaults for widths and input/output positions.
• Improvement: Generic ring resonators (RingShape and RingTraces) now have a default circular shape instead of an empty shape.
• Improvement: ContactHole and Via12 now use "CONTACT" and "VIA12" as name prefix - therefore autogenerated names will change when the name was not manually set.
• Improvement: PlaceandConnect can now logically connect components with electrical as well as optical terms.
• Improvement: The ParabolicCrossing has no hard-coded layer purposes anymore. These can now be set using the properties core_purpose, strip_purpose, cladding_purpose and strip_cladding_purpose.
• Improvement: The generic TraceChain classes 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 DoubleSpiralWithIncoupling does not extend as far east as it used to be. It default to TECH.WG.SHORT_STRAIGHT.
• Spiral loops are now cut in 2 to avoid self-intersecting polygons on export.

#### Picazzo 2.4¶

• 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.
• Removed InWaveguideHeaterDefinition from picazzo.modulators.window_waveguides.

#### Ipkiss 2.4¶

• Bugfix: the ipkiss.plugins.electronics.port package could not be imported anymore. This is now fixed (for designers that need to run old 2.4 code that uses electronic ports).

#### Pysimul¶

• Small syntax fix in SimulationParameterContainer.

### Ipkiss 3.0.1¶

Changes that introduce a backward incompatibility are explained in more detail in Porting from Ipkiss 3.0 to Ipkiss 3.0.1 .

#### Ipcore¶

• Improved error message when a property is not valid.
• BoolProperty and RESTRICT_BOOL now accept int and numpy booleans (numpy.bool_). BoolProperty now stores its value as a python bool.
• Small, but important change in the behavior of number properties:
• Basic type (bool, int, float, complex) properties (such as BoolProperty, IntProperty, NumberProperty and 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] FloatProperty now accepts integer values (this means now NumberProperty and FloatProperty are 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.
• [Backward incompatible] The set method (or _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.

#### Ipkiss¶

• 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_transform now has a parameter mirrored to 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 GDSCell to import external GDS files has been added (ipkiss3.pcell.gdscell).
• Adding electrical traces and ports (ipkiss3.pcell.wiring).
• 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] PortList now has dict-like methods keys, values and items. This makes it similar in use as TermDict. Use those methods wherever possible to avoid future deprecation.
• Bugfix: Port.invert() did not return an object.
• Bugfix: OutputGdsii, FileOutputGdsii and 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<=69 is converted to 20xx (Y2K handling) - was xx<=70 before, which includes the unix epoch.
• Bugfix in NewlineStringCollector: += did not properly support a list of items (ipkiss.io.collector)

#### Picazzo¶

• [Backward incompatible] All occurences of LayerProperty have been removed on picazzo components - the process and purpose properties 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 silicon_photonics
• 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 silicon_photonics technology files.
• 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 (electrical.contact)
• The Y splitters in picazzo3.wg.splitters now have a Caphe model (transmission + 3 reflection parameters)
• Added TerminatePorts, ExtendPorts, FanoutPorts, TransitionPorts, RoutePortsEastWest, 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.
• Refactored PlaceAndAutoRoute: the functionality has been separated into individual PCells: PlaceComponents, ConnectComponents, and 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, ShallowMMI2x2Tapered is now called RibMMI2x2Tapered.
• Added Mach-Zehnder Interferometers. A set of circuit simulation samples for the picazzo MZIs can be found under samples/ipkiss3/picazzo3/mzi.
• Added Curved Grating Couplers. There are 2 classes (FiberCouplerCurvedGratingGeneric and 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 vertical_in by default.
• 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 (ipkiss3\Waveguide spirals.ipynb)
• Added IOFibCoup adapter, 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.

#### Simulation¶

• 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 IntProperty and NumberProperty, or ensure that a DefinitionProperty of a CapheModel always returns a value of the same type.

#### i-Python notebooks¶

• [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 inline at 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 compat24 technology immediately after you have imported your technology.
• Trace transitions should not be mixed with waveguide tapers from Ipkiss 2.4.

### Ipkiss 3.0¶

Most parts of IPKISS are rewritten in IPKISS 3.0, and new functionality has been added. The most notable changes are summarized below:

#### Functionality¶

• 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).

#### User experience¶

• 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 2.4.6¶

The ipkiss 2.4.6 release is a maintenance release and doesn’t contain any major changes, only bug fixes and small additions.

#### Ipkiss¶

• Bugfix: the size_info of a Label is now SIZE_INFO_EMPTY, since a label has zero size (on the mask).
• Bugfix: Structure.cross_section and Waveguide.cross_section now correctly pass on the process_flow parameter

#### Picazzo¶

• Bugfix: fixed inverted taper fiber couplers
• Improvement: Curved grating couplers now use a different trench abuting to avoid design rule violations

#### Pysimul¶

• Bugfix: Fixed output coordinates in the slab engine. They can now be set different from input coordinates.

### Ipkiss 2.4.5¶

The ipkiss 2.4.5 release is a maintenance release and doesn’t contain any major changes, only bug fixes and small additions.

#### Ipkiss¶

• Bufix: Many classes that accept a float would fail if accepting an integer (for example ipkiss.plugins.photonics.routing.to_line.RouteToEastAtY). This has been fixed by changing FloatProperty to NumberProperty in these classes.
• Improvements to installer for Windows
• New feature: Added support for non-orthogonal flattening in GDSII export
• Bugfix: Parameters are now passed to visualize_3d_povray, and colors in povray file are now fixed
• Bugfix: fixed bug when calling write_gdsii in older versions of ipython
• Bugfix: fixed drc violations for fonts
• Bugfix: Fixed dependence on ENVIRONMENT for electromagnetic and optical materials (broken epsilon & mu)
• Improvement: Crop visualization window when include_growth parameter is used during physical simulations.
• Improvement: ShapeParabolic and ParabolicWedge now accept width_step as a parameter to control the discretisation.
• Improvement: Support for BOX elements in GDSII has been improved.

#### Pysimul¶

• Pysimul: Added option to save MEEP output to a different path.

#### Documentation¶

• Various fixes in samples
• Added meep examples in tutorial_rlmzi.

#### Picazzo¶

• Improvement: WgElBundleWaveguides now automatically detects process layer
• Bugfix in shallow waveguide aperture naming
• Small fixes in modulator.window_waveguides
• Bugfix: Fixed error in triangular lattice photonic crystal when specifying different lattice period values in horizontal and oblique direction
• Cleanups in phc.w1 and phc.hetero
• Minor bugfixes in wg.grating
• Bugfixes in filters.parallel_ring
• Improvement: Tapers in wg.wgdefs now have a tip_width property instead of directly using TECH.TECH.MINIMUM_LINE.
• ImprovementParabolic tapers now have a property width_step to control the discretisation.

#### Spectral_toolbox¶

• AWG waveguide lines (bundles) and hull_inversion for MergedApertures now automatically detect the process used.
• Star coupler now adjusts waveguide definitions and works on the correct process layer. It is even possible to use deep apertures on the ports, and shallow on the arms.
• Allow expanded waveguides with small length.

### Ipkiss 2.4.4¶

The ipkiss 2.4.4 release is only a maintenance release and doesn’t contain any major changes, only bug fixes and small additions.

#### Ipkiss¶

• Bugfix: IoTitleBlock didn’t have a process property, this has been added now.
• Bugfix: Fix in SoftRotationAref.
• Bugfix: Fix the centering of the cross_section method in ipkiss.plugins.vfabrication.cross_section.
• Bugfix: Removed the nxutils dependency for matplotlib versions >= 1.3.0.