def test_connect_bundle_waypointsC(): ys1 = np.array([0, 5, 10, 15, 20, 60, 70, 80, 120, 125]) ys2 = np.array([0, 5, 10, 20, 25, 30, 40, 55, 60, 65]) - 500.0 N = ys1.size ports1 = [Port("A_{}".format(i), (0, ys1[i]), 0.5, 0) for i in range(N)] ports2 = [ Port("B_{}".format(i), (600, ys2[i]), 0.5, 180) for i in range(N) ] top_cell = pp.Component() way_points = [ ports1[0].position, ports1[0].position + (200, 0), ports1[0].position + (200, -200), ports1[0].position + (400, -200), (ports1[0].x + 400, ports2[0].y), ports2[0].position, ] elements = connect_bundle_waypoints(ports1, ports2, way_points) top_cell.add(elements) return top_cell
def test_connect_bundle_u_indirect(dy=-200, angle=180): xs1 = [-100, -90, -80, -55, -35] + [200, 210, 240] axis = "X" if angle in [0, 180] else "Y" pitch = 10.0 N = len(xs1) xs2 = [50 + i * pitch for i in range(N)] a1 = angle a2 = a1 + 180 if axis == "X": ports1 = [Port("top_{}".format(i), (0, xs1[i]), 0.5, a1) for i in range(N)] ports2 = [Port("bottom_{}".format(i), (dy, xs2[i]), 0.5, a2) for i in range(N)] else: ports1 = [Port("top_{}".format(i), (xs1[i], 0), 0.5, a1) for i in range(N)] ports2 = [Port("bottom_{}".format(i), (xs2[i], dy), 0.5, a2) for i in range(N)] top_cell = pp.Component() elements = connect_bundle(ports1, ports2) for e in elements: top_cell.add(e) return top_cell
def test_connect_bundle_waypointsA(): xs1 = np.arange(10) * 5 - 500.0 N = xs1.size ys2 = np.array([0, 5, 10, 20, 25, 30, 40, 55, 60, 75]) + 500.0 ports1 = [Port("A_{}".format(i), (xs1[i], 0), 0.5, 90) for i in range(N)] ports2 = [Port("B_{}".format(i), (0, ys2[i]), 0.5, 180) for i in range(N)] top_cell = pp.Component() p0 = ports1[0].position + (22, 0) way_points = [ p0, p0 + (0, 100), p0 + (200, 100), p0 + (200, -200), p0 + (0, -200), p0 + (0, -350), p0 + (400, -350), (p0[0] + 400, ports2[-1].y), ports2[-1].position, ] elements = connect_bundle_waypoints(ports1, ports2, way_points) top_cell.add(elements) return top_cell
def test_connect_bundle_waypointsB(): ys1 = np.array([0, 5, 10, 15, 30, 40, 50, 60]) + 0.0 ys2 = np.array([0, 10, 20, 30, 70, 90, 110, 120]) + 500.0 N = ys1.size ports1 = [Port("A_{}".format(i), (0, ys1[i]), 0.5, 0) for i in range(N)] ports2 = [ Port("B_{}".format(i), (500, ys2[i]), 0.5, 180) for i in range(N) ] p0 = ports1[0].position + (0, 22.5) top_cell = pp.Component() way_points = [ p0, p0 + (200, 0), p0 + (200, -200), p0 + (400, -200), (p0[0] + 400, ports2[0].y), ports2[0].position, ] elements = connect_bundle_waypoints(ports1, ports2, way_points) top_cell.add(elements) return top_cell
def test_connect_bundle_u_indirect(dy=-200, angle=180): xs1 = [-100, -90, -80, -55, -35] + [200, 210, 240] axis = "X" if angle in [0, 180] else "Y" pitch = 10.0 N = len(xs1) xs2 = [50 + i * pitch for i in range(N)] a1 = angle a2 = a1 + 180 if axis == "X": ports1 = [ Port("top_{}".format(i), (0, xs1[i]), 0.5, a1) for i in range(N) ] ports2 = [ Port("bottom_{}".format(i), (dy, xs2[i]), 0.5, a2) for i in range(N) ] else: ports1 = [ Port("top_{}".format(i), (xs1[i], 0), 0.5, a1) for i in range(N) ] ports2 = [ Port("bottom_{}".format(i), (xs2[i], dy), 0.5, a2) for i in range(N) ] c = pp.Component() routes = connect_bundle(ports1, ports2) lengths = [ 341.416, 341.416, 341.416, 326.416, 316.416, 291.416, 291.416, 311.416, ] for route, length in zip(routes, lengths): # print(route["settings"]["length"]) c.add(route["references"]) assert np.isclose(route["settings"]["length"], length) return c
def big_device(w=400.0, h=400.0, N=16, port_pitch=15.0, layer=LAYER.WG, wg_width=0.5): """ big device with N ports on each side """ component = pp.Component() p0 = np.array((0, 0)) dx = w / 2 dy = h / 2 points = [[dx, dy], [dx, -dy], [-dx, -dy], [-dx, dy]] component.add_polygon(points, layer=layer) port_params = {"layer": layer, "width": wg_width} for i in range(N): port = Port( name=f"W{i}", midpoint=p0 + (-dx, (i - N / 2) * port_pitch), orientation=180, **port_params, ) component.add_port(port) for i in range(N): port = Port( name=f"E{i}", midpoint=p0 + (dx, (i - N / 2) * port_pitch), orientation=0, **port_params, ) component.add_port(port) for i in range(N): port = Port( name=f"N{i}", midpoint=p0 + ((i - N / 2) * port_pitch, dy), orientation=90, **port_params, ) component.add_port(port) for i in range(N): port = Port( name=f"S{i}", midpoint=p0 + ((i - N / 2) * port_pitch, -dy), orientation=-90, **port_params, ) component.add_port(port) return component
def test_connect_bundle(): xs_top = [-100, -90, -80, 0, 10, 20, 40, 50, 80, 90, 100, 105, 110, 115] pitch = 127.0 N = len(xs_top) xs_bottom = [(i - N / 2) * pitch for i in range(N)] top_ports = [ Port("top_{}".format(i), (xs_top[i], 0), 0.5, 270) for i in range(N) ] bottom_ports = [ Port("bottom_{}".format(i), (xs_bottom[i], -400), 0.5, 90) for i in range(N) ] c = pp.Component() routes = connect_bundle(top_ports, bottom_ports) lengths = [ 1180.416, 1063.416, 946.416, 899.416, 782.416, 665.416, 558.416, 441.416, 438.416, 555.416, 672.416, 794.416, 916.416, 1038.416, ] for route, length in zip(routes, lengths): # print(route["settings"]["length"]) c.add(route["references"]) assert np.isclose(route["settings"]["length"], length) return c
def test_connect_bundle(): xs_top = [-100, -90, -80, 0, 10, 20, 40, 50, 80, 90, 100, 105, 110, 115] pitch = 127.0 N = len(xs_top) xs_bottom = [(i - N / 2) * pitch for i in range(N)] top_ports = [Port("top_{}".format(i), (xs_top[i], 0), 0.5, 270) for i in range(N)] bottom_ports = [ Port("bottom_{}".format(i), (xs_bottom[i], -400), 0.5, 90) for i in range(N) ] top_cell = pp.Component(name="connect_bundle") elements = connect_bundle(top_ports, bottom_ports) for e in elements: top_cell.add(e) top_cell.name = "connect_bundle" return top_cell
def test_facing_ports(): dy = 200.0 xs1 = [-500, -300, -100, -90, -80, -55, -35, 200, 210, 240, 500, 650] pitch = 10.0 N = len(xs1) xs2 = [-20 + i * pitch for i in range(N // 2)] xs2 += [400 + i * pitch for i in range(N // 2)] a1 = 90 a2 = a1 + 180 ports1 = [Port("top_{}".format(i), (xs1[i], 0), 0.5, a1) for i in range(N)] ports2 = [Port("bottom_{}".format(i), (xs2[i], dy), 0.5, a2) for i in range(N)] top_cell = pp.Component() elements = connect_bundle(ports1, ports2) # elements = link_ports_path_length_match(ports1, ports2) top_cell.add(elements) return top_cell
def test_connect_bundle_waypointsD(): ys1 = np.array([0, 5, 10, 20, 25, 30, 40, 55, 60, 75]) + 100.0 ys2 = np.array([0, -5, -10, -20, -25, -30, -40, -55, -60, -75]) + 500.0 N = ys1.size ports1 = [Port("A_{}".format(i), (0, ys1[i]), 0.5, 0) for i in range(N)] ports2 = [Port("B_{}".format(i), (0, ys2[i]), 0.5, 0) for i in range(N)] def _mean_y(ports): return np.mean([p.y for p in ports]) yc1 = _mean_y(ports1) yc2 = _mean_y(ports2) top_cell = pp.Component() way_points = [(0, yc1), (200, yc1), (200, yc2), (0, yc2)] elements = connect_bundle_waypoints(ports1, ports2, way_points) top_cell.add(elements) return top_cell
def test_facing_ports(): dy = 200.0 xs1 = [-500, -300, -100, -90, -80, -55, -35, 200, 210, 240, 500, 650] pitch = 10.0 N = len(xs1) xs2 = [-20 + i * pitch for i in range(N // 2)] xs2 += [400 + i * pitch for i in range(N // 2)] a1 = 90 a2 = a1 + 180 ports1 = [Port("top_{}".format(i), (xs1[i], 0), 0.5, a1) for i in range(N)] ports2 = [ Port("bottom_{}".format(i), (xs2[i], dy), 0.5, a2) for i in range(N) ] c = pp.Component() routes = connect_bundle(ports1, ports2) lengths = [ 671.416, 481.416, 291.416, 291.416, 291.416, 276.416, 626.416, 401.416, 401.416, 381.416, 251.416, 391.416, ] for route, length in zip(routes, lengths): # print(route["settings"]["length"]) c.add(route["references"]) assert np.isclose(route["settings"]["length"], length) return c
def test_connect_bundle_udirect(dy=200, angle=270): xs1 = [-100, -90, -80, -55, -35, 24, 0] + [200, 210, 240] axis = "X" if angle in [0, 180] else "Y" pitch = 10.0 N = len(xs1) xs2 = [50 + i * pitch for i in range(N)] if axis == "X": ports1 = [ Port("top_{}".format(i), (0, xs1[i]), 0.5, angle) for i in range(N) ] ports2 = [ Port("bottom_{}".format(i), (dy, xs2[i]), 0.5, angle) for i in range(N) ] else: ports1 = [ Port("top_{}".format(i), (xs1[i], 0), 0.5, angle) for i in range(N) ] ports2 = [ Port("bottom_{}".format(i), (xs2[i], dy), 0.5, angle) for i in range(N) ] c = pp.Component(name="connect_bundle") routes = connect_bundle(ports1, ports2) lengths = [0] * len(routes) for route, length in zip(routes, lengths): print(route["settings"]["length"]) c.add(route["references"]) # assert np.isclose(route["settings"]["length"], length) return c
def test_connect_corner(N=6, config="A"): d = 10.0 sep = 5.0 top_cell = pp.Component(name="connect_bundle_corners") if config in ["A", "B"]: a = 100.0 ports_A_TR = [ Port("A_TR_{}".format(i), (d, a / 2 + i * sep), 0.5, 0) for i in range(N) ] ports_A_TL = [ Port("A_TL_{}".format(i), (-d, a / 2 + i * sep), 0.5, 180) for i in range(N) ] ports_A_BR = [ Port("A_BR_{}".format(i), (d, -a / 2 - i * sep), 0.5, 0) for i in range(N) ] ports_A_BL = [ Port("A_BL_{}".format(i), (-d, -a / 2 - i * sep), 0.5, 180) for i in range(N) ] ports_A = [ports_A_TR, ports_A_TL, ports_A_BR, ports_A_BL] ports_B_TR = [ Port("B_TR_{}".format(i), (a / 2 + i * sep, d), 0.5, 90) for i in range(N) ] ports_B_TL = [ Port("B_TL_{}".format(i), (-a / 2 - i * sep, d), 0.5, 90) for i in range(N) ] ports_B_BR = [ Port("B_BR_{}".format(i), (a / 2 + i * sep, -d), 0.5, 270) for i in range(N) ] ports_B_BL = [ Port("B_BL_{}".format(i), (-a / 2 - i * sep, -d), 0.5, 270) for i in range(N) ] ports_B = [ports_B_TR, ports_B_TL, ports_B_BR, ports_B_BL] elif config in ["C", "D"]: a = N * sep + 2 * d ports_A_TR = [ Port("A_TR_{}".format(i), (a, d + i * sep), 0.5, 0) for i in range(N) ] ports_A_TL = [ Port("A_TL_{}".format(i), (-a, d + i * sep), 0.5, 180) for i in range(N) ] ports_A_BR = [ Port("A_BR_{}".format(i), (a, -d - i * sep), 0.5, 0) for i in range(N) ] ports_A_BL = [ Port("A_BL_{}".format(i), (-a, -d - i * sep), 0.5, 180) for i in range(N) ] ports_A = [ports_A_TR, ports_A_TL, ports_A_BR, ports_A_BL] ports_B_TR = [ Port("B_TR_{}".format(i), (d + i * sep, a), 0.5, 90) for i in range(N) ] ports_B_TL = [ Port("B_TL_{}".format(i), (-d - i * sep, a), 0.5, 90) for i in range(N) ] ports_B_BR = [ Port("B_BR_{}".format(i), (d + i * sep, -a), 0.5, 270) for i in range(N) ] ports_B_BL = [ Port("B_BL_{}".format(i), (-d - i * sep, -a), 0.5, 270) for i in range(N) ] ports_B = [ports_B_TR, ports_B_TL, ports_B_BR, ports_B_BL] if config in ["A", "C"]: for ports1, ports2 in zip(ports_A, ports_B): elements = connect_bundle(ports1, ports2) top_cell.add(elements) elif config in ["B", "D"]: for ports1, ports2 in zip(ports_A, ports_B): elements = connect_bundle(ports2, ports1) top_cell.add(elements) return top_cell
def test_connect_corner(N=6, config="A"): d = 10.0 sep = 5.0 c = pp.Component() if config in ["A", "B"]: a = 100.0 ports_A_TR = [ Port("A_TR_{}".format(i), (d, a / 2 + i * sep), 0.5, 0) for i in range(N) ] ports_A_TL = [ Port("A_TL_{}".format(i), (-d, a / 2 + i * sep), 0.5, 180) for i in range(N) ] ports_A_BR = [ Port("A_BR_{}".format(i), (d, -a / 2 - i * sep), 0.5, 0) for i in range(N) ] ports_A_BL = [ Port("A_BL_{}".format(i), (-d, -a / 2 - i * sep), 0.5, 180) for i in range(N) ] ports_A = [ports_A_TR, ports_A_TL, ports_A_BR, ports_A_BL] ports_B_TR = [ Port("B_TR_{}".format(i), (a / 2 + i * sep, d), 0.5, 90) for i in range(N) ] ports_B_TL = [ Port("B_TL_{}".format(i), (-a / 2 - i * sep, d), 0.5, 90) for i in range(N) ] ports_B_BR = [ Port("B_BR_{}".format(i), (a / 2 + i * sep, -d), 0.5, 270) for i in range(N) ] ports_B_BL = [ Port("B_BL_{}".format(i), (-a / 2 - i * sep, -d), 0.5, 270) for i in range(N) ] ports_B = [ports_B_TR, ports_B_TL, ports_B_BR, ports_B_BL] elif config in ["C", "D"]: a = N * sep + 2 * d ports_A_TR = [ Port("A_TR_{}".format(i), (a, d + i * sep), 0.5, 0) for i in range(N) ] ports_A_TL = [ Port("A_TL_{}".format(i), (-a, d + i * sep), 0.5, 180) for i in range(N) ] ports_A_BR = [ Port("A_BR_{}".format(i), (a, -d - i * sep), 0.5, 0) for i in range(N) ] ports_A_BL = [ Port("A_BL_{}".format(i), (-a, -d - i * sep), 0.5, 180) for i in range(N) ] ports_A = [ports_A_TR, ports_A_TL, ports_A_BR, ports_A_BL] ports_B_TR = [ Port("B_TR_{}".format(i), (d + i * sep, a), 0.5, 90) for i in range(N) ] ports_B_TL = [ Port("B_TL_{}".format(i), (-d - i * sep, a), 0.5, 90) for i in range(N) ] ports_B_BR = [ Port("B_BR_{}".format(i), (d + i * sep, -a), 0.5, 270) for i in range(N) ] ports_B_BL = [ Port("B_BL_{}".format(i), (-d - i * sep, -a), 0.5, 270) for i in range(N) ] ports_B = [ports_B_TR, ports_B_TL, ports_B_BR, ports_B_BL] if config in ["A", "C"]: lengths = [ 75.708, 85.708, 95.708, 105.708, 115.708, 125.708, 75.708, 85.708, 95.708, 105.708, 115.708, 125.708, 125.708, 115.708, 105.708, 95.708, 85.708, 75.708, 125.708, 115.708, 105.708, 95.708, 85.708, 75.708, ] i = 0 for ports1, ports2 in zip(ports_A, ports_B): routes = connect_bundle(ports1, ports2) for route in routes: c.add(route["references"]) length = lengths[i] i += 1 assert np.isclose( route["settings"]["length"], length ), f"{route['settings']['length']} should be {length}" elif config in ["B", "D"]: for ports1, ports2 in zip(ports_A, ports_B): routes = connect_bundle(ports2, ports1) for route, length in zip(routes, lengths): print(route["settings"]["length"]) c.add(route["references"]) # assert np.isclose(route["settings"]["length"], length) return c