Source code for gdsfactory.routing.add_electrical_pads_top

from __future__ import annotations

from functools import partial

import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.components.pad import pad_array as pad_array_function
from gdsfactory.components.wire import wire_straight
from gdsfactory.port import select_ports_electrical
from gdsfactory.routing.route_quad import route_quad
from gdsfactory.typings import (
    Callable,
    ComponentSpec,
    Float2,
    LayerSpec,
    Strs,
)

_wire_long = partial(wire_straight, length=200.0)


[docs] @gf.cell_with_child def add_electrical_pads_top( component: ComponentSpec = _wire_long, direction: str = "top", spacing: Float2 = (0.0, 100.0), pad_array: ComponentSpec = pad_array_function, select_ports: Callable = select_ports_electrical, port_names: Strs | None = None, layer: LayerSpec = "MTOP", **kwargs, ) -> Component: """Returns new component with electrical ports connected to top pad array. Args: component: to route. direction: sets direction of the array (top or right). spacing: component to pad spacing. pad_array: function for pad_array. select_ports: function to select electrical ports. port_names: optional port names. Overrides select_ports. layer: for the routes. Keyword Args: ports: Dict[str, Port] a port dict {port name: port}. prefix: select ports with port name prefix. suffix: select ports with port name suffix. orientation: select ports with orientation in degrees. width: select ports with port width. layers_excluded: List of layers to exclude. port_type: select ports with port type (optical, electrical, vertical_te). clockwise: if True, sort ports clockwise, False: counter-clockwise. .. plot:: :include-source: import gdsfactory as gf c = gf.components.wire_straight(length=200.) cc = gf.routing.add_electrical_pads_top(component=c, spacing=(-150, 30)) cc.plot() """ c = Component() component = gf.get_component(component) ref = c << component ports_electrical = ( [ref[port_name] for port_name in port_names] if port_names else list(select_ports(ref.ports, **kwargs).values()) ) if direction == "top": pads = c << gf.get_component( pad_array, columns=len(ports_electrical), rows=1, orientation=270 ) elif direction == "right": pads = c << gf.get_component( pad_array, columns=1, rows=len(ports_electrical), orientation=270 ) pads.x = ref.x + spacing[0] pads.ymin = ref.ymax + spacing[1] ports_pads = list(pads.ports.values()) ports_pads = gf.routing.sort_ports.sort_ports_x(ports_pads) ports_component = gf.routing.sort_ports.sort_ports_x(ports_electrical) for p1, p2 in zip(ports_component, ports_pads): _ = c << route_quad(p1, p2, layer=layer) c.add_ports(ref.ports) # remove electrical ports for port in ports_electrical: c.ports.pop(port.name) c.add_ports(pads.ports) c.copy_child_info(component) c.auto_rename_ports(prefix_electrical=f"elec-{component.name}-") return c
if __name__ == "__main__": import gdsfactory as gf # c = gf.components.straight_heater_metal() # c = gf.components.mzi_phase_shifter_top_heater_metal() # cc = gf.routing.add_electrical_pads_top(component=c, spacing=(-150, 30)) c = add_electrical_pads_top() c.show(show_ports=True)