马赫曾德干涉仪晶格结构是一种很常见的集成光子滤波器和集成波分复用器结构,通过ipkiss可以快速设计其版图和线路仿真
MZI Lattice Filter 版图如下:
线路仿真结果:
全部代码如下:
from si_fab import all as pdk
from ipkiss3 import all as i3
import numpy as np
import pylab as plt
class MZI_Lattice(i3.Circuit):
mmi = i3.ChildCellProperty()
mmi_spacing = i3.PositiveNumberProperty(default=210.0)
bend_radius = i3.PositiveNumberProperty(default=50.0)
def _default_mmi(self):
return pdk.SiNDirectionalCouplerSPower(power_fraction=0.5,target_wavelength =1.55)
def _default_insts(self):
insts = {
"mmi_1": self.mmi,
"mmi_2": self.mmi,
"mmi_3": self.mmi,
"mmi_4": self.mmi,
"mmi_5": self.mmi,
}
return insts
def _default_specs(self):
specs = [
i3.Place("mmi_1:out2", (0, 0)),
i3.PlaceRelative("mmi_2:in2", "mmi_1:out2", (self.mmi_spacing, 0)),
i3.PlaceRelative("mmi_3:in2", "mmi_2:out2", (self.mmi_spacing, 0)),
i3.PlaceRelative("mmi_4:in2", "mmi_3:out2", (self.mmi_spacing, 0)),
i3.PlaceRelative("mmi_5:in2", "mmi_4:out2", (self.mmi_spacing, 0)),
i3.ConnectManhattan("mmi_1:out2", "mmi_2:in2",
bend_radius=self.bend_radius,
control_points=[i3.H(i3.START + 750)], ),
i3.ConnectManhattan("mmi_1:out1", "mmi_2:in1",
bend_radius=self.bend_radius,
control_points=[i3.H(i3.START - 130)], ),
i3.ConnectManhattan("mmi_2:out2", "mmi_3:in2",
bend_radius=self.bend_radius,
control_points=[i3.H(i3.START + 740)], ),
i3.ConnectManhattan("mmi_2:out1", "mmi_3:in1",
bend_radius=self.bend_radius,
control_points=[i3.H(i3.START - 130)], ),
i3.ConnectManhattan("mmi_3:out2", "mmi_4:in2",
bend_radius=self.bend_radius,
control_points=[i3.H(i3.START + 120)], ),
i3.ConnectManhattan("mmi_3:out1", "mmi_4:in1",
bend_radius=self.bend_radius,
control_points=[i3.H(i3.START - 720)], ),
i3.ConnectManhattan("mmi_4:out2", "mmi_5:in2",
bend_radius=self.bend_radius,
control_points=[i3.H(i3.START + 120)], ),
i3.ConnectManhattan("mmi_4:out1", "mmi_5:in1",
bend_radius=self.bend_radius,
control_points=[i3.H(i3.START - 710)], ),
]
return specs
def _default_exposed_ports(self):
exposed_ports = {
"mmi_1:in1": "in1",
"mmi_1:in2": "in2",
"mmi_5:out1": "out1",
"mmi_5:out2": "out2",
}
return exposed_ports
if __name__ == '__main__':
demo = MZI_Lattice()
my_circuit = demo.Layout()
my_circuit.visualize(annotate=False,legacy=True)
my_circuit.write_gdsii("MZI_Lattice.gds")
wavelengths = np.linspace(1.54, 1.545, 1001)
cm = demo.CircuitModel()
S = cm.get_smatrix(wavelengths=wavelengths)
plt.plot(wavelengths, i3.signal_power_dB(S["out1", "in1"]), label="out1")
plt.legend()
plt.xlabel("Wavelengths [um]")
plt.ylabel("Output optical transmission")
plt.show()
整个线路就用到了5个方向耦合器:
pdk.SiNDirectionalCouplerSPower(power_fraction=0.5,target_wavelength =1.55)
线路设计的关键是连接方向耦合器之间的波导,在ipkiss中可以通过control_points来实现波导的路由,比如:
i3.ConnectManhattan("mmi_1:out2", "mmi_2:in2",
bend_radius=self.bend_radius,
control_points=[i3.H(i3.START + 750)], ),
i3.ConnectManhattan("mmi_1:out1", "mmi_2:in1",
bend_radius=self.bend_radius,
control_points=[i3.H(i3.START - 130)], ),
i3.H(i3.START + 750)
表示控制线路延水平方向(i3.H)相对开始端口(i3.START)偏移750(单位默认微米)
这里的开始端口就是:“mmi_1:out2”
如果垂直方向则用i3.V
根据:
cm = demo.CircuitModel()
S = cm.get_smatrix(wavelengths=wavelengths)
plt.plot(wavelengths, i3.signal_power_dB(S["out1", "in1"]), label="out1")
plt.legend()
plt.xlabel("Wavelengths [um]")
plt.ylabel("Output optical transmission")
plt.show()
就可以得到上图仿真结果。