在ipkiss可以用i3.PolygonText来添加文本标签,但是i3.PolygonText返回的是elements,不是insts,那么如何用i3.PolygonText给线路加文本标签呢:
以下图为例:
所有代码如下:
from si_fab import all as pdk
from ipkiss3 import all as i3
class demo_gc(i3.Circuit):
bend_radius = i3.PositiveNumberProperty(default=20.0, doc="the bend radius in the circuit")
gc = i3.ChildCellProperty()
space_x = i3.PositiveNumberProperty(default=600.0)
space_y = i3.PositiveNumberProperty(default=127.0)
y_offset = i3.PositiveNumberProperty(default=1000)
waveguide_space = i3.PositiveNumberProperty(default=20)
number = i3.IntProperty(default=4)
int_xy = i3.NumpyArrayProperty(default=[0, 0])
def _default_gc(self):
return pdk.GratingCoupler()
def _default_insts(self):
insts = {}
for m in range(self.number):
insts["gc_in_{}".format(m)] = self.gc
insts["gc_out_{}".format(m)] = self.gc
return insts
def _default_specs(self):
specs = []
for m in range(self.number):
specs += [
i3.Place("gc_in_{}:out".format(m), (self.int_xy[0], self.int_xy[1] + self.space_y * m)),
i3.Place(
"gc_out_{}:out".format(m),
(self.int_xy[0] + self.space_x, self.int_xy[1] + self.space_y * m - self.y_offset),
angle=180,
),
]
specs += [
i3.ConnectManhattan(
"gc_in_{}:out".format(m),
"gc_out_{}:out".format(m),
control_points=[i3.V(i3.END - self.space_x / 2 + self.waveguide_space * m)],
bend_radius=self.bend_radius,
),
]
return specs
class Layout(i3.Circuit.Layout):
def _generate_elements(self, elems):
# add text label on the chip
elems += super()._generate_elements(elems)
elems += i3.PolygonText(
layer=i3.TECH.PPLAYER.WG.TEXT,
text="GRATING_COUPLER_TE_1550",
coordinate=(0, -150.0),
alignment=(i3.TEXT.ALIGN.LEFT, i3.TEXT.ALIGN.BOTTOM),
font=i3.TEXT.FONT.STANDARD,
height=20.0,
)
return elems
if __name__ == "__main__":
demo_gc_c = demo_gc(y_offset=100.0, space_x=500.0).Layout()
demo_gc_c.visualize()
demo_gc_c.write_gdsii("gratingcoupler_Cband.gds")
可以看到线路设计还是用的i3.ciucuit的框架(教程2有讲),不同的是最后加入了
class Layout ,并且其继承i3.Circuit.Layout, 之所以可以这样用是因为i3.Circuit这个类本身就包含Layout, Netlist,CircuitModel这些子类,理解了这点,就可以像给器件加文本标签一样给线路加标签:
class Layout(i3.Circuit.Layout):
def _generate_elements(self, elems):
# add text label on the chip
elems += super()._generate_elements(elems)
elems += i3.PolygonText(
layer=i3.TECH.PPLAYER.WG.TEXT,
text="GRATING_COUPLER_TE_1550",
coordinate=(0, -150.0),
alignment=(i3.TEXT.ALIGN.LEFT, i3.TEXT.ALIGN.BOTTOM),
font=i3.TEXT.FONT.STANDARD,
height=20.0,
)
return elems
需要注意的是text的图层用的si_fab中的图层:
layer=i3.TECH.PPLAYER.WG.TEXT,
如果用的是流片厂pdk设计的线路,这个图层就要换到对应pdk的图层