ipkiss新版(3.10.0)推出了ShapeSineSBend以及ShapeCosineSBend两个正弦或余弦形状生成函数, 利用这两个函数就可以生成一段正弦或余弦型的波导。
如:
from si_fab import all as pdk
import ipkiss3.all as i3
sp = i3.ShapeCosineSBend(x_offset=30, y_offset=20)
i3.RoundedWaveguide(trace_template=pdk.SWG450()).Layout(shape=sp).visualize()
运行后生成半段余弦型的波导:
要生成一段周期的余弦型的波导,可以参考:
from si_fab import all as pdk
import ipkiss3.all as i3
import numpy as np
class sine_waveguide(i3.Circuit):
_name_prefix = "s_circle"
x_offset = i3.PositiveNumberProperty(default=30.0)
y_offset = i3.PositiveNumberProperty(default=20.0)
wg = i3.ChildCellProperty(doc="sine waveguide in circuit")
trace_template = i3.TraceTemplateProperty(doc="trace_template in circuit")
def _default_trace_template(self):
tt = pdk.SWG450()
return tt
def _default_wg(self):
bw = i3.RoundedWaveguide(trace_template=self.trace_template)
bw.Layout(shape=i3.ShapeSineSBend(x_offset=self.x_offset, y_offset=self.y_offset))
return bw
def _default_insts(self):
insts = {
"bend1": self.wg,
"bend2": self.wg,
}
return insts
def _default_specs(self):
specs = []
specs += [
i3.Place("bend1:in", (0, 0)),
i3.FlipH("bend1"),
i3.Join("bend2:in", "bend1:out")
]
return specs
def _default_exposed_ports(self): # port definition
exposed_ports = {
"bend1:in": "out",
"bend2:out": "in",
}
return exposed_ports
class sine_waveguide_period(i3.Circuit):
_name_prefix = "sine_waveguide_X"
x_offset = i3.PositiveNumberProperty(default=30.0)
y_offset = i3.PositiveNumberProperty(default=20.0)
trace_template = i3.TraceTemplateProperty(doc="trace_template in circuit")
wg = i3.ChildCellProperty(doc="waveguide in circuit")
period = i3.IntProperty(default=20, doc="number of sine_waveguide in x direction")
def _default_trace_template(self):
tt = pdk.SWG450()
return tt
def _default_wg(self):
return sine_waveguide(x_offset=self.x_offset, y_offset=self.y_offset, trace_template=self.trace_template)
def _default_insts(self):
insts = {}
for m in range(self.period):
insts["bend{}".format(m)] = self.wg
return insts
def _default_specs(self):
specs = []
specs += [
i3.Place("bend0:in", (0, 0))
]
for m in range(self.period - 1):
specs += [i3.Join("bend{}:in".format(m + 1), "bend{}:out".format(m))]
return specs
def _default_exposed_ports(self): # port definition
exposed_ports = {
"bend0:in": "in",
"bend{}:out".format(self.period - 1): "out",
}
return exposed_ports
if __name__ == '__main__':
lay_c = sine_waveguide_period(x_offset=30,y_offset=20,period=5).Layout()
lay_c.visualize(annotate=True)
运行结果: