luceda ipkiss教程 31:利用ipkiss画微环

今天介绍ipkiss实现微环的案例:
在这里插入图片描述
所有代码如下:

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

class RingResonator(i3.PCell):
    trace_template = i3.TraceTemplateProperty(
        default=pdk.SiWireWaveguideTemplate(),
        doc="The trace template of the ring resonator"
    )

    class Layout(i3.LayoutView):

        ring_radius = i3.PositiveNumberProperty(default=20, doc="The bend radius of the ring")
        spacing = i3.PositiveNumberProperty(default=0.1, doc="The spacing between the ring and the bus waveguides")
        wrapping_angle = i3.NonNegativeNumberProperty(
            default=20,
            doc="The angle around which the bus waveguides are wrapped"
        )
        wrapping_bend_radius = i3.PositiveNumberProperty(
            default=5,
            doc="Maximum bend radius for the wrap around"
        )
        wrapping_straight_length = i3.PositiveNumberProperty(
            default=2,
            doc="Straight length for the wrap around"
        )

        def _generate_instances(self, insts):

            trace_template = self.trace_template

            ring_radius = self.ring_radius
            spacing = self.spacing

            wrapping_angle = self.wrapping_angle
            wrapping_bend_radius = self.wrapping_bend_radius

            waveguide_ring = i3.Waveguide(trace_template=trace_template)
            waveguide_ring.Layout(shape=i3.ShapeCircle(radius=ring_radius))

            bus_y_distance_from_origin = ring_radius + trace_template.core_width + spacing

            shape = i3.ShapeArc(
                radius=bus_y_distance_from_origin,
                start_angle=-90-wrapping_angle,
                end_angle=-90+wrapping_angle
            )

            bus_add_filter_coupling_segment = i3.Waveguide(trace_template=trace_template)
            bus_add_filter_coupling_segment_lv = bus_add_filter_coupling_segment.Layout(shape=shape)

            bus_add_filter_waveguides = [bus_add_filter_coupling_segment]


            for coupling_segment_port in bus_add_filter_coupling_segment_lv.ports:

                route_bus_add_filter = i3.RouteToHorizontal(
                    start_port=coupling_segment_port,
                    bend_radius=wrapping_bend_radius,
                    rounding_algorithm=i3.SplineRoundingAlgorithm(adiabatic_angles=(15.0, 15.0))
                )

                routing_waveguide = i3.RoundedWaveguide(trace_template=self.trace_template)
                routing_waveguide.Layout(
                    shape=route_bus_add_filter,
                    bend_radius=wrapping_bend_radius,
                    rounding_algorithm=i3.SplineRoundingAlgorithm(adiabatic_angles=(15.0, 15.0))
                )

                bus_add_filter_waveguides.append(routing_waveguide)

            insts += i3.SRef(reference=waveguide_ring, name="waveguide_ring")
            for i, wav in enumerate(bus_add_filter_waveguides):
                insts += i3.SRef(
                    reference=wav,
                    name="bus_add_filter_{}".format(i)
                )
                insts += i3.SRef(
                    reference=wav,
                    name="bus_drop_filter_{}".format(i),
                    transformation=i3.Rotation(rotation=180)
                )

            return insts

        def _generate_ports(self, ports):
            ports += i3.expose_ports(
                instances=self.instances,
                port_name_map={
                    "bus_add_filter_1:out": "in1",
                    "bus_drop_filter_1:out": "out2",
                    "bus_add_filter_2:out": "out1",
                    "bus_drop_filter_2:out": "in2",
                }
            )
            return ports
if __name__ == '__main__':
    ring = RingResonator()
    ring_layout = ring.Layout()
    ring_layout.visualize(annotate=True)

如果只要单根耦合波导:
在这里插入图片描述
代码做如下修改:

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

class RingResonator(i3.PCell):
    trace_template = i3.TraceTemplateProperty(
        default=pdk.SiWireWaveguideTemplate(),
        doc="The trace template of the ring resonator"
    )

    class Layout(i3.LayoutView):

        ring_radius = i3.PositiveNumberProperty(default=20, doc="The bend radius of the ring")
        spacing = i3.PositiveNumberProperty(default=0.1, doc="The spacing between the ring and the bus waveguides")
        wrapping_angle = i3.NonNegativeNumberProperty(
            default=20,
            doc="The angle around which the bus waveguides are wrapped"
        )
        wrapping_bend_radius = i3.PositiveNumberProperty(
            default=5,
            doc="Maximum bend radius for the wrap around"
        )
        wrapping_straight_length = i3.PositiveNumberProperty(
            default=2,
            doc="Straight length for the wrap around"
        )

        def _generate_instances(self, insts):

            trace_template = self.trace_template

            ring_radius = self.ring_radius
            spacing = self.spacing

            wrapping_angle = self.wrapping_angle
            wrapping_bend_radius = self.wrapping_bend_radius

            waveguide_ring = i3.Waveguide(trace_template=trace_template)
            waveguide_ring.Layout(shape=i3.ShapeCircle(radius=ring_radius))

            bus_y_distance_from_origin = ring_radius + trace_template.core_width + spacing

            shape = i3.ShapeArc(
                radius=bus_y_distance_from_origin,
                start_angle=-90-wrapping_angle,
                end_angle=-90+wrapping_angle
            )

            bus_add_filter_coupling_segment = i3.Waveguide(trace_template=trace_template)
            bus_add_filter_coupling_segment_lv = bus_add_filter_coupling_segment.Layout(shape=shape)

            bus_add_filter_waveguides = [bus_add_filter_coupling_segment]


            for coupling_segment_port in bus_add_filter_coupling_segment_lv.ports:

                route_bus_add_filter = i3.RouteToHorizontal(
                    start_port=coupling_segment_port,
                    bend_radius=wrapping_bend_radius,
                    rounding_algorithm=i3.SplineRoundingAlgorithm(adiabatic_angles=(15.0, 15.0))
                )

                routing_waveguide = i3.RoundedWaveguide(trace_template=self.trace_template)
                routing_waveguide.Layout(
                    shape=route_bus_add_filter,
                    bend_radius=wrapping_bend_radius,
                    rounding_algorithm=i3.SplineRoundingAlgorithm(adiabatic_angles=(15.0, 15.0))
                )

                bus_add_filter_waveguides.append(routing_waveguide)

            insts += i3.SRef(reference=waveguide_ring, name="waveguide_ring")
            for i, wav in enumerate(bus_add_filter_waveguides):
                insts += i3.SRef(
                    reference=wav,
                    name="bus_add_filter_{}".format(i)
                )
                # insts += i3.SRef(
                #     reference=wav,
                #     name="bus_drop_filter_{}".format(i),
                #     transformation=i3.Rotation(rotation=180)
                # )

            return insts

        def _generate_ports(self, ports):
            ports += i3.expose_ports(
                instances=self.instances,
                port_name_map={
                    "bus_add_filter_1:out": "in1",
                    # "bus_drop_filter_1:out": "out2",
                    "bus_add_filter_2:out": "out1",
                    # "bus_drop_filter_2:out": "in2",
                }
            )
            return ports
if __name__ == '__main__':
    ring = RingResonator()
    ring_layout = ring.Layout()
    ring_layout.visualize(annotate=True)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值