luceda ipkiss教程 2:简单的光子集成线路设计

利用ipkiss的i3.Circuit来设计如下线路:

在这里插入图片描述
一个方向耦合器连接4个光栅耦合器
代码如下:

from si_fab import all as pdk
from ipkiss3 import all as i3


class routed_dc(i3.Circuit):
    _name_prefix = "routed_dc"
    dc = i3.ChildCellProperty(doc="Directional coupler in circuit")
    fgc = i3.ChildCellProperty(doc="PCell of the fiber grating coupler")
    fgc_space_x = i3.PositiveNumberProperty(default=200.0, doc="The spacing of fiber grating coupler in x direction")
    fgc_space_y = i3.PositiveNumberProperty(default=100.0, doc="The spacing of fiber grating coupler in y direction")
    bend_radius = i3.PositiveNumberProperty(default=20, doc="The bend radius of the routing waveguide")

    def _default_dc(self):
        return pdk.SiDirectionalCouplerSPower(power_fraction=0.5, target_wavelength=1.55)

    def _default_fgc(self):
        return pdk.FC_TE_1550()

    def _default_insts(self):
        insts = {
            "dc": self.dc,
            "fgc_1": self.fgc,
            "fgc_2": self.fgc,
            "fgc_3": self.fgc,
            "fgc_4": self.fgc,
        }
        return insts

    def _default_specs(self):
        specs = [
            i3.Place("dc", (0, 0)),
            i3.PlaceRelative("fgc_1", "dc", (-self.fgc_space_x/2, -self.fgc_space_y/2)),
            i3.PlaceRelative("fgc_2", "dc", (-self.fgc_space_x/2, self.fgc_space_y/2)),
            i3.PlaceRelative("fgc_3", "dc", (self.fgc_space_x / 2, -self.fgc_space_y / 2),angle=180),
            i3.PlaceRelative("fgc_4", "dc", (self.fgc_space_x / 2, self.fgc_space_y / 2),angle=180),
            i3.ConnectManhattan("fgc_1:out", "dc:in1", bend_radius=self.bend_radius),
            i3.ConnectManhattan("fgc_2:out", "dc:in2", bend_radius=self.bend_radius),
            i3.ConnectManhattan("fgc_3:out", "dc:out1", bend_radius=self.bend_radius),
            i3.ConnectManhattan("fgc_4:out", "dc:out2", bend_radius=self.bend_radius)
        ]

        return specs

    def _default_exposed_ports(self):
        exposed_ports = {
            "fgc_1:vertical_in": "in1",
            "fgc_2:vertical_in": "in2",
            "fgc_3:vertical_in": "out1",
            "fgc_4:vertical_in": "out2",
        }
        return exposed_ports


if __name__ == '__main__':
    r_dc = routed_dc(bend_radius=20)
    my_circuit = r_dc.Layout()
    my_circuit.visualize(annotate=True)
    my_circuit.write_gdsii("Rounted_dc.gds")

线路设计程序结构如下:

首先导入PDK库和ipkiss函数库,常用的PDK库有si_fab

from si_fab import all as pdk
from ipkiss3 import all as i3

其次是用i3.Circuit来构建一个python class,class的名称就是线路的名称

class routed_dc(i3.Circuit):

线路设计主要分为4步:
1、定义线路的属性
2、线路中的器件
3、器件的放置与连接
4、端口命名

1、定义线路的属性
线路的属性包含线路中用到的器件类型,以及线路的结构参数,
器件类型: 如这里用到的是方向耦合器pdk.SiDirectionalCouplerSPower 和光栅耦合器 pdk.FC_TE_1550()
结构参数:如光栅耦合器在x方向和y方向上的间距fgc_space_x 和fgc_space_y

    dc = i3.ChildCellProperty(doc="Directional coupler in circuit")
    fgc = i3.ChildCellProperty(doc="PCell of the fiber grating coupler")
    fgc_space_x = i3.PositiveNumberProperty(default=200.0, doc="The spacing of fiber grating coupler in x direction")
    fgc_space_y = i3.PositiveNumberProperty(default=100.0, doc="The spacing of fiber grating coupler in y direction")
    bend_radius = i3.PositiveNumberProperty(default=20, doc="The bend radius of the routing waveguide")

    def _default_dc(self):
        return pdk.SiDirectionalCouplerSPower(power_fraction=0.5, target_wavelength=1.55)

    def _default_fgc(self):
        return pdk.FC_TE_1550()

