Source code for semi_cr.core.lab.station.routing_v1.models
# Contains graph-independent descriptions of routing requests and results:
from dataclasses import dataclass
from typing import Any
from collections.abc import Sequence
from abc import ABC, abstractmethod
import networkx as nx
from semi_cr.core.lab.station.graphing.runtime_builder import (
build_connection_graph_for_instrument,
)
from semi_cr.core.lab.pins.base import BasePinChannel
# Static Routing
[docs]
@dataclass(frozen=True)
class RouteRequest:
pin: BasePinChannel
role: str
quantity: str | None = None
modality: str | None = None
[docs]
class Routable(ABC):
@property
@abstractmethod
def graph(self) -> nx.MultiDiGraph:
...
[docs]
class ConnectionRoutable(Routable):
def _init_connections(
self,
connections: Sequence[dict[str, Any]] | None = None,
) -> None:
self._connections = tuple(connections or ())
@property
def connections(self) -> tuple[dict[str, Any], ...]:
return self._connections
@property
def graph(self) -> nx.MultiDiGraph:
parent = getattr(self, "parent", None)
parent_name = None
if parent is not None:
parent_name = getattr(parent, "short_name", parent.name)
return build_connection_graph_for_instrument(
instrument=self,
connections=self.connections,
parent_name=parent_name,
)
# Configurable Routing
[docs]
@dataclass(frozen=True)
class RouteAction:
instrument: object
parameter: str
value: object
[docs]
@dataclass(frozen=True)
class RouteEdge:
source: str
target: str
key: object
attributes: dict[str, Any]
[docs]
@dataclass(frozen=True)
class RoutePlan:
device_pin: BasePinChannel
terminal: object
path: tuple[object, ...]
actions: tuple[RouteAction, ...]
[docs]
@dataclass(frozen=True)
class Route:
request: RouteRequest
target_node: str
path: tuple[str, ...]
# edges: tuple[RouteEdge, ...]
# actions: tuple[RouteAction, ...] = ()