qiskit 1.4.2__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__cp39-abi3-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.abi3.so +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 +7 -1
  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/compiler/__init__.py +1 -7
  104. qiskit/compiler/transpiler.py +38 -196
  105. qiskit/converters/circuit_to_dag.py +6 -4
  106. qiskit/converters/circuit_to_dagdependency.py +0 -2
  107. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  108. qiskit/converters/circuit_to_gate.py +1 -1
  109. qiskit/converters/circuit_to_instruction.py +16 -29
  110. qiskit/converters/dag_to_circuit.py +7 -8
  111. qiskit/converters/dag_to_dagdependency.py +0 -1
  112. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  113. qiskit/converters/dagdependency_to_circuit.py +0 -6
  114. qiskit/converters/dagdependency_to_dag.py +0 -6
  115. qiskit/dagcircuit/collect_blocks.py +32 -20
  116. qiskit/dagcircuit/dagdependency.py +3 -37
  117. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  118. qiskit/dagcircuit/dagnode.py +14 -2
  119. qiskit/passmanager/__init__.py +24 -6
  120. qiskit/passmanager/passmanager.py +26 -24
  121. qiskit/primitives/__init__.py +44 -35
  122. qiskit/primitives/backend_estimator_v2.py +102 -23
  123. qiskit/primitives/backend_sampler_v2.py +5 -20
  124. qiskit/primitives/base/__init__.py +4 -4
  125. qiskit/primitives/base/base_estimator.py +77 -82
  126. qiskit/primitives/base/base_primitive_job.py +2 -2
  127. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  128. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  129. qiskit/primitives/base/base_sampler.py +52 -60
  130. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  131. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  132. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  133. qiskit/primitives/containers/bindings_array.py +3 -1
  134. qiskit/primitives/containers/bit_array.py +23 -0
  135. qiskit/primitives/containers/data_bin.py +3 -1
  136. qiskit/primitives/containers/observables_array.py +19 -2
  137. qiskit/primitives/statevector_sampler.py +6 -8
  138. qiskit/primitives/utils.py +14 -189
  139. qiskit/providers/__init__.py +4 -130
  140. qiskit/providers/backend.py +11 -314
  141. qiskit/providers/basic_provider/__init__.py +3 -1
  142. qiskit/providers/basic_provider/basic_provider.py +29 -9
  143. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  144. qiskit/providers/exceptions.py +0 -33
  145. qiskit/providers/fake_provider/__init__.py +0 -37
  146. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  147. qiskit/qasm2/__init__.py +21 -6
  148. qiskit/qasm2/export.py +2 -10
  149. qiskit/qasm2/parse.py +11 -25
  150. qiskit/qasm3/__init__.py +5 -1
  151. qiskit/qasm3/ast.py +44 -0
  152. qiskit/qasm3/exporter.py +65 -27
  153. qiskit/qasm3/printer.py +35 -4
  154. qiskit/qpy/__init__.py +162 -19
  155. qiskit/qpy/binary_io/__init__.py +0 -1
  156. qiskit/qpy/binary_io/circuits.py +98 -130
  157. qiskit/qpy/binary_io/schedules.py +69 -439
  158. qiskit/qpy/binary_io/value.py +154 -31
  159. qiskit/qpy/common.py +10 -7
  160. qiskit/qpy/formats.py +41 -0
  161. qiskit/qpy/interface.py +34 -81
  162. qiskit/qpy/type_keys.py +58 -221
  163. qiskit/quantum_info/analysis/distance.py +3 -1
  164. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  165. qiskit/quantum_info/operators/operator.py +6 -2
  166. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  167. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  168. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  169. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  170. qiskit/quantum_info/states/densitymatrix.py +16 -6
  171. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  172. qiskit/quantum_info/states/statevector.py +16 -6
  173. qiskit/result/__init__.py +5 -17
  174. qiskit/result/models.py +18 -11
  175. qiskit/result/result.py +38 -134
  176. qiskit/result/sampled_expval.py +1 -2
  177. qiskit/result/utils.py +3 -4
  178. qiskit/synthesis/__init__.py +21 -1
  179. qiskit/synthesis/arithmetic/__init__.py +3 -1
  180. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  182. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  183. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  184. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  185. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  186. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  188. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  189. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  190. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  191. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  192. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  193. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  194. qiskit/synthesis/evolution/product_formula.py +44 -35
  195. qiskit/synthesis/evolution/qdrift.py +17 -24
  196. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  197. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  198. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  199. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  200. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  201. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  202. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  203. qiskit/synthesis/two_qubit/__init__.py +1 -0
  204. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  205. qiskit/transpiler/__init__.py +32 -232
  206. qiskit/transpiler/basepasses.py +20 -51
  207. qiskit/transpiler/layout.py +1 -1
  208. qiskit/transpiler/passes/__init__.py +4 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  210. qiskit/transpiler/passes/basis/decompose.py +1 -15
  211. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  212. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  213. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  216. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  217. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  218. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  219. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  220. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  221. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  222. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  224. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  225. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  226. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  227. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  228. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  229. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  230. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  231. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  232. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  233. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  234. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  235. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  236. qiskit/transpiler/passes/routing/__init__.py +0 -1
  237. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  238. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  239. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  240. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  241. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  242. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  243. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  244. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  247. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  248. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  249. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  250. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  251. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  252. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  253. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  254. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  255. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  256. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  257. qiskit/transpiler/passes/utils/__init__.py +0 -1
  258. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  259. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  260. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  261. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  262. qiskit/transpiler/passmanager.py +13 -0
  263. qiskit/transpiler/passmanager_config.py +5 -81
  264. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  265. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  266. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  267. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  268. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  269. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  270. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  272. qiskit/transpiler/target.py +78 -524
  273. qiskit/user_config.py +8 -4
  274. qiskit/utils/__init__.py +13 -12
  275. qiskit/utils/deprecation.py +4 -112
  276. qiskit/utils/optionals.py +11 -4
  277. qiskit/utils/parallel.py +214 -87
  278. qiskit/utils/units.py +4 -1
  279. qiskit/visualization/__init__.py +3 -7
  280. qiskit/visualization/array.py +4 -1
  281. qiskit/visualization/bloch.py +1 -1
  282. qiskit/visualization/circuit/_utils.py +19 -19
  283. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  284. qiskit/visualization/circuit/matplotlib.py +13 -23
  285. qiskit/visualization/circuit/text.py +7 -3
  286. qiskit/visualization/counts_visualization.py +4 -0
  287. qiskit/visualization/dag_visualization.py +2 -1
  288. qiskit/visualization/gate_map.py +39 -154
  289. qiskit/visualization/library.py +4 -1
  290. qiskit/visualization/pass_manager_visualization.py +6 -2
  291. qiskit/visualization/state_visualization.py +19 -2
  292. qiskit/visualization/timeline/core.py +19 -13
  293. qiskit/visualization/timeline/interface.py +19 -18
  294. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  295. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  296. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
  297. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
  298. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  299. qiskit/assembler/__init__.py +0 -42
  300. qiskit/assembler/assemble_circuits.py +0 -451
  301. qiskit/assembler/assemble_schedules.py +0 -367
  302. qiskit/assembler/disassemble.py +0 -310
  303. qiskit/assembler/run_config.py +0 -77
  304. qiskit/circuit/bit.py +0 -106
  305. qiskit/circuit/classicalfunction/__init__.py +0 -152
  306. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  307. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  308. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  309. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  310. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  311. qiskit/circuit/classicalfunction/types.py +0 -18
  312. qiskit/circuit/classicalfunction/utils.py +0 -91
  313. qiskit/circuit/classicalregister.py +0 -57
  314. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  315. qiskit/circuit/quantumregister.py +0 -75
  316. qiskit/circuit/register.py +0 -246
  317. qiskit/compiler/assembler.py +0 -689
  318. qiskit/compiler/scheduler.py +0 -109
  319. qiskit/compiler/sequencer.py +0 -71
  320. qiskit/primitives/backend_estimator.py +0 -486
  321. qiskit/primitives/backend_sampler.py +0 -222
  322. qiskit/primitives/estimator.py +0 -172
  323. qiskit/primitives/sampler.py +0 -162
  324. qiskit/providers/backend_compat.py +0 -507
  325. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  340. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/fake_1q.py +0 -91
  349. qiskit/providers/fake_provider/fake_backend.py +0 -165
  350. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  351. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  352. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  353. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  354. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  355. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  356. qiskit/providers/models/__init__.py +0 -89
  357. qiskit/providers/models/backendconfiguration.py +0 -1040
  358. qiskit/providers/models/backendproperties.py +0 -535
  359. qiskit/providers/models/backendstatus.py +0 -104
  360. qiskit/providers/models/jobstatus.py +0 -77
  361. qiskit/providers/models/pulsedefaults.py +0 -305
  362. qiskit/providers/provider.py +0 -95
  363. qiskit/pulse/__init__.py +0 -158
  364. qiskit/pulse/builder.py +0 -2262
  365. qiskit/pulse/calibration_entries.py +0 -381
  366. qiskit/pulse/channels.py +0 -227
  367. qiskit/pulse/configuration.py +0 -245
  368. qiskit/pulse/exceptions.py +0 -45
  369. qiskit/pulse/filters.py +0 -309
  370. qiskit/pulse/instruction_schedule_map.py +0 -424
  371. qiskit/pulse/instructions/__init__.py +0 -67
  372. qiskit/pulse/instructions/acquire.py +0 -150
  373. qiskit/pulse/instructions/delay.py +0 -71
  374. qiskit/pulse/instructions/directives.py +0 -154
  375. qiskit/pulse/instructions/frequency.py +0 -135
  376. qiskit/pulse/instructions/instruction.py +0 -270
  377. qiskit/pulse/instructions/phase.py +0 -152
  378. qiskit/pulse/instructions/play.py +0 -99
  379. qiskit/pulse/instructions/reference.py +0 -100
  380. qiskit/pulse/instructions/snapshot.py +0 -82
  381. qiskit/pulse/library/__init__.py +0 -97
  382. qiskit/pulse/library/continuous.py +0 -430
  383. qiskit/pulse/library/pulse.py +0 -148
  384. qiskit/pulse/library/samplers/__init__.py +0 -15
  385. qiskit/pulse/library/samplers/decorators.py +0 -295
  386. qiskit/pulse/library/samplers/strategies.py +0 -71
  387. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  388. qiskit/pulse/library/waveform.py +0 -136
  389. qiskit/pulse/macros.py +0 -262
  390. qiskit/pulse/parameter_manager.py +0 -445
  391. qiskit/pulse/parser.py +0 -314
  392. qiskit/pulse/reference_manager.py +0 -58
  393. qiskit/pulse/schedule.py +0 -1854
  394. qiskit/pulse/transforms/__init__.py +0 -106
  395. qiskit/pulse/transforms/alignments.py +0 -406
  396. qiskit/pulse/transforms/base_transforms.py +0 -71
  397. qiskit/pulse/transforms/canonicalization.py +0 -498
  398. qiskit/pulse/transforms/dag.py +0 -122
  399. qiskit/pulse/utils.py +0 -149
  400. qiskit/qobj/__init__.py +0 -75
  401. qiskit/qobj/common.py +0 -81
  402. qiskit/qobj/converters/__init__.py +0 -18
  403. qiskit/qobj/converters/lo_config.py +0 -177
  404. qiskit/qobj/converters/pulse_instruction.py +0 -897
  405. qiskit/qobj/pulse_qobj.py +0 -709
  406. qiskit/qobj/qasm_qobj.py +0 -708
  407. qiskit/qobj/utils.py +0 -46
  408. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  409. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  410. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  411. qiskit/result/mitigation/utils.py +0 -217
  412. qiskit/scheduler/__init__.py +0 -40
  413. qiskit/scheduler/config.py +0 -37
  414. qiskit/scheduler/lowering.py +0 -187
  415. qiskit/scheduler/methods/__init__.py +0 -15
  416. qiskit/scheduler/methods/basic.py +0 -140
  417. qiskit/scheduler/schedule_circuit.py +0 -69
  418. qiskit/scheduler/sequence.py +0 -104
  419. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  420. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  421. qiskit/transpiler/passes/calibration/builders.py +0 -20
  422. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  423. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  424. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  425. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  426. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  427. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  428. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  429. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  430. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  431. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  432. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  433. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  434. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  435. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  436. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  437. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  438. qiskit/utils/deprecate_pulse.py +0 -119
  439. qiskit/utils/multiprocessing.py +0 -56
  440. qiskit/visualization/pulse_v2/__init__.py +0 -21
  441. qiskit/visualization/pulse_v2/core.py +0 -901
  442. qiskit/visualization/pulse_v2/device_info.py +0 -173
  443. qiskit/visualization/pulse_v2/drawings.py +0 -253
  444. qiskit/visualization/pulse_v2/events.py +0 -254
  445. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  446. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  447. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  448. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  449. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  450. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  451. qiskit/visualization/pulse_v2/interface.py +0 -459
  452. qiskit/visualization/pulse_v2/layouts.py +0 -387
  453. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  454. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  455. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  456. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  457. qiskit/visualization/pulse_v2/types.py +0 -242
  458. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  459. {qiskit-1.4.2.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:
@@ -638,9 +650,8 @@ def _read_custom_operations(file_obj, version, vectors):
638
650
  return custom_operations
639
651
 
640
652
 
641
- def _read_calibrations(file_obj, version, vectors, metadata_deserializer, trust_input=False):
642
- calibrations = {}
643
-
653
+ def _read_calibrations(file_obj, version, vectors, metadata_deserializer):
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,26 +660,20 @@ def _read_calibrations(file_obj, version, vectors, metadata_deserializer, trust_
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(
660
- file_obj,
661
- version,
662
- metadata_deserializer,
663
- trust_input=trust_input,
664
- )
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
+ )
665
669
 
666
- if name not in calibrations:
667
- calibrations[name] = {(qubits, params): schedule}
668
- else:
669
- calibrations[name][(qubits, params)] = schedule
670
+ for _ in range(defheader.num_qubits): # read qubits info
671
+ file_obj.read(struct.calcsize("!q"))
670
672
 
671
- 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)
672
677
 
