Source code for semi_cr.core.station.helpers
from rich.console import Console
from rich.markup import escape
from rich.table import Table
from semi_cr.core.station.device import DevicePin
from semi_cr.core.station.station import NQCPStation
[docs]
def print_station_map(station: NQCPStation):
def terminal_label(driver) -> str:
if driver is None:
return "-"
node = station.graph.graph.nodes[driver.node_id]
instrument = node.get("instrument")
module = node.get("module")
terminal = node.get("terminal")
if module:
label = f"{instrument}/{module}[{terminal}]" if instrument == "opx1000_1" else f"{module}[{terminal}]"
else:
label = f"{instrument}[{terminal}]"
return escape(label)
def pin_drivers(pin) -> tuple[str, str]:
return terminal_label(pin.get_ac_driver()), terminal_label(pin.get_dc_driver())
def inductor_in_path(pin: DevicePin) -> str:
inductor_pin = next(
station.graph.reachable_from_pin(
pin,
DevicePin,
lambda reachable_pin: "tankinductor" in reachable_pin.parent_ref.qcodes_type.lower(),
),
None,
)
if inductor_pin is None:
return "-"
device = inductor_pin.parent_ref
return f"{device.parent_ref.chip_id}/{device.device_id}"
def pin_role(pin: DevicePin) -> str:
role = getattr(pin, "role", None)
return role.name if role else "-"
table = Table(title="Routable device pin drivers")
table.add_column("Chip")
table.add_column("Device")
table.add_column("Pin")
table.add_column("Type")
table.add_column("Role")
table.add_column("Tank inductor")
table.add_column("AC")
table.add_column("DC")
rows = []
for chip in filter(lambda chip: chip.chip_id == "X001008C1", station.chips):
for device in chip.devices:
for pin in device.pins:
ac, dc = pin_drivers(pin)
inductor = inductor_in_path(pin)
rows.append(
(
chip.chip_id,
device.device_id,
pin.name,
type(pin).__name__,
pin_role(pin),
inductor,
ac,
dc,
)
)
for row in sorted(rows, key=lambda row: (row[2], row[0], row[1])):
table.add_row(*row)
Console().print(table)