diff --git a/qiskit/transpiler/passes/calibration/rzx_builder.py b/qiskit/transpiler/passes/calibration/rzx_builder.py index 0b519a5a375a..6305861a7a76 100644 --- a/qiskit/transpiler/passes/calibration/rzx_builder.py +++ b/qiskit/transpiler/passes/calibration/rzx_builder.py @@ -360,7 +360,10 @@ def _check_calibration_type( cr_sched = inst_sched_map.get("ecr", tuple(reversed(qubits))) cal_type = CRCalType.ECR_REVERSE else: - raise QiskitError(f"{repr(cr_sched)} native direction cannot be determined.") + raise QiskitError( + f"Native direction cannot be determined: operation on qubits {qubits} " + f"for the following instruction schedule map:\n{inst_sched_map}" + ) cr_tones = [t[1] for t in filter_instructions(cr_sched, [_filter_cr_tone]).instructions] comp_tones = [t[1] for t in filter_instructions(cr_sched, [_filter_comp_tone]).instructions] diff --git a/releasenotes/notes/fix-exception-decription-3ba0b5db82c576cf.yaml b/releasenotes/notes/fix-exception-decription-3ba0b5db82c576cf.yaml new file mode 100644 index 000000000000..5733e1c85287 --- /dev/null +++ b/releasenotes/notes/fix-exception-decription-3ba0b5db82c576cf.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - Fix a bug in :class:`~.RZXCalibrationBuilder` where calling calibration with wrong parameters + would crash instead of raising exception. diff --git a/test/python/transpiler/test_calibrationbuilder.py b/test/python/transpiler/test_calibrationbuilder.py index aadbc25c0332..7baa39c8ad6a 100644 --- a/test/python/transpiler/test_calibrationbuilder.py +++ b/test/python/transpiler/test_calibrationbuilder.py @@ -16,10 +16,12 @@ import numpy as np from ddt import data, ddt +from qiskit.converters import circuit_to_dag -from qiskit import circuit, schedule +from qiskit import circuit, schedule, QiskitError from qiskit.circuit.library.standard_gates import SXGate, RZGate from qiskit.providers.fake_provider import FakeHanoi # TODO - include FakeHanoiV2, FakeSherbrooke +from qiskit.providers.fake_provider import FakeArmonk from qiskit.pulse import ( ControlChannel, DriveChannel, @@ -247,6 +249,24 @@ def test_rzx_calibration_rotary_pulse_stretch(self, theta: float): test_sched.duration, self.compute_stretch_duration(self.d1p_play(cr_schedule), theta) ) + def test_raise(self): + """Test that the correct error is raised.""" + theta = np.pi / 4 + + qc = circuit.QuantumCircuit(2) + qc.rzx(theta, 0, 1) + dag = circuit_to_dag(qc) + + backend = FakeArmonk() + inst_map = backend.defaults().instruction_schedule_map + _pass = RZXCalibrationBuilder(inst_map) + + qubit_map = {qubit: i for i, qubit in enumerate(dag.qubits)} + with self.assertRaises(QiskitError): + for node in dag.gate_nodes(): + qubits = [qubit_map[q] for q in node.qargs] + _pass.get_calibration(node.op, qubits) + def test_ecr_cx_forward(self): """Test that correct pulse sequence is generated for native CR pair.""" # Sufficiently large angle to avoid minimum duration, i.e. amplitude rescaling