luceda ipkiss教程 24:获取器件实时位置信息 i3.place_and_route

教程17中介绍了获取器件的端口位置,但是获取的端口位置是器件默认的端口位置,该位置不随器件位置的变化而变化,那么如何获取器件的实时端口位置呢,这就需要用到i3.place_and_route来返回insts的实时信息。
如,还是教程17中的例子:
在这里插入图片描述
当dc的位置发生变化时,添加的两个光学端口的位置也会随之变化,这是因为获取的是dc放置后的端口位置
所有代码如下:

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

class MyPCell(i3.PCell):
    class Layout(i3.LayoutView):
        def _generate_instances(self, insts):
            insts += i3.place_and_route(
                insts={
                    'dc': pdk.SiDirectionalCouplerSPower(power_fraction=0.5, target_wavelength=1.55),
                },
                specs=[
                    i3.Place('dc', (10, 10)),
                ]
            )
            dy = 15
            x1 = insts["dc"].ports["out2"].x
            y1 = insts["dc"].ports["out2"].y
            x2 = insts["dc"].ports["out2"].x
            y2 = insts["dc"].ports["out2"].y
            print(x1)
            opt1 = i3.OpticalPort(name="opt1",position=(x1, y1 + dy), angle=180, trace_template=pdk.SWG450())
            opt2 = i3.OpticalPort(name="opt2",position=(x2, y2 - dy), angle=180, trace_template=pdk.SWG450())

            insts = i3.place_and_route(
                insts=insts,
                specs=[
                    i3.ConnectManhattan(opt2, "dc:in1", bend_radius=5),
                    i3.ConnectManhattan(opt1, "dc:in2", bend_radius=5),
                ]
            )
            return insts


if __name__ == '__main__':
    pcell = MyPCell()
    pcell_lo = pcell.Layout()
    pcell_lo.visualize(annotate=True)

由于用了i3.place_and_route来返回insts,所以:

x1 = insts["dc"].ports["out2"].x
y1 = insts["dc"].ports["out2"].y
x2 = insts["dc"].ports["out2"].x
y2 = insts["dc"].ports["out2"].y

获取的是实时位置,通过 print(x1)可以验证。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值