Source code for mqt.bench.targets.devices.ionq

# 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

"""File to create a target device from the IonQ calibration data."""

from __future__ import annotations

from qiskit.circuit import IfElseOp, Parameter
from qiskit.circuit.library import Measure, RZGate
from qiskit.transpiler import InstructionProperties, Target

from ..gatesets.ionq import GPI2Gate, GPIGate, MSGate, ZZGate
from ._registry import register_device


[docs] @register_device("ionq_aria_25") def get_ionq_aria_25() -> Target: """Get the target device for IonQ Aria 1.""" num_qubits = 25 return _build_ionq_target( num_qubits=num_qubits, description="ionq_aria_25", entangling_gate="MS", oneq_duration=135e-6, twoq_duration=600e-6, readout_duration=300e-6, oneq_fidelity=0.9998, twoq_fidelity=0.98720, spam_fidelity=0.99370, )
[docs] @register_device("ionq_forte_36") def get_ionq_forte_36() -> Target: """Get the target device for IonQ Forte 1.""" num_qubits = 36 return _build_ionq_target( num_qubits=num_qubits, description="ionq_forte_36", entangling_gate="ZZ", oneq_duration=130e-6, twoq_duration=970e-6, readout_duration=150e-6, oneq_fidelity=0.9998, twoq_fidelity=0.9932, spam_fidelity=0.9959, )
def _build_ionq_target( *, num_qubits: int, description: str, entangling_gate: str, oneq_duration: float, twoq_duration: float, readout_duration: float, oneq_fidelity: float, twoq_fidelity: float, spam_fidelity: float, ) -> Target: """Construct a hardcoded IonQ target using mean values.""" target = Target(num_qubits=num_qubits, description=description) theta = Parameter("theta") phi = Parameter("phi") # === Add single-qubit gates === singleq_props = { (q,): InstructionProperties(duration=oneq_duration, error=1 - oneq_fidelity) for q in range(num_qubits) } rz_props = {(q,): InstructionProperties(duration=0, error=0) for q in range(num_qubits)} measure_props = { (q,): InstructionProperties(duration=readout_duration, error=1 - spam_fidelity) for q in range(num_qubits) } target.add_instruction(RZGate(theta), rz_props) target.add_instruction(GPIGate(theta), singleq_props) target.add_instruction(GPI2Gate(phi), singleq_props) target.add_instruction(Measure(), measure_props) # === Add two-qubit gates === connectivity = [(i, j) for i in range(num_qubits) for j in range(num_qubits) if i != j] twoq_props = { (q1, q2): InstructionProperties(duration=twoq_duration, error=1 - twoq_fidelity) for q1, q2 in connectivity } if entangling_gate == "MS": alpha = Parameter("alpha") beta = Parameter("beta") gamma = Parameter("gamma") target.add_instruction(MSGate(alpha, beta, gamma), twoq_props) elif entangling_gate == "ZZ": alpha = Parameter("alpha") target.add_instruction(ZZGate(alpha), twoq_props) else: msg = f"Unknown entangling gate: '{entangling_gate}'." raise ValueError(msg) # === Add control-flow ops === target.add_instruction(IfElseOp, name="if_else") return target