From e8eb5089bcc0bf02e81ca8e28396cfaabe9a4424 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Elena=20Pe=C3=B1a=20Tapia?= Date: Mon, 22 Jul 2024 11:58:39 +0200 Subject: [PATCH] Fix oversight from #12185 where two input parsing functions were not migrated from transpile to generate_preset_pm with the others. --- qiskit/compiler/transpiler.py | 25 ----------------- .../generate_preset_pass_manager.py | 27 +++++++++++++++++++ 2 files changed, 27 insertions(+), 25 deletions(-) diff --git a/qiskit/compiler/transpiler.py b/qiskit/compiler/transpiler.py index 183e260739ba..9c74d10a7b63 100644 --- a/qiskit/compiler/transpiler.py +++ b/qiskit/compiler/transpiler.py @@ -20,7 +20,6 @@ from qiskit import user_config from qiskit.circuit.quantumcircuit import QuantumCircuit -from qiskit.circuit.quantumregister import Qubit from qiskit.dagcircuit import DAGCircuit from qiskit.providers.backend import Backend from qiskit.providers.backend_compat import BackendV2Converter @@ -339,10 +338,7 @@ def callback_func(**kwargs): if translation_method is None and hasattr(backend, "get_translation_stage_plugin"): translation_method = backend.get_translation_stage_plugin() - initial_layout = _parse_initial_layout(initial_layout) - approximation_degree = _parse_approximation_degree(approximation_degree) output_name = _parse_output_name(output_name, circuits) - coupling_map = _parse_coupling_map(coupling_map) _check_circuits_coupling_map(circuits, coupling_map, backend) @@ -425,27 +421,6 @@ def _parse_coupling_map(coupling_map): return coupling_map -def _parse_initial_layout(initial_layout): - # initial_layout could be None, or a list of ints, e.g. [0, 5, 14] - # or a list of tuples/None e.g. [qr[0], None, qr[1]] or a dict e.g. {qr[0]: 0} - if initial_layout is None or isinstance(initial_layout, Layout): - return initial_layout - if isinstance(initial_layout, dict): - return Layout(initial_layout) - initial_layout = list(initial_layout) - if all(phys is None or isinstance(phys, Qubit) for phys in initial_layout): - return Layout.from_qubit_list(initial_layout) - return initial_layout - - -def _parse_approximation_degree(approximation_degree): - if approximation_degree is None: - return None - if approximation_degree < 0.0 or approximation_degree > 1.0: - raise TranspilerError("Approximation degree must be in [0.0, 1.0]") - return approximation_degree - - def _parse_output_name(output_name, circuits): # naming and returning circuits # output_name could be either a string or a list diff --git a/qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py b/qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py index b8f342bd86be..6023f2a4b6aa 100644 --- a/qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +++ b/qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py @@ -18,10 +18,12 @@ from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping +from qiskit.circuit.quantumregister import Qubit from qiskit.providers.backend_compat import BackendV2Converter from qiskit.transpiler.coupling import CouplingMap from qiskit.transpiler.exceptions import TranspilerError from qiskit.transpiler.instruction_durations import InstructionDurations +from qiskit.transpiler.layout import Layout from qiskit.transpiler.passmanager_config import PassManagerConfig from qiskit.transpiler.target import Target, target_to_backend_properties from qiskit.transpiler.timing_constraints import TimingConstraints @@ -319,6 +321,10 @@ def generate_preset_pass_manager( if backend_properties is None: backend_properties = target_to_backend_properties(target) + # Parse non-target dependent pm options + initial_layout = _parse_initial_layout(initial_layout) + approximation_degree = _parse_approximation_degree(approximation_degree) + pm_options = { "target": target, "basis_gates": basis_gates, @@ -470,3 +476,24 @@ def _parse_timing_constraints(backend, timing_constraints): elif backend is not None: timing_constraints = backend.target.timing_constraints() return timing_constraints + + +def _parse_initial_layout(initial_layout): + # initial_layout could be None, or a list of ints, e.g. [0, 5, 14] + # or a list of tuples/None e.g. [qr[0], None, qr[1]] or a dict e.g. {qr[0]: 0} + if initial_layout is None or isinstance(initial_layout, Layout): + return initial_layout + if isinstance(initial_layout, dict): + return Layout(initial_layout) + initial_layout = list(initial_layout) + if all(phys is None or isinstance(phys, Qubit) for phys in initial_layout): + return Layout.from_qubit_list(initial_layout) + return initial_layout + + +def _parse_approximation_degree(approximation_degree): + if approximation_degree is None: + return None + if approximation_degree < 0.0 or approximation_degree > 1.0: + raise TranspilerError("Approximation degree must be in [0.0, 1.0]") + return approximation_degree