From 341386144d6093f8765d08b695d1c2d2c56eac6f Mon Sep 17 00:00:00 2001 From: "mergify[bot]" <37929162+mergify[bot]@users.noreply.github.com> Date: Wed, 21 Aug 2024 13:20:15 +0000 Subject: [PATCH] Extended the `from_backend` method of `InstructionDurations` to support both `BackendV1` and `BackendV2` (#12941) (#13009) * Extended the `from_backend` method of `InstructionDurations` to support `GenericBackendV2` * Simplified the `from_backend` method to allow using `BackendV2`. Added a test and a releasenote. * Made changes to the releasenote. (cherry picked from commit 6107799ce19996ed125cb3f01663ad394e4eadbc) Co-authored-by: Shravan Patel <78003234+shravanpatel30@users.noreply.github.com> --- qiskit/transpiler/instruction_durations.py | 4 ++++ .../notes/fix-InstructionDurations-b47a9770b424d7a0.yaml | 5 +++++ test/python/transpiler/test_instruction_durations.py | 8 ++++++++ 3 files changed, 17 insertions(+) create mode 100644 releasenotes/notes/fix-InstructionDurations-b47a9770b424d7a0.yaml diff --git a/qiskit/transpiler/instruction_durations.py b/qiskit/transpiler/instruction_durations.py index 85d89bb16a18..56f8b5587c0c 100644 --- a/qiskit/transpiler/instruction_durations.py +++ b/qiskit/transpiler/instruction_durations.py @@ -18,6 +18,7 @@ from qiskit.circuit import Barrier, Delay, Instruction, ParameterExpression from qiskit.circuit.duration import duration_in_dt from qiskit.providers import Backend +from qiskit.providers.backend import BackendV2 from qiskit.transpiler.exceptions import TranspilerError from qiskit.utils.units import apply_prefix @@ -75,6 +76,9 @@ def from_backend(cls, backend: Backend): TranspilerError: If dt and dtm is different in the backend. """ # All durations in seconds in gate_length + if isinstance(backend, BackendV2): + return backend.target.durations() + instruction_durations = [] backend_properties = backend.properties() if hasattr(backend_properties, "_gates"): diff --git a/releasenotes/notes/fix-InstructionDurations-b47a9770b424d7a0.yaml b/releasenotes/notes/fix-InstructionDurations-b47a9770b424d7a0.yaml new file mode 100644 index 000000000000..ce8b789462de --- /dev/null +++ b/releasenotes/notes/fix-InstructionDurations-b47a9770b424d7a0.yaml @@ -0,0 +1,5 @@ +--- +fixes: + - | + Fixed a bug where :meth:`.InstructionDurations.from_backend` did not work for :class:`.BackendV2` backends. + Fixed `#12760 `. \ No newline at end of file diff --git a/test/python/transpiler/test_instruction_durations.py b/test/python/transpiler/test_instruction_durations.py index de68fbadf86a..c59d0ff2a6cc 100644 --- a/test/python/transpiler/test_instruction_durations.py +++ b/test/python/transpiler/test_instruction_durations.py @@ -16,6 +16,7 @@ from qiskit.circuit import Delay, Parameter from qiskit.providers.fake_provider import Fake27QPulseV1 +from qiskit.providers.fake_provider import GenericBackendV2 from qiskit.transpiler.exceptions import TranspilerError from qiskit.transpiler.instruction_durations import InstructionDurations from test import QiskitTestCase # pylint: disable=wrong-import-order @@ -92,3 +93,10 @@ def test_fail_if_get_unbounded_duration_with_unit_conversion_when_dt_is_not_prov parameterized_delay = Delay(param, "s") with self.assertRaises(TranspilerError): InstructionDurations().get(parameterized_delay, 0) + + def test_from_backend_with_backendv2(self): + """Test if `from_backend()` method allows using BackendV2""" + backend = GenericBackendV2(num_qubits=4, calibrate_instructions=True, seed=42) + inst_durations = InstructionDurations.from_backend(backend) + self.assertEqual(inst_durations, backend.target.durations()) + self.assertIsInstance(inst_durations, InstructionDurations)