Source code for semi_cr.core.lab.station.routing_v1.integration

from __future__ import annotations

from collections.abc import Iterable
from dataclasses import dataclass

import networkx as nx

from semi_cr.core.lab.devices.pinned import (
    PinnedDevice,
)
from semi_cr.core.lab.station.routing_v1.attachment import (
    attach_routed_pin_quantities,
)
from semi_cr.core.lab.station.routing_v1.validation import (
    RoutingValidationReport,
    validate_routing_graph,
)


[docs] @dataclass(frozen=True) class RoutingIntegrationResult: graph: nx.MultiDiGraph devices: tuple[PinnedDevice, ...] validation: RoutingValidationReport
[docs] def initialize_device_routing( graph: nx.MultiDiGraph, device: PinnedDevice, *, replace: bool = False, validate: bool = True, ) -> RoutingIntegrationResult: """ Validate the station graph and attach routed quantities to one device. """ return initialize_station_routing( graph, devices=(device,), replace=replace, validate=validate, )
[docs] def initialize_station_routing( graph: nx.MultiDiGraph, devices: Iterable[PinnedDevice], *, replace: bool = False, validate: bool = True, ) -> RoutingIntegrationResult: """ Initialize routed quantities for a collection of devices. Validation occurs before mutation so an invalid graph does not leave some devices partially initialized. """ device_tuple = tuple(devices) validation_report = ( validate_routing_graph(graph) if validate else RoutingValidationReport( issues=(), ) ) validation_report.raise_for_errors() for device in device_tuple: attach_routed_pin_quantities( graph, device, replace=replace, ) return RoutingIntegrationResult( graph=graph, devices=device_tuple, validation=validation_report, )