Source code for gdsfactory.routing.add_electrical_pads_shortest
from __future__ import annotations
import gdsfactory as gf
from gdsfactory.component import Component
from gdsfactory.port import select_ports_electrical
from gdsfactory.routing.route_quad import route_quad
from gdsfactory.typings import (
AngleInDegrees,
ComponentSpec,
LayerSpec,
PortsFactory,
Size,
Strs,
)
[docs]
def add_electrical_pads_shortest(
component: ComponentSpec = "wire_straight",
pad: ComponentSpec = "pad",
pad_port_spacing: float = 50.0,
pad_size: Size | None = None,
select_ports: PortsFactory = select_ports_electrical,
port_names: Strs | None = None,
port_orientation: AngleInDegrees = 90,
layer: LayerSpec = "M3",
) -> Component:
"""Returns new Component with a pad by each electrical port.
Args:
component: to route.
pad: pad element or function.
pad_port_spacing: spacing between pad and port.
pad_size: pad size.
select_ports: function to select ports.
port_names: optional port names. Overrides select_ports.
port_orientation: in degrees.
layer: for the routing.
.. plot::
:include-source:
import gdsfactory as gf
c = gf.components.cross(length=100, layer=(49, 0), port_type="electrical")
c = gf.routing.add_electrical_pads_shortest(c, pad_port_spacing=200)
c.plot()
"""
c = Component()
component = gf.get_component(component)
if pad_size is not None:
pad = gf.get_component(pad, size=pad_size)
else:
pad = gf.get_component(pad)
ref = c << component
ports = (
[ref[port_name] for port_name in port_names]
if port_names
else select_ports(ref.ports)
)
for i, port in enumerate(ports):
p = c << pad
port_orientation = port.orientation
if port_orientation == 0:
p.x = port.x + pad_port_spacing
p.y = port.y
route_quad(component=c, port1=port, port2=p.ports["e1"], layer=layer)
elif port_orientation == 180:
p.x = port.x - pad_port_spacing
p.y = port.y
route_quad(c, port, p.ports["e3"], layer=layer)
elif port_orientation == 90:
p.y = port.y + pad_port_spacing
p.x = port.x
route_quad(c, port, p.ports["e4"], layer=layer)
elif port_orientation == 270:
p.y = port.y - pad_port_spacing
p.x = port.x
route_quad(c, port, p.ports["e2"], layer=layer)
c.add_port(port=p.ports["pad"], name=f"elec-{component.name}-{i + 1}")
c.add_ports(ref.ports)
c.copy_child_info(component)
return c