qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0__cp39-abi3-win_amd64.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.
Files changed (462) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +236 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +469 -154
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +11 -0
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/circuit/tools/pi_check.py +3 -0
  104. qiskit/compiler/__init__.py +1 -7
  105. qiskit/compiler/transpiler.py +38 -196
  106. qiskit/converters/circuit_to_dag.py +6 -4
  107. qiskit/converters/circuit_to_dagdependency.py +0 -2
  108. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  109. qiskit/converters/circuit_to_gate.py +1 -1
  110. qiskit/converters/circuit_to_instruction.py +16 -29
  111. qiskit/converters/dag_to_circuit.py +7 -8
  112. qiskit/converters/dag_to_dagdependency.py +0 -1
  113. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  114. qiskit/converters/dagdependency_to_circuit.py +0 -6
  115. qiskit/converters/dagdependency_to_dag.py +0 -6
  116. qiskit/dagcircuit/collect_blocks.py +32 -20
  117. qiskit/dagcircuit/dagdependency.py +3 -37
  118. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  119. qiskit/dagcircuit/dagnode.py +14 -2
  120. qiskit/passmanager/__init__.py +24 -6
  121. qiskit/passmanager/passmanager.py +26 -24
  122. qiskit/primitives/__init__.py +44 -35
  123. qiskit/primitives/backend_estimator_v2.py +102 -23
  124. qiskit/primitives/backend_sampler_v2.py +5 -20
  125. qiskit/primitives/base/__init__.py +4 -4
  126. qiskit/primitives/base/base_estimator.py +77 -82
  127. qiskit/primitives/base/base_primitive_job.py +2 -2
  128. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  129. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  130. qiskit/primitives/base/base_sampler.py +52 -60
  131. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  132. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  133. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  134. qiskit/primitives/containers/bindings_array.py +3 -1
  135. qiskit/primitives/containers/bit_array.py +23 -0
  136. qiskit/primitives/containers/data_bin.py +3 -1
  137. qiskit/primitives/containers/observables_array.py +19 -2
  138. qiskit/primitives/statevector_sampler.py +6 -8
  139. qiskit/primitives/utils.py +14 -189
  140. qiskit/providers/__init__.py +4 -130
  141. qiskit/providers/backend.py +11 -314
  142. qiskit/providers/basic_provider/__init__.py +3 -1
  143. qiskit/providers/basic_provider/basic_provider.py +29 -9
  144. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  145. qiskit/providers/exceptions.py +0 -33
  146. qiskit/providers/fake_provider/__init__.py +0 -37
  147. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  148. qiskit/qasm2/__init__.py +21 -6
  149. qiskit/qasm2/export.py +2 -10
  150. qiskit/qasm2/parse.py +11 -25
  151. qiskit/qasm3/__init__.py +5 -1
  152. qiskit/qasm3/ast.py +44 -0
  153. qiskit/qasm3/exporter.py +65 -27
  154. qiskit/qasm3/printer.py +35 -4
  155. qiskit/qpy/__init__.py +162 -19
  156. qiskit/qpy/binary_io/__init__.py +0 -1
  157. qiskit/qpy/binary_io/circuits.py +96 -116
  158. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  159. qiskit/qpy/binary_io/schedules.py +61 -388
  160. qiskit/qpy/binary_io/value.py +159 -33
  161. qiskit/qpy/common.py +10 -7
  162. qiskit/qpy/formats.py +41 -0
  163. qiskit/qpy/interface.py +29 -62
  164. qiskit/qpy/type_keys.py +58 -221
  165. qiskit/quantum_info/analysis/distance.py +3 -1
  166. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  167. qiskit/quantum_info/operators/operator.py +6 -2
  168. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  169. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  170. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  171. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  172. qiskit/quantum_info/states/densitymatrix.py +16 -6
  173. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  174. qiskit/quantum_info/states/statevector.py +16 -6
  175. qiskit/result/__init__.py +5 -17
  176. qiskit/result/models.py +18 -11
  177. qiskit/result/result.py +38 -134
  178. qiskit/result/sampled_expval.py +1 -2
  179. qiskit/result/utils.py +3 -4
  180. qiskit/synthesis/__init__.py +21 -1
  181. qiskit/synthesis/arithmetic/__init__.py +3 -1
  182. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  183. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  184. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  185. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  186. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  187. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  188. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  189. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  190. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  191. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  192. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  193. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  194. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  195. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  196. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  197. qiskit/synthesis/evolution/product_formula.py +44 -35
  198. qiskit/synthesis/evolution/qdrift.py +17 -24
  199. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  200. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  201. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  202. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  203. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  204. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  205. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  206. qiskit/synthesis/two_qubit/__init__.py +1 -0
  207. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  208. qiskit/transpiler/__init__.py +32 -232
  209. qiskit/transpiler/basepasses.py +20 -51
  210. qiskit/transpiler/layout.py +1 -1
  211. qiskit/transpiler/passes/__init__.py +4 -40
  212. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  213. qiskit/transpiler/passes/basis/decompose.py +1 -15
  214. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  215. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  216. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  217. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  218. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  219. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  220. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  221. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  222. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  223. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  224. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  225. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  226. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  227. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  228. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  229. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  230. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  231. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  232. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  233. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  234. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  235. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  236. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  237. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  238. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
  239. qiskit/transpiler/passes/routing/__init__.py +0 -1
  240. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  241. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  242. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  243. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  244. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  245. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  246. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  247. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  248. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  249. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  250. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  251. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  252. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  253. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  254. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  255. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  256. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  257. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  258. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  259. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  260. qiskit/transpiler/passes/utils/__init__.py +0 -1
  261. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  262. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  263. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  264. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  265. qiskit/transpiler/passmanager.py +13 -0
  266. qiskit/transpiler/passmanager_config.py +5 -81
  267. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  268. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  269. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  270. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  272. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  273. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  274. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  275. qiskit/transpiler/target.py +78 -524
  276. qiskit/user_config.py +8 -4
  277. qiskit/utils/__init__.py +13 -12
  278. qiskit/utils/deprecation.py +4 -112
  279. qiskit/utils/optionals.py +11 -4
  280. qiskit/utils/parallel.py +214 -87
  281. qiskit/utils/units.py +4 -1
  282. qiskit/visualization/__init__.py +3 -7
  283. qiskit/visualization/array.py +4 -1
  284. qiskit/visualization/bloch.py +1 -1
  285. qiskit/visualization/circuit/_utils.py +19 -19
  286. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  287. qiskit/visualization/circuit/matplotlib.py +13 -23
  288. qiskit/visualization/circuit/text.py +7 -3
  289. qiskit/visualization/counts_visualization.py +4 -0
  290. qiskit/visualization/dag_visualization.py +2 -1
  291. qiskit/visualization/gate_map.py +39 -154
  292. qiskit/visualization/library.py +4 -1
  293. qiskit/visualization/pass_manager_visualization.py +6 -2
  294. qiskit/visualization/state_visualization.py +19 -2
  295. qiskit/visualization/timeline/core.py +19 -13
  296. qiskit/visualization/timeline/interface.py +19 -18
  297. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  298. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  299. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
  300. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +1 -1
  301. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  302. qiskit/assembler/__init__.py +0 -42
  303. qiskit/assembler/assemble_circuits.py +0 -451
  304. qiskit/assembler/assemble_schedules.py +0 -367
  305. qiskit/assembler/disassemble.py +0 -310
  306. qiskit/assembler/run_config.py +0 -77
  307. qiskit/circuit/bit.py +0 -106
  308. qiskit/circuit/classicalfunction/__init__.py +0 -152
  309. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  310. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  311. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  312. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  313. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  314. qiskit/circuit/classicalfunction/types.py +0 -18
  315. qiskit/circuit/classicalfunction/utils.py +0 -91
  316. qiskit/circuit/classicalregister.py +0 -57
  317. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  318. qiskit/circuit/quantumregister.py +0 -75
  319. qiskit/circuit/register.py +0 -246
  320. qiskit/compiler/assembler.py +0 -689
  321. qiskit/compiler/scheduler.py +0 -109
  322. qiskit/compiler/sequencer.py +0 -71
  323. qiskit/primitives/backend_estimator.py +0 -486
  324. qiskit/primitives/backend_sampler.py +0 -222
  325. qiskit/primitives/estimator.py +0 -172
  326. qiskit/primitives/sampler.py +0 -162
  327. qiskit/providers/backend_compat.py +0 -507
  328. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  333. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  351. qiskit/providers/fake_provider/fake_1q.py +0 -91
  352. qiskit/providers/fake_provider/fake_backend.py +0 -165
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  357. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  358. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  359. qiskit/providers/models/__init__.py +0 -89
  360. qiskit/providers/models/backendconfiguration.py +0 -1040
  361. qiskit/providers/models/backendproperties.py +0 -535
  362. qiskit/providers/models/backendstatus.py +0 -104
  363. qiskit/providers/models/jobstatus.py +0 -77
  364. qiskit/providers/models/pulsedefaults.py +0 -305
  365. qiskit/providers/provider.py +0 -95
  366. qiskit/pulse/__init__.py +0 -158
  367. qiskit/pulse/builder.py +0 -2262
  368. qiskit/pulse/calibration_entries.py +0 -381
  369. qiskit/pulse/channels.py +0 -227
  370. qiskit/pulse/configuration.py +0 -245
  371. qiskit/pulse/exceptions.py +0 -45
  372. qiskit/pulse/filters.py +0 -309
  373. qiskit/pulse/instruction_schedule_map.py +0 -424
  374. qiskit/pulse/instructions/__init__.py +0 -67
  375. qiskit/pulse/instructions/acquire.py +0 -150
  376. qiskit/pulse/instructions/delay.py +0 -71
  377. qiskit/pulse/instructions/directives.py +0 -154
  378. qiskit/pulse/instructions/frequency.py +0 -135
  379. qiskit/pulse/instructions/instruction.py +0 -270
  380. qiskit/pulse/instructions/phase.py +0 -152
  381. qiskit/pulse/instructions/play.py +0 -99
  382. qiskit/pulse/instructions/reference.py +0 -100
  383. qiskit/pulse/instructions/snapshot.py +0 -82
  384. qiskit/pulse/library/__init__.py +0 -97
  385. qiskit/pulse/library/continuous.py +0 -430
  386. qiskit/pulse/library/pulse.py +0 -148
  387. qiskit/pulse/library/samplers/__init__.py +0 -15
  388. qiskit/pulse/library/samplers/decorators.py +0 -295
  389. qiskit/pulse/library/samplers/strategies.py +0 -71
  390. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  391. qiskit/pulse/library/waveform.py +0 -136
  392. qiskit/pulse/macros.py +0 -262
  393. qiskit/pulse/parameter_manager.py +0 -445
  394. qiskit/pulse/parser.py +0 -314
  395. qiskit/pulse/reference_manager.py +0 -58
  396. qiskit/pulse/schedule.py +0 -1854
  397. qiskit/pulse/transforms/__init__.py +0 -106
  398. qiskit/pulse/transforms/alignments.py +0 -406
  399. qiskit/pulse/transforms/base_transforms.py +0 -71
  400. qiskit/pulse/transforms/canonicalization.py +0 -498
  401. qiskit/pulse/transforms/dag.py +0 -122
  402. qiskit/pulse/utils.py +0 -149
  403. qiskit/qobj/__init__.py +0 -75
  404. qiskit/qobj/common.py +0 -81
  405. qiskit/qobj/converters/__init__.py +0 -18
  406. qiskit/qobj/converters/lo_config.py +0 -177
  407. qiskit/qobj/converters/pulse_instruction.py +0 -897
  408. qiskit/qobj/pulse_qobj.py +0 -709
  409. qiskit/qobj/qasm_qobj.py +0 -708
  410. qiskit/qobj/utils.py +0 -46
  411. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  412. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  413. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  414. qiskit/result/mitigation/utils.py +0 -217
  415. qiskit/scheduler/__init__.py +0 -40
  416. qiskit/scheduler/config.py +0 -37
  417. qiskit/scheduler/lowering.py +0 -187
  418. qiskit/scheduler/methods/__init__.py +0 -15
  419. qiskit/scheduler/methods/basic.py +0 -140
  420. qiskit/scheduler/schedule_circuit.py +0 -69
  421. qiskit/scheduler/sequence.py +0 -104
  422. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  423. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  424. qiskit/transpiler/passes/calibration/builders.py +0 -20
  425. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  426. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  427. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  428. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  429. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  430. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  431. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  432. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  433. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  434. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  435. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  436. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  437. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  438. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  439. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  440. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  441. qiskit/utils/deprecate_pulse.py +0 -119
  442. qiskit/utils/multiprocessing.py +0 -56
  443. qiskit/visualization/pulse_v2/__init__.py +0 -21
  444. qiskit/visualization/pulse_v2/core.py +0 -901
  445. qiskit/visualization/pulse_v2/device_info.py +0 -173
  446. qiskit/visualization/pulse_v2/drawings.py +0 -253
  447. qiskit/visualization/pulse_v2/events.py +0 -254
  448. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  449. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  450. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  451. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  452. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  453. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  454. qiskit/visualization/pulse_v2/interface.py +0 -459
  455. qiskit/visualization/pulse_v2/layouts.py +0 -387
  456. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  457. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  458. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  459. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  460. qiskit/visualization/pulse_v2/types.py +0 -242
  461. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  462. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
