qiskit 1.3.0__cp39-abi3-win32.whl → 1.3.0b1__cp39-abi3-win32.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 +1 -20
- qiskit/_accelerate.pyd +0 -0
- qiskit/assembler/assemble_schedules.py +0 -2
- qiskit/circuit/__init__.py +1 -44
- qiskit/circuit/_standard_gates_commutations.py +0 -585
- qiskit/circuit/barrier.py +0 -2
- qiskit/circuit/controlflow/builder.py +3 -3
- qiskit/circuit/controlflow/if_else.py +5 -13
- qiskit/circuit/controlflow/while_loop.py +2 -10
- qiskit/circuit/delay.py +3 -20
- qiskit/circuit/equivalence.py +214 -13
- qiskit/circuit/gate.py +1 -3
- qiskit/circuit/instruction.py +11 -32
- qiskit/circuit/instructionset.py +0 -2
- qiskit/circuit/library/__init__.py +14 -110
- qiskit/circuit/library/arithmetic/__init__.py +2 -9
- qiskit/circuit/library/arithmetic/adders/__init__.py +0 -1
- qiskit/circuit/library/arithmetic/adders/adder.py +2 -154
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +56 -20
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +1 -14
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +91 -21
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +0 -1
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -8
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +3 -94
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +1 -8
- qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +38 -20
- qiskit/circuit/library/blueprintcircuit.py +0 -64
- qiskit/circuit/library/boolean_logic/__init__.py +4 -4
- qiskit/circuit/library/boolean_logic/inner_product.py +4 -81
- qiskit/circuit/library/boolean_logic/quantum_and.py +4 -107
- qiskit/circuit/library/boolean_logic/quantum_or.py +3 -107
- qiskit/circuit/library/boolean_logic/quantum_xor.py +3 -97
- qiskit/circuit/library/data_preparation/__init__.py +3 -6
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +29 -342
- qiskit/circuit/library/data_preparation/{_z_feature_map.py → z_feature_map.py} +34 -45
- qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
- qiskit/circuit/library/fourier_checking.py +11 -72
- qiskit/circuit/library/generalized_gates/__init__.py +1 -1
- qiskit/circuit/library/generalized_gates/diagonal.py +51 -45
- qiskit/circuit/library/generalized_gates/gms.py +14 -67
- qiskit/circuit/library/generalized_gates/gr.py +4 -4
- qiskit/circuit/library/generalized_gates/isometry.py +2 -2
- qiskit/circuit/library/generalized_gates/linear_function.py +6 -12
- qiskit/circuit/library/generalized_gates/mcmt.py +107 -167
- qiskit/circuit/library/generalized_gates/permutation.py +6 -8
- qiskit/circuit/library/generalized_gates/rv.py +9 -8
- qiskit/circuit/library/graph_state.py +10 -93
- qiskit/circuit/library/grover_operator.py +2 -270
- qiskit/circuit/library/hidden_linear_function.py +20 -83
- qiskit/circuit/library/iqp.py +20 -99
- qiskit/circuit/library/n_local/__init__.py +7 -19
- qiskit/circuit/library/n_local/efficient_su2.py +5 -118
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +0 -259
- qiskit/circuit/library/n_local/excitation_preserving.py +6 -130
- qiskit/circuit/library/n_local/n_local.py +5 -406
- qiskit/circuit/library/n_local/pauli_two_design.py +4 -106
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -80
- qiskit/circuit/library/n_local/real_amplitudes.py +7 -127
- qiskit/circuit/library/n_local/two_local.py +7 -14
- qiskit/circuit/library/overlap.py +26 -91
- qiskit/circuit/library/pauli_evolution.py +15 -17
- qiskit/circuit/library/phase_estimation.py +4 -80
- qiskit/circuit/library/quantum_volume.py +20 -72
- qiskit/circuit/library/standard_gates/__init__.py +1 -20
- qiskit/circuit/library/standard_gates/dcx.py +1 -2
- qiskit/circuit/library/standard_gates/ecr.py +2 -2
- qiskit/circuit/library/standard_gates/h.py +3 -4
- qiskit/circuit/library/standard_gates/i.py +1 -2
- qiskit/circuit/library/standard_gates/iswap.py +2 -2
- qiskit/circuit/library/standard_gates/p.py +12 -20
- qiskit/circuit/library/standard_gates/r.py +1 -1
- qiskit/circuit/library/standard_gates/rx.py +3 -4
- qiskit/circuit/library/standard_gates/rxx.py +2 -2
- qiskit/circuit/library/standard_gates/ry.py +3 -4
- qiskit/circuit/library/standard_gates/ryy.py +2 -2
- qiskit/circuit/library/standard_gates/rz.py +12 -13
- qiskit/circuit/library/standard_gates/rzx.py +6 -6
- qiskit/circuit/library/standard_gates/rzz.py +1 -1
- qiskit/circuit/library/standard_gates/s.py +4 -4
- qiskit/circuit/library/standard_gates/swap.py +3 -3
- qiskit/circuit/library/standard_gates/sx.py +3 -4
- qiskit/circuit/library/standard_gates/t.py +2 -2
- qiskit/circuit/library/standard_gates/u.py +3 -11
- qiskit/circuit/library/standard_gates/u1.py +15 -65
- qiskit/circuit/library/standard_gates/u2.py +1 -4
- qiskit/circuit/library/standard_gates/u3.py +3 -31
- qiskit/circuit/library/standard_gates/x.py +5 -7
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
- qiskit/circuit/library/standard_gates/y.py +3 -4
- qiskit/circuit/library/standard_gates/z.py +3 -3
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +7 -9
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +8 -9
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +9 -10
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +9 -10
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +7 -9
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +8 -10
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +14 -16
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +12 -14
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +12 -14
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +11 -13
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +9 -11
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +10 -12
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +10 -12
- qiskit/circuit/library/templates/rzx/rzx_cy.py +10 -11
- qiskit/circuit/library/templates/rzx/rzx_xz.py +15 -16
- qiskit/circuit/library/templates/rzx/rzx_yz.py +10 -12
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +20 -22
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +15 -16
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +15 -17
- qiskit/circuit/parameter.py +0 -4
- qiskit/circuit/parameterexpression.py +34 -167
- qiskit/circuit/quantumcircuit.py +126 -162
- qiskit/circuit/singleton.py +0 -2
- qiskit/circuit/store.py +0 -2
- qiskit/compiler/assembler.py +4 -17
- qiskit/compiler/scheduler.py +0 -2
- qiskit/compiler/sequencer.py +0 -2
- qiskit/compiler/transpiler.py +26 -81
- qiskit/converters/circuit_to_dag.py +2 -2
- qiskit/converters/circuit_to_dagdependency.py +1 -1
- qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
- qiskit/converters/circuit_to_instruction.py +1 -1
- qiskit/converters/dag_to_circuit.py +5 -7
- qiskit/converters/dag_to_dagdependency.py +1 -1
- qiskit/converters/dag_to_dagdependency_v2.py +1 -1
- qiskit/converters/dagdependency_to_circuit.py +1 -5
- qiskit/converters/dagdependency_to_dag.py +1 -6
- qiskit/dagcircuit/collect_blocks.py +3 -3
- qiskit/dagcircuit/dagdependency.py +5 -18
- qiskit/dagcircuit/dagdependency_v2.py +1 -1
- qiskit/dagcircuit/dagnode.py +2 -2
- qiskit/passmanager/__init__.py +2 -2
- qiskit/primitives/backend_estimator.py +2 -5
- qiskit/primitives/backend_sampler_v2.py +18 -61
- qiskit/primitives/base/base_estimator.py +2 -2
- qiskit/primitives/containers/data_bin.py +1 -9
- qiskit/primitives/statevector_sampler.py +1 -1
- qiskit/primitives/utils.py +1 -1
- qiskit/providers/__init__.py +3 -3
- qiskit/providers/backend.py +1 -12
- qiskit/providers/backend_compat.py +3 -23
- qiskit/providers/basic_provider/basic_simulator.py +2 -12
- qiskit/providers/fake_provider/fake_pulse_backend.py +1 -6
- qiskit/providers/fake_provider/generic_backend_v2.py +30 -46
- qiskit/providers/models/pulsedefaults.py +0 -2
- qiskit/pulse/builder.py +18 -59
- qiskit/pulse/calibration_entries.py +1 -4
- qiskit/pulse/channels.py +0 -2
- qiskit/pulse/exceptions.py +0 -2
- qiskit/pulse/instruction_schedule_map.py +6 -21
- qiskit/pulse/instructions/acquire.py +0 -2
- qiskit/pulse/instructions/delay.py +0 -2
- qiskit/pulse/instructions/directives.py +0 -8
- qiskit/pulse/instructions/frequency.py +0 -3
- qiskit/pulse/instructions/instruction.py +0 -2
- qiskit/pulse/instructions/phase.py +0 -3
- qiskit/pulse/instructions/play.py +0 -2
- qiskit/pulse/instructions/reference.py +0 -2
- qiskit/pulse/instructions/snapshot.py +0 -2
- qiskit/pulse/library/pulse.py +0 -2
- qiskit/pulse/library/symbolic_pulses.py +0 -28
- qiskit/pulse/library/waveform.py +0 -2
- qiskit/pulse/macros.py +1 -1
- qiskit/pulse/schedule.py +13 -12
- qiskit/pulse/transforms/alignments.py +3 -5
- qiskit/pulse/transforms/dag.py +0 -7
- qiskit/qasm2/export.py +3 -5
- qiskit/qasm2/parse.py +2 -46
- qiskit/qasm3/__init__.py +0 -1
- qiskit/qasm3/ast.py +15 -123
- qiskit/qasm3/exporter.py +77 -103
- qiskit/qobj/converters/pulse_instruction.py +4 -6
- qiskit/qpy/__init__.py +0 -181
- qiskit/qpy/binary_io/circuits.py +5 -20
- qiskit/qpy/binary_io/schedules.py +4 -3
- qiskit/qpy/binary_io/value.py +13 -310
- qiskit/qpy/common.py +2 -46
- qiskit/qpy/formats.py +0 -7
- qiskit/qpy/interface.py +4 -40
- qiskit/quantum_info/__init__.py +0 -4
- qiskit/quantum_info/operators/channel/transformations.py +21 -28
- qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
- qiskit/quantum_info/operators/operator.py +8 -54
- qiskit/quantum_info/operators/symplectic/base_pauli.py +19 -11
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +0 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +2 -23
- qiskit/quantum_info/states/densitymatrix.py +5 -5
- qiskit/quantum_info/states/stabilizerstate.py +1 -1
- qiskit/quantum_info/states/statevector.py +6 -6
- qiskit/result/mitigation/base_readout_mitigator.py +1 -1
- qiskit/result/mitigation/correlated_readout_mitigator.py +1 -9
- qiskit/result/mitigation/local_readout_mitigator.py +1 -9
- qiskit/result/mitigation/utils.py +0 -57
- qiskit/scheduler/config.py +0 -2
- qiskit/scheduler/methods/basic.py +0 -3
- qiskit/scheduler/schedule_circuit.py +0 -2
- qiskit/scheduler/sequence.py +0 -2
- qiskit/synthesis/__init__.py +0 -25
- qiskit/synthesis/clifford/clifford_decompose_bm.py +2 -1
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +2 -3
- qiskit/synthesis/clifford/clifford_decompose_layers.py +1 -2
- qiskit/synthesis/evolution/__init__.py +0 -1
- qiskit/synthesis/evolution/lie_trotter.py +42 -16
- qiskit/synthesis/evolution/product_formula.py +238 -165
- qiskit/synthesis/evolution/qdrift.py +29 -36
- qiskit/synthesis/evolution/suzuki_trotter.py +27 -87
- qiskit/synthesis/multi_controlled/__init__.py +0 -1
- qiskit/synthesis/qft/qft_decompose_full.py +1 -19
- qiskit/synthesis/qft/qft_decompose_lnn.py +1 -2
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +1 -2
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +63 -4
- qiskit/synthesis/two_qubit/weyl.py +97 -0
- qiskit/synthesis/unitary/qsd.py +5 -5
- qiskit/transpiler/__init__.py +14 -21
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/passes/__init__.py +0 -2
- qiskit/transpiler/passes/basis/basis_translator.py +565 -9
- qiskit/transpiler/passes/basis/decompose.py +12 -45
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
- qiskit/transpiler/passes/calibration/pulse_gate.py +2 -4
- qiskit/transpiler/passes/calibration/rx_builder.py +7 -11
- qiskit/transpiler/passes/calibration/rzx_builder.py +30 -46
- qiskit/transpiler/passes/layout/disjoint_utils.py +13 -15
- qiskit/transpiler/passes/layout/sabre_layout.py +2 -7
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +0 -5
- qiskit/transpiler/passes/optimization/__init__.py +0 -1
- qiskit/transpiler/passes/optimization/collect_cliffords.py +3 -19
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +131 -48
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +2 -4
- qiskit/transpiler/passes/optimization/elide_permutations.py +32 -9
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +0 -2
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +11 -5
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +3 -7
- qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
- qiskit/transpiler/passes/scheduling/alap.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -2
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
- qiskit/transpiler/passes/scheduling/asap.py +1 -1
- qiskit/transpiler/passes/scheduling/base_scheduler.py +12 -14
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +4 -9
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +5 -16
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +1 -4
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +2 -6
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -9
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +99 -262
- qiskit/transpiler/passes/synthesis/hls_plugins.py +7 -638
- qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -55
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +56 -2
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -5
- qiskit/transpiler/passes/utils/gate_direction.py +275 -12
- qiskit/transpiler/passes/utils/gates_basis.py +30 -7
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +1 -2
- qiskit/transpiler/passmanager_config.py +4 -22
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +14 -40
- qiskit/transpiler/preset_passmanagers/common.py +3 -5
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +42 -125
- qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
- qiskit/transpiler/target.py +16 -74
- qiskit/visualization/circuit/_utils.py +2 -2
- qiskit/visualization/circuit/circuit_visualization.py +2 -3
- qiskit/visualization/circuit/matplotlib.py +1 -1
- qiskit/visualization/dag_visualization.py +1 -1
- qiskit/visualization/pass_manager_visualization.py +14 -3
- qiskit/visualization/pulse_v2/interface.py +1 -3
- qiskit/visualization/timeline/core.py +2 -25
- qiskit/visualization/timeline/interface.py +0 -12
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/METADATA +19 -20
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/RECORD +347 -358
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/WHEEL +1 -1
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/entry_points.txt +0 -19
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +0 -150
- qiskit/circuit/twirling.py +0 -145
- qiskit/synthesis/arithmetic/__init__.py +0 -16
- qiskit/synthesis/arithmetic/adders/__init__.py +0 -17
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +0 -154
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +0 -103
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +0 -161
- qiskit/synthesis/arithmetic/multipliers/__init__.py +0 -16
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +0 -102
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +0 -99
- qiskit/synthesis/evolution/pauli_network.py +0 -80
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +0 -52
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +0 -69
- qiskit/utils/deprecate_pulse.py +0 -119
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.3.0.dist-info → qiskit-1.3.0b1.dist-info}/top_level.txt +0 -0
@@ -10,17 +10,40 @@
|
|
10
10
|
# copyright notice, and modified files need to carry a notice indicating
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
|
-
"""Rearrange the direction of the
|
13
|
+
"""Rearrange the direction of the cx nodes to match the directed coupling map."""
|
14
|
+
|
15
|
+
from math import pi
|
14
16
|
|
15
17
|
from qiskit.transpiler.basepasses import TransformationPass
|
16
|
-
from qiskit.
|
18
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
19
|
+
|
20
|
+
from qiskit.converters import dag_to_circuit, circuit_to_dag
|
21
|
+
from qiskit.circuit import QuantumRegister, ControlFlowOp
|
22
|
+
from qiskit.dagcircuit import DAGCircuit, DAGOpNode
|
23
|
+
from qiskit.circuit.library.standard_gates import (
|
24
|
+
SGate,
|
25
|
+
SdgGate,
|
26
|
+
SXGate,
|
27
|
+
HGate,
|
28
|
+
CXGate,
|
29
|
+
CZGate,
|
30
|
+
ECRGate,
|
31
|
+
RXXGate,
|
32
|
+
RYYGate,
|
33
|
+
RZZGate,
|
34
|
+
RZXGate,
|
35
|
+
SwapGate,
|
36
|
+
)
|
37
|
+
|
38
|
+
|
39
|
+
def _swap_node_qargs(node):
|
40
|
+
return DAGOpNode(node.op, node.qargs[::-1], node.cargs)
|
17
41
|
|
18
42
|
|
19
43
|
class GateDirection(TransformationPass):
|
20
44
|
"""Modify asymmetric gates to match the hardware coupling direction.
|
21
45
|
|
22
|
-
This pass
|
23
|
-
`rzz` gates, using the following identities::
|
46
|
+
This pass makes use of the following identities::
|
24
47
|
|
25
48
|
┌───┐┌───┐┌───┐
|
26
49
|
q_0: ──■── q_0: ┤ H ├┤ X ├┤ H ├
|
@@ -35,9 +58,6 @@ class GateDirection(TransformationPass):
|
|
35
58
|
│ ECR │ = ┌┴───┴┐├────┤└┬───┬┘│ Ecr │├───┤
|
36
59
|
q_1: ┤1 ├ q_1: ┤ Sdg ├┤ √X ├─┤ S ├─┤0 ├┤ H ├
|
37
60
|
└──────┘ └─────┘└────┘ └───┘ └──────┘└───┘
|
38
|
-
Note: This is done in terms of less-efficient S/SX/Sdg gates instead of the more natural
|
39
|
-
`RY(pi /2)` so we have a chance for basis translation to keep things in a discrete basis
|
40
|
-
during resynthesis, if that's what's being asked for.
|
41
61
|
|
42
62
|
|
43
63
|
┌──────┐ ┌───┐┌──────┐┌───┐
|
@@ -46,18 +66,18 @@ class GateDirection(TransformationPass):
|
|
46
66
|
q_1: ┤1 ├ q_1: ┤ H ├┤0 ├┤ H ├
|
47
67
|
└──────┘ └───┘└──────┘└───┘
|
48
68
|
|
49
|
-
cz, swap, rxx, ryy and rzz directions are fixed by reversing their qargs order.
|
50
|
-
|
51
69
|
This pass assumes that the positions of the qubits in the :attr:`.DAGCircuit.qubits` attribute
|
52
70
|
are the physical qubit indices. For example if ``dag.qubits[0]`` is qubit 0 in the
|
53
71
|
:class:`.CouplingMap` or :class:`.Target`.
|
54
72
|
"""
|
55
73
|
|
74
|
+
_KNOWN_REPLACEMENTS = frozenset(["cx", "cz", "ecr", "swap", "rzx", "rxx", "ryy", "rzz"])
|
75
|
+
|
56
76
|
def __init__(self, coupling_map, target=None):
|
57
77
|
"""GateDirection pass.
|
58
78
|
|
59
79
|
Args:
|
60
|
-
coupling_map (CouplingMap): Directed graph
|
80
|
+
coupling_map (CouplingMap): Directed graph represented a coupling map.
|
61
81
|
target (Target): The backend target to use for this pass. If this is specified
|
62
82
|
it will be used instead of the coupling map
|
63
83
|
"""
|
@@ -65,6 +85,248 @@ class GateDirection(TransformationPass):
|
|
65
85
|
self.coupling_map = coupling_map
|
66
86
|
self.target = target
|
67
87
|
|
88
|
+
# Create the replacement dag and associated register.
|
89
|
+
self._cx_dag = DAGCircuit()
|
90
|
+
qr = QuantumRegister(2)
|
91
|
+
self._cx_dag.add_qreg(qr)
|
92
|
+
self._cx_dag.apply_operation_back(HGate(), [qr[0]], [])
|
93
|
+
self._cx_dag.apply_operation_back(HGate(), [qr[1]], [])
|
94
|
+
self._cx_dag.apply_operation_back(CXGate(), [qr[1], qr[0]], [])
|
95
|
+
self._cx_dag.apply_operation_back(HGate(), [qr[0]], [])
|
96
|
+
self._cx_dag.apply_operation_back(HGate(), [qr[1]], [])
|
97
|
+
|
98
|
+
# This is done in terms of less-efficient S/SX/Sdg gates instead of the more natural
|
99
|
+
# `RY(pi /2)` so we have a chance for basis translation to keep things in a discrete basis
|
100
|
+
# during resynthesis, if that's what's being asked for.
|
101
|
+
self._ecr_dag = DAGCircuit()
|
102
|
+
qr = QuantumRegister(2)
|
103
|
+
self._ecr_dag.global_phase = -pi / 2
|
104
|
+
self._ecr_dag.add_qreg(qr)
|
105
|
+
self._ecr_dag.apply_operation_back(SGate(), [qr[0]], [])
|
106
|
+
self._ecr_dag.apply_operation_back(SXGate(), [qr[0]], [])
|
107
|
+
self._ecr_dag.apply_operation_back(SdgGate(), [qr[0]], [])
|
108
|
+
self._ecr_dag.apply_operation_back(SdgGate(), [qr[1]], [])
|
109
|
+
self._ecr_dag.apply_operation_back(SXGate(), [qr[1]], [])
|
110
|
+
self._ecr_dag.apply_operation_back(SGate(), [qr[1]], [])
|
111
|
+
self._ecr_dag.apply_operation_back(ECRGate(), [qr[1], qr[0]], [])
|
112
|
+
self._ecr_dag.apply_operation_back(HGate(), [qr[0]], [])
|
113
|
+
self._ecr_dag.apply_operation_back(HGate(), [qr[1]], [])
|
114
|
+
|
115
|
+
self._cz_dag = DAGCircuit()
|
116
|
+
qr = QuantumRegister(2)
|
117
|
+
self._cz_dag.add_qreg(qr)
|
118
|
+
self._cz_dag.apply_operation_back(CZGate(), [qr[1], qr[0]], [])
|
119
|
+
|
120
|
+
self._swap_dag = DAGCircuit()
|
121
|
+
qr = QuantumRegister(2)
|
122
|
+
self._swap_dag.add_qreg(qr)
|
123
|
+
self._swap_dag.apply_operation_back(SwapGate(), [qr[1], qr[0]], [])
|
124
|
+
|
125
|
+
# If adding more replacements (either static or dynamic), also update the class variable
|
126
|
+
# `_KNOWN_REPLACMENTS` to include them in the error messages.
|
127
|
+
self._static_replacements = {
|
128
|
+
"cx": self._cx_dag,
|
129
|
+
"cz": self._cz_dag,
|
130
|
+
"ecr": self._ecr_dag,
|
131
|
+
"swap": self._swap_dag,
|
132
|
+
}
|
133
|
+
|
134
|
+
@staticmethod
|
135
|
+
def _rzx_dag(parameter):
|
136
|
+
_rzx_dag = DAGCircuit()
|
137
|
+
qr = QuantumRegister(2)
|
138
|
+
_rzx_dag.add_qreg(qr)
|
139
|
+
_rzx_dag.apply_operation_back(HGate(), [qr[0]], [])
|
140
|
+
_rzx_dag.apply_operation_back(HGate(), [qr[1]], [])
|
141
|
+
_rzx_dag.apply_operation_back(RZXGate(parameter), [qr[1], qr[0]], [])
|
142
|
+
_rzx_dag.apply_operation_back(HGate(), [qr[0]], [])
|
143
|
+
_rzx_dag.apply_operation_back(HGate(), [qr[1]], [])
|
144
|
+
return _rzx_dag
|
145
|
+
|
146
|
+
@staticmethod
|
147
|
+
def _rxx_dag(parameter):
|
148
|
+
_rxx_dag = DAGCircuit()
|
149
|
+
qr = QuantumRegister(2)
|
150
|
+
_rxx_dag.add_qreg(qr)
|
151
|
+
_rxx_dag.apply_operation_back(RXXGate(parameter), [qr[1], qr[0]], [])
|
152
|
+
return _rxx_dag
|
153
|
+
|
154
|
+
@staticmethod
|
155
|
+
def _ryy_dag(parameter):
|
156
|
+
_ryy_dag = DAGCircuit()
|
157
|
+
qr = QuantumRegister(2)
|
158
|
+
_ryy_dag.add_qreg(qr)
|
159
|
+
_ryy_dag.apply_operation_back(RYYGate(parameter), [qr[1], qr[0]], [])
|
160
|
+
return _ryy_dag
|
161
|
+
|
162
|
+
@staticmethod
|
163
|
+
def _rzz_dag(parameter):
|
164
|
+
_rzz_dag = DAGCircuit()
|
165
|
+
qr = QuantumRegister(2)
|
166
|
+
_rzz_dag.add_qreg(qr)
|
167
|
+
_rzz_dag.apply_operation_back(RZZGate(parameter), [qr[1], qr[0]], [])
|
168
|
+
return _rzz_dag
|
169
|
+
|
170
|
+
def _run_coupling_map(self, dag, wire_map, edges=None):
|
171
|
+
if edges is None:
|
172
|
+
edges = set(self.coupling_map.get_edges())
|
173
|
+
if not edges:
|
174
|
+
return dag
|
175
|
+
# Don't include directives to avoid things like barrier, which are assumed always supported.
|
176
|
+
for node in dag.op_nodes(include_directives=False):
|
177
|
+
if isinstance(node.op, ControlFlowOp):
|
178
|
+
new_op = node.op.replace_blocks(
|
179
|
+
dag_to_circuit(
|
180
|
+
self._run_coupling_map(
|
181
|
+
circuit_to_dag(block),
|
182
|
+
{
|
183
|
+
inner: wire_map[outer]
|
184
|
+
for outer, inner in zip(node.qargs, block.qubits)
|
185
|
+
},
|
186
|
+
edges,
|
187
|
+
)
|
188
|
+
)
|
189
|
+
for block in node.op.blocks
|
190
|
+
)
|
191
|
+
dag.substitute_node(node, new_op, propagate_condition=False)
|
192
|
+
continue
|
193
|
+
if len(node.qargs) != 2:
|
194
|
+
continue
|
195
|
+
if dag.has_calibration_for(node):
|
196
|
+
continue
|
197
|
+
qargs = (wire_map[node.qargs[0]], wire_map[node.qargs[1]])
|
198
|
+
if qargs not in edges and (qargs[1], qargs[0]) not in edges:
|
199
|
+
raise TranspilerError(
|
200
|
+
f"The circuit requires a connection between physical qubits {qargs}"
|
201
|
+
)
|
202
|
+
if qargs not in edges:
|
203
|
+
replacement = self._static_replacements.get(node.name)
|
204
|
+
if replacement is not None:
|
205
|
+
dag.substitute_node_with_dag(node, replacement)
|
206
|
+
elif node.name == "rzx":
|
207
|
+
dag.substitute_node_with_dag(node, self._rzx_dag(*node.op.params))
|
208
|
+
elif node.name == "rxx":
|
209
|
+
dag.substitute_node_with_dag(node, self._rxx_dag(*node.op.params))
|
210
|
+
elif node.name == "ryy":
|
211
|
+
dag.substitute_node_with_dag(node, self._ryy_dag(*node.op.params))
|
212
|
+
elif node.name == "rzz":
|
213
|
+
dag.substitute_node_with_dag(node, self._rzz_dag(*node.op.params))
|
214
|
+
else:
|
215
|
+
raise TranspilerError(
|
216
|
+
f"'{node.name}' would be supported on '{qargs}' if the direction were"
|
217
|
+
f" swapped, but no rules are known to do that."
|
218
|
+
f" {list(self._KNOWN_REPLACEMENTS)} can be automatically flipped."
|
219
|
+
)
|
220
|
+
return dag
|
221
|
+
|
222
|
+
def _run_target(self, dag, wire_map):
|
223
|
+
# Don't include directives to avoid things like barrier, which are assumed always supported.
|
224
|
+
for node in dag.op_nodes(include_directives=False):
|
225
|
+
if isinstance(node.op, ControlFlowOp):
|
226
|
+
new_op = node.op.replace_blocks(
|
227
|
+
dag_to_circuit(
|
228
|
+
self._run_target(
|
229
|
+
circuit_to_dag(block),
|
230
|
+
{
|
231
|
+
inner: wire_map[outer]
|
232
|
+
for outer, inner in zip(node.qargs, block.qubits)
|
233
|
+
},
|
234
|
+
)
|
235
|
+
)
|
236
|
+
for block in node.op.blocks
|
237
|
+
)
|
238
|
+
dag.substitute_node(node, new_op, propagate_condition=False)
|
239
|
+
continue
|
240
|
+
if len(node.qargs) != 2:
|
241
|
+
continue
|
242
|
+
if dag.has_calibration_for(node):
|
243
|
+
continue
|
244
|
+
qargs = (wire_map[node.qargs[0]], wire_map[node.qargs[1]])
|
245
|
+
swapped = (qargs[1], qargs[0])
|
246
|
+
if node.name in self._static_replacements:
|
247
|
+
if self.target.instruction_supported(node.name, qargs):
|
248
|
+
continue
|
249
|
+
if self.target.instruction_supported(node.name, swapped):
|
250
|
+
dag.substitute_node_with_dag(node, self._static_replacements[node.name])
|
251
|
+
else:
|
252
|
+
raise TranspilerError(
|
253
|
+
f"The circuit requires a connection between physical qubits {qargs}"
|
254
|
+
f" for {node.name}"
|
255
|
+
)
|
256
|
+
elif node.name == "rzx":
|
257
|
+
if self.target.instruction_supported(
|
258
|
+
qargs=qargs, operation_class=RZXGate, parameters=node.op.params
|
259
|
+
):
|
260
|
+
continue
|
261
|
+
if self.target.instruction_supported(
|
262
|
+
qargs=swapped, operation_class=RZXGate, parameters=node.op.params
|
263
|
+
):
|
264
|
+
dag.substitute_node_with_dag(node, self._rzx_dag(*node.op.params))
|
265
|
+
else:
|
266
|
+
raise TranspilerError(
|
267
|
+
f"The circuit requires a connection between physical qubits {qargs}"
|
268
|
+
f" for {node.name}"
|
269
|
+
)
|
270
|
+
elif node.name == "rxx":
|
271
|
+
if self.target.instruction_supported(
|
272
|
+
qargs=qargs, operation_class=RXXGate, parameters=node.op.params
|
273
|
+
):
|
274
|
+
continue
|
275
|
+
if self.target.instruction_supported(
|
276
|
+
qargs=swapped, operation_class=RXXGate, parameters=node.op.params
|
277
|
+
):
|
278
|
+
dag.substitute_node_with_dag(node, self._rxx_dag(*node.op.params))
|
279
|
+
else:
|
280
|
+
raise TranspilerError(
|
281
|
+
f"The circuit requires a connection between physical qubits {qargs}"
|
282
|
+
f" for {node.name}"
|
283
|
+
)
|
284
|
+
elif node.name == "ryy":
|
285
|
+
if self.target.instruction_supported(
|
286
|
+
qargs=qargs, operation_class=RYYGate, parameters=node.op.params
|
287
|
+
):
|
288
|
+
continue
|
289
|
+
if self.target.instruction_supported(
|
290
|
+
qargs=swapped, operation_class=RYYGate, parameters=node.op.params
|
291
|
+
):
|
292
|
+
dag.substitute_node_with_dag(node, self._ryy_dag(*node.op.params))
|
293
|
+
else:
|
294
|
+
raise TranspilerError(
|
295
|
+
f"The circuit requires a connection between physical qubits {qargs}"
|
296
|
+
f" for {node.name}"
|
297
|
+
)
|
298
|
+
elif node.name == "rzz":
|
299
|
+
if self.target.instruction_supported(
|
300
|
+
qargs=qargs, operation_class=RZZGate, parameters=node.op.params
|
301
|
+
):
|
302
|
+
continue
|
303
|
+
if self.target.instruction_supported(
|
304
|
+
qargs=swapped, operation_class=RZZGate, parameters=node.op.params
|
305
|
+
):
|
306
|
+
dag.substitute_node_with_dag(node, self._rzz_dag(*node.op.params))
|
307
|
+
else:
|
308
|
+
raise TranspilerError(
|
309
|
+
f"The circuit requires a connection between physical qubits {qargs}"
|
310
|
+
f" for {node.name}"
|
311
|
+
)
|
312
|
+
elif self.target.instruction_supported(node.name, qargs):
|
313
|
+
continue
|
314
|
+
elif self.target.instruction_supported(node.name, swapped) or dag.has_calibration_for(
|
315
|
+
_swap_node_qargs(node)
|
316
|
+
):
|
317
|
+
raise TranspilerError(
|
318
|
+
f"'{node.name}' would be supported on '{qargs}' if the direction were"
|
319
|
+
f" swapped, but no rules are known to do that."
|
320
|
+
f" {list(self._KNOWN_REPLACEMENTS)} can be automatically flipped."
|
321
|
+
)
|
322
|
+
else:
|
323
|
+
raise TranspilerError(
|
324
|
+
f"'{node.name}' with parameters '{node.op.params}' is not supported on qubits"
|
325
|
+
f" '{qargs}' in either direction."
|
326
|
+
)
|
327
|
+
|
328
|
+
return dag
|
329
|
+
|
68
330
|
def run(self, dag):
|
69
331
|
"""Run the GateDirection pass on `dag`.
|
70
332
|
|
@@ -81,6 +343,7 @@ class GateDirection(TransformationPass):
|
|
81
343
|
TranspilerError: If the circuit cannot be mapped just by flipping the
|
82
344
|
cx nodes.
|
83
345
|
"""
|
346
|
+
layout_map = {bit: i for i, bit in enumerate(dag.qubits)}
|
84
347
|
if self.target is None:
|
85
|
-
return
|
86
|
-
return
|
348
|
+
return self._run_coupling_map(dag, layout_map)
|
349
|
+
return self._run_target(dag, layout_map)
|
@@ -12,13 +12,9 @@
|
|
12
12
|
|
13
13
|
"""Check if all gates in the DAGCircuit are in the specified basis gates."""
|
14
14
|
|
15
|
+
from qiskit.converters import circuit_to_dag
|
15
16
|
from qiskit.transpiler.basepasses import AnalysisPass
|
16
17
|
|
17
|
-
from qiskit._accelerate.gates_in_basis import (
|
18
|
-
any_gate_missing_from_basis,
|
19
|
-
any_gate_missing_from_target,
|
20
|
-
)
|
21
|
-
|
22
18
|
|
23
19
|
class GatesInBasis(AnalysisPass):
|
24
20
|
"""Check if all gates in a DAG are in a given set of gates"""
|
@@ -44,8 +40,35 @@ class GatesInBasis(AnalysisPass):
|
|
44
40
|
if self._basis_gates is None and self._target is None:
|
45
41
|
self.property_set["all_gates_in_basis"] = True
|
46
42
|
return
|
43
|
+
gates_out_of_basis = False
|
47
44
|
if self._target is not None:
|
48
|
-
|
45
|
+
|
46
|
+
def _visit_target(dag, wire_map):
|
47
|
+
for gate in dag.op_nodes():
|
48
|
+
# Barrier and store are assumed universal and supported by all backends
|
49
|
+
if gate.name in ("barrier", "store"):
|
50
|
+
continue
|
51
|
+
if not self._target.instruction_supported(
|
52
|
+
gate.name, tuple(wire_map[bit] for bit in gate.qargs)
|
53
|
+
):
|
54
|
+
return True
|
55
|
+
# Control-flow ops still need to be supported, so don't skip them in the
|
56
|
+
# previous checks.
|
57
|
+
if gate.is_control_flow():
|
58
|
+
for block in gate.op.blocks:
|
59
|
+
inner_wire_map = {
|
60
|
+
inner: wire_map[outer]
|
61
|
+
for outer, inner in zip(gate.qargs, block.qubits)
|
62
|
+
}
|
63
|
+
if _visit_target(circuit_to_dag(block), inner_wire_map):
|
64
|
+
return True
|
65
|
+
return False
|
66
|
+
|
67
|
+
qubit_map = {qubit: index for index, qubit in enumerate(dag.qubits)}
|
68
|
+
gates_out_of_basis = _visit_target(dag, qubit_map)
|
49
69
|
else:
|
50
|
-
|
70
|
+
for gate in dag.count_ops(recurse=True):
|
71
|
+
if gate not in self._basis_gates:
|
72
|
+
gates_out_of_basis = True
|
73
|
+
break
|
51
74
|
self.property_set["all_gates_in_basis"] = not gates_out_of_basis
|
@@ -13,17 +13,14 @@
|
|
13
13
|
"""Pass Manager Configuration class."""
|
14
14
|
|
15
15
|
import pprint
|
16
|
-
import warnings
|
17
16
|
|
18
17
|
from qiskit.transpiler.coupling import CouplingMap
|
19
18
|
from qiskit.transpiler.instruction_durations import InstructionDurations
|
20
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_arg
|
21
19
|
|
22
20
|
|
23
21
|
class PassManagerConfig:
|
24
22
|
"""Pass Manager Configuration."""
|
25
23
|
|
26
|
-
@deprecate_pulse_arg("inst_map", predicate=lambda inst_map: inst_map is not None)
|
27
24
|
def __init__(
|
28
25
|
self,
|
29
26
|
initial_layout=None,
|
@@ -116,17 +113,11 @@ class PassManagerConfig:
|
|
116
113
|
def from_backend(cls, backend, _skip_target=False, **pass_manager_options):
|
117
114
|
"""Construct a configuration based on a backend and user input.
|
118
115
|
|
119
|
-
This method automatically
|
116
|
+
This method automatically gererates a PassManagerConfig object based on the backend's
|
120
117
|
features. User options can be used to overwrite the configuration.
|
121
118
|
|
122
|
-
.. deprecated:: 1.3
|
123
|
-
The method ``PassManagerConfig.from_backend`` will stop supporting inputs of type
|
124
|
-
:class:`.BackendV1` in the `backend` parameter in a future release no
|
125
|
-
earlier than 2.0. :class:`.BackendV1` is deprecated and implementations should move
|
126
|
-
to :class:`.BackendV2`.
|
127
|
-
|
128
119
|
Args:
|
129
|
-
backend (BackendV1
|
120
|
+
backend (BackendV1): The backend that provides the configuration.
|
130
121
|
pass_manager_options: User-defined option-value pairs.
|
131
122
|
|
132
123
|
Returns:
|
@@ -135,21 +126,12 @@ class PassManagerConfig:
|
|
135
126
|
Raises:
|
136
127
|
AttributeError: If the backend does not support a `configuration()` method.
|
137
128
|
"""
|
129
|
+
res = cls(**pass_manager_options)
|
138
130
|
backend_version = getattr(backend, "version", 0)
|
139
|
-
if backend_version == 1:
|
140
|
-
warnings.warn(
|
141
|
-
"The method PassManagerConfig.from_backend will stop supporting inputs of "
|
142
|
-
f"type `BackendV1` ( {backend} ) in the `backend` parameter in a future "
|
143
|
-
"release no earlier than 2.0. `BackendV1` is deprecated and implementations "
|
144
|
-
"should move to `BackendV2`.",
|
145
|
-
category=DeprecationWarning,
|
146
|
-
stacklevel=2,
|
147
|
-
)
|
148
131
|
if not isinstance(backend_version, int):
|
149
132
|
backend_version = 0
|
150
133
|
if backend_version < 2:
|
151
134
|
config = backend.configuration()
|
152
|
-
res = cls(**pass_manager_options)
|
153
135
|
if res.basis_gates is None:
|
154
136
|
if backend_version < 2:
|
155
137
|
res.basis_gates = getattr(config, "basis_gates", None)
|
@@ -162,7 +144,7 @@ class PassManagerConfig:
|
|
162
144
|
if defaults is not None:
|
163
145
|
res.inst_map = defaults.instruction_schedule_map
|
164
146
|
else:
|
165
|
-
res.inst_map = backend.
|
147
|
+
res.inst_map = backend.instruction_schedule_map
|
166
148
|
if res.coupling_map is None:
|
167
149
|
if backend_version < 2:
|
168
150
|
cmap_edge_list = getattr(config, "coupling_map", None)
|
@@ -13,7 +13,6 @@
|
|
13
13
|
"""Built-in transpiler stage plugins for preset pass managers."""
|
14
14
|
|
15
15
|
import os
|
16
|
-
import warnings
|
17
16
|
|
18
17
|
from qiskit.transpiler.passes.optimization.split_2q_unitaries import Split2QUnitaries
|
19
18
|
from qiskit.transpiler.passmanager import PassManager
|
@@ -40,9 +39,9 @@ from qiskit.transpiler.preset_passmanagers.plugin import (
|
|
40
39
|
from qiskit.transpiler.passes.optimization import (
|
41
40
|
Optimize1qGatesDecomposition,
|
42
41
|
CommutativeCancellation,
|
42
|
+
Collect2qBlocks,
|
43
43
|
ConsolidateBlocks,
|
44
44
|
InverseCancellation,
|
45
|
-
RemoveIdentityEquivalent,
|
46
45
|
)
|
47
46
|
from qiskit.transpiler.passes import Depth, Size, FixedPoint, MinimumPoint
|
48
47
|
from qiskit.transpiler.passes.utils.gates_basis import GatesInBasis
|
@@ -154,16 +153,8 @@ class DefaultInitPassManager(PassManagerStagePlugin):
|
|
154
153
|
pass_manager_config.hls_config,
|
155
154
|
pass_manager_config.qubits_initially_zero,
|
156
155
|
)
|
157
|
-
|
158
|
-
init.append(ElidePermutations())
|
156
|
+
init.append(ElidePermutations())
|
159
157
|
init.append(RemoveDiagonalGatesBeforeMeasure())
|
160
|
-
# Target not set on RemoveIdentityEquivalent because we haven't applied a Layout
|
161
|
-
# yet so doing anything relative to an error rate in the target is not valid.
|
162
|
-
init.append(
|
163
|
-
RemoveIdentityEquivalent(
|
164
|
-
approximation_degree=pass_manager_config.approximation_degree
|
165
|
-
)
|
166
|
-
)
|
167
158
|
init.append(
|
168
159
|
InverseCancellation(
|
169
160
|
[
|
@@ -183,6 +174,7 @@ class DefaultInitPassManager(PassManagerStagePlugin):
|
|
183
174
|
)
|
184
175
|
)
|
185
176
|
init.append(CommutativeCancellation())
|
177
|
+
init.append(Collect2qBlocks())
|
186
178
|
init.append(ConsolidateBlocks())
|
187
179
|
# If approximation degree is None that indicates a request to approximate up to the
|
188
180
|
# error rates in the target. However, in the init stage we don't yet know the target
|
@@ -588,10 +580,6 @@ class OptimizationPassManager(PassManagerStagePlugin):
|
|
588
580
|
|
589
581
|
elif optimization_level == 2:
|
590
582
|
_opt = [
|
591
|
-
RemoveIdentityEquivalent(
|
592
|
-
approximation_degree=pass_manager_config.approximation_degree,
|
593
|
-
target=pass_manager_config.target,
|
594
|
-
),
|
595
583
|
Optimize1qGatesDecomposition(
|
596
584
|
basis=pass_manager_config.basis_gates, target=pass_manager_config.target
|
597
585
|
),
|
@@ -600,6 +588,7 @@ class OptimizationPassManager(PassManagerStagePlugin):
|
|
600
588
|
elif optimization_level == 3:
|
601
589
|
# Steps for optimization level 3
|
602
590
|
_opt = [
|
591
|
+
Collect2qBlocks(),
|
603
592
|
ConsolidateBlocks(
|
604
593
|
basis_gates=pass_manager_config.basis_gates,
|
605
594
|
target=pass_manager_config.target,
|
@@ -614,10 +603,6 @@ class OptimizationPassManager(PassManagerStagePlugin):
|
|
614
603
|
plugin_config=pass_manager_config.unitary_synthesis_plugin_config,
|
615
604
|
target=pass_manager_config.target,
|
616
605
|
),
|
617
|
-
RemoveIdentityEquivalent(
|
618
|
-
approximation_degree=pass_manager_config.approximation_degree,
|
619
|
-
target=pass_manager_config.target,
|
620
|
-
),
|
621
606
|
Optimize1qGatesDecomposition(
|
622
607
|
basis=pass_manager_config.basis_gates, target=pass_manager_config.target
|
623
608
|
),
|
@@ -647,6 +632,7 @@ class OptimizationPassManager(PassManagerStagePlugin):
|
|
647
632
|
elif optimization_level == 2:
|
648
633
|
optimization.append(
|
649
634
|
[
|
635
|
+
Collect2qBlocks(),
|
650
636
|
ConsolidateBlocks(
|
651
637
|
basis_gates=pass_manager_config.basis_gates,
|
652
638
|
target=pass_manager_config.target,
|
@@ -689,13 +675,9 @@ class AlapSchedulingPassManager(PassManagerStagePlugin):
|
|
689
675
|
inst_map = pass_manager_config.inst_map
|
690
676
|
target = pass_manager_config.target
|
691
677
|
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
# so filtering these warning when building pass managers
|
696
|
-
return common.generate_scheduling(
|
697
|
-
instruction_durations, scheduling_method, timing_constraints, inst_map, target
|
698
|
-
)
|
678
|
+
return common.generate_scheduling(
|
679
|
+
instruction_durations, scheduling_method, timing_constraints, inst_map, target
|
680
|
+
)
|
699
681
|
|
700
682
|
|
701
683
|
class AsapSchedulingPassManager(PassManagerStagePlugin):
|
@@ -710,13 +692,9 @@ class AsapSchedulingPassManager(PassManagerStagePlugin):
|
|
710
692
|
inst_map = pass_manager_config.inst_map
|
711
693
|
target = pass_manager_config.target
|
712
694
|
|
713
|
-
|
714
|
-
|
715
|
-
|
716
|
-
# so filtering these warning when building pass managers
|
717
|
-
return common.generate_scheduling(
|
718
|
-
instruction_durations, scheduling_method, timing_constraints, inst_map, target
|
719
|
-
)
|
695
|
+
return common.generate_scheduling(
|
696
|
+
instruction_durations, scheduling_method, timing_constraints, inst_map, target
|
697
|
+
)
|
720
698
|
|
721
699
|
|
722
700
|
class DefaultSchedulingPassManager(PassManagerStagePlugin):
|
@@ -731,13 +709,9 @@ class DefaultSchedulingPassManager(PassManagerStagePlugin):
|
|
731
709
|
inst_map = pass_manager_config.inst_map
|
732
710
|
target = pass_manager_config.target
|
733
711
|
|
734
|
-
|
735
|
-
|
736
|
-
|
737
|
-
# so filtering these warning when building pass managers
|
738
|
-
return common.generate_scheduling(
|
739
|
-
instruction_durations, scheduling_method, timing_constraints, inst_map, target
|
740
|
-
)
|
712
|
+
return common.generate_scheduling(
|
713
|
+
instruction_durations, scheduling_method, timing_constraints, inst_map, target
|
714
|
+
)
|
741
715
|
|
742
716
|
|
743
717
|
class DefaultLayoutPassManager(PassManagerStagePlugin):
|
@@ -24,9 +24,9 @@ from qiskit.transpiler.passmanager import PassManager
|
|
24
24
|
from qiskit.transpiler.passes import Error
|
25
25
|
from qiskit.transpiler.passes import BasisTranslator
|
26
26
|
from qiskit.transpiler.passes import Unroll3qOrMore
|
27
|
-
from qiskit.transpiler.passes import ConsolidateBlocks
|
28
|
-
from qiskit.transpiler.passes import Collect1qRuns
|
29
27
|
from qiskit.transpiler.passes import Collect2qBlocks
|
28
|
+
from qiskit.transpiler.passes import Collect1qRuns
|
29
|
+
from qiskit.transpiler.passes import ConsolidateBlocks
|
30
30
|
from qiskit.transpiler.passes import UnitarySynthesis
|
31
31
|
from qiskit.transpiler.passes import HighLevelSynthesis
|
32
32
|
from qiskit.transpiler.passes import CheckMap
|
@@ -52,7 +52,6 @@ from qiskit.transpiler.passes.layout.vf2_layout import VF2LayoutStopReason
|
|
52
52
|
from qiskit.transpiler.passes.layout.vf2_post_layout import VF2PostLayoutStopReason
|
53
53
|
from qiskit.transpiler.exceptions import TranspilerError
|
54
54
|
from qiskit.transpiler.layout import Layout
|
55
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_arg
|
56
55
|
|
57
56
|
|
58
57
|
_ControlFlowState = collections.namedtuple("_ControlFlowState", ("working", "not_working"))
|
@@ -530,7 +529,6 @@ def generate_translation_passmanager(
|
|
530
529
|
return PassManager(unroll)
|
531
530
|
|
532
531
|
|
533
|
-
@deprecate_pulse_arg("inst_map", predicate=lambda inst_map: inst_map is not None)
|
534
532
|
def generate_scheduling(
|
535
533
|
instruction_durations, scheduling_method, timing_constraints, inst_map, target=None
|
536
534
|
):
|
@@ -542,7 +540,7 @@ def generate_scheduling(
|
|
542
540
|
``'asap'``/``'as_soon_as_possible'`` or
|
543
541
|
``'alap'``/``'as_late_as_possible'``
|
544
542
|
timing_constraints (TimingConstraints): Hardware time alignment restrictions.
|
545
|
-
inst_map (InstructionScheduleMap):
|
543
|
+
inst_map (InstructionScheduleMap): Mapping object that maps gate to schedule.
|
546
544
|
target (Target): The :class:`~.Target` object representing the backend
|
547
545
|
|
548
546
|
Returns:
|