def cutback_bend(bend90, straight_length=5.0, n_steps=6, n_stairs=5): """ Deprecated! use cutback_bend90 instead! this is a stair .. code:: _ _| _| _ this is a step """ wg = waveguide(length=straight_length, width=bend90.ports["W0"].width) # Define a map between symbols and (component, input port, output port) string_to_device_in_out_ports = { "A": (bend90, "W0", "N0"), "B": (bend90, "N0", "W0"), "S": (wg, "W0", "E0"), } # Generate the sequence of staircases s = "" for i in range(n_stairs): s += "ASBS" * n_steps s += "ASAS" if i % 2 == 0 else "BSBS" s = s[:-4] # Create the component from the sequence c = component_sequence(s, string_to_device_in_out_ports, start_orientation=90) c.update_settings(n_bends=n_steps * n_stairs * 2 + n_stairs * 2 - 2) return c
def test_extend_ports(): import pp.components as pc c = pc.waveguide(width=2) c = pc.cross(width=2) ce = extend_ports(c) assert len(c.ports) == len(ce.ports) return ce
def splitter_tree( coupler, n_o_outputs=4, bend_radius=10.0, separation=50, termination_component=waveguide(length=0.1), ): n_o_outputs = n_o_outputs c = pp.Component() coupler = pp.call_if_func(coupler) _coupler = c.add_ref(coupler) coupler_sep = coupler.ports["E1"].y - coupler.ports["E0"].y if n_o_outputs > 2: _cmp = splitter_tree( coupler=coupler, n_o_outputs=n_o_outputs // 2, bend_radius=bend_radius, separation=separation / 2, ) else: _cmp = termination_component a = separation or _cmp.ports["W0"].y - _coupler.size_info.south if a < coupler_sep: tree_top = _cmp.ref(port_id="W0", position=_coupler.ports["E1"]) tree_bot = _cmp.ref( port_id="W0", position=_coupler.ports["E0"], v_mirror=False # True ) else: d = 2 * bend_radius + 1 a = max(a, d) tree_top = _cmp.ref(port_id="W0", position=_coupler.ports["E1"].position + (d, a)) tree_bot = _cmp.ref( port_id="W0", position=_coupler.ports["E0"].position + (d, -a), v_mirror=False, # True, ) c.add(connect_strip(coupler.ports["E1"], tree_top.ports["W0"])) c.add(connect_strip(coupler.ports["E0"], tree_bot.ports["W0"])) i = 0 for p in get_ports_facing(tree_bot, "E"): c.add_port(name="{}".format(i), port=p) i += 1 for p in get_ports_facing(tree_top, "E"): c.add_port(name="{}".format(i), port=p) i += 1 c.add(tree_bot) c.add(tree_top) c.add_port(name="W0", port=_coupler.ports["W0"]) return c
p0 = gca1.ports[gc_port_name].position p1 = gca2.ports[gc_port_name].position a = bend_radius_align_ports + 0.5 b = max(2 * a, grating_separation / 2) y_bot_align_route = (y_bot_align_route if y_bot_align_route is not None else -gsi.width - 5.0) route = [ p0, p0 + (0, a), p0 + (b, a), p0 + (b, y_bot_align_route), p1 + (-b, y_bot_align_route), p1 + (-b, a), p1 + (0, a), p1, ] bend90 = bend_factory(radius=bend_radius_align_ports) loop_back = round_corners(route, bend90, waveguide_factory) elements = [gca1, gca2, loop_back] return elements if __name__ == "__main__": import pp c = waveguide() c.add( gen_loopback(c.ports["W0"], c.ports["E0"], gc=pp.c.grating_coupler_te)) pp.show(c)
def test_properties_containers(component_type, data_regression): # pp.clear_cache() c = component_factory[component_type](component=waveguide()) data_regression.check(c.get_settings())
def waveguide_with_loopback() -> pp.Component: c = waveguide() c.add( gen_loopback(c.ports["W0"], c.ports["E0"], gc=pp.c.grating_coupler_te)) return c
def test_extend_ports(): import pp.components as pc c = pc.waveguide() ce = extend_ports(c) assert len(c.ports) == len(ce.ports)
output_port_ext = output_port_ext or port_labels[-1] for port_label in port_list: port = component.ports.get(port_label) extension = c << extension_factory(length=length, width=port.width) extension.connect(input_port_ext, port) c.add_port(port_label, port=extension.ports[output_port_ext]) return c def test_extend_ports(): import pp.components as pc c = pc.waveguide() ce = extend_ports(c) assert len(c.ports) == len(ce.ports) if __name__ == "__main__": test_extend_ports() import pp.components as pc # c = pc.bend_circular() # ce = extend_ports(c, port_list=['W0']) c = pc.waveguide(layer=(3, 0)) ce = extend_ports(c) print(ce) print(len(ce.ports)) pp.show(ce)