qiskit/qpy/__init__.py CHANGED
@@ -17,13 +17,12 @@ QPY serialization (:mod:`qiskit.qpy`)
17
17
 
18
18
  .. currentmodule:: qiskit.qpy
19
19
 
20
- QPY is a binary serialization format for :class:`~.QuantumCircuit` and
21
- :class:`~.ScheduleBlock` objects that is designed to be cross-platform,
22
- Python version agnostic, and backwards compatible moving forward. QPY should
23
- be used if you need a mechanism to save or copy between systems a
24
- :class:`~.QuantumCircuit` or :class:`~.ScheduleBlock` that preserves the full
25
- Qiskit object structure (except for custom attributes defined outside of
26
- Qiskit code). This differs from other serialization formats like
20
+ QPY is a binary serialization format for :class:`~.QuantumCircuit`
21
+ objects that is designed to be cross-platform, Python version agnostic,
22
+ and backwards compatible moving forward. QPY should be used if you need
23
+ a mechanism to save or copy between systems a :class:`~.QuantumCircuit`
24
+ that preserves the full Qiskit object structure (except for custom attributes
25
+ defined outside of Qiskit code). This differs from other serialization formats like
27
26
  `OpenQASM <https://github.com/openqasm/openqasm>`__ (2.0 or 3.0) which has a
