luceda ipkiss教程 15:MZI Lattice Filter 的设计与仿真

马赫曾德干涉仪晶格结构是一种很常见的集成光子滤波器和集成波分复用器结构,通过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()

就可以得到上图仿真结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值