利用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")
得到线路的版图