教程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)可以验证。