qiskit 1.4.0__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0rc1__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 +2 -5
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/circuit/__init__.py +24 -5
- 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 +248 -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 +7 -140
- qiskit/circuit/instructionset.py +7 -54
- qiskit/circuit/library/__init__.py +34 -5
- 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/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 +2 -6
- 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 +13 -60
- 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 +4 -0
- qiskit/circuit/quantumcircuit.py +881 -555
- 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 +4 -2
- 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 +5 -5
- 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 +2 -80
- 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 +141 -19
- qiskit/qpy/binary_io/__init__.py +0 -1
- qiskit/qpy/binary_io/circuits.py +91 -116
- qiskit/qpy/binary_io/schedules.py +61 -388
- qiskit/qpy/binary_io/value.py +168 -28
- qiskit/qpy/common.py +10 -7
- qiskit/qpy/formats.py +41 -0
- qiskit/qpy/interface.py +29 -62
- 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 -10
- qiskit/result/result.py +28 -126
- 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/discrete_basis/generate_basis_approximations.py +2 -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 +2 -40
- qiskit/transpiler/passes/basis/basis_translator.py +4 -3
- 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 +5 -0
- qiskit/transpiler/passes/layout/dense_layout.py +2 -39
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -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 +1 -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 +30 -2
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
- 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 +127 -59
- 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 +101 -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 +67 -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/dag_visualization.py +2 -1
- qiskit/visualization/gate_map.py +39 -154
- qiskit/visualization/pass_manager_visualization.py +6 -2
- qiskit/visualization/state_visualization.py +6 -0
- qiskit/visualization/timeline/core.py +27 -12
- qiskit/visualization/timeline/interface.py +23 -18
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.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.0.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
- {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
qiskit/qasm2/__init__.py
CHANGED
@@ -133,7 +133,10 @@ Exporting examples
|
|
133
133
|
|
134
134
|
Export a simple :class:`.QuantumCircuit` to an OpenQASM 2 string:
|
135
135
|
|
136
|
-
..
|
136
|
+
.. plot::
|
137
|
+
:include-source:
|
138
|
+
:nofigs:
|
139
|
+
:context: reset
|
137
140
|
|
138
141
|
import qiskit.qasm2
|
139
142
|
from qiskit.circuit import QuantumCircuit
|
@@ -183,7 +186,9 @@ Parsing examples
|
|
183
186
|
|
184
187
|
Use :func:`loads` to import an OpenQASM 2 program in a string into a :class:`.QuantumCircuit`:
|
185
188
|
|
186
|
-
..
|
189
|
+
.. plot::
|
190
|
+
:include-source:
|
191
|
+
:nofigs:
|
187
192
|
|
188
193
|
import qiskit.qasm2
|
189
194
|
program = """
|
@@ -259,7 +264,9 @@ Sometimes you may want to influence the :class:`.Gate` objects that the importer
|
|
259
264
|
named instructions. Gates that are defined by the statement ``include "qelib1.inc";`` will
|
260
265
|
automatically be associated with a suitable Qiskit circuit-library gate, but you can extend this:
|
261
266
|
|
262
|
-
..
|
267
|
+
.. plot::
|
268
|
+
:include-source:
|
269
|
+
:nofigs:
|
263
270
|
|
264
271
|
from qiskit.circuit import Gate
|
265
272
|
from qiskit.qasm2 import loads, CustomInstruction
|
@@ -292,7 +299,9 @@ defined gates (which are computed on demand). Here we provide a Python version
|
|
292
299
|
which mathematically is :math:`\arctan(y/x)` but correctly handling angle quadrants and infinities,
|
293
300
|
and a custom ``add_one`` function:
|
294
301
|
|
295
|
-
..
|
302
|
+
.. plot::
|
303
|
+
:include-source:
|
304
|
+
:nofigs:
|
296
305
|
|
297
306
|
import math
|
298
307
|
from qiskit.qasm2 import loads, CustomClassical
|
@@ -356,7 +365,10 @@ the header file, you can use :class:`CustomInstruction` to override how Qiskit b
|
|
356
365
|
For the standard ``qelib1.inc`` include there is only one point of difference, and so the override
|
357
366
|
needed to switch its phase convention is:
|
358
367
|
|
359
|
-
..
|
368
|
+
.. plot::
|
369
|
+
:include-source:
|
370
|
+
:nofigs:
|
371
|
+
:context: reset
|
360
372
|
|
361
373
|
from qiskit import qasm2
|
362
374
|
from qiskit.circuit.library import PhaseGate
|
@@ -376,7 +388,10 @@ needed to switch its phase convention is:
|
|
376
388
|
This will use Qiskit's :class:`.PhaseGate` class to represent the ``rz`` instruction, which is
|
377
389
|
equal (including the phase) to :class:`.U1Gate`:
|
378
390
|
|
379
|
-
..
|
391
|
+
.. plot::
|
392
|
+
:include-source:
|
393
|
+
:nofigs:
|
394
|
+
:context:
|
380
395
|
|
381
396
|
Operator(qasm2.loads(program, custom_instructions=custom))
|
382
397
|
|
qiskit/qasm2/export.py
CHANGED
@@ -116,10 +116,10 @@ def dump(circuit: QuantumCircuit, filename_or_stream: os.PathLike | io.TextIOBas
|
|
116
116
|
QASM2ExportError: if the circuit cannot be represented by OpenQASM 2.
|
117
117
|
"""
|
118
118
|
if isinstance(filename_or_stream, io.TextIOBase):
|
119
|
-
print(dumps(circuit), file=filename_or_stream)
|
119
|
+
print(dumps(circuit), file=filename_or_stream) # pylint: disable=bad-builtin
|
120
120
|
return
|
121
121
|
with open(filename_or_stream, "w") as stream:
|
122
|
-
print(dumps(circuit), file=stream)
|
122
|
+
print(dumps(circuit), file=stream) # pylint: disable=bad-builtin
|
123
123
|
|
124
124
|
|
125
125
|
def dumps(circuit: QuantumCircuit, /) -> str:
|
@@ -246,14 +246,6 @@ def _instruction_call_site(operation):
|
|
246
246
|
if operation.params:
|
247
247
|
params = ",".join([pi_check(i, output="qasm", eps=1e-12) for i in operation.params])
|
248
248
|
qasm2_call = f"{qasm2_call}({params})"
|
249
|
-
if operation._condition is not None:
|
250
|
-
if not isinstance(operation._condition[0], ClassicalRegister):
|
251
|
-
raise QASM2ExportError(
|
252
|
-
"OpenQASM 2 can only condition on registers, but got '{operation.condition[0]}'"
|
253
|
-
)
|
254
|
-
qasm2_call = (
|
255
|
-
f"if({operation._condition[0].name}=={operation._condition[1]:d}) " + qasm2_call
|
256
|
-
)
|
257
249
|
return qasm2_call
|
258
250
|
|
259
251
|
|
qiskit/qasm2/parse.py
CHANGED
@@ -11,7 +11,6 @@
|
|
11
11
|
# that they have been altered from the originals.
|
12
12
|
|
13
13
|
"""Python-space bytecode interpreter for the output of the main Rust parser logic."""
|
14
|
-
import warnings
|
15
14
|
import dataclasses
|
16
15
|
import math
|
17
16
|
from typing import Iterable, Callable
|
@@ -255,37 +254,25 @@ def from_bytecode(bytecode, custom_instructions: Iterable[CustomInstruction]):
|
|
255
254
|
CircuitInstruction(gates[gate_id](*parameters), [qubits[q] for q in op_qubits])
|
256
255
|
)
|
257
256
|
elif opcode == OpCode.ConditionedGate:
|
258
|
-
warnings.warn(
|
259
|
-
"Conditioned gates in qasm2 will be loaded as an IfElseOp starting in Qiskit 2.0",
|
260
|
-
FutureWarning,
|
261
|
-
stacklevel=3,
|
262
|
-
)
|
263
257
|
gate_id, parameters, op_qubits, creg, value = op.operands
|
264
|
-
|
265
|
-
|
258
|
+
with qc.if_test((qc.cregs[creg], value)):
|
259
|
+
gate = gates[gate_id](*parameters)
|
260
|
+
qc.append(gate, [qubits[q] for q in op_qubits])
|
266
261
|
elif opcode == OpCode.Measure:
|
267
262
|
qubit, clbit = op.operands
|
268
263
|
qc._append(CircuitInstruction(Measure(), (qubits[qubit],), (clbits[clbit],)))
|
269
264
|
elif opcode == OpCode.ConditionedMeasure:
|
270
|
-
warnings.warn(
|
271
|
-
"Conditioned measurements in qasm2 will be loaded as an IfElseOp starting in Qiskit 2.0",
|
272
|
-
FutureWarning,
|
273
|
-
stacklevel=3,
|
274
|
-
)
|
275
265
|
qubit, clbit, creg, value = op.operands
|
276
|
-
|
277
|
-
|
266
|
+
with qc.if_test((qc.cregs[creg], value)):
|
267
|
+
measure = Measure()
|
268
|
+
qc.append(measure, (qubits[qubit],), (clbits[clbit],))
|
278
269
|
elif opcode == OpCode.Reset:
|
279
270
|
qc._append(CircuitInstruction(Reset(), (qubits[op.operands[0]],)))
|
280
271
|
elif opcode == OpCode.ConditionedReset:
|
281
|
-
warnings.warn(
|
282
|
-
"Conditioned resets in qasm2 will be loaded as an IfElseOp starting in Qiskit 2.0",
|
283
|
-
FutureWarning,
|
284
|
-
stacklevel=3,
|
285
|
-
)
|
286
272
|
qubit, creg, value = op.operands
|
287
|
-
|
288
|
-
|
273
|
+
with qc.if_test((qc.cregs[creg], value)):
|
274
|
+
reset = Reset()
|
275
|
+
qc.append(reset, (qubits[qubit],))
|
289
276
|
elif opcode == OpCode.Barrier:
|
290
277
|
op_qubits = op.operands[0]
|
291
278
|
qc._append(CircuitInstruction(Barrier(len(op_qubits)), [qubits[q] for q in op_qubits]))
|
@@ -371,15 +358,14 @@ class _DefinedGate(Gate):
|
|
371
358
|
# to pickle ourselves, we just eagerly create the definition and pickle that.
|
372
359
|
|
373
360
|
def __getstate__(self):
|
374
|
-
return (self.name, self.num_qubits, self.params, self.definition
|
361
|
+
return (self.name, self.num_qubits, self.params, self.definition)
|
375
362
|
|
376
363
|
def __setstate__(self, state):
|
377
|
-
name, num_qubits, params, definition
|
364
|
+
name, num_qubits, params, definition = state
|
378
365
|
super().__init__(name, num_qubits, params)
|
379
366
|
self._gates = ()
|
380
367
|
self._bytecode = ()
|
381
368
|
self._definition = definition
|
382
|
-
self._condition = condition
|
383
369
|
|
384
370
|
|
385
371
|
def _gate_builder(name, num_qubits, known_gates, bytecode):
|
qiskit/qasm3/__init__.py
CHANGED
@@ -59,7 +59,11 @@ are:
|
|
59
59
|
If you want to enable multiple experimental features, you should combine the flags using the ``|``
|
60
60
|
operator, such as ``flag1 | flag2``.
|
61
61
|
|
62
|
-
For example, to perform an export using the early semantics of ``switch`` support
|
62
|
+
For example, to perform an export using the early semantics of ``switch`` support:
|
63
|
+
|
64
|
+
.. plot::
|
65
|
+
:include-source:
|
66
|
+
:nofigs:
|
63
67
|
|
64
68
|
from qiskit import qasm3, QuantumCircuit, QuantumRegister, ClassicalRegister
|
65
69
|
|
qiskit/qasm3/ast.py
CHANGED
@@ -14,6 +14,8 @@
|
|
14
14
|
|
15
15
|
"""QASM3 AST Nodes"""
|
16
16
|
|
17
|
+
from __future__ import annotations
|
18
|
+
|
17
19
|
import enum
|
18
20
|
from typing import Optional, List, Union, Iterable, Tuple, Sequence
|
19
21
|
|
@@ -173,6 +175,12 @@ class BitType(ClassicalType):
|
|
173
175
|
__slots__ = ()
|
174
176
|
|
175
177
|
|
178
|
+
class DurationType(ClassicalType):
|
179
|
+
"""Type information for a duration."""
|
180
|
+
|
181
|
+
__slots__ = ()
|
182
|
+
|
183
|
+
|
176
184
|
class BitArrayType(ClassicalType):
|
177
185
|
"""Type information for a sized number of classical bits."""
|
178
186
|
|
@@ -242,6 +250,13 @@ class IntegerLiteral(Expression):
|
|
242
250
|
self.value = value
|
243
251
|
|
244
252
|
|
253
|
+
class FloatLiteral(Expression):
|
254
|
+
__slots__ = ("value",)
|
255
|
+
|
256
|
+
def __init__(self, value):
|
257
|
+
self.value = value
|
258
|
+
|
259
|
+
|
245
260
|
class BooleanLiteral(Expression):
|
246
261
|
__slots__ = ("value",)
|
247
262
|
|
@@ -304,6 +319,10 @@ class Binary(Expression):
|
|
304
319
|
NOT_EQUAL = "!="
|
305
320
|
SHIFT_LEFT = "<<"
|
306
321
|
SHIFT_RIGHT = ">>"
|
322
|
+
ADD = "+"
|
323
|
+
SUB = "-"
|
324
|
+
MUL = "*"
|
325
|
+
DIV = "/"
|
307
326
|
|
308
327
|
def __init__(self, op: Op, left: Expression, right: Expression):
|
309
328
|
self.op = op
|
@@ -389,6 +408,17 @@ class ClassicalDeclaration(Statement):
|
|
389
408
|
self.initializer = initializer
|
390
409
|
|
391
410
|
|
411
|
+
class StretchDeclaration(Statement):
|
412
|
+
"""Declaration of a stretch variable, optionally with a lower bound
|
413
|
+
expression."""
|
414
|
+
|
415
|
+
__slots__ = ("identifier", "bound")
|
416
|
+
|
417
|
+
def __init__(self, identifier: Identifier, bound=None):
|
418
|
+
self.identifier = identifier
|
419
|
+
self.bound = bound
|
420
|
+
|
421
|
+
|
392
422
|
class AssignmentStatement(Statement):
|
393
423
|
"""Assignment of an expression to an l-value."""
|
394
424
|
|
@@ -668,6 +698,20 @@ class WhileLoopStatement(Statement):
|
|
668
698
|
self.body = body
|
669
699
|
|
670
700
|
|
701
|
+
class BoxStatement(Statement):
|
702
|
+
"""Like ``box[duration] { statements* }``."""
|
703
|
+
|
704
|
+
__slots__ = ("duration", "body")
|
705
|
+
|
706
|
+
def __init__(
|
707
|
+
self,
|
708
|
+
body: ProgramBlock,
|
709
|
+
duration: Expression | None = None,
|
710
|
+
):
|
711
|
+
self.body = body
|
712
|
+
self.duration = duration
|
713
|
+
|
714
|
+
|
671
715
|
class BreakStatement(Statement):
|
672
716
|
"""AST node for ``break`` statements. Has no associated information."""
|
673
717
|
|
qiskit/qasm3/exporter.py
CHANGED
@@ -39,10 +39,12 @@ from qiskit.circuit import (
|
|
39
39
|
Reset,
|
40
40
|
Delay,
|
41
41
|
Store,
|
42
|
+
Bit,
|
43
|
+
Register,
|
42
44
|
)
|
43
|
-
from qiskit.circuit.bit import Bit
|
44
45
|
from qiskit.circuit.classical import expr, types
|
45
46
|
from qiskit.circuit.controlflow import (
|
47
|
+
BoxOp,
|
46
48
|
IfElseOp,
|
47
49
|
ForLoopOp,
|
48
50
|
WhileLoopOp,
|
@@ -52,7 +54,6 @@ from qiskit.circuit.controlflow import (
|
|
52
54
|
ContinueLoopOp,
|
53
55
|
CASE_DEFAULT,
|
54
56
|
)
|
55
|
-
from qiskit.circuit.register import Register
|
56
57
|
from qiskit.circuit.tools import pi_check
|
57
58
|
|
58
59
|
from . import ast
|
@@ -60,7 +61,6 @@ from .experimental import ExperimentalFeatures
|
|
60
61
|
from .exceptions import QASM3ExporterError
|
61
62
|
from .printer import BasicPrinter
|
62
63
|
|
63
|
-
|
64
64
|
# Reserved keywords that gates and variables cannot be named. It is possible that some of these
|
65
65
|
# _could_ be accepted as variable names by OpenQASM 3 parsers, but it's safer for us to just be very
|
66
66
|
# conservative.
|
@@ -626,7 +626,7 @@ class QASM3Builder:
|
|
626
626
|
def build_program(self):
|
627
627
|
"""Builds a Program"""
|
628
628
|
circuit = self.scope.circuit
|
629
|
-
if circuit.num_captured_vars:
|
629
|
+
if circuit.num_captured_vars or circuit.num_captured_stretches:
|
630
630
|
raise QASM3ExporterError(
|
631
631
|
"cannot export an inner scope with captured variables as a top-level program"
|
632
632
|
)
|
@@ -958,6 +958,14 @@ class QASM3Builder:
|
|
958
958
|
)
|
959
959
|
for var in self.scope.circuit.iter_declared_vars()
|
960
960
|
]
|
961
|
+
|
962
|
+
for stretch in self.scope.circuit.iter_declared_stretches():
|
963
|
+
statements.append(
|
964
|
+
ast.StretchDeclaration(
|
965
|
+
self.symbols.register_variable(stretch.name, stretch, allow_rename=True),
|
966
|
+
)
|
967
|
+
)
|
968
|
+
|
961
969
|
for instruction in self.scope.circuit.data:
|
962
970
|
if isinstance(instruction.operation, ControlFlowOp):
|
963
971
|
if isinstance(instruction.operation, ForLoopOp):
|
@@ -968,6 +976,8 @@ class QASM3Builder:
|
|
968
976
|
statements.append(self.build_if_statement(instruction))
|
969
977
|
elif isinstance(instruction.operation, SwitchCaseOp):
|
970
978
|
statements.extend(self.build_switch_statement(instruction))
|
979
|
+
elif isinstance(instruction.operation, BoxOp):
|
980
|
+
statements.append(self.build_box(instruction))
|
971
981
|
else:
|
972
982
|
raise RuntimeError(f"unhandled control-flow construct: {instruction.operation}")
|
973
983
|
continue
|
@@ -1006,16 +1016,7 @@ class QASM3Builder:
|
|
1006
1016
|
f" but received '{instruction.operation}'"
|
1007
1017
|
)
|
1008
1018
|
|
1009
|
-
|
1010
|
-
statements.extend(nodes)
|
1011
|
-
else:
|
1012
|
-
body = ast.ProgramBlock(nodes)
|
1013
|
-
statements.append(
|
1014
|
-
ast.BranchingStatement(
|
1015
|
-
self.build_expression(_lift_condition(instruction.operation._condition)),
|
1016
|
-
body,
|
1017
|
-
)
|
1018
|
-
)
|
1019
|
+
statements.extend(nodes)
|
1019
1020
|
return statements
|
1020
1021
|
|
1021
1022
|
def build_if_statement(self, instruction: CircuitInstruction) -> ast.BranchingStatement:
|
@@ -1085,6 +1086,15 @@ class QASM3Builder:
|
|
1085
1086
|
ast.SwitchStatement(target, cases, default=default),
|
1086
1087
|
]
|
1087
1088
|
|
1089
|
+
def build_box(self, instruction: CircuitInstruction) -> ast.BoxStatement:
|
1090
|
+
"""Build a :class:`.BoxOp` into a :class:`.ast.BoxStatement`."""
|
1091
|
+
duration = self.build_duration(instruction.operation.duration, instruction.operation.unit)
|
1092
|
+
body_circuit = instruction.operation.blocks[0]
|
1093
|
+
with self.new_scope(body_circuit, instruction.qubits, instruction.clbits):
|
1094
|
+
# TODO: handle no-op qubits (see https://github.com/openqasm/openqasm/issues/584).
|
1095
|
+
body = ast.ProgramBlock(self.build_current_scope())
|
1096
|
+
return ast.BoxStatement(body, duration)
|
1097
|
+
|
1088
1098
|
def build_while_loop(self, instruction: CircuitInstruction) -> ast.WhileLoopStatement:
|
1089
1099
|
"""Build a :obj:`.WhileLoopOp` into a :obj:`.ast.WhileLoopStatement`."""
|
1090
1100
|
condition = self.build_expression(_lift_condition(instruction.operation.condition))
|
@@ -1134,20 +1144,26 @@ class QASM3Builder:
|
|
1134
1144
|
raise QASM3ExporterError(
|
1135
1145
|
f"Found a delay instruction acting on classical bits: {instruction}"
|
1136
1146
|
)
|
1137
|
-
|
1138
|
-
if unit == "ps":
|
1139
|
-
duration = ast.DurationLiteral(1000 * duration_value, ast.DurationUnit.NANOSECOND)
|
1140
|
-
else:
|
1141
|
-
unit_map = {
|
1142
|
-
"ns": ast.DurationUnit.NANOSECOND,
|
1143
|
-
"us": ast.DurationUnit.MICROSECOND,
|
1144
|
-
"ms": ast.DurationUnit.MILLISECOND,
|
1145
|
-
"s": ast.DurationUnit.SECOND,
|
1146
|
-
"dt": ast.DurationUnit.SAMPLE,
|
1147
|
-
}
|
1148
|
-
duration = ast.DurationLiteral(duration_value, unit_map[unit])
|
1147
|
+
duration = self.build_duration(instruction.operation.duration, instruction.operation.unit)
|
1149
1148
|
return ast.QuantumDelay(duration, [self._lookup_bit(qubit) for qubit in instruction.qubits])
|
1150
1149
|
|
1150
|
+
def build_duration(self, duration, unit) -> ast.Expression | None:
|
1151
|
+
"""Build the expression of a given duration (if not ``None``)."""
|
1152
|
+
if duration is None:
|
1153
|
+
return None
|
1154
|
+
if unit == "expr":
|
1155
|
+
return self.build_expression(duration)
|
1156
|
+
if unit == "ps":
|
1157
|
+
return ast.DurationLiteral(1000 * duration, ast.DurationUnit.NANOSECOND)
|
1158
|
+
unit_map = {
|
1159
|
+
"ns": ast.DurationUnit.NANOSECOND,
|
1160
|
+
"us": ast.DurationUnit.MICROSECOND,
|
1161
|
+
"ms": ast.DurationUnit.MILLISECOND,
|
1162
|
+
"s": ast.DurationUnit.SECOND,
|
1163
|
+
"dt": ast.DurationUnit.SAMPLE,
|
1164
|
+
}
|
1165
|
+
return ast.DurationLiteral(duration, unit_map[unit])
|
1166
|
+
|
1151
1167
|
def build_integer(self, value) -> ast.IntegerLiteral:
|
1152
1168
|
"""Build an integer literal, raising a :obj:`.QASM3ExporterError` if the input is not
|
1153
1169
|
actually an
|
@@ -1262,6 +1278,10 @@ def _build_ast_type(type_: types.Type) -> ast.ClassicalType:
|
|
1262
1278
|
return ast.BoolType()
|
1263
1279
|
if type_.kind is types.Uint:
|
1264
1280
|
return ast.UintType(type_.width)
|
1281
|
+
if type_.kind is types.Float:
|
1282
|
+
return ast.FloatType.DOUBLE
|
1283
|
+
if type_.kind is types.Duration:
|
1284
|
+
return ast.DurationType()
|
1265
1285
|
raise RuntimeError(f"unhandled expr type '{type_}'")
|
1266
1286
|
|
1267
1287
|
|
@@ -1269,7 +1289,7 @@ class _ExprBuilder(expr.ExprVisitor[ast.Expression]):
|
|
1269
1289
|
__slots__ = ("lookup",)
|
1270
1290
|
|
1271
1291
|
# This is a very simple, non-contextual converter. As the type system expands, we may well end
|
1272
|
-
# up with some places where
|
1292
|
+
# up with some places where Qiskit's abstract type system needs to be lowered to OQ3 rather than
|
1273
1293
|
# mapping 100% directly, which might need a more contextual visitor.
|
1274
1294
|
|
1275
1295
|
def __init__(self, lookup):
|
@@ -1278,11 +1298,29 @@ class _ExprBuilder(expr.ExprVisitor[ast.Expression]):
|
|
1278
1298
|
def visit_var(self, node, /):
|
1279
1299
|
return self.lookup(node) if node.standalone else self.lookup(node.var)
|
1280
1300
|
|
1301
|
+
def visit_stretch(self, node, /):
|
1302
|
+
return self.lookup(node)
|
1303
|
+
|
1304
|
+
# pylint: disable=too-many-return-statements
|
1281
1305
|
def visit_value(self, node, /):
|
1282
1306
|
if node.type.kind is types.Bool:
|
1283
1307
|
return ast.BooleanLiteral(node.value)
|
1284
1308
|
if node.type.kind is types.Uint:
|
1285
1309
|
return ast.IntegerLiteral(node.value)
|
1310
|
+
if node.type.kind is types.Float:
|
1311
|
+
return ast.FloatLiteral(node.value)
|
1312
|
+
if node.type.kind is types.Duration:
|
1313
|
+
unit = node.value.unit()
|
1314
|
+
if unit == "dt":
|
1315
|
+
return ast.DurationLiteral(node.value.value(), ast.DurationUnit.SAMPLE)
|
1316
|
+
if unit == "ns":
|
1317
|
+
return ast.DurationLiteral(node.value.value(), ast.DurationUnit.NANOSECOND)
|
1318
|
+
if unit == "us":
|
1319
|
+
return ast.DurationLiteral(node.value.value(), ast.DurationUnit.MICROSECOND)
|
1320
|
+
if unit == "ms":
|
1321
|
+
return ast.DurationLiteral(node.value.value(), ast.DurationUnit.MILLISECOND)
|
1322
|
+
if unit == "s":
|
1323
|
+
return ast.DurationLiteral(node.value.value(), ast.DurationUnit.SECOND)
|
1286
1324
|
raise RuntimeError(f"unhandled Value type '{node}'")
|
1287
1325
|
|
1288
1326
|
def visit_cast(self, node, /):
|
qiskit/qasm3/printer.py
CHANGED
@@ -39,8 +39,12 @@ _BINDING_POWER = {
|
|
39
39
|
ast.Unary.Op.LOGIC_NOT: _BindingPower(right=22),
|
40
40
|
ast.Unary.Op.BIT_NOT: _BindingPower(right=22),
|
41
41
|
#
|
42
|
-
#
|
43
|
-
|
42
|
+
# Modulo: (19, 20)
|
43
|
+
ast.Binary.Op.MUL: _BindingPower(19, 20),
|
44
|
+
ast.Binary.Op.DIV: _BindingPower(19, 20),
|
45
|
+
#
|
46
|
+
ast.Binary.Op.ADD: _BindingPower(17, 18),
|
47
|
+
ast.Binary.Op.SUB: _BindingPower(17, 18),
|
44
48
|
#
|
45
49
|
ast.Binary.Op.SHIFT_LEFT: _BindingPower(15, 16),
|
46
50
|
ast.Binary.Op.SHIFT_RIGHT: _BindingPower(15, 16),
|
@@ -78,7 +82,7 @@ class BasicPrinter:
|
|
78
82
|
ast.QuantumGateModifierName.POW: "pow",
|
79
83
|
}
|
80
84
|
|
81
|
-
|
85
|
+
_FLOAT_TYPE_LOOKUP = {type: f"float[{type.value}]" for type in ast.FloatType}
|
82
86
|
|
83
87
|
# The visitor names include the class names, so they mix snake_case with PascalCase.
|
84
88
|
# pylint: disable=invalid-name
|
@@ -205,11 +209,14 @@ class BasicPrinter:
|
|
205
209
|
self._write_statement(f'defcalgrammar "{node.name}"')
|
206
210
|
|
207
211
|
def _visit_FloatType(self, node: ast.FloatType) -> None:
|
208
|
-
self.stream.write(
|
212
|
+
self.stream.write(self._FLOAT_TYPE_LOOKUP[node])
|
209
213
|
|
210
214
|
def _visit_BoolType(self, _node: ast.BoolType) -> None:
|
211
215
|
self.stream.write("bool")
|
212
216
|
|
217
|
+
def _visit_DurationType(self, _node: ast.DurationType) -> None:
|
218
|
+
self.stream.write("duration")
|
219
|
+
|
213
220
|
def _visit_IntType(self, node: ast.IntType) -> None:
|
214
221
|
self.stream.write("int")
|
215
222
|
if node.size is not None:
|
@@ -282,6 +289,9 @@ class BasicPrinter:
|
|
282
289
|
def _visit_IntegerLiteral(self, node: ast.IntegerLiteral) -> None:
|
283
290
|
self.stream.write(str(node.value))
|
284
291
|
|
292
|
+
def _visit_FloatLiteral(self, node: ast.FloatLiteral) -> None:
|
293
|
+
self.stream.write(str(node.value))
|
294
|
+
|
285
295
|
def _visit_BooleanLiteral(self, node: ast.BooleanLiteral):
|
286
296
|
self.stream.write("true" if node.value else "false")
|
287
297
|
|
@@ -356,6 +366,16 @@ class BasicPrinter:
|
|
356
366
|
self.visit(node.initializer)
|
357
367
|
self._end_statement()
|
358
368
|
|
369
|
+
def _visit_StretchDeclaration(self, node: ast.StretchDeclaration) -> None:
|
370
|
+
self._start_line()
|
371
|
+
self.stream.write("stretch")
|
372
|
+
self.stream.write(" ")
|
373
|
+
self.visit(node.identifier)
|
374
|
+
if node.bound is not None:
|
375
|
+
self.stream.write(" = ")
|
376
|
+
self.visit(node.bound)
|
377
|
+
self._end_statement()
|
378
|
+
|
359
379
|
def _visit_AssignmentStatement(self, node: ast.AssignmentStatement) -> None:
|
360
380
|
self._start_line()
|
361
381
|
self.visit(node.lvalue)
|
@@ -575,3 +595,14 @@ class BasicPrinter:
|
|
575
595
|
|
576
596
|
def _visit_DefaultCase(self, _node: ast.DefaultCase) -> None:
|
577
597
|
self.stream.write("default")
|
598
|
+
|
599
|
+
def _visit_BoxStatement(self, node: ast.BoxStatement) -> None:
|
600
|
+
self._start_line()
|
601
|
+
self.stream.write("box")
|
602
|
+
if node.duration is not None:
|
603
|
+
self.stream.write("[")
|
604
|
+
self.visit(node.duration)
|
605
|
+
self.stream.write("]")
|
606
|
+
self.stream.write(" ")
|
607
|
+
self.visit(node.body)
|
608
|
+
self._end_line()
|