Source code for pyquil.control_flow_graph

"""Classes that represent the control flow graph of a Quil program."""

from typing import Optional

from quil import program as quil_rs
from typing_extensions import Self, override

from pyquil.quilbase import (
    AbstractInstruction,
    _convert_to_py_instruction,
    _convert_to_py_instructions,
)


[docs] class BasicBlock(quil_rs.BasicBlock): """Represents a basic block in the Program. Most functionality is implemented by the `quil` package. See the `quil BasicBlock documentation`_ for documentation and available methods. .. _quil BasicBlock documentation: https://rigetti.github.io/quil-rs/quil/program.html#BasicBlock """ @classmethod def _from_rs(cls, block: quil_rs.BasicBlock) -> Self: return super().__new__(cls, block)
[docs] @override def instructions(self) -> list[AbstractInstruction]: # type: ignore[override] return _convert_to_py_instructions(super().instructions())
[docs] @override def terminator(self) -> Optional[AbstractInstruction]: # type: ignore[override] inst = super().terminator() if inst is None: return None return _convert_to_py_instruction(super().terminator())
[docs] class ControlFlowGraph(quil_rs.ControlFlowGraph): """Representation of a control flow graph (CFG) for a Quil program. The CFG is a directed graph where each node is a basic block and each edge is a control flow transition between two basic blocks. This class should not be initialized directly. Use :py:meth:~pyquil.quil.Program.control flow_graph` to get a CFG for a program. Most functionality is implemented by the `quil` package. See the `quil ControlFlowGraph documentation`_ for available methods. .. _quil ControlFlowGraph documentation: https://rigetti.github.io/quil-rs/quil/program.html#ControlFlowGraph """ @classmethod def _from_rs(cls, graph: quil_rs.ControlFlowGraph) -> Self: return super().__new__(cls, graph)
[docs] @override def basic_blocks(self) -> list[BasicBlock]: # type: ignore[override] """Return a list of all the basic blocks in the control flow graph, in order of definition.""" return [BasicBlock._from_rs(block) for block in super().basic_blocks()]