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
@@ -1,507 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2020, 2024.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
"""Backend abstract interface for providers."""
|
14
|
-
|
15
|
-
from __future__ import annotations
|
16
|
-
import logging
|
17
|
-
import warnings
|
18
|
-
from typing import List, Iterable, Any, Dict, Optional
|
19
|
-
|
20
|
-
from qiskit.providers.backend import BackendV1, BackendV2
|
21
|
-
from qiskit.providers.backend import QubitProperties
|
22
|
-
from qiskit.providers.models.backendconfiguration import BackendConfiguration
|
23
|
-
from qiskit.providers.models.backendproperties import BackendProperties
|
24
|
-
from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES
|
25
|
-
from qiskit.providers.models.pulsedefaults import PulseDefaults
|
26
|
-
from qiskit.providers.options import Options
|
27
|
-
from qiskit.providers.exceptions import BackendPropertyError
|
28
|
-
from qiskit.utils import deprecate_func
|
29
|
-
from qiskit.utils.deprecate_pulse import deprecate_pulse_arg, deprecate_pulse_dependency
|
30
|
-
|
31
|
-
|
32
|
-
logger = logging.getLogger(__name__)
|
33
|
-
|
34
|
-
|
35
|
-
@deprecate_pulse_arg("defaults")
|
36
|
-
def convert_to_target(
|
37
|
-
configuration: BackendConfiguration,
|
38
|
-
properties: BackendProperties = None,
|
39
|
-
defaults: PulseDefaults = None,
|
40
|
-
custom_name_mapping: Optional[Dict[str, Any]] = None,
|
41
|
-
add_delay: bool = True,
|
42
|
-
filter_faulty: bool = True,
|
43
|
-
):
|
44
|
-
"""Decode transpiler target from backend data set.
|
45
|
-
|
46
|
-
This function generates :class:`.Target`` instance from intermediate
|
47
|
-
legacy objects such as :class:`.BackendProperties` and :class:`.PulseDefaults`.
|
48
|
-
These objects are usually components of the legacy :class:`.BackendV1` model.
|
49
|
-
|
50
|
-
Args:
|
51
|
-
configuration: Backend configuration as ``BackendConfiguration``
|
52
|
-
properties: Backend property dictionary or ``BackendProperties``
|
53
|
-
defaults: DEPRECATED. Backend pulse defaults dictionary or ``PulseDefaults``
|
54
|
-
custom_name_mapping: A name mapping must be supplied for the operation
|
55
|
-
not included in Qiskit Standard Gate name mapping, otherwise the operation
|
56
|
-
will be dropped in the resulting ``Target`` object.
|
57
|
-
add_delay: If True, adds delay to the instruction set.
|
58
|
-
filter_faulty: If True, this filters the non-operational qubits.
|
59
|
-
|
60
|
-
Returns:
|
61
|
-
A ``Target`` instance.
|
62
|
-
"""
|
63
|
-
# If a deprecated error is raised during the conversion, we should not return the
|
64
|
-
# deprecation warning to the user,as it is not actionable for them.
|
65
|
-
with warnings.catch_warnings():
|
66
|
-
warnings.filterwarnings(
|
67
|
-
"ignore",
|
68
|
-
category=DeprecationWarning,
|
69
|
-
message=".*``qiskit.providers.exceptions.BackendPropertyError``",
|
70
|
-
module="qiskit",
|
71
|
-
)
|
72
|
-
target = _convert_to_target(
|
73
|
-
configuration, properties, defaults, custom_name_mapping, add_delay, filter_faulty
|
74
|
-
)
|
75
|
-
return target
|
76
|
-
|
77
|
-
|
78
|
-
def _convert_to_target(
|
79
|
-
configuration: BackendConfiguration,
|
80
|
-
properties: BackendProperties = None,
|
81
|
-
defaults: PulseDefaults = None,
|
82
|
-
custom_name_mapping: Optional[Dict[str, Any]] = None,
|
83
|
-
add_delay: bool = True,
|
84
|
-
filter_faulty: bool = True,
|
85
|
-
):
|
86
|
-
"""An alternative private path to avoid pulse deprecations"""
|
87
|
-
# importing packages where they are needed, to avoid cyclic-import.
|
88
|
-
# pylint: disable=cyclic-import
|
89
|
-
from qiskit.transpiler.target import (
|
90
|
-
Target,
|
91
|
-
InstructionProperties,
|
92
|
-
)
|
93
|
-
from qiskit.circuit.controlflow import ForLoopOp, IfElseOp, SwitchCaseOp, WhileLoopOp
|
94
|
-
from qiskit.circuit.library.standard_gates import get_standard_gate_name_mapping
|
95
|
-
from qiskit.circuit.parameter import Parameter
|
96
|
-
from qiskit.circuit.gate import Gate
|
97
|
-
|
98
|
-
required = ["measure", "delay"]
|
99
|
-
|
100
|
-
# Load Qiskit object representation
|
101
|
-
qiskit_inst_mapping = get_standard_gate_name_mapping()
|
102
|
-
if custom_name_mapping:
|
103
|
-
qiskit_inst_mapping.update(custom_name_mapping)
|
104
|
-
|
105
|
-
qiskit_control_flow_mapping = {
|
106
|
-
"if_else": IfElseOp,
|
107
|
-
"while_loop": WhileLoopOp,
|
108
|
-
"for_loop": ForLoopOp,
|
109
|
-
"switch_case": SwitchCaseOp,
|
110
|
-
}
|
111
|
-
|
112
|
-
in_data = {"num_qubits": configuration.num_qubits}
|
113
|
-
|
114
|
-
# Parse global configuration properties
|
115
|
-
if hasattr(configuration, "dt"):
|
116
|
-
in_data["dt"] = configuration.dt
|
117
|
-
if hasattr(configuration, "timing_constraints"):
|
118
|
-
in_data.update(configuration.timing_constraints)
|
119
|
-
|
120
|
-
# Create instruction property placeholder from backend configuration
|
121
|
-
basis_gates = set(getattr(configuration, "basis_gates", []))
|
122
|
-
supported_instructions = set(getattr(configuration, "supported_instructions", []))
|
123
|
-
gate_configs = {gate.name: gate for gate in configuration.gates}
|
124
|
-
all_instructions = set.union(
|
125
|
-
basis_gates, set(required), supported_instructions.intersection(CONTROL_FLOW_OP_NAMES)
|
126
|
-
)
|
127
|
-
inst_name_map = {} # type: Dict[str, Instruction]
|
128
|
-
|
129
|
-
faulty_ops = set()
|
130
|
-
faulty_qubits = set()
|
131
|
-
unsupported_instructions = []
|
132
|
-
|
133
|
-
# Create name to Qiskit instruction object repr mapping
|
134
|
-
for name in all_instructions:
|
135
|
-
if name in qiskit_control_flow_mapping:
|
136
|
-
continue
|
137
|
-
if name in qiskit_inst_mapping:
|
138
|
-
inst_name_map[name] = qiskit_inst_mapping[name]
|
139
|
-
elif name in gate_configs:
|
140
|
-
# GateConfig model is a translator of QASM opcode.
|
141
|
-
# This doesn't have quantum definition, so Qiskit transpiler doesn't perform
|
142
|
-
# any optimization in quantum domain.
|
143
|
-
# Usually GateConfig counterpart should exist in Qiskit namespace so this is rarely called.
|
144
|
-
this_config = gate_configs[name]
|
145
|
-
params = list(map(Parameter, getattr(this_config, "parameters", [])))
|
146
|
-
coupling_map = getattr(this_config, "coupling_map", [])
|
147
|
-
inst_name_map[name] = Gate(
|
148
|
-
name=name,
|
149
|
-
num_qubits=len(coupling_map[0]) if coupling_map else 0,
|
150
|
-
params=params,
|
151
|
-
)
|
152
|
-
else:
|
153
|
-
warnings.warn(
|
154
|
-
f"No gate definition for {name} can be found and is being excluded "
|
155
|
-
"from the generated target. You can use `custom_name_mapping` to provide "
|
156
|
-
"a definition for this operation.",
|
157
|
-
RuntimeWarning,
|
158
|
-
)
|
159
|
-
unsupported_instructions.append(name)
|
160
|
-
|
161
|
-
for name in unsupported_instructions:
|
162
|
-
all_instructions.remove(name)
|
163
|
-
|
164
|
-
# Create inst properties placeholder
|
165
|
-
# Without any assignment, properties value is None,
|
166
|
-
# which defines a global instruction that can be applied to any qubit(s).
|
167
|
-
# The None value behaves differently from an empty dictionary.
|
168
|
-
# See API doc of Target.add_instruction for details.
|
169
|
-
prop_name_map = dict.fromkeys(all_instructions)
|
170
|
-
for name in all_instructions:
|
171
|
-
if name in gate_configs:
|
172
|
-
if coupling_map := getattr(gate_configs[name], "coupling_map", None):
|
173
|
-
# Respect operational qubits that gate configuration defines
|
174
|
-
# This ties instruction to particular qubits even without properties information.
|
175
|
-
# Note that each instruction is considered to be ideal unless
|
176
|
-
# its spec (e.g. error, duration) is bound by the properties object.
|
177
|
-
prop_name_map[name] = dict.fromkeys(map(tuple, coupling_map))
|
178
|
-
|
179
|
-
# Populate instruction properties
|
180
|
-
if properties:
|
181
|
-
|
182
|
-
def _get_value(prop_dict, prop_name):
|
183
|
-
if ndval := prop_dict.get(prop_name, None):
|
184
|
-
return ndval[0]
|
185
|
-
return None
|
186
|
-
|
187
|
-
# is_qubit_operational is a bit of expensive operation so precache the value
|
188
|
-
faulty_qubits = {
|
189
|
-
q for q in range(configuration.num_qubits) if not properties.is_qubit_operational(q)
|
190
|
-
}
|
191
|
-
|
192
|
-
qubit_properties = []
|
193
|
-
for qi in range(0, configuration.num_qubits):
|
194
|
-
# TODO faulty qubit handling might be needed since
|
195
|
-
# faulty qubit reporting qubit properties doesn't make sense.
|
196
|
-
try:
|
197
|
-
prop_dict = properties.qubit_property(qubit=qi)
|
198
|
-
except KeyError:
|
199
|
-
continue
|
200
|
-
qubit_properties.append(
|
201
|
-
QubitProperties(
|
202
|
-
t1=prop_dict.get("T1", (None, None))[0],
|
203
|
-
t2=prop_dict.get("T2", (None, None))[0],
|
204
|
-
frequency=prop_dict.get("frequency", (None, None))[0],
|
205
|
-
)
|
206
|
-
)
|
207
|
-
in_data["qubit_properties"] = qubit_properties
|
208
|
-
|
209
|
-
for name in all_instructions:
|
210
|
-
try:
|
211
|
-
for qubits, params in properties.gate_property(name).items():
|
212
|
-
if filter_faulty and (
|
213
|
-
set.intersection(faulty_qubits, qubits)
|
214
|
-
or not properties.is_gate_operational(name, qubits)
|
215
|
-
):
|
216
|
-
try:
|
217
|
-
# Qubits might be pre-defined by the gate config
|
218
|
-
# However properties objects says the qubits is non-operational
|
219
|
-
del prop_name_map[name][qubits]
|
220
|
-
except KeyError:
|
221
|
-
pass
|
222
|
-
faulty_ops.add((name, qubits))
|
223
|
-
continue
|
224
|
-
if prop_name_map[name] is None:
|
225
|
-
# This instruction is tied to particular qubits
|
226
|
-
# i.e. gate config is not provided, and instruction has been globally defined.
|
227
|
-
prop_name_map[name] = {}
|
228
|
-
prop_name_map[name][qubits] = InstructionProperties(
|
229
|
-
error=_get_value(params, "gate_error"),
|
230
|
-
duration=_get_value(params, "gate_length"),
|
231
|
-
)
|
232
|
-
if isinstance(prop_name_map[name], dict) and any(
|
233
|
-
v is None for v in prop_name_map[name].values()
|
234
|
-
):
|
235
|
-
# Properties provides gate properties only for subset of qubits
|
236
|
-
# Associated qubit set might be defined by the gate config here
|
237
|
-
logger.info(
|
238
|
-
"Gate properties of instruction %s are not provided for every qubits. "
|
239
|
-
"This gate is ideal for some qubits and the rest is with finite error. "
|
240
|
-
"Created backend target may confuse error-aware circuit optimization.",
|
241
|
-
name,
|
242
|
-
)
|
243
|
-
except BackendPropertyError:
|
244
|
-
# This gate doesn't report any property
|
245
|
-
continue
|
246
|
-
|
247
|
-
# Measure instruction property is stored in qubit property
|
248
|
-
prop_name_map["measure"] = {}
|
249
|
-
|
250
|
-
for qubit_idx in range(configuration.num_qubits):
|
251
|
-
if filter_faulty and (qubit_idx in faulty_qubits):
|
252
|
-
continue
|
253
|
-
qubit_prop = properties.qubit_property(qubit_idx)
|
254
|
-
prop_name_map["measure"][(qubit_idx,)] = InstructionProperties(
|
255
|
-
error=_get_value(qubit_prop, "readout_error"),
|
256
|
-
duration=_get_value(qubit_prop, "readout_length"),
|
257
|
-
)
|
258
|
-
|
259
|
-
for op in required:
|
260
|
-
# Map required ops to each operational qubit
|
261
|
-
if prop_name_map[op] is None:
|
262
|
-
prop_name_map[op] = {
|
263
|
-
(q,): None
|
264
|
-
for q in range(configuration.num_qubits)
|
265
|
-
if not filter_faulty or (q not in faulty_qubits)
|
266
|
-
}
|
267
|
-
|
268
|
-
if defaults:
|
269
|
-
inst_sched_map = defaults.instruction_schedule_map
|
270
|
-
|
271
|
-
for name in inst_sched_map.instructions:
|
272
|
-
for qubits in inst_sched_map.qubits_with_instruction(name):
|
273
|
-
if not isinstance(qubits, tuple):
|
274
|
-
qubits = (qubits,)
|
275
|
-
if (
|
276
|
-
name not in all_instructions
|
277
|
-
or name not in prop_name_map
|
278
|
-
or prop_name_map[name] is None
|
279
|
-
or qubits not in prop_name_map[name]
|
280
|
-
):
|
281
|
-
logger.info(
|
282
|
-
"Gate calibration for instruction %s on qubits %s is found "
|
283
|
-
"in the PulseDefaults payload. However, this entry is not defined in "
|
284
|
-
"the gate mapping of Target. This calibration is ignored.",
|
285
|
-
name,
|
286
|
-
qubits,
|
287
|
-
)
|
288
|
-
continue
|
289
|
-
|
290
|
-
if (name, qubits) in faulty_ops:
|
291
|
-
continue
|
292
|
-
|
293
|
-
entry = inst_sched_map._get_calibration_entry(name, qubits)
|
294
|
-
try:
|
295
|
-
prop_name_map[name][qubits]._calibration_prop = entry
|
296
|
-
except AttributeError:
|
297
|
-
# if instruction properties are "None", add entry
|
298
|
-
prop_name_map[name].update({qubits: InstructionProperties(None, None, entry)})
|
299
|
-
logger.info(
|
300
|
-
"The PulseDefaults payload received contains an instruction %s on "
|
301
|
-
"qubits %s which is not present in the configuration or properties payload."
|
302
|
-
"A new properties entry will be added to include the new calibration data.",
|
303
|
-
name,
|
304
|
-
qubits,
|
305
|
-
)
|
306
|
-
# Add parsed properties to target
|
307
|
-
target = Target(**in_data)
|
308
|
-
for inst_name in all_instructions:
|
309
|
-
if inst_name == "delay" and not add_delay:
|
310
|
-
continue
|
311
|
-
if inst_name in qiskit_control_flow_mapping:
|
312
|
-
# Control flow operator doesn't have gate property.
|
313
|
-
target.add_instruction(
|
314
|
-
instruction=qiskit_control_flow_mapping[inst_name],
|
315
|
-
name=inst_name,
|
316
|
-
)
|
317
|
-
else:
|
318
|
-
target.add_instruction(
|
319
|
-
instruction=inst_name_map[inst_name],
|
320
|
-
properties=prop_name_map.get(inst_name, None),
|
321
|
-
name=inst_name,
|
322
|
-
)
|
323
|
-
|
324
|
-
return target
|
325
|
-
|
326
|
-
|
327
|
-
def qubit_props_list_from_props(
|
328
|
-
properties: BackendProperties,
|
329
|
-
) -> List[QubitProperties]:
|
330
|
-
"""Uses BackendProperties to construct
|
331
|
-
and return a list of QubitProperties.
|
332
|
-
"""
|
333
|
-
qubit_props: List[QubitProperties] = []
|
334
|
-
for qubit, _ in enumerate(properties.qubits):
|
335
|
-
try:
|
336
|
-
t_1 = properties.t1(qubit)
|
337
|
-
except BackendPropertyError:
|
338
|
-
t_1 = None
|
339
|
-
try:
|
340
|
-
t_2 = properties.t2(qubit)
|
341
|
-
except BackendPropertyError:
|
342
|
-
t_2 = None
|
343
|
-
try:
|
344
|
-
frequency = properties.frequency(qubit)
|
345
|
-
except BackendPropertyError:
|
346
|
-
frequency = None
|
347
|
-
qubit_props.append(
|
348
|
-
QubitProperties( # type: ignore[no-untyped-call]
|
349
|
-
t1=t_1,
|
350
|
-
t2=t_2,
|
351
|
-
frequency=frequency,
|
352
|
-
)
|
353
|
-
)
|
354
|
-
return qubit_props
|
355
|
-
|
356
|
-
|
357
|
-
class BackendV2Converter(BackendV2):
|
358
|
-
"""A converter class that takes a :class:`~.BackendV1` instance and wraps it in a
|
359
|
-
:class:`~.BackendV2` interface.
|
360
|
-
|
361
|
-
This class implements the :class:`~.BackendV2` interface and is used to enable
|
362
|
-
common access patterns between :class:`~.BackendV1` and :class:`~.BackendV2`. This
|
363
|
-
class should only be used if you need a :class:`~.BackendV2` and still need
|
364
|
-
compatibility with :class:`~.BackendV1`.
|
365
|
-
|
366
|
-
When using custom calibrations (or other custom workflows) it is **not** recommended
|
367
|
-
to mutate the ``BackendV1`` object before applying this converter. For example, in order to
|
368
|
-
convert a ``BackendV1`` object with a customized ``defaults().instruction_schedule_map``,
|
369
|
-
which has a custom calibration for an operation, the operation name must be in
|
370
|
-
``configuration().basis_gates`` and ``name_mapping`` must be supplied for the operation.
|
371
|
-
Otherwise, the operation will be dropped in the resulting ``BackendV2`` object.
|
372
|
-
|
373
|
-
Instead it is typically better to add custom calibrations **after** applying this converter
|
374
|
-
instead of updating ``BackendV1.defaults()`` in advance. For example::
|
375
|
-
|
376
|
-
backend_v2 = BackendV2Converter(backend_v1)
|
377
|
-
backend_v2.target.add_instruction(
|
378
|
-
custom_gate, {(0, 1): InstructionProperties(calibration=custom_sched)}
|
379
|
-
)
|
380
|
-
"""
|
381
|
-
|
382
|
-
@deprecate_func(
|
383
|
-
since="1.4",
|
384
|
-
removal_timeline="in the 2.0 release",
|
385
|
-
additional_msg="Since ``BackendV1`` is deprecated, this conversion tool from BackendV1 to "
|
386
|
-
"BackendV2 is going to be removed with BackendV1.",
|
387
|
-
)
|
388
|
-
def __init__(
|
389
|
-
self,
|
390
|
-
backend: BackendV1,
|
391
|
-
name_mapping: Optional[Dict[str, Any]] = None,
|
392
|
-
add_delay: bool = True,
|
393
|
-
filter_faulty: bool = True,
|
394
|
-
):
|
395
|
-
"""Initialize a BackendV2 converter instance based on a BackendV1 instance.
|
396
|
-
|
397
|
-
Args:
|
398
|
-
backend: The input :class:`~.BackendV1` based backend to wrap in a
|
399
|
-
:class:`~.BackendV2` interface
|
400
|
-
name_mapping: An optional dictionary that maps custom gate/operation names in
|
401
|
-
``backend`` to an :class:`~.Operation` object representing that
|
402
|
-
gate/operation. By default most standard gates names are mapped to the
|
403
|
-
standard gate object from :mod:`qiskit.circuit.library` this only needs
|
404
|
-
to be specified if the input ``backend`` defines gates in names outside
|
405
|
-
that set.
|
406
|
-
add_delay: If set to true a :class:`~qiskit.circuit.Delay` operation
|
407
|
-
will be added to the target as a supported operation for all
|
408
|
-
qubits
|
409
|
-
filter_faulty: If the :class:`~.BackendProperties` object (if present) for
|
410
|
-
``backend`` has any qubits or gates flagged as non-operational filter
|
411
|
-
those from the output target.
|
412
|
-
"""
|
413
|
-
self._backend = backend
|
414
|
-
self._config = self._backend.configuration()
|
415
|
-
super().__init__(
|
416
|
-
provider=backend.provider,
|
417
|
-
name=backend.name(),
|
418
|
-
description=getattr(self._config, "description", None),
|
419
|
-
online_date=getattr(self._config, "online_date", None),
|
420
|
-
backend_version=self._config.backend_version,
|
421
|
-
)
|
422
|
-
self._options = self._backend._options
|
423
|
-
self._properties = None
|
424
|
-
self._defaults = None
|
425
|
-
|
426
|
-
with warnings.catch_warnings():
|
427
|
-
# The class QobjExperimentHeader is deprecated
|
428
|
-
warnings.filterwarnings("ignore", category=DeprecationWarning, module="qiskit")
|
429
|
-
if hasattr(self._backend, "properties"):
|
430
|
-
self._properties = self._backend.properties()
|
431
|
-
if hasattr(self._backend, "defaults"):
|
432
|
-
self._defaults = self._backend.defaults()
|
433
|
-
|
434
|
-
self._target = None
|
435
|
-
self._name_mapping = name_mapping
|
436
|
-
self._add_delay = add_delay
|
437
|
-
self._filter_faulty = filter_faulty
|
438
|
-
|
439
|
-
@property
|
440
|
-
def target(self):
|
441
|
-
"""A :class:`qiskit.transpiler.Target` object for the backend.
|
442
|
-
|
443
|
-
:rtype: Target
|
444
|
-
"""
|
445
|
-
if self._target is None:
|
446
|
-
# If a deprecated error is raised during the conversion,
|
447
|
-
# we should not return the deprecation warning to the user,
|
448
|
-
# as it is not actionable for them.
|
449
|
-
with warnings.catch_warnings():
|
450
|
-
warnings.filterwarnings(
|
451
|
-
"ignore",
|
452
|
-
category=DeprecationWarning,
|
453
|
-
message=".*``qiskit.providers.exceptions.BackendPropertyError``",
|
454
|
-
module="qiskit",
|
455
|
-
)
|
456
|
-
# convert_to_target is deprecated along BackendV2Converter
|
457
|
-
# They both need to be removed at the same time
|
458
|
-
warnings.filterwarnings(
|
459
|
-
"ignore",
|
460
|
-
category=DeprecationWarning,
|
461
|
-
message=r".+qiskit\.providers\.backend_compat\.convert_to_target.+",
|
462
|
-
module="qiskit",
|
463
|
-
)
|
464
|
-
self._target = _convert_to_target(
|
465
|
-
configuration=self._config,
|
466
|
-
properties=self._properties,
|
467
|
-
defaults=self._defaults,
|
468
|
-
custom_name_mapping=self._name_mapping,
|
469
|
-
add_delay=self._add_delay,
|
470
|
-
filter_faulty=self._filter_faulty,
|
471
|
-
)
|
472
|
-
return self._target
|
473
|
-
|
474
|
-
@property
|
475
|
-
def max_circuits(self):
|
476
|
-
return self._config.max_experiments
|
477
|
-
|
478
|
-
@classmethod
|
479
|
-
def _default_options(cls):
|
480
|
-
return Options()
|
481
|
-
|
482
|
-
@property
|
483
|
-
def dtm(self) -> float:
|
484
|
-
return self._config.dtm
|
485
|
-
|
486
|
-
@property
|
487
|
-
def meas_map(self) -> List[List[int]]:
|
488
|
-
return self._config.meas_map
|
489
|
-
|
490
|
-
@deprecate_pulse_dependency
|
491
|
-
def drive_channel(self, qubit: int):
|
492
|
-
return self._config.drive(qubit)
|
493
|
-
|
494
|
-
@deprecate_pulse_dependency
|
495
|
-
def measure_channel(self, qubit: int):
|
496
|
-
return self._config.measure(qubit)
|
497
|
-
|
498
|
-
@deprecate_pulse_dependency
|
499
|
-
def acquire_channel(self, qubit: int):
|
500
|
-
return self._config.acquire(qubit)
|
501
|
-
|
502
|
-
@deprecate_pulse_dependency
|
503
|
-
def control_channel(self, qubits: Iterable[int]):
|
504
|
-
return self._config.control(qubits)
|
505
|
-
|
506
|
-
def run(self, run_input, **options):
|
507
|
-
return self._backend.run(run_input, **options)
|
@@ -1,22 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2023.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
|
14
|
-
"""
|
15
|
-
Fake :class:`.BackendV1` backends for testing purposes
|
16
|
-
"""
|
17
|
-
|
18
|
-
from .fake_5q import Fake5QV1
|
19
|
-
from .fake_20q import Fake20QV1
|
20
|
-
from .fake_7q_pulse import Fake7QPulseV1
|
21
|
-
from .fake_27q_pulse import Fake27QPulseV1
|
22
|
-
from .fake_127q_pulse import Fake127QPulseV1
|
@@ -1,18 +0,0 @@
|
|
1
|
-
# This code is part of Qiskit.
|
2
|
-
#
|
3
|
-
# (C) Copyright IBM 2023.
|
4
|
-
#
|
5
|
-
# This code is licensed under the Apache License, Version 2.0. You may
|
6
|
-
# obtain a copy of this license in the LICENSE.txt file in the root directory
|
7
|
-
# of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
|
8
|
-
#
|
9
|
-
# Any modifications or derivative works of this code must retain this
|
10
|
-
# copyright notice, and modified files need to carry a notice indicating
|
11
|
-
# that they have been altered from the originals.
|
12
|
-
|
13
|
-
|
14
|
-
"""
|
15
|
-
A 127 qubit fake :class:`.BackendV1` with pulse capabilities.
|
16
|
-
"""
|
17
|
-
|
18
|
-
from .fake_127q_pulse_v1 import Fake127QPulseV1
|