28
27
  different abstraction model and can result in a loss of information contained
29
28
  in the original circuit (or is unable to represent some aspects of the
@@ -40,7 +39,24 @@ serializers in Python's standard library, ``pickle`` and ``json``. There are
40
39
  2 user facing functions: :func:`qiskit.qpy.dump` and
41
40
  :func:`qiskit.qpy.load` which are used to dump QPY data
42
41
  to a file object and load circuits from QPY data in a file object respectively.
43
- For example::
42
+ For example:
43
+
44
+ .. plot::
45
+ :nofigs:
46
+ :context: reset
47
+
48
+ # This code is hidden from users
49
+ # It's a hack to avoid writing to file when testing the code examples
50
+ import io
51
+ bytestream = io.BytesIO()
52
+ bytestream.close = lambda: bytestream.seek(0)
53
+ def open(*args):
54
+ return bytestream
55
+
56
+ .. plot::
57
+ :include-source:
58
+ :nofigs:
59
+ :context:
44
60
 
45
61
  from qiskit.circuit import QuantumCircuit
46
62
  from qiskit import qpy
@@ -57,16 +73,27 @@ For example::
57
73
  new_qc = qpy.load(fd)[0]
58
74
 
59
75
  The :func:`qiskit.qpy.dump` function also lets you
60
- include multiple circuits in a single QPY file::
76
+ include multiple circuits in a single QPY file:
77
+
78
+ .. plot::
79
+ :include-source:
80
+ :nofigs:
81
+ :context:
61
82
 
62
83
  with open('twenty_bells.qpy', 'wb') as fd:
63
84
  qpy.dump([qc] * 20, fd)
64
85
 
65
86
  and then loading that file will return a list with all the circuits
66
87
 
88
+ .. plot::
89
+ :include-source:
90
+ :nofigs:
91
+ :context:
92
+
67
93
  with open('twenty_bells.qpy', 'rb') as fd:
68
94
  twenty_new_bells = qpy.load(fd)
69
95
 
96
+
70
97
  API documentation
71
98
  =================
72
99
 
@@ -142,6 +169,14 @@ and how the feature will be internally handled.
142
169
  it to QPY setting ``use_symengine=False``. The resulting file can then be loaded by any later
143
170
  version of Qiskit.
144
171
 
172
+ .. note::
173
+
174
+ Starting with Qiskit version 2.0.0, which removed the Pulse module from the library, QPY provides
175
+ limited support for loading payloads that include pulse data. Loading a ``ScheduleBlock`` payload,
176
+ a :class:`.QpyError` exception will be raised. Loading a payload for a circuit that contained pulse
177
+ gates, the output circuit will contain custom instructions **without** calibration data attached
178
+ for each pulse gate, leaving them undefined.
179
+
145
180
  QPY format version history
146
181
  --------------------------
147
182
 
@@ -159,6 +194,27 @@ of QPY in qiskit-terra 0.18.0.
159
194
  * - Qiskit (qiskit-terra for < 1.0.0) version
160
195
  - :func:`.dump` format(s) output versions
161
196
  - :func:`.load` maximum supported version (older format versions can always be read)
197
+ * - 2.0.0
198
+ - 13, 14
199
+ - 14
200
+ * - 1.4.2
201
+ - 10, 11, 12, 13
202
+ - 13
203
+ * - 1.4.1
204
+ - 10, 11, 12, 13
205
+ - 13
206
+ * - 1.4.0
207
+ - 10, 11, 12, 13
208
+ - 13
209
+ * - 1.3.3
210
+ - 10, 11, 12, 13
211
+ - 13
212
+ * - 1.3.2
213
+ - 10, 11, 12, 13
214
+ - 13
215
+ * - 1.3.1
216
+ - 10, 11, 12, 13
217
+ - 13
162
218
  * - 1.3.0
163
219
  - 10, 11, 12, 13
164
220
  - 13
@@ -342,6 +398,93 @@ There is a circuit payload for each circuit (where the total number is dictated
342
398
  by ``num_circuits`` in the file header). There is no padding between the
343
399
  circuits in the data.
344
400
 
401
+ .. _qpy_version_14:
402
+
403
+ Version 14
404
+ ----------
405
+
406
+ Version 14 adds a new core DURATION type, support for additional :class:`~.types.Type`
407
+ classes :class:`~.types.Float` and :class:`~.types.Duration`, and a new expression
408
+ node type :class:`~.expr.Stretch`.
409
+
410
+ DURATION
411
+ ~~~~~~~~
412
+
413
+ A :class:`~.circuit.Duration` is encoded by a single-byte ASCII ``char`` that encodes the kind of
414
+ type, followed by a payload that varies depending on the type. The defined codes are:
415
+
416
+ ============================== ========= =========================================================
417
+ Qiskit class Type code Payload
418
+ ============================== ========= =========================================================
419
+ :class:`~.circuit.Duration.dt` ``t`` One ``unsigned long long value``.
420
+
421
+ :class:`~.circuit.Duration.ns` ``n`` One ``double value``.
422
+
423
+ :class:`~.circuit.Duration.us` ``u`` One ``double value``.
424
+
425
+ :class:`~.circuit.Duration.ms` ``m`` One ``double value``.
426
+
427
+ :class:`~.circuit.Duration.s` ``s`` One ``double value``.
428
+
429
+ ============================== ========= =========================================================
430
+
431
+ Changes to EXPR_VAR_DECLARATION
432
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
433
+
434
+ The ``EXPR_VAR_DECLARATION`` type is now used to represent both :class:`~.expr.Var` standalone
435
+ variables and :class:`~.expr.Stretch` identifiers. To support this change, the usage type code has
436
+ two new possible entries, in addition to the existing ones:
437
+
438
+ ========= =========================================================================================
439
+ Type code Meaning
440
+ ========= =========================================================================================
441
+ ``A`` A ``capture`` stretch to the circuit.
442
+
443
+ ``O`` A locally declared stretch to the circuit.
444
+
445
+ ========= =========================================================================================
446
+
447
+ Changes to EXPRESSION
448
+ ---------------------
449
+
450
+ The EXPRESSION type code has a new possible entry, ``s``, corresponding to :class:`.expr.Stretch`
451
+ nodes.
452
+
453
+ ======================= ========= ====================================================== ========
454
+ Qiskit class Type code Payload Children
455
+ ======================= ========= ====================================================== ========
456
+ :class:`~.expr.Stretch` ``s`` One ``unsigned short var_index`` 0
457
+ ======================= ========= ====================================================== ========
458
+
459
+ Changes to EXPR_TYPE
460
+ ~~~~~~~~~~~~~~~~~~~~
461
+
462
+ The following table shows the new type classes added in the version:
463
+
464
+ ========================= ========= ==============================================================
465
+ Qiskit class Type code Payload
466
+ ========================= ========= ==============================================================
467
+ :class:`~.types.Float` ``f`` None.
468
+
469
+ :class:`~.types.Duration` ``d`` None.
470
+
471
+ ========================= ========= ==============================================================
472
+
473
+ Changes to EXPR_VALUE
474
+ ~~~~~~~~~~~~~~~~~~~~~
475
+
476
+ The classical expression's type system now supports new encoding types for value literals, in
477
+ addition to the existing encodings for int and bool. The new value type encodings are below:
478
+
479
+ =========================== ========= ============================================================
480
+ Python type Type code Payload
481
+ =========================== ========= ============================================================
482
+ ``float`` ``f`` One ``double value``.
483
+
484
+ :class:`~.circuit.Duration` ``t`` One ``DURATION``.
485
+
486
+ =========================== ========= ============================================================
487
+
345
488
  .. _qpy_version_13:
346
489
 
347
490
  Version 13
@@ -874,7 +1017,7 @@ Version 7
874
1017
  ---------
875
1018
 
876
1019
  Version 7 adds support for :class:`.~Reference` instruction and serialization of
877
- a :class:`.~ScheduleBlock` program while keeping its reference to subroutines::
1020
+ a ``ScheduleBlock`` program while keeping its reference to subroutines::
878
1021
 
879
1022
  from qiskit import pulse
880
1023
  from qiskit import qpy
@@ -946,12 +1089,12 @@ identical to :ref:`qpy_version_5`.
946
1089
  Version 5
947
1090
  ---------
948
1091
 
949
- Version 5 changes from :ref:`qpy_version_4` by adding support for :class:`.~ScheduleBlock`
1092
+ Version 5 changes from :ref:`qpy_version_4` by adding support for ``ScheduleBlock``
950
1093
  and changing two payloads the INSTRUCTION metadata payload and the CUSTOM_INSTRUCTION block.
951
1094
  These now have new fields to better account for :class:`~.ControlledGate` objects in a circuit.
952
1095
  In addition, new payload MAP_ITEM is defined to implement the :ref:`qpy_mapping` block.
953
1096
 
954
- With the support of :class:`.~ScheduleBlock`, now :class:`~.QuantumCircuit` can be
1097
+ With the support of ``ScheduleBlock``, now :class:`~.QuantumCircuit` can be
955
1098
  serialized together with :attr:`~.QuantumCircuit.calibrations`, or
956
1099
  `Pulse Gates <https://docs.quantum.ibm.com/guides/pulse>`_.
957
1100
  In QPY version 5 and above, :ref:`qpy_circuit_calibrations` payload is
@@ -968,7 +1111,7 @@ In QPY version 5 and above,
968
1111
  immediately follows the file header block to represent the program type stored in the file.
969
1112
 
970
1113
  - When ``type==c``, :class:`~.QuantumCircuit` payload follows
971
- - When ``type==s``, :class:`~.ScheduleBlock` payload follows
1114
+ - When ``type==s``, ``ScheduleBlock`` payload follows
972
1115
 
973
1116
  .. note::
974
1117
 
@@ -981,7 +1124,7 @@ immediately follows the file header block to represent the program type stored i
981
1124
  SCHEDULE_BLOCK
982
1125
  ~~~~~~~~~~~~~~
983
1126
 
984
- :class:`~.ScheduleBlock` is first supported in QPY Version 5. This allows
1127
+ ``ScheduleBlock`` is first supported in QPY Version 5. This allows
985
1128
  users to save pulse programs in the QPY binary format as follows:
986
1129
 
987
1130
  .. code-block:: python
@@ -992,10 +1135,10 @@ users to save pulse programs in the QPY binary format as follows:
992
1135
  pulse.play(pulse.Gaussian(160, 0.1, 40), pulse.DriveChannel(0))
993
1136
 
994
1137
  with open('schedule.qpy', 'wb') as fd:
995
- qpy.dump(qc, fd)
1138
+ qpy.dump(schedule, fd)
996
1139
 
997
1140
  with open('schedule.qpy', 'rb') as fd:
998
- new_qc = qpy.load(fd)[0]
1141
+ new_schedule = qpy.load(fd)[0]
999
1142
 
1000
1143
  Note that circuit and schedule block are serialized and deserialized through
1001
1144
  the same QPY interface. Input data type is implicitly analyzed and
@@ -1006,7 +1149,7 @@ no extra option is required to save the schedule block.
1006
1149
  SCHEDULE_BLOCK_HEADER
1007
1150
  ~~~~~~~~~~~~~~~~~~~~~
1008
1151
 
1009
- :class:`~.ScheduleBlock` block starts with the following header:
1152
+ ``ScheduleBlock`` block starts with the following header:
1010
1153
 
1011
1154
  .. code-block:: c
1012
1155
 
@@ -1206,8 +1349,8 @@ the gate name, ``num_qubits`` length of integers representing a sequence of qubi
1206
1349
  and ``num_params`` length of INSTRUCTION_PARAM payload for parameters
1207
1350
  associated to the custom instruction.
1208
1351
  The ``type`` indicates the class of pulse program which is either, in principle,
1209
- :class:`~.ScheduleBlock` or :class:`~.Schedule`. As of QPY Version 5,
1210
- only :class:`~.ScheduleBlock` payload is supported.
1352
+ ``ScheduleBlock`` or :class:`~.Schedule`. As of QPY Version 5,
1353
+ only ``ScheduleBlock`` payload is supported.
1211
1354
  Finally, :ref:`qpy_schedule_block` payload is packed for each CALIBRATION_DEF entry.
1212
1355
 
1213
1356
  .. _qpy_instruction_v5:
@@ -31,6 +31,5 @@ from .circuits import (
31
31
  _read_instruction,
32
32
  )
33
33
  from .schedules import (
34
- write_schedule_block,
35
34
  read_schedule_block,
36
35
  )
@@ -13,7 +13,7 @@
13
13
  # pylint: disable=invalid-name
14
14
 
15
15
  """Binary IO for circuit objects."""
16
-
16
+ import itertools
17
17
  from collections import defaultdict
18
18
  import io
19
19
  import json
@@ -24,9 +24,9 @@ import warnings
24
24
  import numpy as np
25
25
 
26
26
  from qiskit import circuit as circuit_mod
27
- from qiskit.circuit import library, controlflow, CircuitInstruction, ControlFlowOp
27
+ from qiskit.circuit import library, controlflow, CircuitInstruction, ControlFlowOp, IfElseOp
28
28
  from qiskit.circuit.classical import expr
29
- from qiskit.circuit.classicalregister import ClassicalRegister, Clbit
29
+ from qiskit.circuit import ClassicalRegister, Clbit
30
30
  from qiskit.circuit.gate import Gate
31
31
  from qiskit.circuit.singleton import SingletonInstruction, SingletonGate
32
32
  from qiskit.circuit.controlledgate import ControlledGate
@@ -39,8 +39,8 @@ from qiskit.circuit.annotated_operation import (
39
39
  )
40
40
  from qiskit.circuit.instruction import Instruction
41
41
  from qiskit.circuit.quantumcircuit import QuantumCircuit
42
- from qiskit.circuit.quantumregister import QuantumRegister, Qubit
43
- from qiskit.qpy import common, formats, type_keys, exceptions
42
+ from qiskit.circuit import QuantumRegister, Qubit
43
+ from qiskit.qpy import common, formats, type_keys
44
44
  from qiskit.qpy.binary_io import value, schedules
45
45
  from qiskit.quantum_info.operators import SparsePauliOp, Clifford
46
46
  from qiskit.synthesis import evolution as evo_synth
@@ -320,12 +320,16 @@ def _read_instruction(
320
320
  )
321
321
  if condition is not None:
322
322
  warnings.warn(
323
- f"The .condition attribute on {gate_name} will be loaded as an IfElseOp "
324
- "starting in Qiskit 2.0",
325
- FutureWarning,
323
+ f"The .condition attribute on {gate_name} can not be "
324
+ "represented in this version of Qiskit. It will be "
325
+ "represented as an IfElseOp instead.",
326
+ UserWarning,
326
327
  stacklevel=3,
327
328
  )
328
- inst_obj.condition = condition
329
+
330
+ body = QuantumCircuit(qargs, cargs)
331
+ body.append(inst_obj, qargs, cargs)
332
+ inst_obj = IfElseOp(condition, body)
329
333
  if instruction.label_size > 0:
330
334
  inst_obj.label = label
331
335
  if circuit is None:
@@ -363,8 +367,11 @@ def _read_instruction(
363
367
 
364
368
  if instruction.label_size <= 0:
365
369
  label = None
366
- if gate_name in {"IfElseOp", "WhileLoopOp"}:
370
+ if gate_name in ("IfElseOp", "WhileLoopOp"):
367
371
  gate = gate_class(condition, *params, label=label)
372
+ elif gate_name == "BoxOp":
373
+ *params, duration, unit = params
374
+ gate = gate_class(*params, label=label, duration=duration, unit=unit)
368
375
  elif version >= 5 and issubclass(gate_class, ControlledGate):
369
376
  if gate_name in {
370
377
  "MCPhaseGate",
@@ -385,7 +392,9 @@ def _read_instruction(
385
392
  gate.num_ctrl_qubits = instruction.num_ctrl_qubits
386
393
  gate.ctrl_state = instruction.ctrl_state
387
394
  if condition:
388
- gate = gate.c_if(*condition)
395
+ body = QuantumCircuit(qargs, cargs)
396
+ body.append(gate, qargs, cargs)
397
+ gate = IfElseOp(condition, body)
389
398
  else:
390
399
  if gate_name in {"Initialize", "StatePreparation"}:
391
400
  if isinstance(params[0], str):
@@ -422,12 +431,15 @@ def _read_instruction(
422
431
  if condition:
423
432
  if not isinstance(gate, ControlFlowOp):
424
433
  warnings.warn(
425
- f"The .condition attribute on {gate} will be loaded as an "
426
- "IfElseOp starting in Qiskit 2.0",
427
- FutureWarning,
434
+ f"The .condition attribute on {gate_name} can not be "
435
+ "represented in this version of Qiskit. It will be "
436
+ "represented as an IfElseOp instead.",
437
+ UserWarning,
428
438
  stacklevel=3,
429
439
  )
430
- gate = gate.c_if(*condition)
440
+ body = QuantumCircuit(qargs, cargs)
441
+ body.append(gate, qargs, cargs)
442
+ gate = IfElseOp(condition, body)
431
443
  else:
432
444
  gate.condition = condition
433
445
  if circuit is None:
@@ -639,8 +651,7 @@ def _read_custom_operations(file_obj, version, vectors):
639
651
 
640
652
 
641
653
  def _read_calibrations(file_obj, version, vectors, metadata_deserializer):
642
- calibrations = {}
643
-
654
+ """Consume calibrations data, make the file handle point to the next section"""
644
655
  header = formats.CALIBRATION._make(
645
656
  struct.unpack(formats.CALIBRATION_PACK, file_obj.read(formats.CALIBRATION_SIZE))
646
657
  )
@@ -649,21 +660,20 @@ def _read_calibrations(file_obj, version, vectors, metadata_deserializer):
649
660
  struct.unpack(formats.CALIBRATION_DEF_PACK, file_obj.read(formats.CALIBRATION_DEF_SIZE))
650
661
  )
651
662
  name = file_obj.read(defheader.name_size).decode(common.ENCODE)
652
- qubits = tuple(
653
- struct.unpack("!q", file_obj.read(struct.calcsize("!q")))[0]
654
- for _ in range(defheader.num_qubits)
655
- )
656
- params = tuple(
657
- value.read_value(file_obj, version, vectors) for _ in range(defheader.num_params)
658
- )
659
- schedule = schedules.read_schedule_block(file_obj, version, metadata_deserializer)
663
+ if name:
664
+ warnings.warn(
665
+ category=UserWarning,
666
+ message="Support for loading pulse gates has been removed in Qiskit 2.0. "
667
+ f"If `{name}` is in the circuit it will be left as an opaque instruction.",
668
+ )
660
669
 
661
- if name not in calibrations:
662
- calibrations[name] = {(qubits, params): schedule}
663
- else:
664
- calibrations[name][(qubits, params)] = schedule
670
+ for _ in range(defheader.num_qubits): # read qubits info
671
+ file_obj.read(struct.calcsize("!q"))
665
672
 
666
- return calibrations
673
+ for _ in range(defheader.num_params): # read params info
674
+ value.read_value(file_obj, version, vectors)
675
+
676
+ schedules.read_schedule_block(file_obj, version, metadata_deserializer)
667
677
 
668
678
 
669
679
  def _dumps_register(register, index_map):
@@ -746,13 +756,15 @@ def _write_instruction(
746
756
  or isinstance(instruction.operation, library.BlueprintCircuit)
747
757
  ):
748
758
  gate_class_name = instruction.operation.name
749
- if version >= 11:
750
- # Assign a uuid to each instance of a custom operation
759
+ # Assign a uuid to each instance of a custom operation
760
+ if instruction.operation.name not in {"ucrx_dg", "ucry_dg", "ucrz_dg"}:
751
761
  gate_class_name = f"{gate_class_name}_{uuid.uuid4().hex}"
752
- # ucr*_dg gates can have different numbers of parameters,
753
- # the uuid is appended to avoid storing a single definition
754
- # in circuits with multiple ucr*_dg gates.
755
- elif instruction.operation.name in {"ucrx_dg", "ucry_dg", "ucrz_dg"}:
762
+ else:
763
+ # ucr*_dg gates can have different numbers of parameters,
764
+ # the uuid is appended to avoid storing a single definition
765
+ # in circuits with multiple ucr*_dg gates. For legacy reasons
766
+ # the uuid is stored in a different format as this was done
767
+ # prior to QPY 11.
756
768
  gate_class_name = f"{gate_class_name}_{uuid.uuid4()}"
757
769
 
758
770
  custom_operations[gate_class_name] = instruction.operation
@@ -771,6 +783,11 @@ def _write_instruction(
771
783
  custom_operations[gate_class_name] = instruction.operation
772
784
  custom_operations_list.append(gate_class_name)
773
785
 
786
+ elif isinstance(instruction.operation, library.MCMTGate):
787
+ gate_class_name = instruction.operation.name + "_" + str(uuid.uuid4())
788
+ custom_operations[gate_class_name] = instruction.operation
789
+ custom_operations_list.append(gate_class_name)
790
+
774
791
  condition_type = type_keys.Condition.NONE
775
792
  condition_register = b""
776
793
  condition_value = 0
@@ -796,6 +813,12 @@ def _write_instruction(
796
813
  instruction.operation.target,
797
814
  tuple(instruction.operation.cases_specifier()),
798
815
  ]
816
+ elif isinstance(instruction.operation, controlflow.BoxOp):
817
+ instruction_params = [
818
+ instruction.operation.blocks[0],
819
+ instruction.operation.duration,
820
+ instruction.operation.unit,
821
+ ]
799
822
  elif isinstance(instruction.operation, Clifford):
800
823
  instruction_params = [instruction.operation.tableau]
801
824
  elif isinstance(instruction.operation, AnnotatedOperation):
@@ -994,34 +1017,6 @@ def _write_custom_operation(
994
1017
  return new_custom_instruction
995
1018
 
996
1019
 
997
- def _write_calibrations(file_obj, calibrations, metadata_serializer, version):
998
- flatten_dict = {}
999
- for gate, caldef in calibrations.items():
1000
- for (qubits, params), schedule in caldef.items():
1001
- key = (gate, qubits, params)
1002
- flatten_dict[key] = schedule
1003
- header = struct.pack(formats.CALIBRATION_PACK, len(flatten_dict))
1004
- file_obj.write(header)
1005
- for (name, qubits, params), schedule in flatten_dict.items():
1006
- # In principle ScheduleBlock and Schedule can be supported.
1007
- # As of version 5 only ScheduleBlock is supported.
1008
- name_bytes = name.encode(common.ENCODE)
1009
- defheader = struct.pack(
1010
- formats.CALIBRATION_DEF_PACK,
1011
- len(name_bytes),
1012
- len(qubits),
1013
- len(params),
1014
- type_keys.Program.assign(schedule),
1015
- )
1016
- file_obj.write(defheader)
1017
- file_obj.write(name_bytes)
1018
- for qubit in qubits:
1019
- file_obj.write(struct.pack("!q", qubit))
1020
- for param in params:
1021
- value.write_value(file_obj, param, version=version)
1022
- schedules.write_schedule_block(file_obj, schedule, metadata_serializer, version=version)
1023
-
1024
-
1025
1020
  def _write_registers(file_obj, in_circ_regs, full_bits):
1026
1021
  bitmap = {bit: index for index, bit in enumerate(full_bits)}
1027
1022
 
@@ -1032,7 +1027,9 @@ def _write_registers(file_obj, in_circ_regs, full_bits):
1032
1027
 
1033
1028
  for regs, is_in_circuit in [(in_circ_regs, True), (out_circ_regs, False)]:
1034
1029
  for reg in regs:
1035
- standalone = all(bit._register is reg for bit in reg)
1030
+ standalone = all(
1031
+ bit._register == reg and bit._index == index for index, bit in enumerate(reg)
1032
+ )
1036
1033
  reg_name = reg.name.encode(common.ENCODE)
1037
1034
  reg_type = reg.prefix.encode(common.ENCODE)
1038
1035
  file_obj.write(
@@ -1238,48 +1235,25 @@ def write_circuit(
1238
1235
  num_registers = num_qregs + num_cregs
1239
1236
 
1240
1237
  # Write circuit header
1241
- if version >= 12:
1242
- header_raw = formats.CIRCUIT_HEADER_V12(
1243
- name_size=len(circuit_name),
1244
- global_phase_type=global_phase_type,
1245
- global_phase_size=len(global_phase_data),
1246
- num_qubits=circuit.num_qubits,
1247
- num_clbits=circuit.num_clbits,
1248
- metadata_size=metadata_size,
1249
- num_registers=num_registers,
1250
- num_instructions=num_instructions,
1251
- num_vars=circuit.num_vars,
1252
- )
1253
- header = struct.pack(formats.CIRCUIT_HEADER_V12_PACK, *header_raw)
1254
- file_obj.write(header)
1255
- file_obj.write(circuit_name)
1256
- file_obj.write(global_phase_data)
1257
- file_obj.write(metadata_raw)
1258
- # Write header payload
1259
- file_obj.write(registers_raw)
1260
- standalone_var_indices = value.write_standalone_vars(file_obj, circuit)
1261
- else:
1262
- if circuit.num_vars:
1263
- raise exceptions.UnsupportedFeatureForVersion(
1264
- "circuits containing realtime variables", required=12, target=version
1265
- )
1266
- header_raw = formats.CIRCUIT_HEADER_V2(
1267
- name_size=len(circuit_name),
1268
- global_phase_type=global_phase_type,
1269
- global_phase_size=len(global_phase_data),
1270
- num_qubits=circuit.num_qubits,
1271
- num_clbits=circuit.num_clbits,
1272
- metadata_size=metadata_size,
1273
- num_registers=num_registers,
1274
- num_instructions=num_instructions,
1275
- )
1276
- header = struct.pack(formats.CIRCUIT_HEADER_V2_PACK, *header_raw)
1277
- file_obj.write(header)
1278
- file_obj.write(circuit_name)
1279
- file_obj.write(global_phase_data)
1280
- file_obj.write(metadata_raw)
1281
- file_obj.write(registers_raw)
1282
- standalone_var_indices = {}
1238
+ header_raw = formats.CIRCUIT_HEADER_V12(
1239
+ name_size=len(circuit_name),
1240
+ global_phase_type=global_phase_type,
1241
+ global_phase_size=len(global_phase_data),
1242
+ num_qubits=circuit.num_qubits,
1243
+ num_clbits=circuit.num_clbits,
1244
+ metadata_size=metadata_size,
1245
+ num_registers=num_registers,
1246
+ num_instructions=num_instructions,
1247
+ num_vars=circuit.num_identifiers,
1248
+ )
1249
+ header = struct.pack(formats.CIRCUIT_HEADER_V12_PACK, *header_raw)
1250
+ file_obj.write(header)
1251
+ file_obj.write(circuit_name)
1252
+ file_obj.write(global_phase_data)
1253
+ file_obj.write(metadata_raw)
1254
+ # Write header payload
1255
+ file_obj.write(registers_raw)
1256
+ standalone_var_indices = value.write_standalone_vars(file_obj, circuit, version)
1283
1257
 
1284
1258
  instruction_buffer = io.BytesIO()
1285
1259
  custom_operations = {}
@@ -1322,8 +1296,11 @@ def write_circuit(
1322
1296
  file_obj.write(instruction_buffer.getvalue())
1323
1297
  instruction_buffer.close()
1324
1298
 
1325
- # Write calibrations
1326
- _write_calibrations(file_obj, circuit._calibrations_prop, metadata_serializer, version=version)
1299
+ # Pulse has been removed in Qiskit 2.0. As long as we keep QPY at version 13,
1300
+ # we need to write an empty calibrations header since read_circuit expects it
1301
+ header = struct.pack(formats.CALIBRATION_PACK, 0)
1302
+ file_obj.write(header)
1303
+
1327
1304
  _write_layout(file_obj, circuit)
1328
1305
 
1329
1306
 
@@ -1368,7 +1345,7 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
1368
1345
  num_clbits = header["num_clbits"]
1369
1346
  num_registers = header["num_registers"]
1370
1347
  num_instructions = header["num_instructions"]
1371
- num_vars = header.get("num_vars", 0)
1348
+ num_identifiers = header.get("num_vars", 0)
1372
1349
  # `out_registers` is two "name: register" maps segregated by type for the rest of QPY, and
1373
1350
  # `all_registers` is the complete ordered list used to construct the `QuantumCircuit`.
1374
1351
  out_registers = {"q": {}, "c": {}}
@@ -1425,7 +1402,7 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
1425
1402
  "q": [Qubit() for _ in out_bits["q"]],
1426
1403
  "c": [Clbit() for _ in out_bits["c"]],
1427
1404
  }
1428
- var_segments, standalone_var_indices = value.read_standalone_vars(file_obj, num_vars)
1405
+ var_segments, standalone_var_indices = value.read_standalone_vars(file_obj, num_identifiers)
1429
1406
  circ = QuantumCircuit(
1430
1407
  out_bits["q"],
1431
1408
  out_bits["c"],
@@ -1434,10 +1411,15 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
1434
1411
  global_phase=global_phase,
1435
1412
  metadata=metadata,
1436
1413
  inputs=var_segments[type_keys.ExprVarDeclaration.INPUT],
1437
- captures=var_segments[type_keys.ExprVarDeclaration.CAPTURE],
1414
+ captures=itertools.chain(
1415
+ var_segments[type_keys.ExprVarDeclaration.CAPTURE],
1416
+ var_segments[type_keys.ExprVarDeclaration.STRETCH_CAPTURE],
1417
+ ),
1438
1418
  )
1439
1419
  for declaration in var_segments[type_keys.ExprVarDeclaration.LOCAL]:
1440
1420
  circ.add_uninitialized_var(declaration)
1421
+ for stretch in var_segments[type_keys.ExprVarDeclaration.STRETCH_LOCAL]:
1422
+ circ.add_stretch(stretch)
1441
1423
  custom_operations = _read_custom_operations(file_obj, version, vectors)
1442
1424
  for _instruction in range(num_instructions):
1443
1425
  _read_instruction(
@@ -1451,11 +1433,9 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
1451
1433
  standalone_var_indices,
1452
1434
  )
1453
1435
 
1454
- # Read calibrations
1436
+ # Consume calibrations, but don't use them since pulse gates are not supported as of Qiskit 2.0
1455
1437
  if version >= 5:
1456
- circ._calibrations_prop = _read_calibrations(
1457
- file_obj, version, vectors, metadata_deserializer
1458
- )
1438
+ _read_calibrations(file_obj, version, vectors, metadata_deserializer)
1459
1439
 
1460
1440
  for vec_name, (vector, initialized_params) in vectors.items():
1461
1441
  if len(initialized_params) != len(vector):