2、线路中的器件
线路中的器件有:一个方向耦合器和4个光栅耦合器,他们的名称分别为dc、fgc_1、fgc_2、fgc_3、fgc_4

   "dc": self.dc,
   "fgc_1": self.fgc,
   "fgc_2": self.fgc,
   "fgc_3": self.fgc,
   "fgc_4": self.fgc,

3、器件的放置与连接
添加完器件,还需要将器件放置在相应的位置,以及将器件的端口连接起来

def _default_specs(self):
        specs = [
            i3.Place("dc", (0, 0)),
            i3.PlaceRelative("fgc_1", "dc", (-self.fgc_space_x/2, -self.fgc_space_y/2)),
            i3.PlaceRelative("fgc_2", "dc", (-self.fgc_space_x/2, self.fgc_space_y/2)),
            i3.PlaceRelative("fgc_3", "dc", (self.fgc_space_x / 2, -self.fgc_space_y / 2),angle=180),
            i3.PlaceRelative("fgc_4", "dc", (self.fgc_space_x / 2, self.fgc_space_y / 2),angle=180),
            i3.ConnectManhattan("fgc_1:out", "dc:in1", bend_radius=self.bend_radius),
            i3.ConnectManhattan("fgc_2:out", "dc:in2", bend_radius=self.bend_radius),
            i3.ConnectManhattan("fgc_3:out", "dc:out1", bend_radius=self.bend_radius),
            i3.ConnectManhattan("fgc_4:out", "dc:out2", bend_radius=self.bend_radius)
        ]

        return specs

器件的放置可以用ipkiss中的i3.Place 和 i3.PlaceRelative

如:

i3.Place("dc", (0, 0)),

将方向耦合器dc的中心放置在(0,0)位置
也可以是:

i3.Place("dc:in1", (0, 0)),

将方向耦合器dc的in1端口放置在(0,0)位置
si_fab库中的方向耦合器pdk.SiDirectionalCouplerSPower默认有4个端口,分别是in1、in2、out1、out2

在这里插入图片描述

而光栅耦合的默认端口为out,其还有耦合输入输出端口,默认名为vertical_in
在这里插入图片描述

i3.PlaceRelative就是相对放置

i3.PlaceRelative("fgc_1", "dc", (-self.fgc_space_x/2, -self.fgc_space_y/2)),
i3.PlaceRelative("fgc_2", "dc", (-self.fgc_space_x/2, self.fgc_space_y/2)),
i3.PlaceRelative("fgc_3", "dc", (self.fgc_space_x / 2, -self.fgc_space_y / 2),angle=180),
i3.PlaceRelative("fgc_4", "dc", (self.fgc_space_x / 2, self.fgc_space_y / 2),angle=180),

如根据定义的结构参数fgc_space_x、fgc_space_y 将光栅耦合器放置在方向耦合器的两侧,
在放置右边的光栅耦合器时需要旋转180(angle=180)

器件的连接可以用i3.ConnectManhattan,i3.ConnectManhattan可以将两个光学端口按一定算法连接,连接时也可以设定波导的弯曲半径

bend_radius=self.bend_radius

也可以用i3.ConnectBend连接两个光学端口

i3.ConnectBend("fgc_1:out", "dc:in1"),
i3.ConnectBend("fgc_2:out", "dc:in2"),
i3.ConnectBend("fgc_3:out", "dc:out1"),
i3.ConnectBend("fgc_4:out", "dc:out2")

在这里插入图片描述
4、端口的命名
可以分别将4个光栅耦合器的耦合输入输出端口vertical_in命名为:in1、in2、out1、out2
这就是整个光子集成线路光输入输出端口

    def _default_exposed_ports(self):
        exposed_ports = {
            "fgc_1:vertical_in": "in1",
            "fgc_2:vertical_in": "in2",
            "fgc_3:vertical_in": "out1",
            "fgc_4:vertical_in": "out2",
        }
        return exposed_ports

以上4步就构建好了线路

最后就是线路的可视化以及生成版图

if __name__ == '__main__':
    r_dc = routed_dc(bend_radius=20)
    my_circuit = r_dc.Layout()
    my_circuit.visualize(annotate=True)

利用visualize就可以看到设计的线路
也可以调整线路的参数
如:

if __name__ == '__main__':
    r_dc = routed_dc(fgc_space_x=200,fgc_space_y=200,bend_radius=20)
    my_circuit = r_dc.Layout()
    my_circuit.visualize(annotate=True)

得到:
在这里插入图片描述
可以用:

my_circuit.write_gdsii("Rounted_dc.gds")

得到线路的版图
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值