qiskit 1.3.0__cp39-abi3-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -0
- qiskit/__init__.py +146 -0
- qiskit/_accelerate.abi3.so +0 -0
- qiskit/_numpy_compat.py +73 -0
- qiskit/assembler/__init__.py +42 -0
- qiskit/assembler/assemble_circuits.py +451 -0
- qiskit/assembler/assemble_schedules.py +367 -0
- qiskit/assembler/disassemble.py +310 -0
- qiskit/assembler/run_config.py +77 -0
- qiskit/circuit/__init__.py +1313 -0
- qiskit/circuit/_classical_resource_map.py +148 -0
- qiskit/circuit/_standard_gates_commutations.py +3849 -0
- qiskit/circuit/_utils.py +167 -0
- qiskit/circuit/add_control.py +274 -0
- qiskit/circuit/annotated_operation.py +279 -0
- qiskit/circuit/barrier.py +50 -0
- qiskit/circuit/bit.py +94 -0
- qiskit/circuit/classical/__init__.py +41 -0
- qiskit/circuit/classical/expr/__init__.py +238 -0
- qiskit/circuit/classical/expr/constructors.py +556 -0
- qiskit/circuit/classical/expr/expr.py +397 -0
- qiskit/circuit/classical/expr/visitors.py +300 -0
- qiskit/circuit/classical/types/__init__.py +109 -0
- qiskit/circuit/classical/types/ordering.py +222 -0
- qiskit/circuit/classical/types/types.py +117 -0
- qiskit/circuit/classicalfunction/__init__.py +140 -0
- qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
- qiskit/circuit/classicalfunction/classical_element.py +54 -0
- qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
- qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
- qiskit/circuit/classicalfunction/exceptions.py +35 -0
- qiskit/circuit/classicalfunction/types.py +18 -0
- qiskit/circuit/classicalfunction/utils.py +91 -0
- qiskit/circuit/classicalregister.py +57 -0
- qiskit/circuit/commutation_checker.py +106 -0
- qiskit/circuit/commutation_library.py +20 -0
- qiskit/circuit/controlflow/__init__.py +28 -0
- qiskit/circuit/controlflow/_builder_utils.py +207 -0
- qiskit/circuit/controlflow/break_loop.py +56 -0
- qiskit/circuit/controlflow/builder.py +691 -0
- qiskit/circuit/controlflow/continue_loop.py +58 -0
- qiskit/circuit/controlflow/control_flow.py +84 -0
- qiskit/circuit/controlflow/for_loop.py +217 -0
- qiskit/circuit/controlflow/if_else.py +511 -0
- qiskit/circuit/controlflow/switch_case.py +417 -0
- qiskit/circuit/controlflow/while_loop.py +171 -0
- qiskit/circuit/controlledgate.py +274 -0
- qiskit/circuit/delay.py +123 -0
- qiskit/circuit/duration.py +95 -0
- qiskit/circuit/equivalence.py +94 -0
- qiskit/circuit/equivalence_library.py +18 -0
- qiskit/circuit/exceptions.py +19 -0
- qiskit/circuit/gate.py +263 -0
- qiskit/circuit/instruction.py +697 -0
- qiskit/circuit/instructionset.py +179 -0
- qiskit/circuit/library/__init__.py +668 -0
- qiskit/circuit/library/arithmetic/__init__.py +34 -0
- qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
- qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
- qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
- qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
- qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
- qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
- qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
- qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
- qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
- qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
- qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
- qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
- qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
- qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
- qiskit/circuit/library/basis_change/__init__.py +15 -0
- qiskit/circuit/library/basis_change/qft.py +313 -0
- qiskit/circuit/library/blueprintcircuit.py +280 -0
- qiskit/circuit/library/boolean_logic/__init__.py +18 -0
- qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
- qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
- qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
- qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
- qiskit/circuit/library/data_preparation/__init__.py +57 -0
- qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
- qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
- qiskit/circuit/library/data_preparation/initializer.py +107 -0
- qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
- qiskit/circuit/library/fourier_checking.py +158 -0
- qiskit/circuit/library/generalized_gates/__init__.py +30 -0
- qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
- qiskit/circuit/library/generalized_gates/gms.py +174 -0
- qiskit/circuit/library/generalized_gates/gr.py +215 -0
- qiskit/circuit/library/generalized_gates/isometry.py +370 -0
- qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
- qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
- qiskit/circuit/library/generalized_gates/pauli.py +85 -0
- qiskit/circuit/library/generalized_gates/permutation.py +194 -0
- qiskit/circuit/library/generalized_gates/rv.py +96 -0
- qiskit/circuit/library/generalized_gates/uc.py +213 -0
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
- qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
- qiskit/circuit/library/generalized_gates/ucry.py +32 -0
- qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
- qiskit/circuit/library/generalized_gates/unitary.py +215 -0
- qiskit/circuit/library/graph_state.py +169 -0
- qiskit/circuit/library/grover_operator.py +579 -0
- qiskit/circuit/library/hamiltonian_gate.py +142 -0
- qiskit/circuit/library/hidden_linear_function.py +161 -0
- qiskit/circuit/library/iqp.py +175 -0
- qiskit/circuit/library/n_local/__init__.py +45 -0
- qiskit/circuit/library/n_local/efficient_su2.py +277 -0
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
- qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
- qiskit/circuit/library/n_local/n_local.py +1472 -0
- qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
- qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
- qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
- qiskit/circuit/library/n_local/two_local.py +289 -0
- qiskit/circuit/library/overlap.py +182 -0
- qiskit/circuit/library/pauli_evolution.py +186 -0
- qiskit/circuit/library/phase_estimation.py +175 -0
- qiskit/circuit/library/phase_oracle.py +153 -0
- qiskit/circuit/library/quantum_volume.py +167 -0
- qiskit/circuit/library/standard_gates/__init__.py +142 -0
- qiskit/circuit/library/standard_gates/dcx.py +78 -0
- qiskit/circuit/library/standard_gates/ecr.py +130 -0
- qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
- qiskit/circuit/library/standard_gates/global_phase.py +85 -0
- qiskit/circuit/library/standard_gates/h.py +258 -0
- qiskit/circuit/library/standard_gates/i.py +76 -0
- qiskit/circuit/library/standard_gates/iswap.py +134 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
- qiskit/circuit/library/standard_gates/p.py +441 -0
- qiskit/circuit/library/standard_gates/r.py +117 -0
- qiskit/circuit/library/standard_gates/rx.py +303 -0
- qiskit/circuit/library/standard_gates/rxx.py +183 -0
- qiskit/circuit/library/standard_gates/ry.py +298 -0
- qiskit/circuit/library/standard_gates/ryy.py +183 -0
- qiskit/circuit/library/standard_gates/rz.py +319 -0
- qiskit/circuit/library/standard_gates/rzx.py +229 -0
- qiskit/circuit/library/standard_gates/rzz.py +196 -0
- qiskit/circuit/library/standard_gates/s.py +428 -0
- qiskit/circuit/library/standard_gates/swap.py +288 -0
- qiskit/circuit/library/standard_gates/sx.py +315 -0
- qiskit/circuit/library/standard_gates/t.py +179 -0
- qiskit/circuit/library/standard_gates/u.py +403 -0
- qiskit/circuit/library/standard_gates/u1.py +501 -0
- qiskit/circuit/library/standard_gates/u2.py +149 -0
- qiskit/circuit/library/standard_gates/u3.py +436 -0
- qiskit/circuit/library/standard_gates/x.py +1529 -0
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
- qiskit/circuit/library/standard_gates/y.py +262 -0
- qiskit/circuit/library/standard_gates/z.py +348 -0
- qiskit/circuit/library/templates/__init__.py +92 -0
- qiskit/circuit/library/templates/clifford/__init__.py +33 -0
- qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
- qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
- qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
- qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
- qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
- qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
- qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
- qiskit/circuit/library/templates/nct/__init__.py +67 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
- qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
- qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
- qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
- qiskit/circuit/library/templates/rzx/__init__.py +25 -0
- qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
- qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
- qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
- qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
- qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
- qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
- qiskit/circuit/measure.py +44 -0
- qiskit/circuit/operation.py +67 -0
- qiskit/circuit/parameter.py +178 -0
- qiskit/circuit/parameterexpression.py +692 -0
- qiskit/circuit/parametertable.py +119 -0
- qiskit/circuit/parametervector.py +120 -0
- qiskit/circuit/quantumcircuit.py +6829 -0
- qiskit/circuit/quantumcircuitdata.py +136 -0
- qiskit/circuit/quantumregister.py +75 -0
- qiskit/circuit/random/__init__.py +15 -0
- qiskit/circuit/random/utils.py +358 -0
- qiskit/circuit/register.py +233 -0
- qiskit/circuit/reset.py +34 -0
- qiskit/circuit/singleton.py +606 -0
- qiskit/circuit/store.py +97 -0
- qiskit/circuit/tools/__init__.py +16 -0
- qiskit/circuit/tools/pi_check.py +190 -0
- qiskit/circuit/twirling.py +145 -0
- qiskit/compiler/__init__.py +33 -0
- qiskit/compiler/assembler.py +681 -0
- qiskit/compiler/scheduler.py +109 -0
- qiskit/compiler/sequencer.py +71 -0
- qiskit/compiler/transpiler.py +533 -0
- qiskit/converters/__init__.py +74 -0
- qiskit/converters/circuit_to_dag.py +78 -0
- qiskit/converters/circuit_to_dagdependency.py +51 -0
- qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
- qiskit/converters/circuit_to_gate.py +107 -0
- qiskit/converters/circuit_to_instruction.py +155 -0
- qiskit/converters/dag_to_circuit.py +79 -0
- qiskit/converters/dag_to_dagdependency.py +55 -0
- qiskit/converters/dag_to_dagdependency_v2.py +44 -0
- qiskit/converters/dagdependency_to_circuit.py +46 -0
- qiskit/converters/dagdependency_to_dag.py +54 -0
- qiskit/dagcircuit/__init__.py +44 -0
- qiskit/dagcircuit/collect_blocks.py +391 -0
- qiskit/dagcircuit/dagcircuit.py +24 -0
- qiskit/dagcircuit/dagdependency.py +646 -0
- qiskit/dagcircuit/dagdependency_v2.py +641 -0
- qiskit/dagcircuit/dagdepnode.py +160 -0
- qiskit/dagcircuit/dagnode.py +176 -0
- qiskit/dagcircuit/exceptions.py +42 -0
- qiskit/exceptions.py +153 -0
- qiskit/passmanager/__init__.py +240 -0
- qiskit/passmanager/base_tasks.py +230 -0
- qiskit/passmanager/compilation_status.py +74 -0
- qiskit/passmanager/exceptions.py +19 -0
- qiskit/passmanager/flow_controllers.py +116 -0
- qiskit/passmanager/passmanager.py +333 -0
- qiskit/primitives/__init__.py +481 -0
- qiskit/primitives/backend_estimator.py +486 -0
- qiskit/primitives/backend_estimator_v2.py +434 -0
- qiskit/primitives/backend_sampler.py +222 -0
- qiskit/primitives/backend_sampler_v2.py +339 -0
- qiskit/primitives/base/__init__.py +20 -0
- qiskit/primitives/base/base_estimator.py +252 -0
- qiskit/primitives/base/base_primitive.py +45 -0
- qiskit/primitives/base/base_primitive_job.py +78 -0
- qiskit/primitives/base/base_result.py +65 -0
- qiskit/primitives/base/base_sampler.py +204 -0
- qiskit/primitives/base/estimator_result.py +46 -0
- qiskit/primitives/base/sampler_result.py +45 -0
- qiskit/primitives/base/validation.py +231 -0
- qiskit/primitives/containers/__init__.py +26 -0
- qiskit/primitives/containers/bindings_array.py +389 -0
- qiskit/primitives/containers/bit_array.py +741 -0
- qiskit/primitives/containers/data_bin.py +173 -0
- qiskit/primitives/containers/estimator_pub.py +222 -0
- qiskit/primitives/containers/object_array.py +94 -0
- qiskit/primitives/containers/observables_array.py +279 -0
- qiskit/primitives/containers/primitive_result.py +53 -0
- qiskit/primitives/containers/pub_result.py +51 -0
- qiskit/primitives/containers/sampler_pub.py +193 -0
- qiskit/primitives/containers/sampler_pub_result.py +74 -0
- qiskit/primitives/containers/shape.py +129 -0
- qiskit/primitives/estimator.py +172 -0
- qiskit/primitives/primitive_job.py +81 -0
- qiskit/primitives/sampler.py +162 -0
- qiskit/primitives/statevector_estimator.py +174 -0
- qiskit/primitives/statevector_sampler.py +292 -0
- qiskit/primitives/utils.py +247 -0
- qiskit/providers/__init__.py +803 -0
- qiskit/providers/backend.py +667 -0
- qiskit/providers/backend_compat.py +472 -0
- qiskit/providers/basic_provider/__init__.py +45 -0
- qiskit/providers/basic_provider/basic_provider.py +101 -0
- qiskit/providers/basic_provider/basic_provider_job.py +65 -0
- qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
- qiskit/providers/basic_provider/basic_simulator.py +821 -0
- qiskit/providers/basic_provider/exceptions.py +30 -0
- qiskit/providers/exceptions.py +45 -0
- qiskit/providers/fake_provider/__init__.py +105 -0
- qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
- qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
- qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
- qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
- qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
- qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
- qiskit/providers/fake_provider/fake_1q.py +91 -0
- qiskit/providers/fake_provider/fake_backend.py +165 -0
- qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
- qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
- qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
- qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
- qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
- qiskit/providers/fake_provider/utils/__init__.py +15 -0
- qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
- qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
- qiskit/providers/job.py +147 -0
- qiskit/providers/jobstatus.py +30 -0
- qiskit/providers/models/__init__.py +89 -0
- qiskit/providers/models/backendconfiguration.py +1040 -0
- qiskit/providers/models/backendproperties.py +517 -0
- qiskit/providers/models/backendstatus.py +94 -0
- qiskit/providers/models/jobstatus.py +66 -0
- qiskit/providers/models/pulsedefaults.py +305 -0
- qiskit/providers/options.py +273 -0
- qiskit/providers/provider.py +95 -0
- qiskit/providers/providerutils.py +110 -0
- qiskit/pulse/__init__.py +158 -0
- qiskit/pulse/builder.py +2254 -0
- qiskit/pulse/calibration_entries.py +381 -0
- qiskit/pulse/channels.py +227 -0
- qiskit/pulse/configuration.py +245 -0
- qiskit/pulse/exceptions.py +45 -0
- qiskit/pulse/filters.py +309 -0
- qiskit/pulse/instruction_schedule_map.py +424 -0
- qiskit/pulse/instructions/__init__.py +67 -0
- qiskit/pulse/instructions/acquire.py +150 -0
- qiskit/pulse/instructions/delay.py +71 -0
- qiskit/pulse/instructions/directives.py +154 -0
- qiskit/pulse/instructions/frequency.py +135 -0
- qiskit/pulse/instructions/instruction.py +270 -0
- qiskit/pulse/instructions/phase.py +152 -0
- qiskit/pulse/instructions/play.py +99 -0
- qiskit/pulse/instructions/reference.py +100 -0
- qiskit/pulse/instructions/snapshot.py +82 -0
- qiskit/pulse/library/__init__.py +97 -0
- qiskit/pulse/library/continuous.py +430 -0
- qiskit/pulse/library/pulse.py +148 -0
- qiskit/pulse/library/samplers/__init__.py +15 -0
- qiskit/pulse/library/samplers/decorators.py +295 -0
- qiskit/pulse/library/samplers/strategies.py +71 -0
- qiskit/pulse/library/symbolic_pulses.py +1988 -0
- qiskit/pulse/library/waveform.py +136 -0
- qiskit/pulse/macros.py +262 -0
- qiskit/pulse/parameter_manager.py +445 -0
- qiskit/pulse/parser.py +314 -0
- qiskit/pulse/reference_manager.py +58 -0
- qiskit/pulse/schedule.py +1854 -0
- qiskit/pulse/transforms/__init__.py +106 -0
- qiskit/pulse/transforms/alignments.py +406 -0
- qiskit/pulse/transforms/base_transforms.py +71 -0
- qiskit/pulse/transforms/canonicalization.py +498 -0
- qiskit/pulse/transforms/dag.py +122 -0
- qiskit/pulse/utils.py +149 -0
- qiskit/qasm/libs/dummy/stdgates.inc +75 -0
- qiskit/qasm/libs/qelib1.inc +266 -0
- qiskit/qasm/libs/stdgates.inc +82 -0
- qiskit/qasm2/__init__.py +654 -0
- qiskit/qasm2/exceptions.py +27 -0
- qiskit/qasm2/export.py +372 -0
- qiskit/qasm2/parse.py +452 -0
- qiskit/qasm3/__init__.py +367 -0
- qiskit/qasm3/ast.py +738 -0
- qiskit/qasm3/exceptions.py +27 -0
- qiskit/qasm3/experimental.py +70 -0
- qiskit/qasm3/exporter.py +1299 -0
- qiskit/qasm3/printer.py +577 -0
- qiskit/qobj/__init__.py +75 -0
- qiskit/qobj/common.py +81 -0
- qiskit/qobj/converters/__init__.py +18 -0
- qiskit/qobj/converters/lo_config.py +177 -0
- qiskit/qobj/converters/pulse_instruction.py +897 -0
- qiskit/qobj/pulse_qobj.py +709 -0
- qiskit/qobj/qasm_qobj.py +708 -0
- qiskit/qobj/utils.py +46 -0
- qiskit/qpy/__init__.py +1822 -0
- qiskit/qpy/binary_io/__init__.py +36 -0
- qiskit/qpy/binary_io/circuits.py +1475 -0
- qiskit/qpy/binary_io/schedules.py +635 -0
- qiskit/qpy/binary_io/value.py +1025 -0
- qiskit/qpy/common.py +350 -0
- qiskit/qpy/exceptions.py +53 -0
- qiskit/qpy/formats.py +401 -0
- qiskit/qpy/interface.py +377 -0
- qiskit/qpy/type_keys.py +572 -0
- qiskit/quantum_info/__init__.py +162 -0
- qiskit/quantum_info/analysis/__init__.py +17 -0
- qiskit/quantum_info/analysis/average.py +47 -0
- qiskit/quantum_info/analysis/distance.py +102 -0
- qiskit/quantum_info/analysis/make_observable.py +44 -0
- qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
- qiskit/quantum_info/operators/__init__.py +28 -0
- qiskit/quantum_info/operators/base_operator.py +145 -0
- qiskit/quantum_info/operators/channel/__init__.py +29 -0
- qiskit/quantum_info/operators/channel/chi.py +191 -0
- qiskit/quantum_info/operators/channel/choi.py +218 -0
- qiskit/quantum_info/operators/channel/kraus.py +337 -0
- qiskit/quantum_info/operators/channel/ptm.py +204 -0
- qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
- qiskit/quantum_info/operators/channel/stinespring.py +296 -0
- qiskit/quantum_info/operators/channel/superop.py +377 -0
- qiskit/quantum_info/operators/channel/transformations.py +475 -0
- qiskit/quantum_info/operators/custom_iterator.py +48 -0
- qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
- qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
- qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
- qiskit/quantum_info/operators/dihedral/random.py +64 -0
- qiskit/quantum_info/operators/linear_op.py +25 -0
- qiskit/quantum_info/operators/measures.py +418 -0
- qiskit/quantum_info/operators/mixins/__init__.py +52 -0
- qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
- qiskit/quantum_info/operators/mixins/group.py +171 -0
- qiskit/quantum_info/operators/mixins/linear.py +84 -0
- qiskit/quantum_info/operators/mixins/multiply.py +62 -0
- qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
- qiskit/quantum_info/operators/op_shape.py +525 -0
- qiskit/quantum_info/operators/operator.py +865 -0
- qiskit/quantum_info/operators/operator_utils.py +76 -0
- qiskit/quantum_info/operators/predicates.py +183 -0
- qiskit/quantum_info/operators/random.py +154 -0
- qiskit/quantum_info/operators/scalar_op.py +254 -0
- qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
- qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
- qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
- qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
- qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
- qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
- qiskit/quantum_info/operators/symplectic/random.py +117 -0
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1196 -0
- qiskit/quantum_info/operators/utils/__init__.py +20 -0
- qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
- qiskit/quantum_info/operators/utils/commutator.py +36 -0
- qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
- qiskit/quantum_info/quaternion.py +156 -0
- qiskit/quantum_info/random.py +26 -0
- qiskit/quantum_info/states/__init__.py +28 -0
- qiskit/quantum_info/states/densitymatrix.py +845 -0
- qiskit/quantum_info/states/measures.py +288 -0
- qiskit/quantum_info/states/quantum_state.py +503 -0
- qiskit/quantum_info/states/random.py +157 -0
- qiskit/quantum_info/states/stabilizerstate.py +773 -0
- qiskit/quantum_info/states/statevector.py +958 -0
- qiskit/quantum_info/states/utils.py +247 -0
- qiskit/result/__init__.py +73 -0
- qiskit/result/counts.py +189 -0
- qiskit/result/distributions/__init__.py +17 -0
- qiskit/result/distributions/probability.py +100 -0
- qiskit/result/distributions/quasi.py +154 -0
- qiskit/result/exceptions.py +40 -0
- qiskit/result/mitigation/__init__.py +13 -0
- qiskit/result/mitigation/base_readout_mitigator.py +79 -0
- qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
- qiskit/result/mitigation/local_readout_mitigator.py +328 -0
- qiskit/result/mitigation/utils.py +217 -0
- qiskit/result/models.py +234 -0
- qiskit/result/postprocess.py +239 -0
- qiskit/result/result.py +392 -0
- qiskit/result/sampled_expval.py +75 -0
- qiskit/result/utils.py +295 -0
- qiskit/scheduler/__init__.py +40 -0
- qiskit/scheduler/config.py +37 -0
- qiskit/scheduler/lowering.py +187 -0
- qiskit/scheduler/methods/__init__.py +15 -0
- qiskit/scheduler/methods/basic.py +140 -0
- qiskit/scheduler/schedule_circuit.py +69 -0
- qiskit/scheduler/sequence.py +104 -0
- qiskit/synthesis/__init__.py +220 -0
- qiskit/synthesis/arithmetic/__init__.py +16 -0
- qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
- qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
- qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
- qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
- qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
- qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
- qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
- qiskit/synthesis/clifford/__init__.py +19 -0
- qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
- qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
- qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
- qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
- qiskit/synthesis/cnotdihedral/__init__.py +17 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
- qiskit/synthesis/discrete_basis/__init__.py +16 -0
- qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
- qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
- qiskit/synthesis/evolution/__init__.py +21 -0
- qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
- qiskit/synthesis/evolution/lie_trotter.py +117 -0
- qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
- qiskit/synthesis/evolution/pauli_network.py +80 -0
- qiskit/synthesis/evolution/product_formula.py +311 -0
- qiskit/synthesis/evolution/qdrift.py +138 -0
- qiskit/synthesis/evolution/suzuki_trotter.py +215 -0
- qiskit/synthesis/linear/__init__.py +26 -0
- qiskit/synthesis/linear/cnot_synth.py +69 -0
- qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
- qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
- qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
- qiskit/synthesis/linear_phase/__init__.py +17 -0
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
- qiskit/synthesis/multi_controlled/__init__.py +24 -0
- qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
- qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
- qiskit/synthesis/one_qubit/__init__.py +15 -0
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
- qiskit/synthesis/permutation/__init__.py +18 -0
- qiskit/synthesis/permutation/permutation_full.py +78 -0
- qiskit/synthesis/permutation/permutation_lnn.py +54 -0
- qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
- qiskit/synthesis/permutation/permutation_utils.py +16 -0
- qiskit/synthesis/qft/__init__.py +16 -0
- qiskit/synthesis/qft/qft_decompose_full.py +97 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
- qiskit/synthesis/stabilizer/__init__.py +16 -0
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
- qiskit/synthesis/two_qubit/__init__.py +19 -0
- qiskit/synthesis/two_qubit/local_invariance.py +63 -0
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
- qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
- qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
- qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
- qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
- qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
- qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
- qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
- qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
- qiskit/synthesis/unitary/__init__.py +13 -0
- qiskit/synthesis/unitary/aqc/__init__.py +177 -0
- qiskit/synthesis/unitary/aqc/approximate.py +116 -0
- qiskit/synthesis/unitary/aqc/aqc.py +175 -0
- qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
- qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
- qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
- qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
- qiskit/synthesis/unitary/qsd.py +288 -0
- qiskit/transpiler/__init__.py +1290 -0
- qiskit/transpiler/basepasses.py +221 -0
- qiskit/transpiler/coupling.py +500 -0
- qiskit/transpiler/exceptions.py +59 -0
- qiskit/transpiler/instruction_durations.py +281 -0
- qiskit/transpiler/layout.py +737 -0
- qiskit/transpiler/passes/__init__.py +312 -0
- qiskit/transpiler/passes/analysis/__init__.py +23 -0
- qiskit/transpiler/passes/analysis/count_ops.py +30 -0
- qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
- qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
- qiskit/transpiler/passes/analysis/depth.py +33 -0
- qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
- qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
- qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
- qiskit/transpiler/passes/analysis/size.py +36 -0
- qiskit/transpiler/passes/analysis/width.py +27 -0
- qiskit/transpiler/passes/basis/__init__.py +19 -0
- qiskit/transpiler/passes/basis/basis_translator.py +137 -0
- qiskit/transpiler/passes/basis/decompose.py +131 -0
- qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
- qiskit/transpiler/passes/calibration/__init__.py +17 -0
- qiskit/transpiler/passes/calibration/base_builder.py +79 -0
- qiskit/transpiler/passes/calibration/builders.py +20 -0
- qiskit/transpiler/passes/calibration/exceptions.py +22 -0
- qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
- qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
- qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
- qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
- qiskit/transpiler/passes/layout/__init__.py +26 -0
- qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
- qiskit/transpiler/passes/layout/apply_layout.py +123 -0
- qiskit/transpiler/passes/layout/csp_layout.py +132 -0
- qiskit/transpiler/passes/layout/dense_layout.py +202 -0
- qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
- qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
- qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
- qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
- qiskit/transpiler/passes/layout/sabre_layout.py +487 -0
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
- qiskit/transpiler/passes/layout/set_layout.py +69 -0
- qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
- qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
- qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
- qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
- qiskit/transpiler/passes/optimization/__init__.py +43 -0
- qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
- qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
- qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
- qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
- qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
- qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
- qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
- qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +149 -0
- qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
- qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
- qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
- qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
- qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
- qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
- qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
- qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
- qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
- qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
- qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
- qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
- qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
- qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
- qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
- qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
- qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
- qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
- qiskit/transpiler/passes/routing/__init__.py +22 -0
- qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
- qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
- qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
- qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
- qiskit/transpiler/passes/routing/basic_swap.py +166 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
- qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
- qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
- qiskit/transpiler/passes/routing/sabre_swap.py +447 -0
- qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
- qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
- qiskit/transpiler/passes/routing/utils.py +35 -0
- qiskit/transpiler/passes/scheduling/__init__.py +27 -0
- qiskit/transpiler/passes/scheduling/alap.py +153 -0
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
- qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
- qiskit/transpiler/passes/scheduling/asap.py +175 -0
- qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
- qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
- qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
- qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
- qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
- qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
- qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
- qiskit/transpiler/passes/synthesis/__init__.py +20 -0
- qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
- qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
- qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
- qiskit/transpiler/passes/synthesis/plugin.py +734 -0
- qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
- qiskit/transpiler/passes/utils/__init__.py +33 -0
- qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
- qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
- qiskit/transpiler/passes/utils/check_map.py +78 -0
- qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
- qiskit/transpiler/passes/utils/control_flow.py +65 -0
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -0
- qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
- qiskit/transpiler/passes/utils/error.py +69 -0
- qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
- qiskit/transpiler/passes/utils/fixed_point.py +48 -0
- qiskit/transpiler/passes/utils/gate_direction.py +86 -0
- qiskit/transpiler/passes/utils/gates_basis.py +51 -0
- qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
- qiskit/transpiler/passes/utils/minimum_point.py +118 -0
- qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
- qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
- qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
- qiskit/transpiler/passmanager.py +490 -0
- qiskit/transpiler/passmanager_config.py +216 -0
- qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
- qiskit/transpiler/preset_passmanagers/common.py +649 -0
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
- qiskit/transpiler/preset_passmanagers/level0.py +113 -0
- qiskit/transpiler/preset_passmanagers/level1.py +120 -0
- qiskit/transpiler/preset_passmanagers/level2.py +119 -0
- qiskit/transpiler/preset_passmanagers/level3.py +119 -0
- qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
- qiskit/transpiler/target.py +1319 -0
- qiskit/transpiler/timing_constraints.py +59 -0
- qiskit/user_config.py +262 -0
- qiskit/utils/__init__.py +89 -0
- qiskit/utils/classtools.py +146 -0
- qiskit/utils/deprecate_pulse.py +119 -0
- qiskit/utils/deprecation.py +490 -0
- qiskit/utils/lazy_tester.py +363 -0
- qiskit/utils/multiprocessing.py +56 -0
- qiskit/utils/optionals.py +347 -0
- qiskit/utils/parallel.py +191 -0
- qiskit/utils/units.py +143 -0
- qiskit/version.py +84 -0
- qiskit/visualization/__init__.py +288 -0
- qiskit/visualization/array.py +204 -0
- qiskit/visualization/bloch.py +778 -0
- qiskit/visualization/circuit/__init__.py +15 -0
- qiskit/visualization/circuit/_utils.py +675 -0
- qiskit/visualization/circuit/circuit_visualization.py +727 -0
- qiskit/visualization/circuit/latex.py +661 -0
- qiskit/visualization/circuit/matplotlib.py +2029 -0
- qiskit/visualization/circuit/qcstyle.py +278 -0
- qiskit/visualization/circuit/styles/__init__.py +13 -0
- qiskit/visualization/circuit/styles/bw.json +202 -0
- qiskit/visualization/circuit/styles/clifford.json +202 -0
- qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
- qiskit/visualization/circuit/styles/iqp.json +214 -0
- qiskit/visualization/circuit/styles/textbook.json +202 -0
- qiskit/visualization/circuit/text.py +1844 -0
- qiskit/visualization/circuit_visualization.py +19 -0
- qiskit/visualization/counts_visualization.py +481 -0
- qiskit/visualization/dag_visualization.py +316 -0
- qiskit/visualization/exceptions.py +21 -0
- qiskit/visualization/gate_map.py +1485 -0
- qiskit/visualization/library.py +37 -0
- qiskit/visualization/pass_manager_visualization.py +308 -0
- qiskit/visualization/pulse_v2/__init__.py +21 -0
- qiskit/visualization/pulse_v2/core.py +901 -0
- qiskit/visualization/pulse_v2/device_info.py +173 -0
- qiskit/visualization/pulse_v2/drawings.py +253 -0
- qiskit/visualization/pulse_v2/events.py +254 -0
- qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
- qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
- qiskit/visualization/pulse_v2/generators/chart.py +208 -0
- qiskit/visualization/pulse_v2/generators/frame.py +436 -0
- qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
- qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
- qiskit/visualization/pulse_v2/interface.py +458 -0
- qiskit/visualization/pulse_v2/layouts.py +387 -0
- qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
- qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
- qiskit/visualization/pulse_v2/stylesheet.py +312 -0
- qiskit/visualization/pulse_v2/types.py +242 -0
- qiskit/visualization/state_visualization.py +1518 -0
- qiskit/visualization/timeline/__init__.py +21 -0
- qiskit/visualization/timeline/core.py +480 -0
- qiskit/visualization/timeline/drawings.py +260 -0
- qiskit/visualization/timeline/generators.py +506 -0
- qiskit/visualization/timeline/interface.py +436 -0
- qiskit/visualization/timeline/layouts.py +115 -0
- qiskit/visualization/timeline/plotters/__init__.py +16 -0
- qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
- qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
- qiskit/visualization/timeline/stylesheet.py +301 -0
- qiskit/visualization/timeline/types.py +148 -0
- qiskit/visualization/transition_visualization.py +369 -0
- qiskit/visualization/utils.py +49 -0
- qiskit-1.3.0.dist-info/LICENSE.txt +203 -0
- qiskit-1.3.0.dist-info/METADATA +222 -0
- qiskit-1.3.0.dist-info/RECORD +836 -0
- qiskit-1.3.0.dist-info/WHEEL +5 -0
- qiskit-1.3.0.dist-info/entry_points.txt +76 -0
- qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,153 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2020.
|
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
|
+
"""ALAP Scheduling."""
|
14
|
+
|
15
|
+
from qiskit.circuit import Delay, Qubit, Measure
|
16
|
+
from qiskit.dagcircuit import DAGCircuit
|
17
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
18
|
+
from qiskit.transpiler.passes.scheduling.base_scheduler import BaseSchedulerTransform
|
19
|
+
from qiskit.utils.deprecation import deprecate_func
|
20
|
+
|
21
|
+
|
22
|
+
class ALAPSchedule(BaseSchedulerTransform):
|
23
|
+
"""ALAP Scheduling pass, which schedules the **stop** time of instructions as late as possible.
|
24
|
+
|
25
|
+
See :class:`~qiskit.transpiler.passes.scheduling.base_scheduler.BaseSchedulerTransform` for the
|
26
|
+
detailed behavior of the control flow operation, i.e. ``c_if``.
|
27
|
+
"""
|
28
|
+
|
29
|
+
@deprecate_func(
|
30
|
+
additional_msg=(
|
31
|
+
"Instead, use :class:`~.ALAPScheduleAnalysis`, which is an "
|
32
|
+
"analysis pass that requires a padding pass to later modify the circuit."
|
33
|
+
),
|
34
|
+
since="1.1.0",
|
35
|
+
)
|
36
|
+
def __init__(self, *args, **kwargs):
|
37
|
+
super().__init__(*args, **kwargs)
|
38
|
+
|
39
|
+
def run(self, dag):
|
40
|
+
"""Run the ALAPSchedule pass on `dag`.
|
41
|
+
|
42
|
+
Args:
|
43
|
+
dag (DAGCircuit): DAG to schedule.
|
44
|
+
|
45
|
+
Returns:
|
46
|
+
DAGCircuit: A scheduled DAG.
|
47
|
+
|
48
|
+
Raises:
|
49
|
+
TranspilerError: if the circuit is not mapped on physical qubits.
|
50
|
+
TranspilerError: if conditional bit is added to non-supported instruction.
|
51
|
+
"""
|
52
|
+
if len(dag.qregs) != 1 or dag.qregs.get("q", None) is None:
|
53
|
+
raise TranspilerError("ALAP schedule runs on physical circuits only")
|
54
|
+
|
55
|
+
time_unit = self.property_set["time_unit"]
|
56
|
+
new_dag = DAGCircuit()
|
57
|
+
for qreg in dag.qregs.values():
|
58
|
+
new_dag.add_qreg(qreg)
|
59
|
+
for creg in dag.cregs.values():
|
60
|
+
new_dag.add_creg(creg)
|
61
|
+
|
62
|
+
idle_before = {q: 0 for q in dag.qubits + dag.clbits}
|
63
|
+
for node in reversed(list(dag.topological_op_nodes())):
|
64
|
+
op_duration = self._get_node_duration(node, dag)
|
65
|
+
|
66
|
+
# compute t0, t1: instruction interval, note that
|
67
|
+
# t0: start time of instruction
|
68
|
+
# t1: end time of instruction
|
69
|
+
|
70
|
+
# since this is alap scheduling, node is scheduled in reversed topological ordering
|
71
|
+
# and nodes are packed from the very end of the circuit.
|
72
|
+
# the physical meaning of t0 and t1 is flipped here.
|
73
|
+
if isinstance(node.op, self.CONDITIONAL_SUPPORTED):
|
74
|
+
t0q = max(idle_before[q] for q in node.qargs)
|
75
|
+
if node.op.condition_bits:
|
76
|
+
# conditional is bit tricky due to conditional_latency
|
77
|
+
t0c = max(idle_before[c] for c in node.op.condition_bits)
|
78
|
+
# Assume following case (t0c > t0q):
|
79
|
+
#
|
80
|
+
# |t0q
|
81
|
+
# Q ░░░░░░░░░░░░░▒▒▒
|
82
|
+
# C ░░░░░░░░▒▒▒▒▒▒▒▒
|
83
|
+
# |t0c
|
84
|
+
#
|
85
|
+
# In this case, there is no actual clbit read before gate.
|
86
|
+
#
|
87
|
+
# |t0q' = t0c - conditional_latency
|
88
|
+
# Q ░░░░░░░░▒▒▒░░▒▒▒
|
89
|
+
# C ░░░░░░▒▒▒▒▒▒▒▒▒▒
|
90
|
+
# |t1c' = t0c + conditional_latency
|
91
|
+
#
|
92
|
+
# rather than naively doing
|
93
|
+
#
|
94
|
+
# |t1q' = t0c + duration
|
95
|
+
# Q ░░░░░▒▒▒░░░░░▒▒▒
|
96
|
+
# C ░░▒▒░░░░▒▒▒▒▒▒▒▒
|
97
|
+
# |t1c' = t0c + duration + conditional_latency
|
98
|
+
#
|
99
|
+
t0 = max(t0q, t0c - op_duration)
|
100
|
+
t1 = t0 + op_duration
|
101
|
+
for clbit in node.op.condition_bits:
|
102
|
+
idle_before[clbit] = t1 + self.conditional_latency
|
103
|
+
else:
|
104
|
+
t0 = t0q
|
105
|
+
t1 = t0 + op_duration
|
106
|
+
else:
|
107
|
+
if node.op.condition_bits:
|
108
|
+
raise TranspilerError(
|
109
|
+
f"Conditional instruction {node.op.name} is not supported in ALAP scheduler."
|
110
|
+
)
|
111
|
+
|
112
|
+
if isinstance(node.op, Measure):
|
113
|
+
# clbit time is always right (alap) justified
|
114
|
+
t0 = max(idle_before[bit] for bit in node.qargs + node.cargs)
|
115
|
+
t1 = t0 + op_duration
|
116
|
+
#
|
117
|
+
# |t1 = t0 + duration
|
118
|
+
# Q ░░░░░▒▒▒▒▒▒▒▒▒▒▒
|
119
|
+
# C ░░░░░░░░░▒▒▒▒▒▒▒
|
120
|
+
# |t0 + (duration - clbit_write_latency)
|
121
|
+
#
|
122
|
+
for clbit in node.cargs:
|
123
|
+
idle_before[clbit] = t0 + (op_duration - self.clbit_write_latency)
|
124
|
+
else:
|
125
|
+
# It happens to be directives such as barrier
|
126
|
+
t0 = max(idle_before[bit] for bit in node.qargs + node.cargs)
|
127
|
+
t1 = t0 + op_duration
|
128
|
+
|
129
|
+
for bit in node.qargs:
|
130
|
+
delta = t0 - idle_before[bit]
|
131
|
+
if delta > 0 and self._delay_supported(dag.find_bit(bit).index):
|
132
|
+
new_dag.apply_operation_front(Delay(delta, time_unit), [bit], [], check=False)
|
133
|
+
idle_before[bit] = t1
|
134
|
+
|
135
|
+
new_dag.apply_operation_front(node.op, node.qargs, node.cargs, check=False)
|
136
|
+
|
137
|
+
circuit_duration = max(idle_before.values())
|
138
|
+
for bit, before in idle_before.items():
|
139
|
+
delta = circuit_duration - before
|
140
|
+
if not (delta > 0 and isinstance(bit, Qubit)):
|
141
|
+
continue
|
142
|
+
if self._delay_supported(dag.find_bit(bit).index):
|
143
|
+
new_dag.apply_operation_front(Delay(delta, time_unit), [bit], [], check=False)
|
144
|
+
|
145
|
+
new_dag.name = dag.name
|
146
|
+
new_dag.metadata = dag.metadata
|
147
|
+
new_dag._calibrations_prop = dag._calibrations_prop
|
148
|
+
|
149
|
+
# set circuit duration and unit to indicate it is scheduled
|
150
|
+
new_dag.duration = circuit_duration
|
151
|
+
new_dag.unit = time_unit
|
152
|
+
|
153
|
+
return new_dag
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2022.
|
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
|
+
"""Validation and optimization for hardware instruction alignment constraints.
|
14
|
+
|
15
|
+
This is a control electronics aware analysis pass group.
|
16
|
+
|
17
|
+
In many quantum computing architectures gates (instructions) are implemented with
|
18
|
+
shaped analog stimulus signals. These signals are digitally stored in the
|
19
|
+
waveform memory of the control electronics and converted into analog voltage signals
|
20
|
+
by electronic components called digital to analog converters (DAC).
|
21
|
+
|
22
|
+
In a typical hardware implementation of superconducting quantum processors,
|
23
|
+
a single qubit instruction is implemented by a
|
24
|
+
microwave signal with the duration of around several tens of ns with a per-sample
|
25
|
+
time resolution of ~0.1-10ns, as reported by ``backend.configuration().dt``.
|
26
|
+
In such systems requiring higher DAC bandwidth, control electronics often
|
27
|
+
defines a `pulse granularity`, in other words a data chunk, to allow the DAC to
|
28
|
+
perform the signal conversion in parallel to gain the bandwidth.
|
29
|
+
|
30
|
+
A control electronics, i.e. micro-architecture, of the real quantum backend may
|
31
|
+
impose some constraints on the start time of microinstructions.
|
32
|
+
In Qiskit SDK, the duration of :class:`qiskit.circuit.Delay` can take arbitrary
|
33
|
+
value in units of dt, thus circuits involving delays may violate the constraints,
|
34
|
+
which may result in failure in the circuit execution on the backend.
|
35
|
+
|
36
|
+
There are two alignment constraint values reported by your quantum backend.
|
37
|
+
In addition, if you want to define a custom instruction as a pulse gate, i.e. calibration,
|
38
|
+
the underlying pulse instruction should satisfy other two waveform constraints.
|
39
|
+
|
40
|
+
Pulse alignment constraint
|
41
|
+
|
42
|
+
This value is reported by ``timing_constraints["pulse_alignment"]`` in the backend
|
43
|
+
configuration in units of dt. The start time of the all pulse instruction should be
|
44
|
+
multiple of this value. Violation of this constraint may result in the
|
45
|
+
backend execution failure.
|
46
|
+
|
47
|
+
In most of the scenarios, the scheduled start time of ``DAGOpNode`` corresponds to the
|
48
|
+
start time of the underlying pulse instruction composing the node operation.
|
49
|
+
However, this assumption can be intentionally broken by defining a pulse gate,
|
50
|
+
i.e. calibration, with the schedule involving pre-buffer, i.e. some random pulse delay
|
51
|
+
followed by a pulse instruction. Because this pass is not aware of such edge case,
|
52
|
+
the user must take special care of pulse gates if any.
|
53
|
+
|
54
|
+
Acquire alignment constraint
|
55
|
+
|
56
|
+
This value is reported by ``timing_constraints["acquire_alignment"]`` in the backend
|
57
|
+
configuration in units of dt. The start time of the :class:`~qiskit.circuit.Measure`
|
58
|
+
instruction should be multiple of this value.
|
59
|
+
|
60
|
+
Granularity constraint
|
61
|
+
|
62
|
+
This value is reported by ``timing_constraints["granularity"]`` in the backend
|
63
|
+
configuration in units of dt. This is the constraint for a single pulse :class:`Play`
|
64
|
+
instruction that may constitute your pulse gate.
|
65
|
+
The length of waveform samples should be multiple of this constraint value.
|
66
|
+
Violation of this constraint may result in failue in backend execution.
|
67
|
+
|
68
|
+
Minimum pulse length constraint
|
69
|
+
|
70
|
+
This value is reported by ``timing_constraints["min_length"]`` in the backend
|
71
|
+
configuration in units of dt. This is the constraint for a single pulse :class:`Play`
|
72
|
+
instruction that may constitute your pulse gate.
|
73
|
+
The length of waveform samples should be greater than this constraint value.
|
74
|
+
Violation of this constraint may result in failue in backend execution.
|
75
|
+
|
76
|
+
"""
|
77
|
+
|
78
|
+
from .check_durations import InstructionDurationCheck
|
79
|
+
from .pulse_gate_validation import ValidatePulseGates
|
80
|
+
from .reschedule import ConstrainedReschedule
|
81
|
+
from .align_measures import AlignMeasures
|
@@ -0,0 +1,255 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021.
|
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
|
+
"""Align measurement instructions."""
|
14
|
+
from __future__ import annotations
|
15
|
+
import itertools
|
16
|
+
import warnings
|
17
|
+
from collections import defaultdict
|
18
|
+
from collections.abc import Iterable
|
19
|
+
from typing import Type
|
20
|
+
|
21
|
+
from qiskit.circuit.quantumcircuit import ClbitSpecifier, QubitSpecifier
|
22
|
+
|
23
|
+
from qiskit.circuit.delay import Delay
|
24
|
+
from qiskit.circuit.measure import Measure
|
25
|
+
from qiskit.circuit.parameterexpression import ParameterExpression
|
26
|
+
from qiskit.dagcircuit import DAGCircuit
|
27
|
+
from qiskit.transpiler.basepasses import TransformationPass
|
28
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
29
|
+
from qiskit.utils.deprecation import deprecate_func
|
30
|
+
|
31
|
+
|
32
|
+
class AlignMeasures(TransformationPass):
|
33
|
+
"""Measurement alignment.
|
34
|
+
|
35
|
+
This is a control electronics aware optimization pass.
|
36
|
+
|
37
|
+
In many quantum computing architectures gates (instructions) are implemented with
|
38
|
+
shaped analog stimulus signals. These signals are digitally stored in the
|
39
|
+
waveform memory of the control electronics and converted into analog voltage signals
|
40
|
+
by electronic components called digital to analog converters (DAC).
|
41
|
+
|
42
|
+
In a typical hardware implementation of superconducting quantum processors,
|
43
|
+
a single qubit instruction is implemented by a
|
44
|
+
microwave signal with the duration of around several tens of ns with a per-sample
|
45
|
+
time resolution of ~0.1-10ns, as reported by ``backend.configuration().dt``.
|
46
|
+
In such systems requiring higher DAC bandwidth, control electronics often
|
47
|
+
defines a `pulse granularity`, in other words a data chunk, to allow the DAC to
|
48
|
+
perform the signal conversion in parallel to gain the bandwidth.
|
49
|
+
|
50
|
+
Measurement alignment is required if a backend only allows triggering ``measure``
|
51
|
+
instructions at a certain multiple value of this pulse granularity.
|
52
|
+
This value is usually provided by ``backend.configuration().timing_constraints``.
|
53
|
+
|
54
|
+
In Qiskit SDK, the duration of delay can take arbitrary value in units of ``dt``,
|
55
|
+
thus circuits involving delays may violate the above alignment constraint (i.e. misalignment).
|
56
|
+
This pass shifts measurement instructions to a new time position to fix the misalignment,
|
57
|
+
by inserting extra delay right before the measure instructions.
|
58
|
+
The input of this pass should be scheduled :class:`~qiskit.dagcircuit.DAGCircuit`,
|
59
|
+
thus one should select one of the scheduling passes
|
60
|
+
(:class:`~qiskit.transpiler.passes.ALAPSchedule` or
|
61
|
+
:class:`~qiskit.trasnpiler.passes.ASAPSchedule`) before calling this.
|
62
|
+
|
63
|
+
Examples:
|
64
|
+
We assume executing the following circuit on a backend with ``alignment=16``.
|
65
|
+
|
66
|
+
.. code-block:: text
|
67
|
+
|
68
|
+
┌───┐┌────────────────┐┌─┐
|
69
|
+
q_0: ┤ X ├┤ Delay(100[dt]) ├┤M├
|
70
|
+
└───┘└────────────────┘└╥┘
|
71
|
+
c: 1/════════════════════════╩═
|
72
|
+
0
|
73
|
+
|
74
|
+
Note that delay of 100 dt induces a misalignment of 4 dt at the measurement.
|
75
|
+
This pass appends an extra 12 dt time shift to the input circuit.
|
76
|
+
|
77
|
+
.. code-block:: text
|
78
|
+
|
79
|
+
┌───┐┌────────────────┐┌─┐
|
80
|
+
q_0: ┤ X ├┤ Delay(112[dt]) ├┤M├
|
81
|
+
└───┘└────────────────┘└╥┘
|
82
|
+
c: 1/════════════════════════╩═
|
83
|
+
0
|
84
|
+
|
85
|
+
This pass always inserts a positive delay before measurements
|
86
|
+
rather than reducing other delays.
|
87
|
+
|
88
|
+
Notes:
|
89
|
+
The Backend may allow users to execute circuits violating the alignment constraint.
|
90
|
+
However, it may return meaningless measurement data mainly due to the phase error.
|
91
|
+
"""
|
92
|
+
|
93
|
+
@deprecate_func(
|
94
|
+
additional_msg=(
|
95
|
+
"Instead, use :class:`~.ConstrainedReschedule`, which performs the same function "
|
96
|
+
"but also supports aligning to additional timing constraints."
|
97
|
+
),
|
98
|
+
since="1.1.0",
|
99
|
+
)
|
100
|
+
def __init__(self, alignment: int = 1):
|
101
|
+
"""Create new pass.
|
102
|
+
|
103
|
+
Args:
|
104
|
+
alignment: Integer number representing the minimum time resolution to
|
105
|
+
trigger measure instruction in units of ``dt``. This value depends on
|
106
|
+
the control electronics of your quantum processor.
|
107
|
+
"""
|
108
|
+
super().__init__()
|
109
|
+
self.alignment = alignment
|
110
|
+
|
111
|
+
def run(self, dag: DAGCircuit):
|
112
|
+
"""Run the measurement alignment pass on `dag`.
|
113
|
+
|
114
|
+
Args:
|
115
|
+
dag (DAGCircuit): DAG to be checked.
|
116
|
+
|
117
|
+
Returns:
|
118
|
+
DAGCircuit: DAG with consistent timing and op nodes annotated with duration.
|
119
|
+
|
120
|
+
Raises:
|
121
|
+
TranspilerError: If circuit is not scheduled.
|
122
|
+
"""
|
123
|
+
time_unit = self.property_set["time_unit"]
|
124
|
+
|
125
|
+
if not _check_alignment_required(dag, self.alignment, Measure):
|
126
|
+
# return input as-is to avoid unnecessary scheduling.
|
127
|
+
# because following procedure regenerate new DAGCircuit,
|
128
|
+
# we should avoid continuing if not necessary from performance viewpoint.
|
129
|
+
return dag
|
130
|
+
|
131
|
+
# if circuit is not yet scheduled, schedule with ALAP method
|
132
|
+
if dag.duration is None:
|
133
|
+
raise TranspilerError(
|
134
|
+
f"This circuit {dag.name} may involve a delay instruction violating the "
|
135
|
+
"pulse controller alignment. To adjust instructions to "
|
136
|
+
"right timing, you should call one of scheduling passes first. "
|
137
|
+
"This is usually done by calling transpiler with scheduling_method='alap'."
|
138
|
+
)
|
139
|
+
|
140
|
+
# the following lines are basically copied from ASAPSchedule pass
|
141
|
+
#
|
142
|
+
# * some validations for non-scheduled nodes are dropped, since we assume scheduled input
|
143
|
+
# * pad_with_delay is called only with non-delay node to avoid consecutive delay
|
144
|
+
new_dag = dag.copy_empty_like()
|
145
|
+
|
146
|
+
qubit_time_available: dict[QubitSpecifier, int] = defaultdict(int) # to track op start time
|
147
|
+
qubit_stop_times: dict[QubitSpecifier, int] = defaultdict(
|
148
|
+
int
|
149
|
+
) # to track delay start time for padding
|
150
|
+
clbit_readable: dict[ClbitSpecifier, int] = defaultdict(int)
|
151
|
+
clbit_writeable: dict[ClbitSpecifier, int] = defaultdict(int)
|
152
|
+
|
153
|
+
def pad_with_delays(qubits: Iterable[QubitSpecifier], until, unit) -> None:
|
154
|
+
"""Pad idle time-slots in ``qubits`` with delays in ``unit`` until ``until``."""
|
155
|
+
for q in qubits:
|
156
|
+
if qubit_stop_times[q] < until:
|
157
|
+
idle_duration = until - qubit_stop_times[q]
|
158
|
+
new_dag.apply_operation_back(Delay(idle_duration, unit), (q,), check=False)
|
159
|
+
|
160
|
+
for node in dag.topological_op_nodes():
|
161
|
+
# choose appropriate clbit available time depending on op
|
162
|
+
clbit_time_available = (
|
163
|
+
clbit_writeable if isinstance(node.op, Measure) else clbit_readable
|
164
|
+
)
|
165
|
+
# correction to change clbit start time to qubit start time
|
166
|
+
delta = node.op.duration if isinstance(node.op, Measure) else 0
|
167
|
+
start_time = max(
|
168
|
+
itertools.chain(
|
169
|
+
(qubit_time_available[q] for q in node.qargs),
|
170
|
+
(
|
171
|
+
clbit_time_available[c] - delta
|
172
|
+
for c in node.cargs + tuple(node.op.condition_bits)
|
173
|
+
),
|
174
|
+
)
|
175
|
+
)
|
176
|
+
|
177
|
+
if isinstance(node.op, Measure):
|
178
|
+
if start_time % self.alignment != 0:
|
179
|
+
start_time = ((start_time // self.alignment) + 1) * self.alignment
|
180
|
+
|
181
|
+
if not isinstance(node.op, Delay): # exclude delays for combining consecutive delays
|
182
|
+
pad_with_delays(node.qargs, until=start_time, unit=time_unit)
|
183
|
+
new_dag.apply_operation_back(node.op, node.qargs, node.cargs, check=False)
|
184
|
+
|
185
|
+
stop_time = start_time + node.op.duration
|
186
|
+
# update time table
|
187
|
+
for q in node.qargs:
|
188
|
+
qubit_time_available[q] = stop_time
|
189
|
+
if not isinstance(node.op, Delay):
|
190
|
+
qubit_stop_times[q] = stop_time
|
191
|
+
for c in node.cargs: # measure
|
192
|
+
clbit_writeable[c] = clbit_readable[c] = stop_time
|
193
|
+
for c in node.op.condition_bits: # conditional op
|
194
|
+
clbit_writeable[c] = max(start_time, clbit_writeable[c])
|
195
|
+
|
196
|
+
working_qubits = qubit_time_available.keys()
|
197
|
+
circuit_duration = max(qubit_time_available[q] for q in working_qubits)
|
198
|
+
pad_with_delays(new_dag.qubits, until=circuit_duration, unit=time_unit)
|
199
|
+
|
200
|
+
new_dag.name = dag.name
|
201
|
+
new_dag.metadata = dag.metadata
|
202
|
+
|
203
|
+
# set circuit duration and unit to indicate it is scheduled
|
204
|
+
new_dag.duration = circuit_duration
|
205
|
+
new_dag.unit = time_unit
|
206
|
+
|
207
|
+
return new_dag
|
208
|
+
|
209
|
+
|
210
|
+
def _check_alignment_required(
|
211
|
+
dag: DAGCircuit,
|
212
|
+
alignment: int,
|
213
|
+
instructions: Type | list[Type],
|
214
|
+
) -> bool:
|
215
|
+
"""Check DAG nodes and return a boolean representing if instruction scheduling is necessary.
|
216
|
+
|
217
|
+
Args:
|
218
|
+
dag: DAG circuit to check.
|
219
|
+
alignment: Instruction alignment condition.
|
220
|
+
instructions: Target instructions.
|
221
|
+
|
222
|
+
Returns:
|
223
|
+
If instruction scheduling is necessary.
|
224
|
+
"""
|
225
|
+
if not isinstance(instructions, list):
|
226
|
+
instructions = [instructions]
|
227
|
+
|
228
|
+
if alignment == 1:
|
229
|
+
# disable alignment if arbitrary t0 value can be used
|
230
|
+
return False
|
231
|
+
|
232
|
+
if all(len(dag.op_nodes(inst)) == 0 for inst in instructions):
|
233
|
+
# disable alignment if target instruction is not involved
|
234
|
+
return False
|
235
|
+
|
236
|
+
# check delay durations
|
237
|
+
for delay_node in dag.op_nodes(Delay):
|
238
|
+
duration = delay_node.op.duration
|
239
|
+
if isinstance(duration, ParameterExpression):
|
240
|
+
# duration is parametrized:
|
241
|
+
# raise user warning if backend alignment is not 1.
|
242
|
+
warnings.warn(
|
243
|
+
f"Parametrized delay with {repr(duration)} is found in circuit {dag.name}. "
|
244
|
+
f"This backend requires alignment={alignment}. "
|
245
|
+
"Please make sure all assigned values are multiple values of the alignment.",
|
246
|
+
UserWarning,
|
247
|
+
)
|
248
|
+
else:
|
249
|
+
# duration is bound:
|
250
|
+
# check duration and trigger alignment if it violates constraint
|
251
|
+
if duration % alignment != 0:
|
252
|
+
return True
|
253
|
+
|
254
|
+
# disable alignment if all delays are multiple values of the alignment
|
255
|
+
return False
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021, 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
|
+
"""A pass to check if input circuit requires reschedule."""
|
13
|
+
|
14
|
+
from qiskit.circuit.delay import Delay
|
15
|
+
from qiskit.dagcircuit import DAGCircuit
|
16
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
17
|
+
from qiskit.transpiler.target import Target
|
18
|
+
|
19
|
+
|
20
|
+
class InstructionDurationCheck(AnalysisPass):
|
21
|
+
"""Duration validation pass for reschedule.
|
22
|
+
|
23
|
+
This pass investigates the input quantum circuit and checks if the circuit requires
|
24
|
+
rescheduling for execution. Note that this pass can be triggered without scheduling.
|
25
|
+
This pass only checks the duration of delay instructions and user defined pulse gates,
|
26
|
+
which report duration values without pre-scheduling.
|
27
|
+
|
28
|
+
This pass assumes backend supported instructions, i.e. basis gates, have no violation
|
29
|
+
of the hardware alignment constraints, which is true in general.
|
30
|
+
"""
|
31
|
+
|
32
|
+
def __init__(self, acquire_alignment: int = 1, pulse_alignment: int = 1, target: Target = None):
|
33
|
+
"""Create new duration validation pass.
|
34
|
+
|
35
|
+
The alignment values depend on the control electronics of your quantum processor.
|
36
|
+
|
37
|
+
Args:
|
38
|
+
acquire_alignment: Integer number representing the minimum time resolution to
|
39
|
+
trigger acquisition instruction in units of ``dt``.
|
40
|
+
pulse_alignment: Integer number representing the minimum time resolution to
|
41
|
+
trigger gate instruction in units of ``dt``.
|
42
|
+
target: The :class:`~.Target` representing the target backend, if
|
43
|
+
``target`` is specified then this argument will take
|
44
|
+
precedence and ``acquire_alignment`` and ``pulse_alignment`` will be ignored.
|
45
|
+
"""
|
46
|
+
super().__init__()
|
47
|
+
self.acquire_align = acquire_alignment
|
48
|
+
self.pulse_align = pulse_alignment
|
49
|
+
if target is not None:
|
50
|
+
self.acquire_align = target.acquire_alignment
|
51
|
+
self.pulse_align = target.pulse_alignment
|
52
|
+
|
53
|
+
def run(self, dag: DAGCircuit):
|
54
|
+
"""Run duration validation passes.
|
55
|
+
|
56
|
+
Args:
|
57
|
+
dag: DAG circuit to check instruction durations.
|
58
|
+
"""
|
59
|
+
self.property_set["reschedule_required"] = False
|
60
|
+
|
61
|
+
# Rescheduling is not necessary
|
62
|
+
if self.acquire_align == 1 and self.pulse_align == 1:
|
63
|
+
return
|
64
|
+
|
65
|
+
# Check delay durations
|
66
|
+
for delay_node in dag.op_nodes(Delay):
|
67
|
+
dur = delay_node.op.duration
|
68
|
+
if not (dur % self.acquire_align == 0 and dur % self.pulse_align == 0):
|
69
|
+
self.property_set["reschedule_required"] = True
|
70
|
+
return
|
71
|
+
|
72
|
+
# Check custom gate durations
|
73
|
+
for inst_defs in dag._calibrations_prop.values():
|
74
|
+
for caldef in inst_defs.values():
|
75
|
+
dur = caldef.duration
|
76
|
+
if not (dur % self.acquire_align == 0 and dur % self.pulse_align == 0):
|
77
|
+
self.property_set["reschedule_required"] = True
|
78
|
+
return
|
@@ -0,0 +1,107 @@
|
|
1
|
+
# This code is part of Qiskit.
|
2
|
+
#
|
3
|
+
# (C) Copyright IBM 2021.
|
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
|
+
"""Analysis passes for hardware alignment constraints."""
|
14
|
+
|
15
|
+
from qiskit.dagcircuit import DAGCircuit
|
16
|
+
from qiskit.pulse import Play
|
17
|
+
from qiskit.transpiler.basepasses import AnalysisPass
|
18
|
+
from qiskit.transpiler.exceptions import TranspilerError
|
19
|
+
from qiskit.transpiler.target import Target
|
20
|
+
from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
|
21
|
+
|
22
|
+
|
23
|
+
class ValidatePulseGates(AnalysisPass):
|
24
|
+
"""Check custom gate length.
|
25
|
+
|
26
|
+
This is a control electronics aware analysis pass.
|
27
|
+
|
28
|
+
Quantum gates (instructions) are often implemented with shaped analog stimulus signals.
|
29
|
+
These signals may be digitally stored in the waveform memory of the control electronics
|
30
|
+
and converted into analog voltage signals by electronic components known as
|
31
|
+
digital to analog converters (DAC).
|
32
|
+
|
33
|
+
In Qiskit SDK, we can define the pulse-level implementation of custom quantum gate
|
34
|
+
instructions, as a `pulse gate
|
35
|
+
<https://docs.quantum.ibm.com/guides/pulse>`__,
|
36
|
+
thus user gates should satisfy all waveform memory constraints imposed by the backend.
|
37
|
+
|
38
|
+
This pass validates all attached calibration entries and raises ``TranspilerError`` to
|
39
|
+
kill the transpilation process if any invalid calibration entry is found.
|
40
|
+
This pass saves users from waiting until job execution time to get an invalid pulse error from
|
41
|
+
the backend control electronics.
|
42
|
+
"""
|
43
|
+
|
44
|
+
@deprecate_pulse_dependency
|
45
|
+
def __init__(
|
46
|
+
self,
|
47
|
+
granularity: int = 1,
|
48
|
+
min_length: int = 1,
|
49
|
+
target: Target = None,
|
50
|
+
):
|
51
|
+
"""Create new pass.
|
52
|
+
|
53
|
+
Args:
|
54
|
+
granularity: Integer number representing the minimum time resolution to
|
55
|
+
define the pulse gate length in units of ``dt``. This value depends on
|
56
|
+
the control electronics of your quantum processor.
|
57
|
+
min_length: Integer number representing the minimum data point length to
|
58
|
+
define the pulse gate in units of ``dt``. This value depends on
|
59
|
+
the control electronics of your quantum processor.
|
60
|
+
target: The :class:`~.Target` representing the target backend, if
|
61
|
+
``target`` is specified then this argument will take
|
62
|
+
precedence and ``granularity`` and ``min_length`` will be ignored.
|
63
|
+
"""
|
64
|
+
super().__init__()
|
65
|
+
self.granularity = granularity
|
66
|
+
self.min_length = min_length
|
67
|
+
if target is not None:
|
68
|
+
self.granularity = target.granularity
|
69
|
+
self.min_length = target.min_length
|
70
|
+
|
71
|
+
def run(self, dag: DAGCircuit):
|
72
|
+
"""Run the pulse gate validation attached to ``dag``.
|
73
|
+
|
74
|
+
Args:
|
75
|
+
dag: DAG to be validated.
|
76
|
+
|
77
|
+
Returns:
|
78
|
+
DAGCircuit: DAG with consistent timing and op nodes annotated with duration.
|
79
|
+
|
80
|
+
Raises:
|
81
|
+
TranspilerError: When pulse gate violate pulse controller constraints.
|
82
|
+
"""
|
83
|
+
if self.granularity == 1 and self.min_length == 1:
|
84
|
+
# we can define arbitrary length pulse with dt resolution
|
85
|
+
return
|
86
|
+
|
87
|
+
for gate, insts in dag.calibrations.items():
|
88
|
+
for qubit_param_pair, schedule in insts.items():
|
89
|
+
for _, inst in schedule.instructions:
|
90
|
+
if isinstance(inst, Play):
|
91
|
+
pulse = inst.pulse
|
92
|
+
if pulse.duration % self.granularity != 0:
|
93
|
+
raise TranspilerError(
|
94
|
+
f"Pulse duration is not multiple of {self.granularity}. "
|
95
|
+
"This pulse cannot be played on the specified backend. "
|
96
|
+
f"Please modify the duration of the custom gate pulse {pulse.name} "
|
97
|
+
f"which is associated with the gate {gate} of "
|
98
|
+
f"qubit {qubit_param_pair[0]}."
|
99
|
+
)
|
100
|
+
if pulse.duration < self.min_length:
|
101
|
+
raise TranspilerError(
|
102
|
+
f"Pulse gate duration is less than {self.min_length}. "
|
103
|
+
"This pulse cannot be played on the specified backend. "
|
104
|
+
f"Please modify the duration of the custom gate pulse {pulse.name} "
|
105
|
+
f"which is associated with the gate {gate} of "
|
106
|
+
"qubit {qubit_param_pair[0]}."
|
107
|
+
)
|