qiskit 1.3.0b1__cp39-abi3-win32.whl → 1.3.0rc2__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 +20 -1
- qiskit/_accelerate.pyd +0 -0
- qiskit/assembler/assemble_schedules.py +2 -0
- qiskit/circuit/__init__.py +44 -1
- qiskit/circuit/_standard_gates_commutations.py +585 -0
- qiskit/circuit/barrier.py +2 -0
- qiskit/circuit/controlflow/builder.py +3 -3
- qiskit/circuit/controlflow/if_else.py +13 -5
- qiskit/circuit/controlflow/while_loop.py +10 -2
- qiskit/circuit/delay.py +20 -3
- qiskit/circuit/equivalence.py +13 -214
- qiskit/circuit/gate.py +3 -1
- qiskit/circuit/instruction.py +32 -11
- qiskit/circuit/instructionset.py +2 -0
- qiskit/circuit/library/__init__.py +110 -14
- qiskit/circuit/library/arithmetic/__init__.py +9 -2
- qiskit/circuit/library/arithmetic/adders/__init__.py +1 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +154 -2
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +20 -56
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +14 -1
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +21 -91
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +1 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +8 -1
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +94 -3
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +8 -1
- qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +20 -38
- qiskit/circuit/library/blueprintcircuit.py +64 -0
- qiskit/circuit/library/boolean_logic/__init__.py +4 -4
- qiskit/circuit/library/boolean_logic/inner_product.py +81 -4
- qiskit/circuit/library/boolean_logic/quantum_and.py +107 -4
- qiskit/circuit/library/boolean_logic/quantum_or.py +107 -3
- qiskit/circuit/library/boolean_logic/quantum_xor.py +97 -3
- qiskit/circuit/library/data_preparation/__init__.py +6 -3
- qiskit/circuit/library/data_preparation/{z_feature_map.py → _z_feature_map.py} +45 -34
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +342 -29
- qiskit/circuit/library/fourier_checking.py +72 -11
- qiskit/circuit/library/generalized_gates/__init__.py +1 -1
- qiskit/circuit/library/generalized_gates/diagonal.py +45 -51
- qiskit/circuit/library/generalized_gates/gms.py +67 -14
- 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 +12 -6
- qiskit/circuit/library/generalized_gates/mcmt.py +167 -107
- qiskit/circuit/library/generalized_gates/permutation.py +8 -6
- qiskit/circuit/library/generalized_gates/rv.py +8 -9
- qiskit/circuit/library/graph_state.py +93 -10
- qiskit/circuit/library/grover_operator.py +270 -2
- qiskit/circuit/library/hidden_linear_function.py +83 -20
- qiskit/circuit/library/iqp.py +99 -20
- qiskit/circuit/library/n_local/__init__.py +19 -7
- qiskit/circuit/library/n_local/efficient_su2.py +118 -5
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +259 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +130 -6
- qiskit/circuit/library/n_local/n_local.py +406 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +106 -4
- qiskit/circuit/library/n_local/qaoa_ansatz.py +80 -1
- qiskit/circuit/library/n_local/real_amplitudes.py +127 -7
- qiskit/circuit/library/n_local/two_local.py +14 -7
- qiskit/circuit/library/overlap.py +91 -26
- qiskit/circuit/library/pauli_evolution.py +17 -15
- qiskit/circuit/library/phase_estimation.py +80 -4
- qiskit/circuit/library/quantum_volume.py +72 -20
- qiskit/circuit/library/standard_gates/__init__.py +20 -1
- qiskit/circuit/library/standard_gates/dcx.py +2 -1
- qiskit/circuit/library/standard_gates/ecr.py +2 -2
- qiskit/circuit/library/standard_gates/h.py +4 -3
- qiskit/circuit/library/standard_gates/i.py +2 -1
- qiskit/circuit/library/standard_gates/iswap.py +2 -2
- qiskit/circuit/library/standard_gates/p.py +20 -12
- qiskit/circuit/library/standard_gates/r.py +1 -1
- qiskit/circuit/library/standard_gates/rx.py +4 -3
- qiskit/circuit/library/standard_gates/rxx.py +2 -2
- qiskit/circuit/library/standard_gates/ry.py +4 -3
- qiskit/circuit/library/standard_gates/ryy.py +2 -2
- qiskit/circuit/library/standard_gates/rz.py +13 -12
- 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 +4 -3
- qiskit/circuit/library/standard_gates/t.py +2 -2
- qiskit/circuit/library/standard_gates/u.py +11 -3
- qiskit/circuit/library/standard_gates/u1.py +65 -15
- qiskit/circuit/library/standard_gates/u2.py +4 -1
- qiskit/circuit/library/standard_gates/u3.py +31 -3
- qiskit/circuit/library/standard_gates/x.py +7 -5
- 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 +4 -3
- qiskit/circuit/library/standard_gates/z.py +3 -3
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +9 -7
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +9 -8
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +10 -9
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +10 -9
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +9 -7
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +10 -8
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +16 -14
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +14 -12
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +14 -12
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +13 -11
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +11 -9
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +12 -10
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +12 -10
- qiskit/circuit/library/templates/rzx/rzx_cy.py +11 -10
- qiskit/circuit/library/templates/rzx/rzx_xz.py +16 -15
- qiskit/circuit/library/templates/rzx/rzx_yz.py +12 -10
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +22 -20
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +16 -15
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +17 -15
- qiskit/circuit/parameter.py +4 -0
- qiskit/circuit/parameterexpression.py +167 -34
- qiskit/circuit/quantumcircuit.py +162 -126
- qiskit/circuit/singleton.py +2 -0
- qiskit/circuit/store.py +2 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/assembler.py +17 -4
- qiskit/compiler/scheduler.py +2 -0
- qiskit/compiler/sequencer.py +2 -0
- qiskit/compiler/transpiler.py +81 -26
- 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 +7 -5
- qiskit/converters/dag_to_dagdependency.py +1 -1
- qiskit/converters/dag_to_dagdependency_v2.py +1 -1
- qiskit/converters/dagdependency_to_circuit.py +5 -1
- qiskit/converters/dagdependency_to_dag.py +6 -1
- qiskit/dagcircuit/collect_blocks.py +3 -3
- qiskit/dagcircuit/dagdependency.py +18 -5
- qiskit/dagcircuit/dagdependency_v2.py +1 -1
- qiskit/dagcircuit/dagnode.py +2 -2
- qiskit/passmanager/__init__.py +2 -2
- qiskit/primitives/backend_estimator.py +5 -2
- qiskit/primitives/backend_sampler_v2.py +61 -18
- qiskit/primitives/base/base_estimator.py +2 -2
- qiskit/primitives/containers/data_bin.py +9 -1
- qiskit/primitives/statevector_sampler.py +1 -1
- qiskit/primitives/utils.py +1 -1
- qiskit/providers/__init__.py +3 -3
- qiskit/providers/backend.py +12 -1
- qiskit/providers/backend_compat.py +23 -3
- qiskit/providers/basic_provider/basic_simulator.py +12 -2
- qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
- qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
- qiskit/providers/models/pulsedefaults.py +2 -0
- qiskit/pulse/builder.py +59 -18
- qiskit/pulse/calibration_entries.py +4 -1
- qiskit/pulse/channels.py +2 -0
- qiskit/pulse/exceptions.py +2 -0
- qiskit/pulse/instruction_schedule_map.py +21 -6
- qiskit/pulse/instructions/acquire.py +2 -0
- qiskit/pulse/instructions/delay.py +2 -0
- qiskit/pulse/instructions/directives.py +8 -0
- qiskit/pulse/instructions/frequency.py +3 -0
- qiskit/pulse/instructions/instruction.py +2 -0
- qiskit/pulse/instructions/phase.py +3 -0
- qiskit/pulse/instructions/play.py +2 -0
- qiskit/pulse/instructions/reference.py +2 -0
- qiskit/pulse/instructions/snapshot.py +2 -0
- qiskit/pulse/library/pulse.py +2 -0
- qiskit/pulse/library/symbolic_pulses.py +28 -0
- qiskit/pulse/library/waveform.py +2 -0
- qiskit/pulse/macros.py +1 -1
- qiskit/pulse/schedule.py +12 -13
- qiskit/pulse/transforms/alignments.py +5 -3
- qiskit/pulse/transforms/dag.py +7 -0
- qiskit/qasm2/export.py +5 -3
- qiskit/qasm2/parse.py +46 -2
- qiskit/qasm3/__init__.py +1 -0
- qiskit/qasm3/ast.py +123 -15
- qiskit/qasm3/exporter.py +103 -77
- qiskit/qobj/converters/pulse_instruction.py +6 -4
- qiskit/qpy/__init__.py +181 -0
- qiskit/qpy/binary_io/circuits.py +20 -5
- qiskit/qpy/binary_io/schedules.py +3 -4
- qiskit/qpy/binary_io/value.py +310 -13
- qiskit/qpy/common.py +46 -2
- qiskit/qpy/formats.py +7 -0
- qiskit/qpy/interface.py +40 -4
- qiskit/quantum_info/__init__.py +4 -0
- qiskit/quantum_info/operators/channel/transformations.py +28 -21
- qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
- qiskit/quantum_info/operators/operator.py +54 -8
- qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
- 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 +2 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
- 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 +9 -1
- qiskit/result/mitigation/local_readout_mitigator.py +9 -1
- qiskit/result/mitigation/utils.py +57 -0
- qiskit/scheduler/config.py +2 -0
- qiskit/scheduler/methods/basic.py +3 -0
- qiskit/scheduler/schedule_circuit.py +2 -0
- qiskit/scheduler/sequence.py +2 -0
- qiskit/synthesis/__init__.py +25 -0
- qiskit/synthesis/arithmetic/__init__.py +16 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
- qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
- qiskit/synthesis/evolution/__init__.py +1 -0
- qiskit/synthesis/evolution/lie_trotter.py +16 -42
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +165 -238
- qiskit/synthesis/evolution/qdrift.py +36 -29
- qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/qft/qft_decompose_full.py +19 -1
- qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
- qiskit/synthesis/unitary/qsd.py +5 -5
- qiskit/transpiler/__init__.py +21 -14
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +9 -565
- qiskit/transpiler/passes/basis/decompose.py +45 -12
- 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 +4 -2
- qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
- qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
- qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
- 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 +48 -131
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
- qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
- 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/remove_identity_equiv.py +69 -0
- 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 +7 -3
- 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 +2 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
- qiskit/transpiler/passes/scheduling/asap.py +1 -1
- qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +262 -99
- qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
- qiskit/transpiler/passes/utils/gate_direction.py +12 -275
- qiskit/transpiler/passes/utils/gates_basis.py +7 -30
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
- qiskit/transpiler/passmanager_config.py +22 -4
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
- qiskit/transpiler/preset_passmanagers/common.py +5 -3
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +125 -42
- qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
- qiskit/transpiler/target.py +74 -16
- qiskit/utils/deprecate_pulse.py +119 -0
- qiskit/visualization/circuit/_utils.py +2 -2
- qiskit/visualization/circuit/circuit_visualization.py +3 -2
- qiskit/visualization/circuit/matplotlib.py +1 -1
- qiskit/visualization/dag_visualization.py +1 -1
- qiskit/visualization/pass_manager_visualization.py +3 -14
- qiskit/visualization/pulse_v2/interface.py +3 -1
- qiskit/visualization/timeline/core.py +25 -2
- qiskit/visualization/timeline/interface.py +12 -0
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/METADATA +9 -8
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/RECORD +357 -346
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/WHEEL +1 -1
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/entry_points.txt +19 -0
- qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
- qiskit/synthesis/two_qubit/weyl.py +0 -97
- qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/top_level.txt +0 -0
qiskit/circuit/barrier.py
CHANGED
@@ -19,6 +19,7 @@ with the :meth:`~qiskit.circuit.QuantumCircuit.barrier` method.
|
|
19
19
|
from __future__ import annotations
|
20
20
|
|
21
21
|
from qiskit.exceptions import QiskitError
|
22
|
+
from qiskit.utils import deprecate_func
|
22
23
|
from .instruction import Instruction
|
23
24
|
|
24
25
|
|
@@ -44,5 +45,6 @@ class Barrier(Instruction):
|
|
44
45
|
"""Special case. Return self."""
|
45
46
|
return Barrier(self.num_qubits)
|
46
47
|
|
48
|
+
@deprecate_func(since="1.3.0", removal_timeline="in 2.0.0")
|
47
49
|
def c_if(self, classical, val):
|
48
50
|
raise QiskitError("Barriers are compiler directives and cannot be conditional.")
|
@@ -284,7 +284,7 @@ class InstructionPlaceholder(Instruction, abc.ABC):
|
|
284
284
|
The same instruction instance that was passed, but mutated to propagate the tracked
|
285
285
|
changes to this class.
|
286
286
|
"""
|
287
|
-
instruction.
|
287
|
+
instruction._condition = self._condition
|
288
288
|
return instruction
|
289
289
|
|
290
290
|
# Provide some better error messages, just in case something goes wrong during development and
|
@@ -639,8 +639,8 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
|
|
639
639
|
# a register is already present, so we use our own tracking.
|
640
640
|
self.add_register(register)
|
641
641
|
out.add_register(register)
|
642
|
-
if getattr(op, "
|
643
|
-
for register in condition_resources(op.
|
642
|
+
if getattr(op, "_condition", None) is not None:
|
643
|
+
for register in condition_resources(op._condition).cregs:
|
644
644
|
if register not in self.registers:
|
645
645
|
self.add_register(register)
|
646
646
|
out.add_register(register)
|
@@ -87,12 +87,20 @@ class IfElseOp(ControlFlowOp):
|
|
87
87
|
|
88
88
|
super().__init__("if_else", num_qubits, num_clbits, [true_body, false_body], label=label)
|
89
89
|
|
90
|
-
self.
|
90
|
+
self._condition = validate_condition(condition)
|
91
91
|
|
92
92
|
@property
|
93
93
|
def params(self):
|
94
94
|
return self._params
|
95
95
|
|
96
|
+
@property
|
97
|
+
def condition(self):
|
98
|
+
return self._condition
|
99
|
+
|
100
|
+
@condition.setter
|
101
|
+
def condition(self, value):
|
102
|
+
self._condition = value
|
103
|
+
|
96
104
|
@params.setter
|
97
105
|
def params(self, parameters):
|
98
106
|
# pylint: disable=cyclic-import
|
@@ -152,7 +160,7 @@ class IfElseOp(ControlFlowOp):
|
|
152
160
|
true_body, false_body = (
|
153
161
|
ablock for ablock, _ in itertools.zip_longest(blocks, range(2), fillvalue=None)
|
154
162
|
)
|
155
|
-
return IfElseOp(self.
|
163
|
+
return IfElseOp(self._condition, true_body, false_body=false_body, label=self.label)
|
156
164
|
|
157
165
|
def c_if(self, classical, val):
|
158
166
|
raise NotImplementedError(
|
@@ -200,7 +208,7 @@ class IfElsePlaceholder(InstructionPlaceholder):
|
|
200
208
|
"if_else", len(self.__resources.qubits), len(self.__resources.clbits), [], label=label
|
201
209
|
)
|
202
210
|
# Set the condition after super().__init__() has initialized it to None.
|
203
|
-
self.
|
211
|
+
self._condition = validate_condition(condition)
|
204
212
|
|
205
213
|
def with_false_block(self, false_block: ControlFlowBuilderBlock) -> "IfElsePlaceholder":
|
206
214
|
"""Return a new placeholder instruction, with the false block set to the given value,
|
@@ -225,7 +233,7 @@ class IfElsePlaceholder(InstructionPlaceholder):
|
|
225
233
|
false_bits = false_block.qubits() | false_block.clbits()
|
226
234
|
true_block.add_bits(false_bits - true_bits)
|
227
235
|
false_block.add_bits(true_bits - false_bits)
|
228
|
-
return type(self)(self.
|
236
|
+
return type(self)(self._condition, true_block, false_block, label=self.label)
|
229
237
|
|
230
238
|
def registers(self):
|
231
239
|
"""Get the registers used by the interior blocks."""
|
@@ -288,7 +296,7 @@ class IfElsePlaceholder(InstructionPlaceholder):
|
|
288
296
|
)
|
289
297
|
return (
|
290
298
|
self._copy_mutable_properties(
|
291
|
-
IfElseOp(self.
|
299
|
+
IfElseOp(self._condition, true_body, false_body, label=self.label)
|
292
300
|
),
|
293
301
|
InstructionResources(
|
294
302
|
qubits=tuple(true_body.qubits),
|
@@ -53,12 +53,20 @@ class WhileLoopOp(ControlFlowOp):
|
|
53
53
|
num_clbits = body.num_clbits
|
54
54
|
|
55
55
|
super().__init__("while_loop", num_qubits, num_clbits, [body], label=label)
|
56
|
-
self.
|
56
|
+
self._condition = validate_condition(condition)
|
57
57
|
|
58
58
|
@property
|
59
59
|
def params(self):
|
60
60
|
return self._params
|
61
61
|
|
62
|
+
@property
|
63
|
+
def condition(self):
|
64
|
+
return self._condition
|
65
|
+
|
66
|
+
@condition.setter
|
67
|
+
def condition(self, value):
|
68
|
+
self._condition = value
|
69
|
+
|
62
70
|
@params.setter
|
63
71
|
def params(self, parameters):
|
64
72
|
# pylint: disable=cyclic-import
|
@@ -88,7 +96,7 @@ class WhileLoopOp(ControlFlowOp):
|
|
88
96
|
|
89
97
|
def replace_blocks(self, blocks):
|
90
98
|
(body,) = blocks
|
91
|
-
return WhileLoopOp(self.
|
99
|
+
return WhileLoopOp(self._condition, body, label=self.label)
|
92
100
|
|
93
101
|
def c_if(self, classical, val):
|
94
102
|
raise NotImplementedError(
|
qiskit/circuit/delay.py
CHANGED
@@ -19,6 +19,7 @@ from qiskit.circuit.instruction import Instruction
|
|
19
19
|
from qiskit.circuit.gate import Gate
|
20
20
|
from qiskit.circuit import _utils
|
21
21
|
from qiskit.circuit.parameterexpression import ParameterExpression
|
22
|
+
from qiskit.utils import deprecate_func
|
22
23
|
|
23
24
|
|
24
25
|
@_utils.with_gate_array(np.eye(2, dtype=complex))
|
@@ -33,8 +34,12 @@ class Delay(Instruction):
|
|
33
34
|
"""
|
34
35
|
if unit not in {"s", "ms", "us", "ns", "ps", "dt"}:
|
35
36
|
raise CircuitError(f"Unknown unit {unit} is specified.")
|
36
|
-
|
37
|
-
|
37
|
+
# Double underscore to differentiate from the private attribute in
|
38
|
+
# `Instruction`. This can be changed to `_unit` in 2.0 after we
|
39
|
+
# remove `unit` and `duration` from the standard instruction model
|
40
|
+
# as it only will exist in `Delay` after that point.
|
41
|
+
self.__unit = unit
|
42
|
+
super().__init__("delay", 1, 0, params=[duration])
|
38
43
|
|
39
44
|
broadcast_arguments = Gate.broadcast_arguments
|
40
45
|
|
@@ -42,9 +47,21 @@ class Delay(Instruction):
|
|
42
47
|
"""Special case. Return self."""
|
43
48
|
return self
|
44
49
|
|
50
|
+
@deprecate_func(since="1.3.0", removal_timeline="in 2.0.0")
|
45
51
|
def c_if(self, classical, val):
|
46
52
|
raise CircuitError("Conditional Delay is not yet implemented.")
|
47
53
|
|
54
|
+
@property
|
55
|
+
def unit(self):
|
56
|
+
|
57
|
+
return self.__unit
|
58
|
+
|
59
|
+
@unit.setter
|
60
|
+
def unit(self, value):
|
61
|
+
if value not in {"s", "ms", "us", "ns", "ps", "dt"}:
|
62
|
+
raise CircuitError(f"Unknown unit {value} is specified.")
|
63
|
+
self.__unit = value
|
64
|
+
|
48
65
|
@property
|
49
66
|
def duration(self):
|
50
67
|
"""Get the duration of this delay."""
|
@@ -81,7 +98,7 @@ class Delay(Instruction):
|
|
81
98
|
raise CircuitError(
|
82
99
|
f"Duration for Delay instruction must be positive. Found {parameter}"
|
83
100
|
)
|
84
|
-
if self.
|
101
|
+
if self.__unit == "dt":
|
85
102
|
parameter_int = int(parameter)
|
86
103
|
if parameter != parameter_int:
|
87
104
|
raise CircuitError("Integer duration is expected for 'dt' unit.")
|
qiskit/circuit/equivalence.py
CHANGED
@@ -12,190 +12,24 @@
|
|
12
12
|
|
13
13
|
"""Gate equivalence library."""
|
14
14
|
|
15
|
-
import copy
|
16
|
-
from collections import namedtuple
|
17
|
-
|
18
15
|
from rustworkx.visualization import graphviz_draw
|
19
16
|
import rustworkx as rx
|
20
17
|
|
21
|
-
from qiskit.exceptions import InvalidFileError
|
22
|
-
from .exceptions import CircuitError
|
23
|
-
from .parameter import Parameter
|
24
|
-
from .parameterexpression import ParameterExpression
|
25
18
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
19
|
+
from qiskit.exceptions import InvalidFileError
|
20
|
+
from qiskit._accelerate.equivalence import ( # pylint: disable=unused-import
|
21
|
+
BaseEquivalenceLibrary,
|
22
|
+
Key,
|
23
|
+
Equivalence,
|
24
|
+
NodeData,
|
25
|
+
EdgeData,
|
26
|
+
)
|
30
27
|
|
31
28
|
|
32
|
-
class EquivalenceLibrary:
|
29
|
+
class EquivalenceLibrary(BaseEquivalenceLibrary):
|
33
30
|
"""A library providing a one-way mapping of Gates to their equivalent
|
34
31
|
implementations as QuantumCircuits."""
|
35
32
|
|
36
|
-
def __init__(self, *, base=None):
|
37
|
-
"""Create a new equivalence library.
|
38
|
-
|
39
|
-
Args:
|
40
|
-
base (Optional[EquivalenceLibrary]): Base equivalence library to
|
41
|
-
be referenced if an entry is not found in this library.
|
42
|
-
"""
|
43
|
-
self._base = base
|
44
|
-
|
45
|
-
if base is None:
|
46
|
-
self._graph = rx.PyDiGraph()
|
47
|
-
self._key_to_node_index = {}
|
48
|
-
# Some unique identifier for rules.
|
49
|
-
self._rule_id = 0
|
50
|
-
else:
|
51
|
-
self._graph = base._graph.copy()
|
52
|
-
self._key_to_node_index = copy.deepcopy(base._key_to_node_index)
|
53
|
-
self._rule_id = base._rule_id
|
54
|
-
|
55
|
-
@property
|
56
|
-
def graph(self) -> rx.PyDiGraph:
|
57
|
-
"""Return graph representing the equivalence library data.
|
58
|
-
|
59
|
-
This property should be treated as read-only as it provides
|
60
|
-
a reference to the internal state of the :class:`~.EquivalenceLibrary` object.
|
61
|
-
If the graph returned by this property is mutated it could corrupt the
|
62
|
-
the contents of the object. If you need to modify the output ``PyDiGraph``
|
63
|
-
be sure to make a copy prior to any modification.
|
64
|
-
|
65
|
-
Returns:
|
66
|
-
PyDiGraph: A graph object with equivalence data in each node.
|
67
|
-
"""
|
68
|
-
return self._graph
|
69
|
-
|
70
|
-
def _set_default_node(self, key):
|
71
|
-
"""Create a new node if key not found"""
|
72
|
-
if key not in self._key_to_node_index:
|
73
|
-
self._key_to_node_index[key] = self._graph.add_node(NodeData(key=key, equivs=[]))
|
74
|
-
return self._key_to_node_index[key]
|
75
|
-
|
76
|
-
def add_equivalence(self, gate, equivalent_circuit):
|
77
|
-
"""Add a new equivalence to the library. Future queries for the Gate
|
78
|
-
will include the given circuit, in addition to all existing equivalences
|
79
|
-
(including those from base).
|
80
|
-
|
81
|
-
Parameterized Gates (those including `qiskit.circuit.Parameters` in their
|
82
|
-
`Gate.params`) can be marked equivalent to parameterized circuits,
|
83
|
-
provided the parameters match.
|
84
|
-
|
85
|
-
Args:
|
86
|
-
gate (Gate): A Gate instance.
|
87
|
-
equivalent_circuit (QuantumCircuit): A circuit equivalently
|
88
|
-
implementing the given Gate.
|
89
|
-
"""
|
90
|
-
|
91
|
-
_raise_if_shape_mismatch(gate, equivalent_circuit)
|
92
|
-
_raise_if_param_mismatch(gate.params, equivalent_circuit.parameters)
|
93
|
-
|
94
|
-
key = Key(name=gate.name, num_qubits=gate.num_qubits)
|
95
|
-
equiv = Equivalence(params=gate.params.copy(), circuit=equivalent_circuit.copy())
|
96
|
-
|
97
|
-
target = self._set_default_node(key)
|
98
|
-
self._graph[target].equivs.append(equiv)
|
99
|
-
|
100
|
-
sources = {
|
101
|
-
Key(name=instruction.operation.name, num_qubits=len(instruction.qubits))
|
102
|
-
for instruction in equivalent_circuit
|
103
|
-
}
|
104
|
-
edges = [
|
105
|
-
(
|
106
|
-
self._set_default_node(source),
|
107
|
-
target,
|
108
|
-
EdgeData(index=self._rule_id, num_gates=len(sources), rule=equiv, source=source),
|
109
|
-
)
|
110
|
-
for source in sources
|
111
|
-
]
|
112
|
-
self._graph.add_edges_from(edges)
|
113
|
-
self._rule_id += 1
|
114
|
-
|
115
|
-
def has_entry(self, gate):
|
116
|
-
"""Check if a library contains any decompositions for gate.
|
117
|
-
|
118
|
-
Args:
|
119
|
-
gate (Gate): A Gate instance.
|
120
|
-
|
121
|
-
Returns:
|
122
|
-
Bool: True if gate has a known decomposition in the library.
|
123
|
-
False otherwise.
|
124
|
-
"""
|
125
|
-
key = Key(name=gate.name, num_qubits=gate.num_qubits)
|
126
|
-
|
127
|
-
return key in self._key_to_node_index
|
128
|
-
|
129
|
-
def set_entry(self, gate, entry):
|
130
|
-
"""Set the equivalence record for a Gate. Future queries for the Gate
|
131
|
-
will return only the circuits provided.
|
132
|
-
|
133
|
-
Parameterized Gates (those including `qiskit.circuit.Parameters` in their
|
134
|
-
`Gate.params`) can be marked equivalent to parameterized circuits,
|
135
|
-
provided the parameters match.
|
136
|
-
|
137
|
-
Args:
|
138
|
-
gate (Gate): A Gate instance.
|
139
|
-
entry (List['QuantumCircuit']) : A list of QuantumCircuits, each
|
140
|
-
equivalently implementing the given Gate.
|
141
|
-
"""
|
142
|
-
for equiv in entry:
|
143
|
-
_raise_if_shape_mismatch(gate, equiv)
|
144
|
-
_raise_if_param_mismatch(gate.params, equiv.parameters)
|
145
|
-
|
146
|
-
node_index = self._set_default_node(Key(name=gate.name, num_qubits=gate.num_qubits))
|
147
|
-
# Remove previous equivalences of this node, leaving in place any later equivalences that
|
148
|
-
# were added that use `gate`.
|
149
|
-
self._graph[node_index].equivs.clear()
|
150
|
-
for parent, child, _ in self._graph.in_edges(node_index):
|
151
|
-
# `child` should always be ourselves, but there might be parallel edges.
|
152
|
-
self._graph.remove_edge(parent, child)
|
153
|
-
for equivalence in entry:
|
154
|
-
self.add_equivalence(gate, equivalence)
|
155
|
-
|
156
|
-
def get_entry(self, gate):
|
157
|
-
"""Gets the set of QuantumCircuits circuits from the library which
|
158
|
-
equivalently implement the given Gate.
|
159
|
-
|
160
|
-
Parameterized circuits will have their parameters replaced with the
|
161
|
-
corresponding entries from Gate.params.
|
162
|
-
|
163
|
-
Args:
|
164
|
-
gate (Gate) - Gate: A Gate instance.
|
165
|
-
|
166
|
-
Returns:
|
167
|
-
List[QuantumCircuit]: A list of equivalent QuantumCircuits. If empty,
|
168
|
-
library contains no known decompositions of Gate.
|
169
|
-
|
170
|
-
Returned circuits will be ordered according to their insertion in
|
171
|
-
the library, from earliest to latest, from top to base. The
|
172
|
-
ordering of the StandardEquivalenceLibrary will not generally be
|
173
|
-
consistent across Qiskit versions.
|
174
|
-
"""
|
175
|
-
key = Key(name=gate.name, num_qubits=gate.num_qubits)
|
176
|
-
query_params = gate.params
|
177
|
-
|
178
|
-
return [_rebind_equiv(equiv, query_params) for equiv in self._get_equivalences(key)]
|
179
|
-
|
180
|
-
def keys(self):
|
181
|
-
"""Return list of keys to key to node index map.
|
182
|
-
|
183
|
-
Returns:
|
184
|
-
List: Keys to the key to node index map.
|
185
|
-
"""
|
186
|
-
return self._key_to_node_index.keys()
|
187
|
-
|
188
|
-
def node_index(self, key):
|
189
|
-
"""Return node index for a given key.
|
190
|
-
|
191
|
-
Args:
|
192
|
-
key (Key): Key to an equivalence.
|
193
|
-
|
194
|
-
Returns:
|
195
|
-
Int: Index to the node in the graph for the given key.
|
196
|
-
"""
|
197
|
-
return self._key_to_node_index[key]
|
198
|
-
|
199
33
|
def draw(self, filename=None):
|
200
34
|
"""Draws the equivalence relations available in the library.
|
201
35
|
|
@@ -227,12 +61,13 @@ class EquivalenceLibrary:
|
|
227
61
|
graph = rx.PyDiGraph()
|
228
62
|
|
229
63
|
node_map = {}
|
230
|
-
for key in
|
231
|
-
name, num_qubits = key
|
64
|
+
for key in super().keys():
|
65
|
+
name, num_qubits = key.name, key.num_qubits
|
232
66
|
equivalences = self._get_equivalences(key)
|
233
67
|
|
234
68
|
basis = frozenset([f"{name}/{num_qubits}"])
|
235
|
-
for
|
69
|
+
for equivalence in equivalences:
|
70
|
+
params, decomp = equivalence.params, equivalence.circuit
|
236
71
|
decomp_basis = frozenset(
|
237
72
|
f"{name}/{num_qubits}"
|
238
73
|
for name, num_qubits in {
|
@@ -257,39 +92,3 @@ class EquivalenceLibrary:
|
|
257
92
|
)
|
258
93
|
|
259
94
|
return graph
|
260
|
-
|
261
|
-
def _get_equivalences(self, key):
|
262
|
-
"""Get all the equivalences for the given key"""
|
263
|
-
return (
|
264
|
-
self._graph[self._key_to_node_index[key]].equivs
|
265
|
-
if key in self._key_to_node_index
|
266
|
-
else []
|
267
|
-
)
|
268
|
-
|
269
|
-
|
270
|
-
def _raise_if_param_mismatch(gate_params, circuit_parameters):
|
271
|
-
gate_parameters = [p for p in gate_params if isinstance(p, ParameterExpression)]
|
272
|
-
|
273
|
-
if set(gate_parameters) != circuit_parameters:
|
274
|
-
raise CircuitError(
|
275
|
-
"Cannot add equivalence between circuit and gate "
|
276
|
-
f"of different parameters. Gate params: {gate_parameters}. "
|
277
|
-
f"Circuit params: {circuit_parameters}."
|
278
|
-
)
|
279
|
-
|
280
|
-
|
281
|
-
def _raise_if_shape_mismatch(gate, circuit):
|
282
|
-
if gate.num_qubits != circuit.num_qubits or gate.num_clbits != circuit.num_clbits:
|
283
|
-
raise CircuitError(
|
284
|
-
"Cannot add equivalence between circuit and gate "
|
285
|
-
f"of different shapes. Gate: {gate.num_qubits} qubits and {gate.num_clbits} clbits. "
|
286
|
-
f"Circuit: {circuit.num_qubits} qubits and {circuit.num_clbits} clbits."
|
287
|
-
)
|
288
|
-
|
289
|
-
|
290
|
-
def _rebind_equiv(equiv, query_params):
|
291
|
-
equiv_params, equiv_circuit = equiv
|
292
|
-
param_map = {x: y for x, y in zip(equiv_params, query_params) if isinstance(x, Parameter)}
|
293
|
-
equiv = equiv_circuit.assign_parameters(param_map, inplace=False, flat_input=True)
|
294
|
-
|
295
|
-
return equiv
|
qiskit/circuit/gate.py
CHANGED
@@ -89,7 +89,9 @@ class Gate(Instruction):
|
|
89
89
|
from qiskit.circuit.library.generalized_gates.unitary import UnitaryGate
|
90
90
|
|
91
91
|
if not annotated:
|
92
|
-
return UnitaryGate(
|
92
|
+
return UnitaryGate(
|
93
|
+
Operator(self).power(exponent, assume_unitary=True), label=f"{self.name}^{exponent}"
|
94
|
+
)
|
93
95
|
else:
|
94
96
|
return AnnotatedOperation(self, PowerModifier(exponent))
|
95
97
|
|
qiskit/circuit/instruction.py
CHANGED
@@ -103,7 +103,23 @@ class Instruction(Operation):
|
|
103
103
|
# list of instructions (and their contexts) that this instruction is composed of
|
104
104
|
# empty definition means opaque or fundamental instruction
|
105
105
|
self._definition = None
|
106
|
+
if duration is not None:
|
107
|
+
warnings.warn(
|
108
|
+
"Setting a custom duration per instruction is deprecated as of Qiskit "
|
109
|
+
"1.3.0. It will be removed in Qiskit 2.0.0. An instruction's duration "
|
110
|
+
"is defined in a backend's Target object.",
|
111
|
+
DeprecationWarning,
|
112
|
+
stacklevel=2,
|
113
|
+
)
|
106
114
|
self._duration = duration
|
115
|
+
if unit is not None and unit != "dt":
|
116
|
+
warnings.warn(
|
117
|
+
"Setting a custom unit for duration per instruction is deprecated as of Qiskit "
|
118
|
+
"1.3.0. It will be removed in Qiskit 2.0.0. An instruction's duration "
|
119
|
+
"is defined in a backend's Target object which has a fixed unit in seconds.",
|
120
|
+
DeprecationWarning,
|
121
|
+
stacklevel=2,
|
122
|
+
)
|
107
123
|
self._unit = unit
|
108
124
|
|
109
125
|
self.params = params # must be at last (other properties may be required for validation)
|
@@ -160,6 +176,7 @@ class Instruction(Operation):
|
|
160
176
|
return self.copy()
|
161
177
|
|
162
178
|
@property
|
179
|
+
@deprecate_func(since="1.3.0", removal_timeline="in 2.0.0", is_property=True)
|
163
180
|
def condition(self):
|
164
181
|
"""The classical condition on the instruction."""
|
165
182
|
return self._condition
|
@@ -341,24 +358,26 @@ class Instruction(Operation):
|
|
341
358
|
sel.add_equivalence(self, decomposition)
|
342
359
|
|
343
360
|
@property
|
361
|
+
@deprecate_func(since="1.3.0", removal_timeline="in Qiskit 2.0.0", is_property=True)
|
344
362
|
def duration(self):
|
345
363
|
"""Get the duration."""
|
346
364
|
return self._duration
|
347
365
|
|
348
366
|
@duration.setter
|
349
|
-
def duration(self,
|
367
|
+
def duration(self, value):
|
350
368
|
"""Set the duration."""
|
351
|
-
self._duration =
|
369
|
+
self._duration = value
|
352
370
|
|
353
371
|
@property
|
372
|
+
@deprecate_func(since="1.3.0", removal_timeline="in Qiskit 2.0.0", is_property=True)
|
354
373
|
def unit(self):
|
355
374
|
"""Get the time unit of duration."""
|
356
375
|
return self._unit
|
357
376
|
|
358
377
|
@unit.setter
|
359
|
-
def unit(self,
|
378
|
+
def unit(self, value):
|
360
379
|
"""Set the time unit of duration."""
|
361
|
-
self._unit =
|
380
|
+
self._unit = value
|
362
381
|
|
363
382
|
@deprecate_func(
|
364
383
|
since="1.2",
|
@@ -392,8 +411,8 @@ class Instruction(Operation):
|
|
392
411
|
# Add condition parameters for assembler. This is needed to convert
|
393
412
|
# to a qobj conditional instruction at assemble time and after
|
394
413
|
# conversion will be deleted by the assembler.
|
395
|
-
if self.
|
396
|
-
instruction._condition = self.
|
414
|
+
if self._condition:
|
415
|
+
instruction._condition = self._condition
|
397
416
|
return instruction
|
398
417
|
|
399
418
|
@property
|
@@ -499,6 +518,7 @@ class Instruction(Operation):
|
|
499
518
|
inverse_gate.definition = inverse_definition
|
500
519
|
return inverse_gate
|
501
520
|
|
521
|
+
@deprecate_func(since="1.3.0", removal_timeline="in 2.0.0")
|
502
522
|
def c_if(self, classical, val):
|
503
523
|
"""Set a classical equality condition on this instruction between the register or cbit
|
504
524
|
``classical`` and value ``val``.
|
@@ -614,7 +634,7 @@ class Instruction(Operation):
|
|
614
634
|
qargs = tuple(qc.qubits)
|
615
635
|
cargs = tuple(qc.clbits)
|
616
636
|
base = self.copy()
|
617
|
-
if self.
|
637
|
+
if self._condition:
|
618
638
|
# Condition is handled on the outer instruction.
|
619
639
|
base = base.to_mutable()
|
620
640
|
base.condition = None
|
@@ -622,18 +642,19 @@ class Instruction(Operation):
|
|
622
642
|
qc._append(CircuitInstruction(base, qargs, cargs))
|
623
643
|
|
624
644
|
instruction.definition = qc
|
625
|
-
if self.
|
626
|
-
instruction = instruction.c_if(*self.
|
645
|
+
if self._condition:
|
646
|
+
instruction = instruction.c_if(*self._condition)
|
627
647
|
return instruction
|
628
648
|
|
629
649
|
@property
|
650
|
+
@deprecate_func(since="1.3.0", removal_timeline="in 2.0.0", is_property=True)
|
630
651
|
def condition_bits(self) -> List[Clbit]:
|
631
652
|
"""Get Clbits in condition."""
|
632
653
|
from qiskit.circuit.controlflow import condition_resources # pylint: disable=cyclic-import
|
633
654
|
|
634
|
-
if self.
|
655
|
+
if self._condition is None:
|
635
656
|
return []
|
636
|
-
return list(condition_resources(self.
|
657
|
+
return list(condition_resources(self._condition).clbits)
|
637
658
|
|
638
659
|
@property
|
639
660
|
def name(self):
|
qiskit/circuit/instructionset.py
CHANGED
@@ -20,6 +20,7 @@ from collections.abc import MutableSequence
|
|
20
20
|
from typing import Callable
|
21
21
|
|
22
22
|
from qiskit.circuit.exceptions import CircuitError
|
23
|
+
from qiskit.utils import deprecate_func
|
23
24
|
from .classicalregister import Clbit, ClassicalRegister
|
24
25
|
from .operation import Operation
|
25
26
|
from .quantumcircuitdata import CircuitInstruction
|
@@ -105,6 +106,7 @@ class InstructionSet:
|
|
105
106
|
)
|
106
107
|
return self
|
107
108
|
|
109
|
+
@deprecate_func(since="1.3.0", removal_timeline="in 2.0.0")
|
108
110
|
def c_if(self, classical: Clbit | ClassicalRegister | int, val: int) -> "InstructionSet":
|
109
111
|
"""Set a classical equality condition on all the instructions in this set between the
|
110
112
|
:obj:`.ClassicalRegister` or :obj:`.Clbit` ``classical`` and value ``val``.
|