|
18 | 18 |
|
19 | 19 | from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES |
20 | 20 | from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping |
| 21 | +from qiskit.circuit.quantumregister import Qubit |
21 | 22 | from qiskit.providers.backend_compat import BackendV2Converter |
22 | 23 | from qiskit.transpiler.coupling import CouplingMap |
23 | 24 | from qiskit.transpiler.exceptions import TranspilerError |
24 | 25 | from qiskit.transpiler.instruction_durations import InstructionDurations |
| 26 | +from qiskit.transpiler.layout import Layout |
25 | 27 | from qiskit.transpiler.passmanager_config import PassManagerConfig |
26 | 28 | from qiskit.transpiler.target import Target, target_to_backend_properties |
27 | 29 | from qiskit.transpiler.timing_constraints import TimingConstraints |
@@ -319,6 +321,10 @@ def generate_preset_pass_manager( |
319 | 321 | if backend_properties is None: |
320 | 322 | backend_properties = target_to_backend_properties(target) |
321 | 323 |
|
| 324 | + # Parse non-target dependent pm options |
| 325 | + initial_layout = _parse_initial_layout(initial_layout) |
| 326 | + approximation_degree = _parse_approximation_degree(approximation_degree) |
| 327 | + |
322 | 328 | pm_options = { |
323 | 329 | "target": target, |
324 | 330 | "basis_gates": basis_gates, |
@@ -470,3 +476,24 @@ def _parse_timing_constraints(backend, timing_constraints): |
470 | 476 | elif backend is not None: |
471 | 477 | timing_constraints = backend.target.timing_constraints() |
472 | 478 | return timing_constraints |
| 479 | + |
| 480 | + |
| 481 | +def _parse_initial_layout(initial_layout): |
| 482 | + # initial_layout could be None, or a list of ints, e.g. [0, 5, 14] |
| 483 | + # or a list of tuples/None e.g. [qr[0], None, qr[1]] or a dict e.g. {qr[0]: 0} |
| 484 | + if initial_layout is None or isinstance(initial_layout, Layout): |
| 485 | + return initial_layout |
| 486 | + if isinstance(initial_layout, dict): |
| 487 | + return Layout(initial_layout) |
| 488 | + initial_layout = list(initial_layout) |
| 489 | + if all(phys is None or isinstance(phys, Qubit) for phys in initial_layout): |
| 490 | + return Layout.from_qubit_list(initial_layout) |
| 491 | + return initial_layout |
| 492 | + |
| 493 | + |
| 494 | +def _parse_approximation_degree(approximation_degree): |
| 495 | + if approximation_degree is None: |
| 496 | + return None |
| 497 | + if approximation_degree < 0.0 or approximation_degree > 1.0: |
| 498 | + raise TranspilerError("Approximation degree must be in [0.0, 1.0]") |
| 499 | + return approximation_degree |
0 commit comments