673
678
 
674
679
  def _dumps_register(register, index_map):
@@ -751,13 +756,15 @@ def _write_instruction(
751
756
  or isinstance(instruction.operation, library.BlueprintCircuit)
752
757
  ):
753
758
  gate_class_name = instruction.operation.name
754
- if version >= 11:
755
- # 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"}:
756
761
  gate_class_name = f"{gate_class_name}_{uuid.uuid4().hex}"
757
- # ucr*_dg gates can have different numbers of parameters,
758
- # the uuid is appended to avoid storing a single definition
759
- # in circuits with multiple ucr*_dg gates.
760
- 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.
761
768
  gate_class_name = f"{gate_class_name}_{uuid.uuid4()}"
762
769
 
763
770
  custom_operations[gate_class_name] = instruction.operation
@@ -776,6 +783,11 @@ def _write_instruction(
776
783
  custom_operations[gate_class_name] = instruction.operation
777
784
  custom_operations_list.append(gate_class_name)
778
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
+
779
791
  condition_type = type_keys.Condition.NONE
780
792
  condition_register = b""
781
793
  condition_value = 0
@@ -801,6 +813,12 @@ def _write_instruction(
801
813
  instruction.operation.target,
802
814
  tuple(instruction.operation.cases_specifier()),
803
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
+ ]
804
822
  elif isinstance(instruction.operation, Clifford):
805
823
  instruction_params = [instruction.operation.tableau]
806
824
  elif isinstance(instruction.operation, AnnotatedOperation):
@@ -999,34 +1017,6 @@ def _write_custom_operation(
999
1017
  return new_custom_instruction
1000
1018
 
1001
1019
 
1002
- def _write_calibrations(file_obj, calibrations, metadata_serializer, version):
1003
- flatten_dict = {}
1004
- for gate, caldef in calibrations.items():
1005
- for (qubits, params), schedule in caldef.items():
1006
- key = (gate, qubits, params)
1007
- flatten_dict[key] = schedule
1008
- header = struct.pack(formats.CALIBRATION_PACK, len(flatten_dict))
1009
- file_obj.write(header)
1010
- for (name, qubits, params), schedule in flatten_dict.items():
1011
- # In principle ScheduleBlock and Schedule can be supported.
1012
- # As of version 5 only ScheduleBlock is supported.
1013
- name_bytes = name.encode(common.ENCODE)
1014
- defheader = struct.pack(
1015
- formats.CALIBRATION_DEF_PACK,
1016
- len(name_bytes),
1017
- len(qubits),
1018
- len(params),
1019
- type_keys.Program.assign(schedule),
1020
- )
1021
- file_obj.write(defheader)
1022
- file_obj.write(name_bytes)
1023
- for qubit in qubits:
1024
- file_obj.write(struct.pack("!q", qubit))
1025
- for param in params:
1026
- value.write_value(file_obj, param, version=version)
1027
- schedules.write_schedule_block(file_obj, schedule, metadata_serializer, version=version)
1028
-
1029
-
1030
1020
  def _write_registers(file_obj, in_circ_regs, full_bits):
1031
1021
  bitmap = {bit: index for index, bit in enumerate(full_bits)}
1032
1022
 
@@ -1037,7 +1027,9 @@ def _write_registers(file_obj, in_circ_regs, full_bits):
1037
1027
 
1038
1028
  for regs, is_in_circuit in [(in_circ_regs, True), (out_circ_regs, False)]:
1039
1029
  for reg in regs:
1040
- 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
+ )
1041
1033
  reg_name = reg.name.encode(common.ENCODE)
1042
1034
  reg_type = reg.prefix.encode(common.ENCODE)
1043
1035
  file_obj.write(
@@ -1243,48 +1235,25 @@ def write_circuit(
1243
1235
  num_registers = num_qregs + num_cregs
1244
1236
 
1245
1237
  # Write circuit header
1246
- if version >= 12:
1247
- header_raw = formats.CIRCUIT_HEADER_V12(
1248
- name_size=len(circuit_name),
1249
- global_phase_type=global_phase_type,
1250
- global_phase_size=len(global_phase_data),
1251
- num_qubits=circuit.num_qubits,
1252
- num_clbits=circuit.num_clbits,
1253
- metadata_size=metadata_size,
1254
- num_registers=num_registers,
1255
- num_instructions=num_instructions,
1256
- num_vars=circuit.num_vars,
1257
- )
1258
- header = struct.pack(formats.CIRCUIT_HEADER_V12_PACK, *header_raw)
1259
- file_obj.write(header)
1260
- file_obj.write(circuit_name)
1261
- file_obj.write(global_phase_data)
1262
- file_obj.write(metadata_raw)
1263
- # Write header payload
1264
- file_obj.write(registers_raw)
1265
- standalone_var_indices = value.write_standalone_vars(file_obj, circuit)
1266
- else:
1267
- if circuit.num_vars:
1268
- raise exceptions.UnsupportedFeatureForVersion(
1269
- "circuits containing realtime variables", required=12, target=version
1270
- )
1271
- header_raw = formats.CIRCUIT_HEADER_V2(
1272
- name_size=len(circuit_name),
1273
- global_phase_type=global_phase_type,
1274
- global_phase_size=len(global_phase_data),
1275
- num_qubits=circuit.num_qubits,
1276
- num_clbits=circuit.num_clbits,
1277
- metadata_size=metadata_size,
1278
- num_registers=num_registers,
1279
- num_instructions=num_instructions,
1280
- )
1281
- header = struct.pack(formats.CIRCUIT_HEADER_V2_PACK, *header_raw)
1282
- file_obj.write(header)
1283
- file_obj.write(circuit_name)
1284
- file_obj.write(global_phase_data)
1285
- file_obj.write(metadata_raw)
1286
- file_obj.write(registers_raw)
1287
- 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)
1288
1257
 
1289
1258
  instruction_buffer = io.BytesIO()
1290
1259
  custom_operations = {}
@@ -1327,14 +1296,15 @@ def write_circuit(
1327
1296
  file_obj.write(instruction_buffer.getvalue())
1328
1297
  instruction_buffer.close()
1329
1298
 
1330
- # Write calibrations
1331
- _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
+
1332
1304
  _write_layout(file_obj, circuit)
1333
1305
 
1334
1306
 
1335
- def read_circuit(
1336
- file_obj, version, metadata_deserializer=None, use_symengine=False, trust_input=False
1337
- ):
1307
+ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=False):
1338
1308
  """Read a single QuantumCircuit object from the file like object.
1339
1309
 
1340
1310
  Args:
@@ -1352,7 +1322,6 @@ def read_circuit(
1352
1322
  supported in all platforms. Please check that your target platform is supported by
1353
1323
  the symengine library before setting this option, as it will be required by qpy to
1354
1324
  deserialize the payload.
1355
- trust_input (bool): If true, deserialize vulnerable schedule block payloads.
1356
1325
  Returns:
1357
1326
  QuantumCircuit: The circuit object from the file.
1358
1327
 
@@ -1376,7 +1345,7 @@ def read_circuit(
1376
1345
  num_clbits = header["num_clbits"]
1377
1346
  num_registers = header["num_registers"]
1378
1347
  num_instructions = header["num_instructions"]
1379
- num_vars = header.get("num_vars", 0)
1348
+ num_identifiers = header.get("num_vars", 0)
1380
1349
  # `out_registers` is two "name: register" maps segregated by type for the rest of QPY, and
1381
1350
  # `all_registers` is the complete ordered list used to construct the `QuantumCircuit`.
1382
1351
  out_registers = {"q": {}, "c": {}}
@@ -1433,7 +1402,7 @@ def read_circuit(
1433
1402
  "q": [Qubit() for _ in out_bits["q"]],
1434
1403
  "c": [Clbit() for _ in out_bits["c"]],
1435
1404
  }
1436
- 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)
1437
1406
  circ = QuantumCircuit(
1438
1407
  out_bits["q"],
1439
1408
  out_bits["c"],
@@ -1442,10 +1411,15 @@ def read_circuit(
1442
1411
  global_phase=global_phase,
1443
1412
  metadata=metadata,
1444
1413
  inputs=var_segments[type_keys.ExprVarDeclaration.INPUT],
1445
- 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
+ ),
1446
1418
  )
1447
1419
  for declaration in var_segments[type_keys.ExprVarDeclaration.LOCAL]:
1448
1420
  circ.add_uninitialized_var(declaration)
1421
+ for stretch in var_segments[type_keys.ExprVarDeclaration.STRETCH_LOCAL]:
1422
+ circ.add_stretch(stretch)
1449
1423
  custom_operations = _read_custom_operations(file_obj, version, vectors)
1450
1424
  for _instruction in range(num_instructions):
1451
1425
  _read_instruction(
@@ -1459,15 +1433,9 @@ def read_circuit(
1459
1433
  standalone_var_indices,
1460
1434
  )
1461
1435
 
1462
- # Read calibrations
1436
+ # Consume calibrations, but don't use them since pulse gates are not supported as of Qiskit 2.0
1463
1437
  if version >= 5:
1464
- circ._calibrations_prop = _read_calibrations(
1465
- file_obj,
1466
- version,
1467
- vectors,
1468
- metadata_deserializer,
1469
- trust_input=trust_input,
1470
- )
1438
+ _read_calibrations(file_obj, version, vectors, metadata_deserializer)
1471
1439
 
1472
1440
  for vec_name, (vector, initialized_params) in vectors.items():
1473
1441
  if len(initialized_params) != len(vector):