Source code for bqskit.passes.retarget.general

"""This module implements the GeneralSQDecomposition."""
from __future__ import annotations

from bqskit.compiler.basepass import BasePass
from bqskit.compiler.passdata import PassData
from bqskit.ir.circuit import Circuit
from bqskit.ir.gates.generalgate import GeneralGate


[docs] class GeneralSQDecomposition(BasePass): """Convert to a general single-qudit gate from the model's gate set."""
[docs] async def run(self, circuit: Circuit, data: PassData) -> None: """Perform the pass's operation, see :class:`BasePass` for more.""" if circuit.num_qudits != 1: raise ValueError( 'Cannot convert multi-qudit circuit into' ' general single-qudit gate.', ) # Check radixes radix = circuit.radixes[0] # Pick a general gate general_gate: GeneralGate | None = None for gate in data.gate_set.single_qudit_gates: if isinstance(gate, GeneralGate): if gate.radixes[0] == radix: general_gate = gate break if general_gate is None: raise ValueError( f'No general single-qudit gate with radix {radix} in gate set.', ) utry = circuit.get_unitary() new_circuit = Circuit(1) new_circuit.append_gate(general_gate, 0, general_gate.calc_params(utry)) circuit.become(new_circuit)