qiskit 1.1.2__cp38-abi3-macosx_10_9_universal2.whl → 1.2.0__cp38-abi3-macosx_10_9_universal2.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +27 -24
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +1 -1
- qiskit/assembler/assemble_circuits.py +107 -64
- qiskit/assembler/assemble_schedules.py +5 -12
- qiskit/assembler/disassemble.py +10 -1
- qiskit/circuit/__init__.py +6 -3
- qiskit/circuit/_classical_resource_map.py +5 -5
- qiskit/circuit/_utils.py +0 -13
- qiskit/circuit/add_control.py +1 -1
- qiskit/circuit/annotated_operation.py +23 -1
- qiskit/circuit/classical/expr/expr.py +4 -4
- qiskit/circuit/classical/expr/visitors.py +1 -1
- qiskit/circuit/classical/types/__init__.py +1 -1
- qiskit/circuit/classical/types/types.py +2 -2
- qiskit/circuit/classicalfunction/boolean_expression.py +1 -1
- qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
- qiskit/circuit/classicalfunction/utils.py +1 -1
- qiskit/circuit/classicalregister.py +1 -1
- qiskit/circuit/commutation_checker.py +83 -35
- qiskit/circuit/controlflow/_builder_utils.py +1 -1
- qiskit/circuit/controlflow/builder.py +10 -6
- qiskit/circuit/controlflow/if_else.py +2 -2
- qiskit/circuit/controlflow/switch_case.py +1 -1
- qiskit/circuit/delay.py +1 -1
- qiskit/circuit/duration.py +2 -2
- qiskit/circuit/equivalence.py +5 -7
- qiskit/circuit/gate.py +11 -8
- qiskit/circuit/instruction.py +31 -13
- qiskit/circuit/instructionset.py +2 -5
- qiskit/circuit/library/__init__.py +2 -1
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
- qiskit/circuit/library/basis_change/__init__.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +40 -6
- qiskit/circuit/library/blueprintcircuit.py +3 -5
- qiskit/circuit/library/data_preparation/__init__.py +9 -2
- qiskit/circuit/library/data_preparation/initializer.py +8 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
- qiskit/circuit/library/generalized_gates/isometry.py +8 -8
- qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
- qiskit/circuit/library/generalized_gates/permutation.py +8 -9
- qiskit/circuit/library/generalized_gates/uc.py +3 -3
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
- qiskit/circuit/library/generalized_gates/unitary.py +13 -11
- qiskit/circuit/library/graph_state.py +1 -1
- qiskit/circuit/library/hamiltonian_gate.py +1 -2
- qiskit/circuit/library/hidden_linear_function.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
- qiskit/circuit/library/n_local/n_local.py +4 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
- qiskit/circuit/library/n_local/two_local.py +1 -1
- qiskit/circuit/library/overlap.py +11 -5
- qiskit/circuit/library/pauli_evolution.py +7 -3
- qiskit/circuit/library/standard_gates/dcx.py +3 -0
- qiskit/circuit/library/standard_gates/ecr.py +3 -0
- qiskit/circuit/library/standard_gates/global_phase.py +3 -0
- qiskit/circuit/library/standard_gates/h.py +13 -5
- qiskit/circuit/library/standard_gates/i.py +3 -0
- qiskit/circuit/library/standard_gates/iswap.py +3 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
- qiskit/circuit/library/standard_gates/p.py +14 -9
- qiskit/circuit/library/standard_gates/r.py +3 -0
- qiskit/circuit/library/standard_gates/rx.py +21 -6
- qiskit/circuit/library/standard_gates/rxx.py +40 -1
- qiskit/circuit/library/standard_gates/ry.py +21 -6
- qiskit/circuit/library/standard_gates/ryy.py +40 -1
- qiskit/circuit/library/standard_gates/rz.py +22 -6
- qiskit/circuit/library/standard_gates/rzx.py +40 -1
- qiskit/circuit/library/standard_gates/rzz.py +41 -2
- qiskit/circuit/library/standard_gates/s.py +77 -0
- qiskit/circuit/library/standard_gates/swap.py +12 -5
- qiskit/circuit/library/standard_gates/sx.py +14 -5
- qiskit/circuit/library/standard_gates/t.py +5 -0
- qiskit/circuit/library/standard_gates/u.py +22 -7
- qiskit/circuit/library/standard_gates/u1.py +8 -3
- qiskit/circuit/library/standard_gates/u2.py +3 -0
- qiskit/circuit/library/standard_gates/u3.py +22 -7
- qiskit/circuit/library/standard_gates/x.py +156 -92
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
- qiskit/circuit/library/standard_gates/y.py +6 -1
- qiskit/circuit/library/standard_gates/z.py +8 -1
- qiskit/circuit/operation.py +1 -1
- qiskit/circuit/parameter.py +9 -10
- qiskit/circuit/parameterexpression.py +16 -13
- qiskit/circuit/parametertable.py +1 -190
- qiskit/circuit/parametervector.py +1 -1
- qiskit/circuit/quantumcircuit.py +395 -387
- qiskit/circuit/quantumcircuitdata.py +3 -5
- qiskit/circuit/quantumregister.py +1 -1
- qiskit/circuit/random/__init__.py +1 -1
- qiskit/circuit/random/utils.py +175 -26
- qiskit/circuit/register.py +5 -7
- qiskit/circuit/singleton.py +3 -3
- qiskit/circuit/tools/pi_check.py +4 -4
- qiskit/compiler/assembler.py +95 -24
- qiskit/compiler/scheduler.py +2 -2
- qiskit/compiler/transpiler.py +42 -128
- qiskit/converters/circuit_to_dag.py +4 -6
- qiskit/converters/circuit_to_gate.py +4 -8
- qiskit/converters/circuit_to_instruction.py +5 -17
- qiskit/converters/dag_to_circuit.py +2 -6
- qiskit/dagcircuit/collect_blocks.py +2 -2
- qiskit/dagcircuit/dagcircuit.py +190 -187
- qiskit/dagcircuit/dagdependency.py +4 -4
- qiskit/dagcircuit/dagdependency_v2.py +4 -4
- qiskit/dagcircuit/dagdepnode.py +1 -1
- qiskit/dagcircuit/dagnode.py +66 -157
- qiskit/passmanager/flow_controllers.py +1 -1
- qiskit/passmanager/passmanager.py +3 -3
- qiskit/primitives/__init__.py +1 -5
- qiskit/primitives/backend_estimator.py +25 -15
- qiskit/primitives/backend_estimator_v2.py +31 -7
- qiskit/primitives/backend_sampler.py +21 -12
- qiskit/primitives/backend_sampler_v2.py +12 -3
- qiskit/primitives/base/base_estimator.py +31 -4
- qiskit/primitives/base/base_primitive.py +2 -2
- qiskit/primitives/base/base_result.py +2 -2
- qiskit/primitives/base/base_sampler.py +26 -2
- qiskit/primitives/base/estimator_result.py +2 -2
- qiskit/primitives/base/sampler_result.py +2 -2
- qiskit/primitives/containers/__init__.py +0 -1
- qiskit/primitives/containers/bindings_array.py +2 -2
- qiskit/primitives/containers/bit_array.py +108 -10
- qiskit/primitives/containers/shape.py +3 -3
- qiskit/primitives/estimator.py +9 -2
- qiskit/primitives/primitive_job.py +1 -1
- qiskit/primitives/sampler.py +10 -3
- qiskit/primitives/statevector_estimator.py +5 -3
- qiskit/primitives/statevector_sampler.py +11 -5
- qiskit/primitives/utils.py +16 -0
- qiskit/providers/backend.py +15 -6
- qiskit/providers/backend_compat.py +7 -4
- qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
- qiskit/providers/basic_provider/basic_simulator.py +33 -25
- qiskit/providers/fake_provider/fake_backend.py +10 -3
- qiskit/providers/fake_provider/fake_openpulse_2q.py +157 -149
- qiskit/providers/fake_provider/fake_openpulse_3q.py +228 -220
- qiskit/providers/fake_provider/fake_pulse_backend.py +2 -1
- qiskit/providers/fake_provider/fake_qasm_backend.py +7 -2
- qiskit/providers/fake_provider/generic_backend_v2.py +514 -68
- qiskit/providers/models/__init__.py +48 -11
- qiskit/providers/models/backendconfiguration.py +50 -4
- qiskit/providers/models/backendproperties.py +13 -2
- qiskit/providers/models/pulsedefaults.py +10 -11
- qiskit/providers/options.py +13 -13
- qiskit/providers/providerutils.py +3 -1
- qiskit/pulse/configuration.py +8 -12
- qiskit/pulse/instruction_schedule_map.py +3 -5
- qiskit/pulse/instructions/acquire.py +7 -8
- qiskit/pulse/instructions/instruction.py +2 -3
- qiskit/pulse/library/samplers/decorators.py +5 -9
- qiskit/pulse/library/symbolic_pulses.py +4 -7
- qiskit/pulse/library/waveform.py +2 -5
- qiskit/pulse/macros.py +11 -6
- qiskit/pulse/parser.py +8 -10
- qiskit/pulse/schedule.py +9 -17
- qiskit/pulse/transforms/alignments.py +1 -3
- qiskit/pulse/utils.py +1 -2
- qiskit/qasm/libs/stdgates.inc +35 -28
- qiskit/qasm2/__init__.py +7 -7
- qiskit/qasm2/export.py +5 -9
- qiskit/qasm2/parse.py +1 -1
- qiskit/qasm3/ast.py +9 -25
- qiskit/qasm3/exporter.py +582 -479
- qiskit/qasm3/printer.py +7 -16
- qiskit/qobj/common.py +10 -0
- qiskit/qobj/converters/lo_config.py +9 -0
- qiskit/qobj/converters/pulse_instruction.py +13 -6
- qiskit/qobj/pulse_qobj.py +69 -15
- qiskit/qobj/qasm_qobj.py +72 -20
- qiskit/qobj/utils.py +9 -0
- qiskit/qpy/__init__.py +1 -1
- qiskit/qpy/binary_io/circuits.py +8 -5
- qiskit/qpy/binary_io/schedules.py +1 -1
- qiskit/qpy/binary_io/value.py +3 -3
- qiskit/qpy/interface.py +3 -2
- qiskit/qpy/type_keys.py +2 -2
- qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
- qiskit/quantum_info/operators/channel/superop.py +2 -2
- qiskit/quantum_info/operators/channel/transformations.py +1 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
- qiskit/quantum_info/operators/dihedral/random.py +6 -3
- qiskit/quantum_info/operators/measures.py +2 -2
- qiskit/quantum_info/operators/op_shape.py +12 -20
- qiskit/quantum_info/operators/operator.py +14 -21
- qiskit/quantum_info/operators/predicates.py +1 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +3 -3
- qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
- qiskit/quantum_info/operators/symplectic/random.py +1 -1
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +15 -17
- qiskit/quantum_info/quaternion.py +1 -1
- qiskit/quantum_info/states/densitymatrix.py +5 -8
- qiskit/quantum_info/states/stabilizerstate.py +128 -37
- qiskit/quantum_info/states/statevector.py +4 -8
- qiskit/result/counts.py +2 -2
- qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
- qiskit/result/mitigation/local_readout_mitigator.py +2 -2
- qiskit/result/mitigation/utils.py +1 -3
- qiskit/result/models.py +17 -16
- qiskit/result/result.py +15 -20
- qiskit/scheduler/lowering.py +2 -2
- qiskit/synthesis/__init__.py +2 -1
- qiskit/synthesis/clifford/__init__.py +1 -1
- qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
- qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
- qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +1 -1
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +2 -2
- qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
- qiskit/synthesis/evolution/lie_trotter.py +46 -19
- qiskit/synthesis/evolution/product_formula.py +111 -55
- qiskit/synthesis/evolution/qdrift.py +40 -10
- qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
- qiskit/synthesis/linear/__init__.py +1 -0
- qiskit/synthesis/linear/cnot_synth.py +22 -96
- qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
- qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
- qiskit/synthesis/permutation/permutation_full.py +5 -29
- qiskit/synthesis/permutation/permutation_lnn.py +2 -24
- qiskit/synthesis/permutation/permutation_utils.py +2 -59
- qiskit/synthesis/qft/__init__.py +1 -0
- qiskit/synthesis/qft/qft_decompose_full.py +79 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
- qiskit/synthesis/two_qubit/local_invariance.py +8 -38
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
- qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
- qiskit/synthesis/unitary/qsd.py +5 -3
- qiskit/transpiler/__init__.py +1 -0
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/coupling.py +3 -3
- qiskit/transpiler/instruction_durations.py +1 -2
- qiskit/transpiler/layout.py +3 -3
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +84 -64
- qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
- qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
- qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
- qiskit/transpiler/passes/layout/apply_layout.py +13 -3
- qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
- qiskit/transpiler/passes/layout/set_layout.py +2 -2
- qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
- qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +17 -8
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
- qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
- qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
- qiskit/transpiler/passes/scheduling/alap.py +1 -2
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
- qiskit/transpiler/passes/scheduling/asap.py +1 -2
- qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -14
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
- qiskit/transpiler/passes/synthesis/plugin.py +2 -2
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +80 -40
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
- qiskit/transpiler/passes/utils/check_map.py +3 -6
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
- qiskit/transpiler/passes/utils/error.py +2 -2
- qiskit/transpiler/passes/utils/fixed_point.py +3 -3
- qiskit/transpiler/passes/utils/gate_direction.py +1 -1
- qiskit/transpiler/passes/utils/gates_basis.py +1 -2
- qiskit/transpiler/passmanager.py +7 -6
- qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +73 -18
- qiskit/transpiler/preset_passmanagers/common.py +3 -6
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
- qiskit/transpiler/preset_passmanagers/level0.py +1 -1
- qiskit/transpiler/target.py +27 -8
- qiskit/user_config.py +29 -6
- qiskit/utils/classtools.py +3 -3
- qiskit/utils/deprecation.py +3 -2
- qiskit/utils/lazy_tester.py +2 -2
- qiskit/utils/optionals.py +8 -8
- qiskit/visualization/bloch.py +18 -23
- qiskit/visualization/circuit/_utils.py +34 -10
- qiskit/visualization/circuit/circuit_visualization.py +23 -16
- qiskit/visualization/circuit/latex.py +29 -27
- qiskit/visualization/circuit/matplotlib.py +4 -2
- qiskit/visualization/circuit/qcstyle.py +2 -2
- qiskit/visualization/circuit/text.py +9 -15
- qiskit/visualization/dag_visualization.py +2 -2
- qiskit/visualization/pulse_v2/core.py +1 -1
- qiskit/visualization/pulse_v2/events.py +1 -1
- qiskit/visualization/pulse_v2/generators/frame.py +3 -4
- qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
- qiskit/visualization/pulse_v2/layouts.py +1 -5
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
- qiskit/visualization/state_visualization.py +5 -6
- qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
- qiskit/visualization/transition_visualization.py +7 -2
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/METADATA +12 -12
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/RECORD +342 -340
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/entry_points.txt +3 -0
- qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/WHEEL +0 -0
- {qiskit-1.1.2.dist-info → qiskit-1.2.0.dist-info}/top_level.txt +0 -0
qiskit/compiler/transpiler.py
CHANGED
@@ -13,7 +13,6 @@
|
|
13
13
|
# pylint: disable=invalid-sequence-index
|
14
14
|
|
15
15
|
"""Circuit transpile function"""
|
16
|
-
import copy
|
17
16
|
import logging
|
18
17
|
from time import time
|
19
18
|
from typing import List, Union, Dict, Callable, Any, Optional, TypeVar
|
@@ -21,20 +20,18 @@ import warnings
|
|
21
20
|
|
22
21
|
from qiskit import user_config
|
23
22
|
from qiskit.circuit.quantumcircuit import QuantumCircuit
|
24
|
-
from qiskit.circuit.quantumregister import Qubit
|
25
23
|
from qiskit.dagcircuit import DAGCircuit
|
26
24
|
from qiskit.providers.backend import Backend
|
27
25
|
from qiskit.providers.backend_compat import BackendV2Converter
|
28
|
-
from qiskit.providers.models import BackendProperties
|
26
|
+
from qiskit.providers.models.backendproperties import BackendProperties
|
29
27
|
from qiskit.pulse import Schedule, InstructionScheduleMap
|
30
28
|
from qiskit.transpiler import Layout, CouplingMap, PropertySet
|
31
29
|
from qiskit.transpiler.basepasses import BasePass
|
32
30
|
from qiskit.transpiler.exceptions import TranspilerError, CircuitTooWideForTarget
|
33
|
-
from qiskit.transpiler.instruction_durations import
|
31
|
+
from qiskit.transpiler.instruction_durations import InstructionDurationsType
|
34
32
|
from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig
|
35
33
|
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
|
36
|
-
from qiskit.transpiler.
|
37
|
-
from qiskit.transpiler.target import Target, target_to_backend_properties
|
34
|
+
from qiskit.transpiler.target import Target
|
38
35
|
|
39
36
|
logger = logging.getLogger(__name__)
|
40
37
|
|
@@ -318,10 +315,28 @@ def transpile( # pylint: disable=too-many-return-statements
|
|
318
315
|
optimization_level = config.get("transpile_optimization_level", 1)
|
319
316
|
|
320
317
|
if backend is not None and getattr(backend, "version", 0) <= 1:
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
318
|
+
warnings.warn(
|
319
|
+
"The `transpile` function will stop supporting inputs of "
|
320
|
+
f"type `BackendV1` ( {backend} ) in the `backend` parameter in a future "
|
321
|
+
"release no earlier than 2.0. `BackendV1` is deprecated and implementations "
|
322
|
+
"should move to `BackendV2`.",
|
323
|
+
category=DeprecationWarning,
|
324
|
+
stacklevel=2,
|
325
|
+
)
|
326
|
+
with warnings.catch_warnings():
|
327
|
+
# This is a temporary conversion step to allow for a smoother transition
|
328
|
+
# to a fully target-based transpiler pipeline while maintaining the behavior
|
329
|
+
# of `transpile` with BackendV1 inputs.
|
330
|
+
# TODO BackendV1 is deprecated and this path can be
|
331
|
+
# removed once it gets removed:
|
332
|
+
# https://github.com/Qiskit/qiskit/pull/12850
|
333
|
+
warnings.filterwarnings(
|
334
|
+
"ignore",
|
335
|
+
category=DeprecationWarning,
|
336
|
+
message=r".+qiskit\.providers\.backend_compat\.BackendV2Converter.+",
|
337
|
+
module="qiskit",
|
338
|
+
)
|
339
|
+
backend = BackendV2Converter(backend)
|
325
340
|
|
326
341
|
if (
|
327
342
|
scheduling_method is not None
|
@@ -335,73 +350,29 @@ def transpile( # pylint: disable=too-many-return-statements
|
|
335
350
|
UserWarning,
|
336
351
|
)
|
337
352
|
|
338
|
-
_skip_target = False
|
339
|
-
_given_inst_map = bool(inst_map) # check before inst_map is overwritten
|
340
|
-
# If a target is specified, have it override any implicit selections from a backend
|
341
|
-
if target is not None:
|
342
|
-
if coupling_map is None:
|
343
|
-
coupling_map = target.build_coupling_map()
|
344
|
-
if basis_gates is None:
|
345
|
-
basis_gates = list(target.operation_names)
|
346
|
-
if instruction_durations is None:
|
347
|
-
instruction_durations = target.durations()
|
348
|
-
if inst_map is None:
|
349
|
-
inst_map = target.instruction_schedule_map()
|
350
|
-
if dt is None:
|
351
|
-
dt = target.dt
|
352
|
-
if timing_constraints is None:
|
353
|
-
timing_constraints = target.timing_constraints()
|
354
|
-
if backend_properties is None:
|
355
|
-
backend_properties = target_to_backend_properties(target)
|
356
|
-
# If target is not specified and any hardware constraint object is
|
357
|
-
# manually specified, do not use the target from the backend as
|
358
|
-
# it is invalidated by a custom basis gate list, custom coupling map,
|
359
|
-
# custom dt or custom instruction_durations
|
360
|
-
elif (
|
361
|
-
basis_gates is not None # pylint: disable=too-many-boolean-expressions
|
362
|
-
or coupling_map is not None
|
363
|
-
or dt is not None
|
364
|
-
or instruction_durations is not None
|
365
|
-
or backend_properties is not None
|
366
|
-
or timing_constraints is not None
|
367
|
-
):
|
368
|
-
_skip_target = True
|
369
|
-
else:
|
370
|
-
target = getattr(backend, "target", None)
|
371
|
-
|
372
|
-
initial_layout = _parse_initial_layout(initial_layout)
|
373
|
-
coupling_map = _parse_coupling_map(coupling_map, backend)
|
374
|
-
approximation_degree = _parse_approximation_degree(approximation_degree)
|
375
|
-
|
376
|
-
output_name = _parse_output_name(output_name, circuits)
|
377
|
-
inst_map = _parse_inst_map(inst_map, backend)
|
378
|
-
|
379
|
-
_check_circuits_coupling_map(circuits, coupling_map, backend)
|
380
|
-
|
381
|
-
timing_constraints = _parse_timing_constraints(backend, timing_constraints)
|
382
|
-
instruction_durations = _parse_instruction_durations(backend, instruction_durations, dt)
|
383
|
-
|
384
|
-
if _given_inst_map and inst_map.has_custom_gate() and target is not None:
|
385
|
-
# Do not mutate backend target
|
386
|
-
target = copy.deepcopy(target)
|
387
|
-
target.update_from_instruction_schedule_map(inst_map)
|
388
|
-
|
389
353
|
if not ignore_backend_supplied_default_methods:
|
390
354
|
if scheduling_method is None and hasattr(backend, "get_scheduling_stage_plugin"):
|
391
355
|
scheduling_method = backend.get_scheduling_stage_plugin()
|
392
356
|
if translation_method is None and hasattr(backend, "get_translation_stage_plugin"):
|
393
357
|
translation_method = backend.get_translation_stage_plugin()
|
394
358
|
|
359
|
+
output_name = _parse_output_name(output_name, circuits)
|
360
|
+
coupling_map = _parse_coupling_map(coupling_map)
|
361
|
+
_check_circuits_coupling_map(circuits, coupling_map, backend)
|
362
|
+
|
363
|
+
# Edge cases require using the old model (loose constraints) instead of building a target,
|
364
|
+
# but we don't populate the passmanager config with loose constraints unless it's one of
|
365
|
+
# the known edge cases to control the execution path.
|
395
366
|
pm = generate_preset_pass_manager(
|
396
367
|
optimization_level,
|
397
|
-
backend=backend,
|
398
368
|
target=target,
|
369
|
+
backend=backend,
|
399
370
|
basis_gates=basis_gates,
|
400
|
-
inst_map=inst_map,
|
401
371
|
coupling_map=coupling_map,
|
402
372
|
instruction_durations=instruction_durations,
|
403
373
|
backend_properties=backend_properties,
|
404
374
|
timing_constraints=timing_constraints,
|
375
|
+
inst_map=inst_map,
|
405
376
|
initial_layout=initial_layout,
|
406
377
|
layout_method=layout_method,
|
407
378
|
routing_method=routing_method,
|
@@ -414,14 +385,15 @@ def transpile( # pylint: disable=too-many-return-statements
|
|
414
385
|
hls_config=hls_config,
|
415
386
|
init_method=init_method,
|
416
387
|
optimization_method=optimization_method,
|
417
|
-
|
388
|
+
dt=dt,
|
418
389
|
)
|
390
|
+
|
419
391
|
out_circuits = pm.run(circuits, callback=callback, num_processes=num_processes)
|
392
|
+
|
420
393
|
for name, circ in zip(output_name, out_circuits):
|
421
394
|
circ.name = name
|
422
395
|
end_time = time()
|
423
396
|
_log_transpile_time(start_time, end_time)
|
424
|
-
|
425
397
|
if arg_circuits_list:
|
426
398
|
return out_circuits
|
427
399
|
else:
|
@@ -447,72 +419,24 @@ def _check_circuits_coupling_map(circuits, cmap, backend):
|
|
447
419
|
|
448
420
|
|
449
421
|
def _log_transpile_time(start_time, end_time):
|
450
|
-
log_msg = "Total Transpile Time -
|
422
|
+
log_msg = f"Total Transpile Time - {((end_time - start_time) * 1000):.5f} (ms)"
|
451
423
|
logger.info(log_msg)
|
452
424
|
|
453
425
|
|
454
|
-
def
|
455
|
-
# try getting inst_map from user, else backend
|
456
|
-
if inst_map is None and backend is not None:
|
457
|
-
inst_map = backend.target.instruction_schedule_map()
|
458
|
-
return inst_map
|
459
|
-
|
460
|
-
|
461
|
-
def _parse_coupling_map(coupling_map, backend):
|
462
|
-
# try getting coupling_map from user, else backend
|
463
|
-
if coupling_map is None and backend is not None:
|
464
|
-
coupling_map = backend.coupling_map
|
465
|
-
|
426
|
+
def _parse_coupling_map(coupling_map):
|
466
427
|
# coupling_map could be None, or a list of lists, e.g. [[0, 1], [2, 1]]
|
467
|
-
if coupling_map is None or isinstance(coupling_map, CouplingMap):
|
468
|
-
return coupling_map
|
469
428
|
if isinstance(coupling_map, list) and all(
|
470
429
|
isinstance(i, list) and len(i) == 2 for i in coupling_map
|
471
430
|
):
|
472
431
|
return CouplingMap(coupling_map)
|
473
|
-
|
432
|
+
elif isinstance(coupling_map, list):
|
474
433
|
raise TranspilerError(
|
475
434
|
"Only a single input coupling map can be used with transpile() if you need to "
|
476
435
|
"target different coupling maps for different circuits you must call transpile() "
|
477
436
|
"multiple times"
|
478
437
|
)
|
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_instruction_durations(backend, inst_durations, dt):
|
495
|
-
"""Create a list of ``InstructionDuration``s. If ``inst_durations`` is provided,
|
496
|
-
the backend will be ignored, otherwise, the durations will be populated from the
|
497
|
-
backend.
|
498
|
-
"""
|
499
|
-
final_durations = InstructionDurations()
|
500
|
-
if not inst_durations:
|
501
|
-
backend_durations = InstructionDurations()
|
502
|
-
if backend is not None:
|
503
|
-
backend_durations = backend.instruction_durations
|
504
|
-
final_durations.update(backend_durations, dt or backend_durations.dt)
|
505
438
|
else:
|
506
|
-
|
507
|
-
return final_durations
|
508
|
-
|
509
|
-
|
510
|
-
def _parse_approximation_degree(approximation_degree):
|
511
|
-
if approximation_degree is None:
|
512
|
-
return None
|
513
|
-
if approximation_degree < 0.0 or approximation_degree > 1.0:
|
514
|
-
raise TranspilerError("Approximation degree must be in [0.0, 1.0]")
|
515
|
-
return approximation_degree
|
439
|
+
return coupling_map
|
516
440
|
|
517
441
|
|
518
442
|
def _parse_output_name(output_name, circuits):
|
@@ -545,17 +469,7 @@ def _parse_output_name(output_name, circuits):
|
|
545
469
|
else:
|
546
470
|
raise TranspilerError(
|
547
471
|
"The parameter output_name should be a string or a"
|
548
|
-
"list of strings:
|
472
|
+
f"list of strings: {type(output_name)} was used."
|
549
473
|
)
|
550
474
|
else:
|
551
475
|
return [circuit.name for circuit in circuits]
|
552
|
-
|
553
|
-
|
554
|
-
def _parse_timing_constraints(backend, timing_constraints):
|
555
|
-
if isinstance(timing_constraints, TimingConstraints):
|
556
|
-
return timing_constraints
|
557
|
-
if backend is None and timing_constraints is None:
|
558
|
-
timing_constraints = TimingConstraints()
|
559
|
-
elif backend is not None:
|
560
|
-
timing_constraints = backend.target.timing_constraints()
|
561
|
-
return timing_constraints
|
@@ -11,9 +11,8 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""Helper function for converting a circuit to a dag"""
|
14
|
-
import copy
|
15
14
|
|
16
|
-
from qiskit.dagcircuit.dagcircuit import DAGCircuit
|
15
|
+
from qiskit.dagcircuit.dagcircuit import DAGCircuit, DAGOpNode
|
17
16
|
|
18
17
|
|
19
18
|
def circuit_to_dag(circuit, copy_operations=True, *, qubit_order=None, clbit_order=None):
|
@@ -93,10 +92,9 @@ def circuit_to_dag(circuit, copy_operations=True, *, qubit_order=None, clbit_ord
|
|
93
92
|
dagcircuit.add_creg(register)
|
94
93
|
|
95
94
|
for instruction in circuit.data:
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
dagcircuit.apply_operation_back(op, instruction.qubits, instruction.clbits, check=False)
|
95
|
+
dagcircuit._apply_op_node_back(
|
96
|
+
DAGOpNode.from_instruction(instruction, dag=dagcircuit, deepcopy=copy_operations)
|
97
|
+
)
|
100
98
|
|
101
99
|
dagcircuit.duration = circuit.duration
|
102
100
|
dagcircuit.unit = circuit.unit
|
@@ -64,10 +64,8 @@ def circuit_to_gate(circuit, parameter_map=None, equivalence_library=None, label
|
|
64
64
|
for instruction in circuit.data:
|
65
65
|
if not _check_is_gate(instruction.operation):
|
66
66
|
raise QiskitError(
|
67
|
-
|
68
|
-
|
69
|
-
' a gate. "{}" is not a gate instruction'
|
70
|
-
).format(instruction.operation.name)
|
67
|
+
"One or more instructions cannot be converted to"
|
68
|
+
f' a gate. "{instruction.operation.name}" is not a gate instruction'
|
71
69
|
)
|
72
70
|
|
73
71
|
if parameter_map is None:
|
@@ -77,10 +75,8 @@ def circuit_to_gate(circuit, parameter_map=None, equivalence_library=None, label
|
|
77
75
|
|
78
76
|
if parameter_dict.keys() != circuit.parameters:
|
79
77
|
raise QiskitError(
|
80
|
-
|
81
|
-
|
82
|
-
"Circuit parameters: {}, parameter_map: {}"
|
83
|
-
).format(circuit.parameters, parameter_dict)
|
78
|
+
"parameter_map should map all circuit parameters. "
|
79
|
+
f"Circuit parameters: {circuit.parameters}, parameter_map: {parameter_dict}"
|
84
80
|
)
|
85
81
|
|
86
82
|
gate = Gate(
|
@@ -11,7 +11,6 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""Helper function for converting a circuit to an instruction."""
|
14
|
-
from qiskit.circuit.parametertable import ParameterTable, ParameterReferences
|
15
14
|
from qiskit.exceptions import QiskitError
|
16
15
|
from qiskit.circuit.instruction import Instruction
|
17
16
|
from qiskit.circuit.quantumregister import QuantumRegister
|
@@ -63,7 +62,7 @@ def circuit_to_instruction(circuit, parameter_map=None, equivalence_library=None
|
|
63
62
|
|
64
63
|
if circuit.num_input_vars:
|
65
64
|
# This could be supported by moving the `input` variables to be parameters of the
|
66
|
-
# instruction, but we don't really have a good
|
65
|
+
# instruction, but we don't really have a good representation of that yet, so safer to
|
67
66
|
# forbid it.
|
68
67
|
raise QiskitError("Circuits with 'input' variables cannot yet be converted to instructions")
|
69
68
|
if circuit.num_captured_vars:
|
@@ -90,10 +89,8 @@ def circuit_to_instruction(circuit, parameter_map=None, equivalence_library=None
|
|
90
89
|
|
91
90
|
if parameter_dict.keys() != circuit.parameters:
|
92
91
|
raise QiskitError(
|
93
|
-
|
94
|
-
|
95
|
-
"Circuit parameters: {}, parameter_map: {}"
|
96
|
-
).format(circuit.parameters, parameter_dict)
|
92
|
+
"parameter_map should map all circuit parameters. "
|
93
|
+
f"Circuit parameters: {circuit.parameters}, parameter_map: {parameter_dict}"
|
97
94
|
)
|
98
95
|
|
99
96
|
out_instruction = Instruction(
|
@@ -121,7 +118,7 @@ def circuit_to_instruction(circuit, parameter_map=None, equivalence_library=None
|
|
121
118
|
regs.append(creg)
|
122
119
|
|
123
120
|
clbit_map = {bit: creg[idx] for idx, bit in enumerate(circuit.clbits)}
|
124
|
-
operation_map = {
|
121
|
+
operation_map = {}
|
125
122
|
|
126
123
|
def fix_condition(op):
|
127
124
|
original_id = id(op)
|
@@ -145,19 +142,10 @@ def circuit_to_instruction(circuit, parameter_map=None, equivalence_library=None
|
|
145
142
|
|
146
143
|
data = target._data.copy()
|
147
144
|
data.replace_bits(qubits=qreg, clbits=creg)
|
148
|
-
data.
|
145
|
+
data.map_nonstandard_ops(fix_condition)
|
149
146
|
|
150
147
|
qc = QuantumCircuit(*regs, name=out_instruction.name)
|
151
148
|
qc._data = data
|
152
|
-
qc._parameter_table = ParameterTable(
|
153
|
-
{
|
154
|
-
param: ParameterReferences(
|
155
|
-
(operation_map[id(operation)], param_index)
|
156
|
-
for operation, param_index in target._parameter_table[param]
|
157
|
-
)
|
158
|
-
for param in target._parameter_table
|
159
|
-
}
|
160
|
-
)
|
161
149
|
|
162
150
|
if circuit.global_phase:
|
163
151
|
qc.global_phase = circuit.global_phase
|
@@ -11,9 +11,8 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""Helper function for converting a dag to a circuit."""
|
14
|
-
import copy
|
15
14
|
|
16
|
-
from qiskit.circuit import QuantumCircuit
|
15
|
+
from qiskit.circuit import QuantumCircuit
|
17
16
|
|
18
17
|
|
19
18
|
def dag_to_circuit(dag, copy_operations=True):
|
@@ -71,10 +70,7 @@ def dag_to_circuit(dag, copy_operations=True):
|
|
71
70
|
circuit.calibrations = dag.calibrations
|
72
71
|
|
73
72
|
for node in dag.topological_op_nodes():
|
74
|
-
|
75
|
-
if copy_operations:
|
76
|
-
op = copy.deepcopy(op)
|
77
|
-
circuit._append(CircuitInstruction(op, node.qargs, node.cargs))
|
73
|
+
circuit._append(node._to_circuit_instruction(deepcopy=copy_operations))
|
78
74
|
|
79
75
|
circuit.duration = dag.duration
|
80
76
|
circuit.unit = dag.unit
|
@@ -288,8 +288,8 @@ class BlockSplitter:
|
|
288
288
|
self.group[self.find_leader(first)].append(node)
|
289
289
|
|
290
290
|
blocks = []
|
291
|
-
for index in self.leader:
|
292
|
-
if
|
291
|
+
for index, item in self.leader.items():
|
292
|
+
if index == item:
|
293
293
|
blocks.append(self.group[index])
|
294
294
|
|
295
295
|
return blocks
|