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)