Source code for gdsfactory.routing.add_electrical_pads_top_dc
from __future__ import annotations
from typing import Any
import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.port import select_ports_electrical
from gdsfactory.routing.route_bundle import route_bundle_electrical
from gdsfactory.routing.sort_ports import sort_ports_x
from gdsfactory.typings import (
ComponentSpec,
CrossSectionSpec,
Float2,
SelectPorts,
Strs,
)
[docs]
def add_electrical_pads_top_dc(
component: ComponentSpec,
spacing: Float2 = (0.0, 100.0),
pad_array: ComponentSpec = "pad_array270",
select_ports: SelectPorts = select_ports_electrical,
port_names: Strs | None = None,
cross_section: CrossSectionSpec = "metal_routing",
**kwargs: Any,
) -> Component:
"""Returns new component with electrical ports connected to top pad array.
Args:
component: component spec to connect to.
spacing: component to pad spacing.
pad_array: component factor for pad_array
select_ports: function to select_ports.
route_bundle_function: function to route bundle of ports.
port_names: optional port names. Overrides select_ports.
cross_section: cross_section for the route.
kwargs: route settings.
.. plot::
:include-source:
import gdsfactory as gf
c = gf.components.wire_straight(length=200.)
c = gf.routing.add_electrical_pads_top_dc(c, width=10)
c.plot()
"""
c = Component()
component = gf.get_component(component)
cref = c << component
ports = (
[cref[port_name] for port_name in port_names]
if port_names
else select_ports(cref.ports)
)
if not ports:
raise ValueError(
f"select_ports or port_names did not match any ports in "
f"{[port.name for port in component.ports]}"
)
ports_component = [port.copy() for port in ports]
for port in ports_component:
port.orientation = 90
pad_array_component = gf.get_component(pad_array, columns=len(ports))
pads = c << pad_array_component
pads.x = cref.x + spacing[0]
pads.ymin = cref.ymax + spacing[1]
ports_pads = pads.ports.filter(orientation=270)
ports_component = sort_ports_x(ports_component)
ports_pads = sort_ports_x(ports_pads)
route_bundle_electrical(
c, ports_component, ports_pads, cross_section=cross_section, **kwargs
)
for port in cref.ports:
if port not in ports_component:
c.add_port(name=port.name, port=port)
for i, port_pad in enumerate(ports_pads):
c.add_port(port=port_pad, name=f"elec-{component.name}-{i}")
c.copy_child_info(component)
return c