qiskit 1.4.2__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.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 +3 -9
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +35 -10
- qiskit/circuit/{add_control.py → _add_control.py} +32 -12
- qiskit/circuit/_classical_resource_map.py +5 -3
- qiskit/circuit/barrier.py +3 -7
- qiskit/circuit/classical/expr/__init__.py +31 -3
- qiskit/circuit/classical/expr/constructors.py +236 -28
- qiskit/circuit/classical/expr/expr.py +104 -3
- qiskit/circuit/classical/expr/visitors.py +75 -0
- qiskit/circuit/classical/types/__init__.py +12 -8
- qiskit/circuit/classical/types/ordering.py +14 -7
- qiskit/circuit/classical/types/types.py +36 -0
- qiskit/circuit/commutation_checker.py +34 -7
- qiskit/circuit/controlflow/__init__.py +32 -1
- qiskit/circuit/controlflow/_builder_utils.py +9 -5
- qiskit/circuit/controlflow/box.py +163 -0
- qiskit/circuit/controlflow/break_loop.py +1 -1
- qiskit/circuit/controlflow/builder.py +139 -39
- qiskit/circuit/controlflow/continue_loop.py +1 -3
- qiskit/circuit/controlflow/control_flow.py +10 -0
- qiskit/circuit/controlflow/for_loop.py +2 -1
- qiskit/circuit/controlflow/if_else.py +3 -16
- qiskit/circuit/controlflow/switch_case.py +2 -8
- qiskit/circuit/controlflow/while_loop.py +2 -7
- qiskit/circuit/controlledgate.py +2 -4
- qiskit/circuit/delay.py +40 -11
- qiskit/circuit/duration.py +0 -15
- qiskit/circuit/gate.py +2 -4
- qiskit/circuit/instruction.py +2 -141
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +469 -154
- qiskit/circuit/library/arithmetic/__init__.py +16 -10
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
- qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
- qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
- qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
- qiskit/circuit/library/bit_flip_oracle.py +130 -0
- qiskit/circuit/library/blueprintcircuit.py +52 -16
- qiskit/circuit/library/data_preparation/initializer.py +1 -1
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
- qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
- qiskit/circuit/library/generalized_gates/gms.py +1 -1
- qiskit/circuit/library/generalized_gates/isometry.py +1 -1
- qiskit/circuit/library/generalized_gates/pauli.py +1 -2
- qiskit/circuit/library/generalized_gates/uc.py +97 -7
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
- qiskit/circuit/library/generalized_gates/unitary.py +4 -2
- qiskit/circuit/library/graph_state.py +1 -0
- qiskit/circuit/library/hamiltonian_gate.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
- qiskit/circuit/library/n_local/n_local.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
- qiskit/circuit/library/overlap.py +2 -2
- qiskit/circuit/library/pauli_evolution.py +39 -24
- qiskit/circuit/library/phase_oracle.py +130 -51
- qiskit/circuit/library/standard_gates/__init__.py +0 -1
- qiskit/circuit/library/standard_gates/dcx.py +3 -4
- qiskit/circuit/library/standard_gates/ecr.py +3 -4
- qiskit/circuit/library/standard_gates/global_phase.py +5 -6
- qiskit/circuit/library/standard_gates/h.py +4 -9
- qiskit/circuit/library/standard_gates/i.py +2 -2
- qiskit/circuit/library/standard_gates/iswap.py +3 -4
- qiskit/circuit/library/standard_gates/p.py +15 -34
- qiskit/circuit/library/standard_gates/r.py +7 -10
- qiskit/circuit/library/standard_gates/rx.py +5 -15
- qiskit/circuit/library/standard_gates/rxx.py +3 -6
- qiskit/circuit/library/standard_gates/ry.py +5 -17
- qiskit/circuit/library/standard_gates/ryy.py +3 -6
- qiskit/circuit/library/standard_gates/rz.py +5 -17
- qiskit/circuit/library/standard_gates/rzx.py +3 -6
- qiskit/circuit/library/standard_gates/rzz.py +3 -6
- qiskit/circuit/library/standard_gates/s.py +6 -15
- qiskit/circuit/library/standard_gates/swap.py +4 -11
- qiskit/circuit/library/standard_gates/sx.py +7 -12
- qiskit/circuit/library/standard_gates/t.py +6 -7
- qiskit/circuit/library/standard_gates/u.py +2 -10
- qiskit/circuit/library/standard_gates/u1.py +5 -16
- qiskit/circuit/library/standard_gates/u2.py +2 -6
- qiskit/circuit/library/standard_gates/u3.py +3 -11
- qiskit/circuit/library/standard_gates/x.py +14 -62
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
- qiskit/circuit/library/standard_gates/y.py +4 -9
- qiskit/circuit/library/standard_gates/z.py +5 -15
- qiskit/circuit/measure.py +11 -2
- qiskit/circuit/parameterexpression.py +7 -1
- qiskit/circuit/quantumcircuit.py +890 -564
- qiskit/circuit/random/utils.py +12 -6
- qiskit/circuit/reset.py +5 -2
- qiskit/circuit/singleton.py +5 -11
- qiskit/circuit/store.py +0 -8
- qiskit/compiler/__init__.py +1 -7
- qiskit/compiler/transpiler.py +38 -196
- qiskit/converters/circuit_to_dag.py +6 -4
- qiskit/converters/circuit_to_dagdependency.py +0 -2
- qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
- qiskit/converters/circuit_to_gate.py +1 -1
- qiskit/converters/circuit_to_instruction.py +16 -29
- qiskit/converters/dag_to_circuit.py +7 -8
- qiskit/converters/dag_to_dagdependency.py +0 -1
- qiskit/converters/dag_to_dagdependency_v2.py +0 -1
- qiskit/converters/dagdependency_to_circuit.py +0 -6
- qiskit/converters/dagdependency_to_dag.py +0 -6
- qiskit/dagcircuit/collect_blocks.py +32 -20
- qiskit/dagcircuit/dagdependency.py +3 -37
- qiskit/dagcircuit/dagdependency_v2.py +5 -82
- qiskit/dagcircuit/dagnode.py +14 -2
- qiskit/passmanager/__init__.py +24 -6
- qiskit/passmanager/passmanager.py +26 -24
- qiskit/primitives/__init__.py +44 -35
- qiskit/primitives/backend_estimator_v2.py +102 -23
- qiskit/primitives/backend_sampler_v2.py +5 -20
- qiskit/primitives/base/__init__.py +4 -4
- qiskit/primitives/base/base_estimator.py +77 -82
- qiskit/primitives/base/base_primitive_job.py +2 -2
- qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
- qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
- qiskit/primitives/base/base_sampler.py +52 -60
- qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
- qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
- qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
- qiskit/primitives/containers/bindings_array.py +3 -1
- qiskit/primitives/containers/bit_array.py +23 -0
- qiskit/primitives/containers/data_bin.py +3 -1
- qiskit/primitives/containers/observables_array.py +19 -2
- qiskit/primitives/statevector_sampler.py +6 -8
- qiskit/primitives/utils.py +14 -189
- qiskit/providers/__init__.py +4 -130
- qiskit/providers/backend.py +11 -314
- qiskit/providers/basic_provider/__init__.py +3 -1
- qiskit/providers/basic_provider/basic_provider.py +29 -9
- qiskit/providers/basic_provider/basic_simulator.py +158 -298
- qiskit/providers/exceptions.py +0 -33
- qiskit/providers/fake_provider/__init__.py +0 -37
- qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
- qiskit/qasm2/__init__.py +21 -6
- qiskit/qasm2/export.py +2 -10
- qiskit/qasm2/parse.py +11 -25
- qiskit/qasm3/__init__.py +5 -1
- qiskit/qasm3/ast.py +44 -0
- qiskit/qasm3/exporter.py +65 -27
- qiskit/qasm3/printer.py +35 -4
- qiskit/qpy/__init__.py +162 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +98 -130
- qiskit/qpy/binary_io/schedules.py +69 -439
- qiskit/qpy/binary_io/value.py +154 -31
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +34 -81
- qiskit/qpy/type_keys.py +58 -221
- qiskit/quantum_info/analysis/distance.py +3 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
- qiskit/quantum_info/operators/operator.py +6 -2
- qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
- qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
- qiskit/quantum_info/states/densitymatrix.py +16 -6
- qiskit/quantum_info/states/stabilizerstate.py +35 -4
- qiskit/quantum_info/states/statevector.py +16 -6
- qiskit/result/__init__.py +5 -17
- qiskit/result/models.py +18 -11
- qiskit/result/result.py +38 -134
- qiskit/result/sampled_expval.py +1 -2
- qiskit/result/utils.py +3 -4
- qiskit/synthesis/__init__.py +21 -1
- qiskit/synthesis/arithmetic/__init__.py +3 -1
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
- qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
- qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
- qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
- qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
- qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
- qiskit/synthesis/boolean/boolean_expression.py +231 -0
- qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
- qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
- qiskit/synthesis/evolution/lie_trotter.py +10 -7
- qiskit/synthesis/evolution/product_formula.py +44 -35
- qiskit/synthesis/evolution/qdrift.py +17 -24
- qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
- qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
- qiskit/synthesis/multi_controlled/__init__.py +1 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
- qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
- qiskit/synthesis/two_qubit/__init__.py +1 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
- qiskit/transpiler/__init__.py +32 -232
- qiskit/transpiler/basepasses.py +20 -51
- qiskit/transpiler/layout.py +1 -1
- qiskit/transpiler/passes/__init__.py +4 -40
- qiskit/transpiler/passes/basis/basis_translator.py +5 -4
- qiskit/transpiler/passes/basis/decompose.py +1 -15
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
- qiskit/transpiler/passes/layout/apply_layout.py +4 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
- qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
- qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
- qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
- qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
- qiskit/transpiler/passes/optimization/__init__.py +2 -3
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
- qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
- qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
- qiskit/transpiler/passes/optimization/light_cone.py +135 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
- qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
- qiskit/transpiler/passes/routing/__init__.py +0 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
- qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
- qiskit/transpiler/passes/scheduling/__init__.py +1 -7
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
- qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
- qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
- qiskit/transpiler/passes/synthesis/plugin.py +4 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
- qiskit/transpiler/passes/utils/control_flow.py +2 -6
- qiskit/transpiler/passes/utils/gate_direction.py +7 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
- qiskit/transpiler/passmanager.py +13 -0
- qiskit/transpiler/passmanager_config.py +5 -81
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
- qiskit/transpiler/preset_passmanagers/common.py +140 -167
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
- qiskit/transpiler/preset_passmanagers/level0.py +2 -11
- qiskit/transpiler/preset_passmanagers/level1.py +2 -14
- qiskit/transpiler/preset_passmanagers/level2.py +2 -12
- qiskit/transpiler/preset_passmanagers/level3.py +2 -11
- qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
- qiskit/transpiler/target.py +78 -524
- qiskit/user_config.py +8 -4
- qiskit/utils/__init__.py +13 -12
- qiskit/utils/deprecation.py +4 -112
- qiskit/utils/optionals.py +11 -4
- qiskit/utils/parallel.py +214 -87
- qiskit/utils/units.py +4 -1
- qiskit/visualization/__init__.py +3 -7
- qiskit/visualization/array.py +4 -1
- qiskit/visualization/bloch.py +1 -1
- qiskit/visualization/circuit/_utils.py +19 -19
- qiskit/visualization/circuit/circuit_visualization.py +11 -4
- qiskit/visualization/circuit/matplotlib.py +13 -23
- qiskit/visualization/circuit/text.py +7 -3
- qiskit/visualization/counts_visualization.py +4 -0
- qiskit/visualization/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/library.py +4 -1
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +19 -2
- qiskit/visualization/timeline/core.py +19 -13
- qiskit/visualization/timeline/interface.py +19 -18
- qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
- qiskit/assembler/__init__.py +0 -42
- qiskit/assembler/assemble_circuits.py +0 -451
- qiskit/assembler/assemble_schedules.py +0 -367
- qiskit/assembler/disassemble.py +0 -310
- qiskit/assembler/run_config.py +0 -77
- qiskit/circuit/bit.py +0 -106
- qiskit/circuit/classicalfunction/__init__.py +0 -152
- qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
- qiskit/circuit/classicalfunction/classical_element.py +0 -54
- qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
- qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
- qiskit/circuit/classicalfunction/exceptions.py +0 -41
- qiskit/circuit/classicalfunction/types.py +0 -18
- qiskit/circuit/classicalfunction/utils.py +0 -91
- qiskit/circuit/classicalregister.py +0 -57
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
- qiskit/circuit/quantumregister.py +0 -75
- qiskit/circuit/register.py +0 -246
- qiskit/compiler/assembler.py +0 -689
- qiskit/compiler/scheduler.py +0 -109
- qiskit/compiler/sequencer.py +0 -71
- qiskit/primitives/backend_estimator.py +0 -486
- qiskit/primitives/backend_sampler.py +0 -222
- qiskit/primitives/estimator.py +0 -172
- qiskit/primitives/sampler.py +0 -162
- qiskit/providers/backend_compat.py +0 -507
- qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
- qiskit/providers/fake_provider/fake_1q.py +0 -91
- qiskit/providers/fake_provider/fake_backend.py +0 -165
- qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
- qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
- qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
- qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
- qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
- qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
- qiskit/providers/models/__init__.py +0 -89
- qiskit/providers/models/backendconfiguration.py +0 -1040
- qiskit/providers/models/backendproperties.py +0 -535
- qiskit/providers/models/backendstatus.py +0 -104
- qiskit/providers/models/jobstatus.py +0 -77
- qiskit/providers/models/pulsedefaults.py +0 -305
- qiskit/providers/provider.py +0 -95
- qiskit/pulse/__init__.py +0 -158
- qiskit/pulse/builder.py +0 -2262
- qiskit/pulse/calibration_entries.py +0 -381
- qiskit/pulse/channels.py +0 -227
- qiskit/pulse/configuration.py +0 -245
- qiskit/pulse/exceptions.py +0 -45
- qiskit/pulse/filters.py +0 -309
- qiskit/pulse/instruction_schedule_map.py +0 -424
- qiskit/pulse/instructions/__init__.py +0 -67
- qiskit/pulse/instructions/acquire.py +0 -150
- qiskit/pulse/instructions/delay.py +0 -71
- qiskit/pulse/instructions/directives.py +0 -154
- qiskit/pulse/instructions/frequency.py +0 -135
- qiskit/pulse/instructions/instruction.py +0 -270
- qiskit/pulse/instructions/phase.py +0 -152
- qiskit/pulse/instructions/play.py +0 -99
- qiskit/pulse/instructions/reference.py +0 -100
- qiskit/pulse/instructions/snapshot.py +0 -82
- qiskit/pulse/library/__init__.py +0 -97
- qiskit/pulse/library/continuous.py +0 -430
- qiskit/pulse/library/pulse.py +0 -148
- qiskit/pulse/library/samplers/__init__.py +0 -15
- qiskit/pulse/library/samplers/decorators.py +0 -295
- qiskit/pulse/library/samplers/strategies.py +0 -71
- qiskit/pulse/library/symbolic_pulses.py +0 -1989
- qiskit/pulse/library/waveform.py +0 -136
- qiskit/pulse/macros.py +0 -262
- qiskit/pulse/parameter_manager.py +0 -445
- qiskit/pulse/parser.py +0 -314
- qiskit/pulse/reference_manager.py +0 -58
- qiskit/pulse/schedule.py +0 -1854
- qiskit/pulse/transforms/__init__.py +0 -106
- qiskit/pulse/transforms/alignments.py +0 -406
- qiskit/pulse/transforms/base_transforms.py +0 -71
- qiskit/pulse/transforms/canonicalization.py +0 -498
- qiskit/pulse/transforms/dag.py +0 -122
- qiskit/pulse/utils.py +0 -149
- qiskit/qobj/__init__.py +0 -75
- qiskit/qobj/common.py +0 -81
- qiskit/qobj/converters/__init__.py +0 -18
- qiskit/qobj/converters/lo_config.py +0 -177
- qiskit/qobj/converters/pulse_instruction.py +0 -897
- qiskit/qobj/pulse_qobj.py +0 -709
- qiskit/qobj/qasm_qobj.py +0 -708
- qiskit/qobj/utils.py +0 -46
- qiskit/result/mitigation/base_readout_mitigator.py +0 -79
- qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
- qiskit/result/mitigation/local_readout_mitigator.py +0 -328
- qiskit/result/mitigation/utils.py +0 -217
- qiskit/scheduler/__init__.py +0 -40
- qiskit/scheduler/config.py +0 -37
- qiskit/scheduler/lowering.py +0 -187
- qiskit/scheduler/methods/__init__.py +0 -15
- qiskit/scheduler/methods/basic.py +0 -140
- qiskit/scheduler/schedule_circuit.py +0 -69
- qiskit/scheduler/sequence.py +0 -104
- qiskit/transpiler/passes/calibration/__init__.py +0 -17
- qiskit/transpiler/passes/calibration/base_builder.py +0 -79
- qiskit/transpiler/passes/calibration/builders.py +0 -20
- qiskit/transpiler/passes/calibration/exceptions.py +0 -22
- qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
- qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
- qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
- qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
- qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
- qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
- qiskit/transpiler/passes/scheduling/alap.py +0 -153
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
- qiskit/transpiler/passes/scheduling/asap.py +0 -175
- qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
- qiskit/utils/deprecate_pulse.py +0 -119
- qiskit/utils/multiprocessing.py +0 -56
- qiskit/visualization/pulse_v2/__init__.py +0 -21
- qiskit/visualization/pulse_v2/core.py +0 -901
- qiskit/visualization/pulse_v2/device_info.py +0 -173
- qiskit/visualization/pulse_v2/drawings.py +0 -253
- qiskit/visualization/pulse_v2/events.py +0 -254
- qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
- qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
- qiskit/visualization/pulse_v2/generators/chart.py +0 -208
- qiskit/visualization/pulse_v2/generators/frame.py +0 -436
- qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
- qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
- qiskit/visualization/pulse_v2/interface.py +0 -459
- qiskit/visualization/pulse_v2/layouts.py +0 -387
- qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
- qiskit/visualization/pulse_v2/stylesheet.py +0 -312
- qiskit/visualization/pulse_v2/types.py +0 -242
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
- {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -25,13 +25,13 @@ import typing
|
|
25
25
|
from typing import Collection, Iterable, FrozenSet, Tuple, Union, Optional, Sequence
|
26
26
|
|
27
27
|
from qiskit._accelerate.circuit import CircuitData
|
28
|
+
from qiskit.circuit import Register
|
28
29
|
from qiskit.circuit.classical import expr
|
29
|
-
from qiskit.circuit
|
30
|
+
from qiskit.circuit import Clbit, ClassicalRegister
|
30
31
|
from qiskit.circuit.exceptions import CircuitError
|
31
32
|
from qiskit.circuit.instruction import Instruction
|
32
33
|
from qiskit.circuit.quantumcircuitdata import CircuitInstruction
|
33
|
-
from qiskit.circuit
|
34
|
-
from qiskit.circuit.register import Register
|
34
|
+
from qiskit.circuit import Qubit, QuantumRegister
|
35
35
|
|
36
36
|
from ._builder_utils import condition_resources, node_resources
|
37
37
|
|
@@ -121,6 +121,18 @@ class CircuitScopeInterface(abc.ABC):
|
|
121
121
|
redefines an existing name.
|
122
122
|
"""
|
123
123
|
|
124
|
+
@abc.abstractmethod
|
125
|
+
def add_stretch(self, stretch: expr.Stretch):
|
126
|
+
"""Add a stretch to the circuit scope.
|
127
|
+
|
128
|
+
Args:
|
129
|
+
stretch: the stretch to add, if valid.
|
130
|
+
|
131
|
+
Raises:
|
132
|
+
CircuitError: if the stretch cannot be added, such as because it invalidly shadows or
|
133
|
+
redefines an existing name.
|
134
|
+
"""
|
135
|
+
|
124
136
|
@abc.abstractmethod
|
125
137
|
def remove_var(self, var: expr.Var):
|
126
138
|
"""Remove a variable from the locals of this scope.
|
@@ -133,6 +145,18 @@ class CircuitScopeInterface(abc.ABC):
|
|
133
145
|
:meth:`add_uninitialized_var` call.
|
134
146
|
"""
|
135
147
|
|
148
|
+
@abc.abstractmethod
|
149
|
+
def remove_stretch(self, stretch: expr.Stretch):
|
150
|
+
"""Remove a stretch from the locals of this scope.
|
151
|
+
|
152
|
+
This is only called in the case that an exception occurred while initializing the stretch,
|
153
|
+
and is not exposed to users.
|
154
|
+
|
155
|
+
Args:
|
156
|
+
stretch: the stretch to remove. It can be assumed that this was already the subject of an
|
157
|
+
:meth:`add_stretch` call.
|
158
|
+
"""
|
159
|
+
|
136
160
|
@abc.abstractmethod
|
137
161
|
def use_var(self, var: expr.Var):
|
138
162
|
"""Called for every standalone classical real-time variable being used by some circuit
|
@@ -145,13 +169,21 @@ class CircuitScopeInterface(abc.ABC):
|
|
145
169
|
Args:
|
146
170
|
var: the variable to validate.
|
147
171
|
|
148
|
-
Returns:
|
149
|
-
the same variable.
|
150
|
-
|
151
172
|
Raises:
|
152
173
|
CircuitError: if the variable is not valid for this scope.
|
153
174
|
"""
|
154
175
|
|
176
|
+
@abc.abstractmethod
|
177
|
+
def use_stretch(self, stretch: expr.Stretch):
|
178
|
+
"""Called for every stretch being used by some circuit instruction.
|
179
|
+
|
180
|
+
Args:
|
181
|
+
stretch: the stretch to validate.
|
182
|
+
|
183
|
+
Raises:
|
184
|
+
CircuitError: if the stretch is not valid for this scope.
|
185
|
+
"""
|
186
|
+
|
155
187
|
@abc.abstractmethod
|
156
188
|
def get_var(self, name: str) -> Optional[expr.Var]:
|
157
189
|
"""Get the variable (if any) in scope with the given name.
|
@@ -166,6 +198,27 @@ class CircuitScopeInterface(abc.ABC):
|
|
166
198
|
the variable if it is found, otherwise ``None``.
|
167
199
|
"""
|
168
200
|
|
201
|
+
@abc.abstractmethod
|
202
|
+
def get_stretch(self, name: str) -> Optional[expr.Stretch]:
|
203
|
+
"""Get the stretch (if any) in scope with the given name.
|
204
|
+
|
205
|
+
This should call up to the parent scope if in a control-flow builder scope, in case the
|
206
|
+
stretch exists in an outer scope.
|
207
|
+
|
208
|
+
Args:
|
209
|
+
name: the name of the symbol to lookup.
|
210
|
+
|
211
|
+
Returns:
|
212
|
+
the stretch if it is found, otherwise ``None``.
|
213
|
+
"""
|
214
|
+
|
215
|
+
@abc.abstractmethod
|
216
|
+
def use_qubit(self, qubit: Qubit):
|
217
|
+
"""Called to mark that a :class:`~.circuit.Qubit` should be considered "used" by this scope,
|
218
|
+
without appending an explicit instruction.
|
219
|
+
|
220
|
+
The subclass may assume that the ``qubit`` is valid for the root scope."""
|
221
|
+
|
169
222
|
|
170
223
|
class InstructionResources(typing.NamedTuple):
|
171
224
|
"""The quantum and classical resources used within a particular instruction.
|
@@ -198,10 +251,12 @@ class InstructionPlaceholder(Instruction, abc.ABC):
|
|
198
251
|
with qc.for_loop(range(5)):
|
199
252
|
qc.h(0)
|
200
253
|
qc.measure(0, 0)
|
201
|
-
qc.
|
254
|
+
with qc.if_test((0, 0)):
|
255
|
+
qc.break_loop()
|
202
256
|
|
203
|
-
|
204
|
-
:obj:`~qiskit.circuit.Instruction` in order for
|
257
|
+
``qc.break_loop()`` needed to return a (mostly) functional
|
258
|
+
:obj:`~qiskit.circuit.Instruction` in order for the historical ``.InstructionSet.c_if``
|
259
|
+
to work correctly.
|
205
260
|
|
206
261
|
When appending a placeholder instruction into a circuit scope, you should create the
|
207
262
|
placeholder, and then ask it what resources it should be considered as using from the start by
|
@@ -234,9 +289,6 @@ class InstructionPlaceholder(Instruction, abc.ABC):
|
|
234
289
|
The caller of this function is responsible for ensuring that the inputs to this function
|
235
290
|
are non-strict supersets of the bits returned by :meth:`placeholder_resources`.
|
236
291
|
|
237
|
-
Any condition added in by a call to :obj:`.Instruction.c_if` will be propagated through, but
|
238
|
-
set properties like ``duration`` will not; it doesn't make sense for control-flow operations
|
239
|
-
to have pulse scheduling on them.
|
240
292
|
|
241
293
|
Args:
|
242
294
|
qubits: The qubits the created instruction should be defined across.
|
@@ -265,34 +317,9 @@ class InstructionPlaceholder(Instruction, abc.ABC):
|
|
265
317
|
"""
|
266
318
|
raise NotImplementedError
|
267
319
|
|
268
|
-
def _copy_mutable_properties(self, instruction: Instruction) -> Instruction:
|
269
|
-
"""Copy mutable properties from ourselves onto a non-placeholder instruction.
|
270
|
-
|
271
|
-
The mutable properties are expected to be things like ``condition``, added onto a
|
272
|
-
placeholder by the :meth:`c_if` method. This mutates ``instruction``, and returns the same
|
273
|
-
instance that was passed. This is mostly intended to make writing concrete versions of
|
274
|
-
:meth:`.concrete_instruction` easy.
|
275
|
-
|
276
|
-
The complete list of mutations is:
|
277
|
-
|
278
|
-
* ``condition``, added by :meth:`c_if`.
|
279
|
-
|
280
|
-
Args:
|
281
|
-
instruction: the concrete instruction instance to be mutated.
|
282
|
-
|
283
|
-
Returns:
|
284
|
-
The same instruction instance that was passed, but mutated to propagate the tracked
|
285
|
-
changes to this class.
|
286
|
-
"""
|
287
|
-
instruction._condition = self._condition
|
288
|
-
return instruction
|
289
|
-
|
290
320
|
# Provide some better error messages, just in case something goes wrong during development and
|
291
321
|
# the placeholder type leaks out to somewhere visible.
|
292
322
|
|
293
|
-
def assemble(self):
|
294
|
-
raise CircuitError("Cannot assemble a placeholder instruction.")
|
295
|
-
|
296
323
|
def repeat(self, n):
|
297
324
|
raise CircuitError("Cannot repeat a placeholder instruction.")
|
298
325
|
|
@@ -336,6 +363,8 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
|
|
336
363
|
"_forbidden_message",
|
337
364
|
"_vars_local",
|
338
365
|
"_vars_capture",
|
366
|
+
"_stretches_local",
|
367
|
+
"_stretches_capture",
|
339
368
|
)
|
340
369
|
|
341
370
|
def __init__(
|
@@ -378,6 +407,8 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
|
|
378
407
|
self.global_phase = 0.0
|
379
408
|
self._vars_local = {}
|
380
409
|
self._vars_capture = {}
|
410
|
+
self._stretches_local = {}
|
411
|
+
self._stretches_capture = {}
|
381
412
|
self._allow_jumps = allow_jumps
|
382
413
|
self._parent = parent
|
383
414
|
self._built = False
|
@@ -467,25 +498,64 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
|
|
467
498
|
raise CircuitError("Cannot add resources after the scope has been built.")
|
468
499
|
# We can shadow a name if it was declared in an outer scope, but only if we haven't already
|
469
500
|
# captured it ourselves yet.
|
501
|
+
if (previous := self._stretches_local.get(var.name)) is not None:
|
502
|
+
raise CircuitError(f"cannot add '{var}' as its name shadows the existing '{previous}'")
|
470
503
|
if (previous := self._vars_local.get(var.name)) is not None:
|
471
504
|
if previous == var:
|
472
505
|
raise CircuitError(f"'{var}' is already present in the scope")
|
473
506
|
raise CircuitError(f"cannot add '{var}' as its name shadows the existing '{previous}'")
|
474
|
-
if var.name in self._vars_capture:
|
507
|
+
if var.name in self._vars_capture or var.name in self._stretches_capture:
|
475
508
|
raise CircuitError(f"cannot add '{var}' as its name shadows the existing '{previous}'")
|
476
509
|
self._vars_local[var.name] = var
|
477
510
|
|
511
|
+
def add_stretch(self, stretch: expr.Stretch):
|
512
|
+
if self._built:
|
513
|
+
raise CircuitError("Cannot add resources after the scope has been built.")
|
514
|
+
# We can shadow a name if it was declared in an outer scope, but only if we haven't already
|
515
|
+
# captured it ourselves yet.
|
516
|
+
if (previous := self._vars_local.get(stretch.name)) is not None:
|
517
|
+
raise CircuitError(
|
518
|
+
f"cannot add '{stretch}' as its name shadows the existing '{previous}'"
|
519
|
+
)
|
520
|
+
if (previous := self._stretches_local.get(stretch.name)) is not None:
|
521
|
+
if previous == stretch:
|
522
|
+
raise CircuitError(f"'{stretch}' is already present in the scope")
|
523
|
+
raise CircuitError(
|
524
|
+
f"cannot add '{stretch}' as its name shadows the existing '{previous}'"
|
525
|
+
)
|
526
|
+
if stretch.name in self._vars_capture or stretch.name in self._stretches_capture:
|
527
|
+
raise CircuitError(
|
528
|
+
f"cannot add '{stretch}' as its name shadows the existing '{previous}'"
|
529
|
+
)
|
530
|
+
self._stretches_local[stretch.name] = stretch
|
531
|
+
|
478
532
|
def remove_var(self, var: expr.Var):
|
479
533
|
if self._built:
|
480
534
|
raise RuntimeError("exception handler 'remove_var' called after scope built")
|
481
535
|
self._vars_local.pop(var.name)
|
482
536
|
|
537
|
+
def remove_stretch(self, stretch: expr.Stretch):
|
538
|
+
if self._built:
|
539
|
+
raise RuntimeError("exception handler 'remove_stretch' called after scope built")
|
540
|
+
self._stretches_local.pop(stretch.name)
|
541
|
+
|
483
542
|
def get_var(self, name: str):
|
543
|
+
if name in self._stretches_local:
|
544
|
+
return None
|
484
545
|
if (out := self._vars_local.get(name)) is not None:
|
485
546
|
return out
|
486
547
|
return self._parent.get_var(name)
|
487
548
|
|
549
|
+
def get_stretch(self, name: str):
|
550
|
+
if name in self._vars_local:
|
551
|
+
return None
|
552
|
+
if (out := self._stretches_local.get(name)) is not None:
|
553
|
+
return out
|
554
|
+
return self._parent.get_stretch(name)
|
555
|
+
|
488
556
|
def use_var(self, var: expr.Var):
|
557
|
+
if (local := self._stretches_local.get(var.name)) is not None:
|
558
|
+
raise CircuitError(f"cannot use '{var}' which is shadowed by the local '{local}'")
|
489
559
|
if (local := self._vars_local.get(var.name)) is not None:
|
490
560
|
if local == var:
|
491
561
|
return
|
@@ -497,14 +567,39 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
|
|
497
567
|
self._parent.use_var(var)
|
498
568
|
self._vars_capture[var.name] = var
|
499
569
|
|
570
|
+
def use_stretch(self, stretch: expr.Stretch):
|
571
|
+
if (local := self._vars_local.get(stretch.name)) is not None:
|
572
|
+
raise CircuitError(f"cannot use '{stretch}' which is shadowed by the local '{local}'")
|
573
|
+
if (local := self._stretches_local.get(stretch.name)) is not None:
|
574
|
+
if local == stretch:
|
575
|
+
return
|
576
|
+
raise CircuitError(f"cannot use '{stretch}' which is shadowed by the local '{local}'")
|
577
|
+
if self._stretches_capture.get(stretch.name) == stretch:
|
578
|
+
return
|
579
|
+
if self._parent.get_stretch(stretch.name) != stretch:
|
580
|
+
raise CircuitError(f"cannot close over '{stretch}', which is not in scope")
|
581
|
+
self._parent.use_stretch(stretch)
|
582
|
+
self._stretches_capture[stretch.name] = stretch
|
583
|
+
|
584
|
+
def use_qubit(self, qubit: Qubit):
|
585
|
+
self._instructions.add_qubit(qubit, strict=False)
|
586
|
+
|
500
587
|
def iter_local_vars(self):
|
501
588
|
"""Iterator over the variables currently declared in this scope."""
|
502
589
|
return self._vars_local.values()
|
503
590
|
|
591
|
+
def iter_local_stretches(self):
|
592
|
+
"""Iterator over the stretches currently declared in this scope."""
|
593
|
+
return self._stretches_local.values()
|
594
|
+
|
504
595
|
def iter_captured_vars(self):
|
505
596
|
"""Iterator over the variables currently captured in this scope."""
|
506
597
|
return self._vars_capture.values()
|
507
598
|
|
599
|
+
def iter_captured_stretches(self):
|
600
|
+
"""Iterator over the stretches currently captured in this scope."""
|
601
|
+
return self._stretches_capture.values()
|
602
|
+
|
508
603
|
def peek(self) -> CircuitInstruction:
|
509
604
|
"""Get the value of the most recent instruction tuple in this scope."""
|
510
605
|
if not self._instructions:
|
@@ -605,13 +700,16 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
|
|
605
700
|
self._instructions.clbits,
|
606
701
|
*self.registers,
|
607
702
|
global_phase=self.global_phase,
|
608
|
-
captures=self._vars_capture.values(),
|
703
|
+
captures=itertools.chain(self._vars_capture.values(), self._stretches_capture.values()),
|
609
704
|
)
|
610
705
|
for var in self._vars_local.values():
|
611
706
|
# The requisite `Store` instruction to initialise the variable will have been appended
|
612
707
|
# into the instructions.
|
613
708
|
out.add_uninitialized_var(var)
|
614
709
|
|
710
|
+
for var in self._stretches_local.values():
|
711
|
+
out.add_stretch(var)
|
712
|
+
|
615
713
|
# Maps placeholder index to the newly concrete instruction.
|
616
714
|
placeholder_to_concrete = {}
|
617
715
|
|
@@ -685,6 +783,8 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
|
|
685
783
|
out.global_phase = self.global_phase
|
686
784
|
out._vars_local = self._vars_local.copy()
|
687
785
|
out._vars_capture = self._vars_capture.copy()
|
786
|
+
out._stretches_local = self._stretches_local.copy()
|
787
|
+
out._stretches_capture = self._stretches_capture.copy()
|
688
788
|
out._parent = self._parent
|
689
789
|
out._allow_jumps = self._allow_jumps
|
690
790
|
out._forbidden_message = self._forbidden_message
|
@@ -48,9 +48,7 @@ class ContinueLoopPlaceholder(InstructionPlaceholder):
|
|
48
48
|
|
49
49
|
def concrete_instruction(self, qubits, clbits):
|
50
50
|
return (
|
51
|
-
self.
|
52
|
-
ContinueLoopOp(len(qubits), len(clbits), label=self.label)
|
53
|
-
),
|
51
|
+
ContinueLoopOp(len(qubits), len(clbits), label=self.label),
|
54
52
|
InstructionResources(qubits=tuple(qubits), clbits=tuple(clbits)),
|
55
53
|
)
|
56
54
|
|
@@ -82,3 +82,13 @@ class ControlFlowOp(Instruction, ABC):
|
|
82
82
|
if var not in seen:
|
83
83
|
seen.add(var)
|
84
84
|
yield var
|
85
|
+
|
86
|
+
def iter_captured_stretches(self) -> typing.Iterable[expr.Stretch]:
|
87
|
+
"""Get an iterator over the unique captured stretch variables in all blocks of this
|
88
|
+
construct."""
|
89
|
+
seen = set()
|
90
|
+
for block in self.blocks:
|
91
|
+
for stretch in block.iter_captured_stretches():
|
92
|
+
if stretch not in seen:
|
93
|
+
seen.add(stretch)
|
94
|
+
yield stretch
|
@@ -138,7 +138,8 @@ class ForLoopContext:
|
|
138
138
|
qc.rx(i * math.pi/4, 0)
|
139
139
|
qc.cx(0, 1)
|
140
140
|
qc.measure(0, 0)
|
141
|
-
qc.
|
141
|
+
with qc.if_test((0, True)):
|
142
|
+
qc.break_loop()
|
142
143
|
|
143
144
|
This context should almost invariably be created by a :meth:`.QuantumCircuit.for_loop` call, and
|
144
145
|
the resulting instance is a "friend" of the calling circuit. The context will manipulate the
|
@@ -17,7 +17,7 @@ from __future__ import annotations
|
|
17
17
|
from typing import Optional, Union, Iterable, TYPE_CHECKING
|
18
18
|
import itertools
|
19
19
|
|
20
|
-
from qiskit.circuit
|
20
|
+
from qiskit.circuit import ClassicalRegister, Clbit # pylint: disable=cyclic-import
|
21
21
|
from qiskit.circuit.classical import expr
|
22
22
|
from qiskit.circuit.instructionset import InstructionSet
|
23
23
|
from qiskit.circuit.exceptions import CircuitError
|
@@ -95,6 +95,7 @@ class IfElseOp(ControlFlowOp):
|
|
95
95
|
|
96
96
|
@property
|
97
97
|
def condition(self):
|
98
|
+
"""The condition for the if else operation."""
|
98
99
|
return self._condition
|
99
100
|
|
100
101
|
@condition.setter
|
@@ -162,12 +163,6 @@ class IfElseOp(ControlFlowOp):
|
|
162
163
|
)
|
163
164
|
return IfElseOp(self._condition, true_body, false_body=false_body, label=self.label)
|
164
165
|
|
165
|
-
def c_if(self, classical, val):
|
166
|
-
raise NotImplementedError(
|
167
|
-
"IfElseOp cannot be classically controlled through Instruction.c_if. "
|
168
|
-
"Please nest it in an IfElseOp instead."
|
169
|
-
)
|
170
|
-
|
171
166
|
|
172
167
|
class IfElsePlaceholder(InstructionPlaceholder):
|
173
168
|
"""A placeholder instruction to use in control-flow context managers, when calculating the
|
@@ -295,9 +290,7 @@ class IfElsePlaceholder(InstructionPlaceholder):
|
|
295
290
|
(true_body, self.__false_block.build(qubits, clbits))
|
296
291
|
)
|
297
292
|
return (
|
298
|
-
self.
|
299
|
-
IfElseOp(self._condition, true_body, false_body, label=self.label)
|
300
|
-
),
|
293
|
+
IfElseOp(self._condition, true_body, false_body, label=self.label),
|
301
294
|
InstructionResources(
|
302
295
|
qubits=tuple(true_body.qubits),
|
303
296
|
clbits=tuple(true_body.clbits),
|
@@ -306,12 +299,6 @@ class IfElsePlaceholder(InstructionPlaceholder):
|
|
306
299
|
),
|
307
300
|
)
|
308
301
|
|
309
|
-
def c_if(self, classical, val):
|
310
|
-
raise NotImplementedError(
|
311
|
-
"IfElseOp cannot be classically controlled through Instruction.c_if. "
|
312
|
-
"Please nest it in another IfElseOp instead."
|
313
|
-
)
|
314
|
-
|
315
302
|
|
316
303
|
class IfContext:
|
317
304
|
"""A context manager for building up ``if`` statements onto circuits in a natural order, without
|
@@ -19,7 +19,7 @@ __all__ = ("SwitchCaseOp", "CASE_DEFAULT")
|
|
19
19
|
import contextlib
|
20
20
|
from typing import Union, Iterable, Any, Tuple, Optional, List, Literal, TYPE_CHECKING
|
21
21
|
|
22
|
-
from qiskit.circuit
|
22
|
+
from qiskit.circuit import ClassicalRegister, Clbit # pylint: disable=cyclic-import
|
23
23
|
from qiskit.circuit.classical import expr, types
|
24
24
|
from qiskit.circuit.exceptions import CircuitError
|
25
25
|
|
@@ -182,12 +182,6 @@ class SwitchCaseOp(ControlFlowOp):
|
|
182
182
|
raise CircuitError(f"needed {len(self._case_map)} blocks but received {len(blocks)}")
|
183
183
|
return SwitchCaseOp(self.target, zip(self._label_spec, blocks))
|
184
184
|
|
185
|
-
def c_if(self, classical, val):
|
186
|
-
raise NotImplementedError(
|
187
|
-
"SwitchCaseOp cannot be classically controlled through Instruction.c_if. "
|
188
|
-
"Please nest it in an IfElseOp instead."
|
189
|
-
)
|
190
|
-
|
191
185
|
|
192
186
|
class SwitchCasePlaceholder(InstructionPlaceholder):
|
193
187
|
"""A placeholder instruction to use in control-flow context managers, when calculating the
|
@@ -269,7 +263,7 @@ class SwitchCasePlaceholder(InstructionPlaceholder):
|
|
269
263
|
else:
|
270
264
|
resources = self.__resources
|
271
265
|
return (
|
272
|
-
|
266
|
+
SwitchCaseOp(self.__target, cases, label=self.label),
|
273
267
|
resources,
|
274
268
|
)
|
275
269
|
|
@@ -16,7 +16,7 @@ from __future__ import annotations
|
|
16
16
|
|
17
17
|
from typing import TYPE_CHECKING
|
18
18
|
|
19
|
-
from qiskit.circuit
|
19
|
+
from qiskit.circuit import ClassicalRegister, Clbit # pylint: disable=cyclic-import
|
20
20
|
from qiskit.circuit.classical import expr
|
21
21
|
from qiskit.circuit.exceptions import CircuitError
|
22
22
|
from ._builder_utils import validate_condition, condition_resources
|
@@ -61,6 +61,7 @@ class WhileLoopOp(ControlFlowOp):
|
|
61
61
|
|
62
62
|
@property
|
63
63
|
def condition(self):
|
64
|
+
"""The condition for the while loop."""
|
64
65
|
return self._condition
|
65
66
|
|
66
67
|
@condition.setter
|
@@ -98,12 +99,6 @@ class WhileLoopOp(ControlFlowOp):
|
|
98
99
|
(body,) = blocks
|
99
100
|
return WhileLoopOp(self._condition, body, label=self.label)
|
100
101
|
|
101
|
-
def c_if(self, classical, val):
|
102
|
-
raise NotImplementedError(
|
103
|
-
"WhileLoopOp cannot be classically controlled through Instruction.c_if. "
|
104
|
-
"Please use an IfElseOp instead."
|
105
|
-
)
|
106
|
-
|
107
102
|
|
108
103
|
class WhileLoopContext:
|
109
104
|
"""A context manager for building up while loops onto circuits in a natural order, without
|
qiskit/circuit/controlledgate.py
CHANGED
@@ -19,9 +19,9 @@ from typing import Optional, Union
|
|
19
19
|
from qiskit.circuit.exceptions import CircuitError
|
20
20
|
|
21
21
|
# pylint: disable=cyclic-import
|
22
|
+
from . import QuantumRegister
|
22
23
|
from .quantumcircuit import QuantumCircuit
|
23
24
|
from .gate import Gate
|
24
|
-
from .quantumregister import QuantumRegister
|
25
25
|
from ._utils import _ctrl_state_to_int
|
26
26
|
|
27
27
|
|
@@ -38,8 +38,6 @@ class ControlledGate(Gate):
|
|
38
38
|
definition: Optional["QuantumCircuit"] = None,
|
39
39
|
ctrl_state: Optional[Union[int, str]] = None,
|
40
40
|
base_gate: Optional[Gate] = None,
|
41
|
-
duration=None,
|
42
|
-
unit=None,
|
43
41
|
*,
|
44
42
|
_base_label=None,
|
45
43
|
):
|
@@ -101,7 +99,7 @@ class ControlledGate(Gate):
|
|
101
99
|
qc2.draw('mpl')
|
102
100
|
"""
|
103
101
|
self.base_gate = None if base_gate is None else base_gate.copy()
|
104
|
-
super().__init__(name, num_qubits, params, label=label
|
102
|
+
super().__init__(name, num_qubits, params, label=label)
|
105
103
|
self._num_ctrl_qubits = 1
|
106
104
|
self.num_ctrl_qubits = num_ctrl_qubits
|
107
105
|
self.definition = copy.deepcopy(definition)
|
qiskit/circuit/delay.py
CHANGED
@@ -14,25 +14,51 @@
|
|
14
14
|
Delay instruction (for circuit module).
|
15
15
|
"""
|
16
16
|
import numpy as np
|
17
|
+
|
18
|
+
from qiskit.circuit.classical import expr, types
|
17
19
|
from qiskit.circuit.exceptions import CircuitError
|
18
20
|
from qiskit.circuit.instruction import Instruction
|
19
21
|
from qiskit.circuit.gate import Gate
|
20
22
|
from qiskit.circuit import _utils
|
21
23
|
from qiskit.circuit.parameterexpression import ParameterExpression
|
22
|
-
from qiskit.
|
24
|
+
from qiskit._accelerate.circuit import StandardInstructionType
|
23
25
|
|
24
26
|
|
25
27
|
@_utils.with_gate_array(np.eye(2, dtype=complex))
|
26
28
|
class Delay(Instruction):
|
27
29
|
"""Do nothing and just delay/wait/idle for a specified duration."""
|
28
30
|
|
29
|
-
|
31
|
+
_standard_instruction_type = StandardInstructionType.Delay
|
32
|
+
|
33
|
+
def __init__(self, duration, unit=None):
|
30
34
|
"""
|
31
35
|
Args:
|
32
|
-
duration: the length of time of the duration.
|
33
|
-
|
36
|
+
duration: the length of time of the duration. If this is an
|
37
|
+
:class:`~.expr.Expr`, it must be a constant expression of type
|
38
|
+
:class:`~.types.Duration` and the ``unit`` parameter should be
|
39
|
+
omitted (or MUST be "expr" if it is specified).
|
40
|
+
unit: the unit of the duration, if ``duration`` is a numeric
|
41
|
+
value. Must be ``"dt"``, an SI-prefixed seconds unit, or "expr".
|
42
|
+
|
43
|
+
Raises:
|
44
|
+
CircuitError: A ``duration`` expression was specified with a resolved
|
45
|
+
type that is not timing-based, or the ``unit`` was improperly specified.
|
34
46
|
"""
|
35
|
-
if
|
47
|
+
if isinstance(duration, expr.Expr):
|
48
|
+
if unit is not None and unit != "expr":
|
49
|
+
raise CircuitError(
|
50
|
+
"Argument 'unit' must not be specified for a duration expression."
|
51
|
+
)
|
52
|
+
if duration.type.kind is not types.Duration:
|
53
|
+
raise CircuitError(
|
54
|
+
f"Expression of type '{duration.type}' is not valid for 'duration'."
|
55
|
+
)
|
56
|
+
if not duration.const:
|
57
|
+
raise CircuitError("Duration expressions must be constant.")
|
58
|
+
unit = "expr"
|
59
|
+
elif unit is None:
|
60
|
+
unit = "dt"
|
61
|
+
elif unit not in {"s", "ms", "us", "ns", "ps", "dt"}:
|
36
62
|
raise CircuitError(f"Unknown unit {unit} is specified.")
|
37
63
|
# Double underscore to differentiate from the private attribute in
|
38
64
|
# `Instruction`. This can be changed to `_unit` in 2.0 after we
|
@@ -47,13 +73,9 @@ class Delay(Instruction):
|
|
47
73
|
"""Special case. Return self."""
|
48
74
|
return self
|
49
75
|
|
50
|
-
@deprecate_func(since="1.3.0", removal_timeline="in 2.0.0")
|
51
|
-
def c_if(self, classical, val):
|
52
|
-
raise CircuitError("Conditional Delay is not yet implemented.")
|
53
|
-
|
54
76
|
@property
|
55
77
|
def unit(self):
|
56
|
-
|
78
|
+
"""The unit for the duration of the delay in :attr`.params`"""
|
57
79
|
return self.__unit
|
58
80
|
|
59
81
|
@unit.setter
|
@@ -90,8 +112,9 @@ class Delay(Instruction):
|
|
90
112
|
"""Return the official string representing the delay."""
|
91
113
|
return f"{self.__class__.__name__}(duration={self.params[0]}[unit={self.unit}])"
|
92
114
|
|
115
|
+
# pylint: disable=too-many-return-statements
|
93
116
|
def validate_parameter(self, parameter):
|
94
|
-
"""Delay parameter (i.e. duration) must be int, float or ParameterExpression."""
|
117
|
+
"""Delay parameter (i.e. duration) must be Expr, int, float or ParameterExpression."""
|
95
118
|
if isinstance(parameter, int):
|
96
119
|
if parameter < 0:
|
97
120
|
raise CircuitError(
|
@@ -109,6 +132,12 @@ class Delay(Instruction):
|
|
109
132
|
raise CircuitError("Integer duration is expected for 'dt' unit.")
|
110
133
|
return parameter_int
|
111
134
|
return parameter
|
135
|
+
elif isinstance(parameter, expr.Expr):
|
136
|
+
if parameter.type.kind is not types.Duration:
|
137
|
+
raise CircuitError(f"Expression duration of type '{parameter.type}' is not valid.")
|
138
|
+
if not parameter.const:
|
139
|
+
raise CircuitError("Duration expressions must be constant.")
|
140
|
+
return parameter
|
112
141
|
elif isinstance(parameter, ParameterExpression):
|
113
142
|
if len(parameter.parameters) > 0:
|
114
143
|
return parameter # expression has free parameters, we cannot validate it
|
qiskit/circuit/duration.py
CHANGED
@@ -63,21 +63,6 @@ def convert_durations_to_dt(qc: QuantumCircuit, dt_in_sec: float, inplace=True):
|
|
63
63
|
else:
|
64
64
|
circ = qc.copy()
|
65
65
|
|
66
|
-
for instruction in circ.data:
|
67
|
-
operation = instruction.operation
|
68
|
-
if operation.unit == "dt" or operation.duration is None:
|
69
|
-
continue
|
70
|
-
|
71
|
-
if not operation.unit.endswith("s"):
|
72
|
-
raise CircuitError(f"Invalid time unit: '{operation.unit}'")
|
73
|
-
|
74
|
-
duration = operation.duration
|
75
|
-
if operation.unit != "s":
|
76
|
-
duration = apply_prefix(duration, operation.unit)
|
77
|
-
|
78
|
-
operation.duration = duration_in_dt(duration, dt_in_sec)
|
79
|
-
operation.unit = "dt"
|
80
|
-
|
81
66
|
if circ.duration is not None and circ.unit != "dt":
|
82
67
|
if not circ.unit.endswith("s"):
|
83
68
|
raise CircuitError(f"Invalid time unit: '{circ.unit}'")
|
qiskit/circuit/gate.py
CHANGED
@@ -31,8 +31,6 @@ class Gate(Instruction):
|
|
31
31
|
num_qubits: int,
|
32
32
|
params: list,
|
33
33
|
label: str | None = None,
|
34
|
-
duration=None,
|
35
|
-
unit="dt",
|
36
34
|
) -> None:
|
37
35
|
"""Create a new gate.
|
38
36
|
|
@@ -43,7 +41,7 @@ class Gate(Instruction):
|
|
43
41
|
label: An optional label for the gate.
|
44
42
|
"""
|
45
43
|
self.definition = None
|
46
|
-
super().__init__(name, num_qubits, 0, params, label=label
|
44
|
+
super().__init__(name, num_qubits, 0, params, label=label)
|
47
45
|
|
48
46
|
# Set higher priority than Numpy array and matrix classes
|
49
47
|
__array_priority__ = 20
|
@@ -137,7 +135,7 @@ class Gate(Instruction):
|
|
137
135
|
"""
|
138
136
|
if not annotated: # captures both None and False
|
139
137
|
# pylint: disable=cyclic-import
|
140
|
-
from .
|
138
|
+
from ._add_control import add_control
|
141
139
|
|
142
140
|
return add_control(self, num_ctrl_qubits, label, ctrl_state)
|
143
141
|
|