luceda ipkiss教程 26:画正弦或余弦型的波导

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)


运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值