今天介绍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)