Source code for mqt.ionshuttler.multi_shuttler.inside.graph
# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM
# All rights reserved.
#
# SPDX-License-Identifier: MIT
#
# Licensed under the MIT License
from __future__ import annotations
from typing import TYPE_CHECKING, Any
import networkx as nx
from .graph_utils import create_idc_dictionary
if TYPE_CHECKING:
from ..circuit_types import GateInfo, GateRef
from .ion_types import Edge, Node
from .processing_zone import ProcessingZone
[docs]
class Graph(nx.Graph):
def __init__(self, *args: Any, **kwargs: Any) -> None:
super().__init__(*args, **kwargs)
self._executed_gates_next = []
self._locked_gates = {}
self._gate_info = {}
self._gate_pz_assignment = {}
self._in_process = []
@property
def executed_gates_next(self) -> list[dict[str, Any]]:
return self._executed_gates_next
@executed_gates_next.setter
def executed_gates_next(self, value: list[dict[str, Any]]) -> None:
self._executed_gates_next = value
@property
def junction_nodes(self) -> list[Node]:
return self._junction_nodes
@junction_nodes.setter
def junction_nodes(self, value: list[Node]) -> None:
self._junction_nodes = value
@property
def pzs(self) -> list[ProcessingZone]:
return self._pzs
@pzs.setter
def pzs(self, value: list[ProcessingZone]) -> None:
self._pzs = value
@property
def locked_gates(self) -> dict[int, str]:
return self._locked_gates
@locked_gates.setter
def locked_gates(self, value: dict[int, str]) -> None:
self._locked_gates = value
@property
def gate_info(self) -> dict[int, GateInfo]:
return self._gate_info
@gate_info.setter
def gate_info(self, value: dict[int, GateInfo]) -> None:
self._gate_info = value
[docs]
def get_gate_qubits(self, gate: GateRef) -> tuple[int, ...]:
"""Resolve an integer gate ID or pass through a direct qubit tuple.
Args:
gate: Stable gate ID backed by ``gate_info`` or a direct qubit tuple.
Returns:
The qubits referenced by the gate.
"""
if isinstance(gate, int):
return self.gate_info[gate].qubits
return gate
@property
def gate_pz_assignment(self) -> dict[int, str]:
"""Return explicit gate-ID to processing-zone assignments."""
return self._gate_pz_assignment
@gate_pz_assignment.setter
def gate_pz_assignment(self, value: dict[int, str]) -> None:
self._gate_pz_assignment = value
[docs]
def get_preferred_pz_for_gate(self, gate_id: int) -> str | None:
"""Return the preferred processing zone for a gate, if assigned.
Args:
gate_id: Stable gate identifier to query.
Returns:
The assigned processing-zone name, or ``None`` when unspecified.
"""
return self.gate_pz_assignment.get(gate_id)
@property
def state(self) -> dict[int, Edge]:
return self._state
@state.setter
def state(self, value: dict[int, Edge]) -> None:
self._state = value
@property
def in_process(self) -> list[int]:
return self._in_process
@in_process.setter
def in_process(self, value: list[int]) -> None:
self._in_process = value
@property
def arch(self) -> str:
return self._arch
@arch.setter
def arch(self, value: str) -> None:
self._arch = value
@property
def sequence(self) -> list[int]:
return self._sequence
@sequence.setter
def sequence(self, value: list[int]) -> None:
self._sequence = value
@property
def plot(self) -> bool:
return self._plot
@plot.setter
def plot(self, value: bool) -> None:
self._plot = value
@property
def save(self) -> bool:
return self._save
@save.setter
def save(self, value: bool) -> None:
self._save = value
@property
def stop_moves(self) -> list[int]:
return self._stop_moves
@stop_moves.setter
def stop_moves(self, value: list[int]) -> None:
self._stop_moves = value
@property
def idc_dict(self) -> dict[int, Edge]:
if not hasattr(self, "_idc_dict"):
self._idc_dict = create_idc_dictionary(self)
return self._idc_dict
@property
def map_to_pz(self) -> dict[int, str]:
return self._map_to_pz
@map_to_pz.setter
def map_to_pz(self, value: dict[int, str]) -> None:
self._map_to_pz = value