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,
)