Known changes and backwards incompatibilities in 3.8.0

Compact Models

The existing circuit models in IPKISS/Picazzo have been renamed and added to the compact model library (Compact model library). For example, the ipkiss3.pcell.photonics.waveguide.WaveguideModel has been renamed to i3.cml.WG1. The original models still exist but might be removed in a future version.

All models now also express their parameters in SI units(https://en.wikipedia.org/wiki/International_System_of_Units). Prior to this version, center_wavelength and length inputs were expected in micrometer. In this version they are changed to meter. As a result, when defining the relationship between CircuitModels and CompactModels, please provide the inputs in meters for getting the expected results.

In addition to change in units, WG1 model has it’s parameter loss_dB_m renamed to loss to avoid using units in the parameter names. In the python code snippet provided below it can be noticed that center_wavelength and length are multiplied by 1e-6 to convert micrometer to meter and loss_dB_m renamed to loss.

model = WG1(center_wavelength=1.55 * 1e-6,
            length=100. * 1e-6,
            loss=300000.,
            n_g=2.0,
            n_eff=1.0
            )

Other Changes to models include:

WG2:
loss : dB/cm to dB/m center_wavelength : micrometer to meter
DC1:
coupler_length : micrometer to meter
FGC1:
center_wavelength : micrometer to meter

Netlist extraction with array references

Before 3.8.0 there was a bug in the netlist extraction from layout (i3.NetlistFromLayout) when used with array instances (i3.ARef).

For instance, consider the following hypothetical example:

import ipkiss3.all as i3

class Earring(i3.PCell):
    _name_prefix = "EARRING"

    class Layout(i3.LayoutView):
        def _generate_elements(self, elems):
            elems += i3.RelativeBendPath(
                layer=i3.Layer(0),
                radius=10.0,
                start_point=(0.0, 0.0),
                input_angle=270.0,
                angle_amount=340.0,
                line_width=3.0
            )
            return elems

        def _generate_ports(self, ports):
            ports += i3.OpticalPort(name="in", position=(0.0, 0.0), angle=90.0)
            return ports

    class Netlist(i3.NetlistFromLayout):
        pass


class Earrings(i3.PCell):
    n_o_periods = i3.Tuple2Property(default=(1, 2))

    class Layout(i3.LayoutView):
        def _generate_instances(self, insts):
            insts += i3.ARef(reference=Earring(),
                             origin=(0.0, 0.0),
                             period=(30.0, 40.0),
                             n_o_periods=self.n_o_periods,
                             name="ringarray"
                             )
            return insts

        def _generate_ports(self, ports):
            for ndx, port in enumerate(self.instances["ringarray"].ports):
                ports += port.modified_copy(name=port.name + "_" + str(ndx))
            return ports

    class Netlist(i3.NetlistFromLayout):
        pass

# 1xm array - worked correctly before 3.8
earrings1x2 = Earrings(n_o_periods=(1, 2))
earrings1x2_layout = earrings1x2.Layout()
earrings1x2_layout.visualize(annotate=True)
earrings1x2_netlist = earrings1x2.Netlist()
print(earrings1x2_netlist)

# nxm array - gave an incorrect netlist before 3.8
# the ports are wrongly connected, in_2 is double connected and in_5 is missing.
earrings2x3 = Earrings(n_o_periods=(2, 3))
earrings2x3_layout = earrings2x3.Layout()
earrings2x3_layout.visualize(annotate=True)
earrings2x3_netlist = earrings2x3.Netlist()
print(earrings2x3_netlist)

# before 3.8, this gave the following nets:
# nets:
    #    - in_3-ringarray<1><1>:in: <OpticalLink in_3 to ringarray<1><1>:in>
    #    - in_2-ringarray<2><0>:in: <OpticalLink in_2 to ringarray<2><0>:in>
    #    - in_0-ringarray<0><0>:in: <OpticalLink in_0 to ringarray<0><0>:in>
#    - in_4-ringarray<2><1>:in: <OpticalLink in_4 to ringarray<2><1>:in>
    #    - in_2-ringarray<0><1>:in: <OpticalLink in_2 to ringarray<0><1>:in>
    #    - in_1-ringarray<1><0>:in: <OpticalLink in_1 to ringarray<1><0>:in>

# nx1 array - crashed before 3.8
earrings2x1 = Earrings(n_o_periods=(2, 1))
earrings2x1_layout = earrings2x1.Layout()
earrings2x1_layout.visualize(annotate=True)
earrings2x1_netlist = earrings2x1.Netlist()
print(earrings2x1_netlist)
../_images/compatibility380-1_00.png
../_images/compatibility380-1_01.png
../_images/compatibility380-1_02.png