Source code for mqt.bench.targets.gatesets.rigetti

# Copyright (c) 2023 - 2026 Chair for Design Automation, TUM
# Copyright (c) 2025 - 2026 Munich Quantum Software Company GmbH
# All rights reserved.
#
# SPDX-License-Identifier: MIT
#
# Licensed under the MIT License

"""Handles the available native gatesets for Rigetti."""

from __future__ import annotations

from typing import TYPE_CHECKING

import numpy as np
from qiskit import QuantumCircuit, QuantumRegister
from qiskit.circuit import Gate, Parameter
from qiskit.circuit.library.standard_gates import RXGate, RZGate, UGate

from ._registry import register_gateset

if TYPE_CHECKING:
    from qiskit.circuit import EquivalenceLibrary


[docs] @register_gateset("rigetti") def get_rigetti_gateset() -> list[str]: """Returns the basis gates of the Rigetti gateset.""" return ["rxpi", "rxpi2", "rxpi2dg", "rz", "iswap", "measure"]
[docs] class RXPIGate(Gate): r"""Single-qubit RX(π) gate. **Circuit symbol:** .. parsed-literal:: ┌─────┐ q_0: ┤ RX(π)├ └─────┘ **Matrix representation:** .. math:: RX(π) = \begin{pmatrix} 0 & -i \\ -i & 0 \end{pmatrix} """ def __init__(self, label: str | None = None) -> None: """Create RX(π) gate.""" super().__init__("rxpi", 1, [np.pi], label=label) def _define(self) -> None: """Define RX(π) gate using standard RX.""" q = QuantumRegister(1, "q") qc = QuantumCircuit(q) qc.rx(np.pi, 0) self.definition = qc
[docs] class RXPI2Gate(Gate): r"""Single-qubit RX(π/2) gate. **Circuit symbol:** .. parsed-literal:: ┌──────────┐ q_0: ┤ RX(π/2) ├ └──────────┘ **Matrix representation:** .. math:: RX(π/2) = \begin{pmatrix} \cos(π/4) & -i \sin(π/4) \\ -i \sin(π/4) & \cos(π/4) \end{pmatrix} """ def __init__(self, label: str | None = None) -> None: """Create RX(π/2) gate.""" super().__init__("rxpi2", 1, [np.pi / 2], label=label) def _define(self) -> None: """Define RX(π/2) gate using standard RX.""" q = QuantumRegister(1, "q") qc = QuantumCircuit(q) qc.rx(np.pi / 2, 0) self.definition = qc
[docs] class RXPI2DgGate(Gate): r"""Single-qubit RX(-π/2) gate. **Circuit symbol:** .. parsed-literal:: ┌────────────┐ q_0: ┤ RX(-π/2) ├ └────────────┘ **Matrix representation:** .. math:: RX(-π/2) = \begin{pmatrix} \cos(π/4) & i \sin(π/4) \\ i \sin(π/4) & \cos(π/4) \end{pmatrix} """ def __init__(self, label: str | None = None) -> None: """Create RX(-π/2) gate.""" super().__init__("rxpi2dg", 1, [-np.pi / 2], label=label) def _define(self) -> None: """Define RX(-π/2) gate using standard RX.""" q = QuantumRegister(1, "q") qc = QuantumCircuit(q) qc.rx(-np.pi / 2, 0) self.definition = qc
[docs] def u_gate_equivalence(sel: EquivalenceLibrary) -> None: """Add U(θ, φ, λ) gate equivalence to the SessionEquivalenceLibrary using RZ and RX gates.""" theta = Parameter("θ") phi = Parameter("φ") lam = Parameter("λ") qr = QuantumRegister(1, "q") qc = QuantumCircuit(qr) # Decomposition: U(θ, φ, λ) = RZ(φ) RX(-π/2) RZ(θ) RX(π/2) RZ(λ) qc.append(RZGate(phi), [qr[0]]) qc.append(RXPI2DgGate(), [qr[0]]) qc.append(RZGate(theta), [qr[0]]) qc.append(RXPI2Gate(), [qr[0]]) qc.append(RZGate(lam), [qr[0]]) sel.add_equivalence(UGate(theta, phi, lam), qc)
[docs] def rx_gate_equivalence(sel: EquivalenceLibrary) -> None: """Add RX(θ) gate equivalence using RX(±π/2) and RZ gates.""" theta = Parameter("θ") qr = QuantumRegister(1, "q") qc = QuantumCircuit(qr) qc.rz(-np.pi / 2, qr[0]) qc.append(RXPI2Gate(), [qr[0]]) qc.rz(theta, qr[0]) qc.append(RXPI2DgGate(), [qr[0]]) qc.rz(np.pi / 2, qr[0]) sel.add_equivalence(RXGate(theta), qc)
[docs] def add_equivalences(sel: EquivalenceLibrary) -> None: """Add Rigetti gate equivalences to the session equivalence library.""" u_gate_equivalence(sel) rx_gate_equivalence(sel)