qiskit 1.4.2__cp39-abi3-win_amd64.whl → 2.0.0rc2__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 (455) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +2 -5
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/circuit/__init__.py +24 -5
  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 +248 -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 +34 -5
  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/hamiltonian_gate.py +1 -1
  60. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  61. qiskit/circuit/library/n_local/n_local.py +1 -1
  62. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  63. qiskit/circuit/library/overlap.py +2 -2
  64. qiskit/circuit/library/pauli_evolution.py +39 -24
  65. qiskit/circuit/library/phase_oracle.py +130 -51
  66. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  67. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  68. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  69. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  70. qiskit/circuit/library/standard_gates/h.py +4 -9
  71. qiskit/circuit/library/standard_gates/i.py +2 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  73. qiskit/circuit/library/standard_gates/p.py +15 -34
  74. qiskit/circuit/library/standard_gates/r.py +3 -7
  75. qiskit/circuit/library/standard_gates/rx.py +5 -15
  76. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  77. qiskit/circuit/library/standard_gates/ry.py +5 -17
  78. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  79. qiskit/circuit/library/standard_gates/rz.py +5 -17
  80. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  82. qiskit/circuit/library/standard_gates/s.py +6 -15
  83. qiskit/circuit/library/standard_gates/swap.py +4 -11
  84. qiskit/circuit/library/standard_gates/sx.py +7 -12
  85. qiskit/circuit/library/standard_gates/t.py +6 -7
  86. qiskit/circuit/library/standard_gates/u.py +2 -10
  87. qiskit/circuit/library/standard_gates/u1.py +5 -16
  88. qiskit/circuit/library/standard_gates/u2.py +2 -6
  89. qiskit/circuit/library/standard_gates/u3.py +3 -11
  90. qiskit/circuit/library/standard_gates/x.py +13 -60
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/y.py +4 -9
  94. qiskit/circuit/library/standard_gates/z.py +5 -15
  95. qiskit/circuit/measure.py +11 -2
  96. qiskit/circuit/parameterexpression.py +7 -1
  97. qiskit/circuit/quantumcircuit.py +881 -555
  98. qiskit/circuit/random/utils.py +12 -6
  99. qiskit/circuit/reset.py +5 -2
  100. qiskit/circuit/singleton.py +5 -11
  101. qiskit/circuit/store.py +0 -8
  102. qiskit/compiler/__init__.py +1 -7
  103. qiskit/compiler/transpiler.py +38 -196
  104. qiskit/converters/circuit_to_dag.py +4 -2
  105. qiskit/converters/circuit_to_dagdependency.py +0 -2
  106. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  107. qiskit/converters/circuit_to_gate.py +1 -1
  108. qiskit/converters/circuit_to_instruction.py +16 -29
  109. qiskit/converters/dag_to_circuit.py +5 -5
  110. qiskit/converters/dag_to_dagdependency.py +0 -1
  111. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  112. qiskit/converters/dagdependency_to_circuit.py +0 -6
  113. qiskit/converters/dagdependency_to_dag.py +0 -6
  114. qiskit/dagcircuit/collect_blocks.py +32 -20
  115. qiskit/dagcircuit/dagdependency.py +3 -37
  116. qiskit/dagcircuit/dagdependency_v2.py +2 -80
  117. qiskit/dagcircuit/dagnode.py +14 -2
  118. qiskit/passmanager/__init__.py +24 -6
  119. qiskit/passmanager/passmanager.py +26 -24
  120. qiskit/primitives/__init__.py +44 -35
  121. qiskit/primitives/backend_estimator_v2.py +102 -23
  122. qiskit/primitives/backend_sampler_v2.py +5 -20
  123. qiskit/primitives/base/__init__.py +4 -4
  124. qiskit/primitives/base/base_estimator.py +77 -82
  125. qiskit/primitives/base/base_primitive_job.py +2 -2
  126. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  127. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  128. qiskit/primitives/base/base_sampler.py +52 -60
  129. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  130. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  131. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  132. qiskit/primitives/containers/bindings_array.py +3 -1
  133. qiskit/primitives/containers/bit_array.py +23 -0
  134. qiskit/primitives/containers/data_bin.py +3 -1
  135. qiskit/primitives/containers/observables_array.py +19 -2
  136. qiskit/primitives/statevector_sampler.py +6 -8
  137. qiskit/primitives/utils.py +14 -189
  138. qiskit/providers/__init__.py +4 -130
  139. qiskit/providers/backend.py +11 -314
  140. qiskit/providers/basic_provider/__init__.py +3 -1
  141. qiskit/providers/basic_provider/basic_provider.py +29 -9
  142. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  143. qiskit/providers/exceptions.py +0 -33
  144. qiskit/providers/fake_provider/__init__.py +0 -37
  145. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  146. qiskit/qasm2/__init__.py +21 -6
  147. qiskit/qasm2/export.py +2 -10
  148. qiskit/qasm2/parse.py +11 -25
  149. qiskit/qasm3/__init__.py +5 -1
  150. qiskit/qasm3/ast.py +44 -0
  151. qiskit/qasm3/exporter.py +65 -27
  152. qiskit/qasm3/printer.py +35 -4
  153. qiskit/qpy/__init__.py +141 -19
  154. qiskit/qpy/binary_io/__init__.py +0 -1
  155. qiskit/qpy/binary_io/circuits.py +93 -130
  156. qiskit/qpy/binary_io/schedules.py +69 -439
  157. qiskit/qpy/binary_io/value.py +154 -31
  158. qiskit/qpy/common.py +10 -7
  159. qiskit/qpy/formats.py +41 -0
  160. qiskit/qpy/interface.py +34 -81
  161. qiskit/qpy/type_keys.py +58 -221
  162. qiskit/quantum_info/analysis/distance.py +3 -1
  163. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  164. qiskit/quantum_info/operators/operator.py +6 -2
  165. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  166. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  167. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  168. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  169. qiskit/quantum_info/states/densitymatrix.py +16 -6
  170. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  171. qiskit/quantum_info/states/statevector.py +16 -6
  172. qiskit/result/__init__.py +5 -17
  173. qiskit/result/models.py +18 -10
  174. qiskit/result/result.py +28 -126
  175. qiskit/result/sampled_expval.py +1 -2
  176. qiskit/result/utils.py +3 -4
  177. qiskit/synthesis/__init__.py +21 -1
  178. qiskit/synthesis/arithmetic/__init__.py +3 -1
  179. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  180. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  182. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  183. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  184. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  185. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  186. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  188. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  189. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  190. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  191. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  192. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  193. qiskit/synthesis/evolution/product_formula.py +44 -35
  194. qiskit/synthesis/evolution/qdrift.py +17 -24
  195. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  196. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  197. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  198. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  199. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  200. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  201. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  202. qiskit/synthesis/two_qubit/__init__.py +1 -0
  203. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  204. qiskit/transpiler/__init__.py +32 -232
  205. qiskit/transpiler/basepasses.py +20 -51
  206. qiskit/transpiler/layout.py +1 -1
  207. qiskit/transpiler/passes/__init__.py +2 -40
  208. qiskit/transpiler/passes/basis/basis_translator.py +4 -3
  209. qiskit/transpiler/passes/basis/decompose.py +1 -15
  210. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  211. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  212. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  213. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  214. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
  215. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  216. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  217. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  218. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  219. qiskit/transpiler/passes/optimization/__init__.py +1 -3
  220. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  221. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  222. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  224. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  225. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  226. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  227. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  228. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  229. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  230. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  231. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  232. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  233. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  234. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  235. qiskit/transpiler/passes/routing/__init__.py +0 -1
  236. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  237. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  238. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  239. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  240. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  241. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  242. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  243. qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
  244. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
  245. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
  246. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  247. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  248. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  249. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
  250. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  251. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  252. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  253. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  254. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  255. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  256. qiskit/transpiler/passes/utils/__init__.py +0 -1
  257. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  258. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  259. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  260. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  261. qiskit/transpiler/passmanager.py +13 -0
  262. qiskit/transpiler/passmanager_config.py +5 -81
  263. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  264. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  265. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
  266. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  267. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  268. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  269. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  270. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  271. qiskit/transpiler/target.py +67 -524
  272. qiskit/user_config.py +8 -4
  273. qiskit/utils/__init__.py +13 -12
  274. qiskit/utils/deprecation.py +4 -112
  275. qiskit/utils/optionals.py +11 -4
  276. qiskit/utils/parallel.py +214 -87
  277. qiskit/utils/units.py +4 -1
  278. qiskit/visualization/__init__.py +3 -7
  279. qiskit/visualization/array.py +4 -1
  280. qiskit/visualization/bloch.py +1 -1
  281. qiskit/visualization/circuit/_utils.py +19 -19
  282. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  283. qiskit/visualization/circuit/matplotlib.py +13 -23
  284. qiskit/visualization/circuit/text.py +7 -3
  285. qiskit/visualization/dag_visualization.py +2 -1
  286. qiskit/visualization/gate_map.py +39 -154
  287. qiskit/visualization/pass_manager_visualization.py +6 -2
  288. qiskit/visualization/state_visualization.py +6 -0
  289. qiskit/visualization/timeline/core.py +18 -12
  290. qiskit/visualization/timeline/interface.py +19 -18
  291. {qiskit-1.4.2.dist-info → qiskit-2.0.0rc2.dist-info}/METADATA +2 -2
  292. {qiskit-1.4.2.dist-info → qiskit-2.0.0rc2.dist-info}/RECORD +296 -443
  293. {qiskit-1.4.2.dist-info → qiskit-2.0.0rc2.dist-info}/entry_points.txt +8 -2
  294. qiskit/assembler/__init__.py +0 -42
  295. qiskit/assembler/assemble_circuits.py +0 -451
  296. qiskit/assembler/assemble_schedules.py +0 -367
  297. qiskit/assembler/disassemble.py +0 -310
  298. qiskit/assembler/run_config.py +0 -77
  299. qiskit/circuit/bit.py +0 -106
  300. qiskit/circuit/classicalfunction/__init__.py +0 -152
  301. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  302. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  303. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  304. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  305. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  306. qiskit/circuit/classicalfunction/types.py +0 -18
  307. qiskit/circuit/classicalfunction/utils.py +0 -91
  308. qiskit/circuit/classicalregister.py +0 -57
  309. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  310. qiskit/circuit/quantumregister.py +0 -75
  311. qiskit/circuit/register.py +0 -246
  312. qiskit/compiler/assembler.py +0 -689
  313. qiskit/compiler/scheduler.py +0 -109
  314. qiskit/compiler/sequencer.py +0 -71
  315. qiskit/primitives/backend_estimator.py +0 -486
  316. qiskit/primitives/backend_sampler.py +0 -222
  317. qiskit/primitives/estimator.py +0 -172
  318. qiskit/primitives/sampler.py +0 -162
  319. qiskit/providers/backend_compat.py +0 -507
  320. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  321. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  322. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  323. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  324. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  325. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  326. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  327. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  328. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  330. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  333. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  335. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  337. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  338. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  339. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  341. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  342. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  343. qiskit/providers/fake_provider/fake_1q.py +0 -91
  344. qiskit/providers/fake_provider/fake_backend.py +0 -165
  345. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  346. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  347. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  348. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  349. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  350. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  351. qiskit/providers/models/__init__.py +0 -89
  352. qiskit/providers/models/backendconfiguration.py +0 -1040
  353. qiskit/providers/models/backendproperties.py +0 -535
  354. qiskit/providers/models/backendstatus.py +0 -104
  355. qiskit/providers/models/jobstatus.py +0 -77
  356. qiskit/providers/models/pulsedefaults.py +0 -305
  357. qiskit/providers/provider.py +0 -95
  358. qiskit/pulse/__init__.py +0 -158
  359. qiskit/pulse/builder.py +0 -2262
  360. qiskit/pulse/calibration_entries.py +0 -381
  361. qiskit/pulse/channels.py +0 -227
  362. qiskit/pulse/configuration.py +0 -245
  363. qiskit/pulse/exceptions.py +0 -45
  364. qiskit/pulse/filters.py +0 -309
  365. qiskit/pulse/instruction_schedule_map.py +0 -424
  366. qiskit/pulse/instructions/__init__.py +0 -67
  367. qiskit/pulse/instructions/acquire.py +0 -150
  368. qiskit/pulse/instructions/delay.py +0 -71
  369. qiskit/pulse/instructions/directives.py +0 -154
  370. qiskit/pulse/instructions/frequency.py +0 -135
  371. qiskit/pulse/instructions/instruction.py +0 -270
  372. qiskit/pulse/instructions/phase.py +0 -152
  373. qiskit/pulse/instructions/play.py +0 -99
  374. qiskit/pulse/instructions/reference.py +0 -100
  375. qiskit/pulse/instructions/snapshot.py +0 -82
  376. qiskit/pulse/library/__init__.py +0 -97
  377. qiskit/pulse/library/continuous.py +0 -430
  378. qiskit/pulse/library/pulse.py +0 -148
  379. qiskit/pulse/library/samplers/__init__.py +0 -15
  380. qiskit/pulse/library/samplers/decorators.py +0 -295
  381. qiskit/pulse/library/samplers/strategies.py +0 -71
  382. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  383. qiskit/pulse/library/waveform.py +0 -136
  384. qiskit/pulse/macros.py +0 -262
  385. qiskit/pulse/parameter_manager.py +0 -445
  386. qiskit/pulse/parser.py +0 -314
  387. qiskit/pulse/reference_manager.py +0 -58
  388. qiskit/pulse/schedule.py +0 -1854
  389. qiskit/pulse/transforms/__init__.py +0 -106
  390. qiskit/pulse/transforms/alignments.py +0 -406
  391. qiskit/pulse/transforms/base_transforms.py +0 -71
  392. qiskit/pulse/transforms/canonicalization.py +0 -498
  393. qiskit/pulse/transforms/dag.py +0 -122
  394. qiskit/pulse/utils.py +0 -149
  395. qiskit/qobj/__init__.py +0 -75
  396. qiskit/qobj/common.py +0 -81
  397. qiskit/qobj/converters/__init__.py +0 -18
  398. qiskit/qobj/converters/lo_config.py +0 -177
  399. qiskit/qobj/converters/pulse_instruction.py +0 -897
  400. qiskit/qobj/pulse_qobj.py +0 -709
  401. qiskit/qobj/qasm_qobj.py +0 -708
  402. qiskit/qobj/utils.py +0 -46
  403. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  404. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  405. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  406. qiskit/result/mitigation/utils.py +0 -217
  407. qiskit/scheduler/__init__.py +0 -40
  408. qiskit/scheduler/config.py +0 -37
  409. qiskit/scheduler/lowering.py +0 -187
  410. qiskit/scheduler/methods/__init__.py +0 -15
  411. qiskit/scheduler/methods/basic.py +0 -140
  412. qiskit/scheduler/schedule_circuit.py +0 -69
  413. qiskit/scheduler/sequence.py +0 -104
  414. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  415. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  416. qiskit/transpiler/passes/calibration/builders.py +0 -20
  417. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  418. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  419. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  420. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  421. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  422. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  423. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  424. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  425. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  426. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  427. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  428. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  429. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  430. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  431. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  432. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  433. qiskit/utils/deprecate_pulse.py +0 -119
  434. qiskit/utils/multiprocessing.py +0 -56
  435. qiskit/visualization/pulse_v2/__init__.py +0 -21
  436. qiskit/visualization/pulse_v2/core.py +0 -901
  437. qiskit/visualization/pulse_v2/device_info.py +0 -173
  438. qiskit/visualization/pulse_v2/drawings.py +0 -253
  439. qiskit/visualization/pulse_v2/events.py +0 -254
  440. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  441. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  442. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  443. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  444. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  445. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  446. qiskit/visualization/pulse_v2/interface.py +0 -459
  447. qiskit/visualization/pulse_v2/layouts.py +0 -387
  448. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  449. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  450. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  451. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  452. qiskit/visualization/pulse_v2/types.py +0 -242
  453. {qiskit-1.4.2.dist-info → qiskit-2.0.0rc2.dist-info}/LICENSE.txt +0 -0
  454. {qiskit-1.4.2.dist-info → qiskit-2.0.0rc2.dist-info}/WHEEL +0 -0
  455. {qiskit-1.4.2.dist-info → qiskit-2.0.0rc2.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
 
@@ -342,6 +377,93 @@ There is a circuit payload for each circuit (where the total number is dictated
342
377
  by ``num_circuits`` in the file header). There is no padding between the
343
378
  circuits in the data.
344
379
 
380
+ .. _qpy_version_14:
381
+
382
+ Version 14
383
+ ----------
384
+
385
+ Version 14 adds a new core DURATION type, support for additional :class:`~.types.Type`
386
+ classes :class:`~.types.Float` and :class:`~.types.Duration`, and a new expression
387
+ node type :class:`~.expr.Stretch`.
388
+
389
+ DURATION
390
+ ~~~~~~~~
391
+
392
+ A :class:`~.circuit.Duration` is encoded by a single-byte ASCII ``char`` that encodes the kind of
393
+ type, followed by a payload that varies depending on the type. The defined codes are:
394
+
395
+ ============================== ========= =========================================================
396
+ Qiskit class Type code Payload
397
+ ============================== ========= =========================================================
398
+ :class:`~.circuit.Duration.dt` ``t`` One ``unsigned long long value``.
399
+
400
+ :class:`~.circuit.Duration.ns` ``n`` One ``double value``.
401
+
402
+ :class:`~.circuit.Duration.us` ``u`` One ``double value``.
403
+
404
+ :class:`~.circuit.Duration.ms` ``m`` One ``double value``.
405
+
406
+ :class:`~.circuit.Duration.s` ``s`` One ``double value``.
407
+
408
+ ============================== ========= =========================================================
409
+
410
+ Changes to EXPR_VAR_DECLARATION
411
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
412
+
413
+ The ``EXPR_VAR_DECLARATION`` type is now used to represent both :class:`~.expr.Var` standalone
414
+ variables and :class:`~.expr.Stretch` identifiers. To support this change, the usage type code has
415
+ two new possible entries, in addition to the existing ones:
416
+
417
+ ========= =========================================================================================
418
+ Type code Meaning
419
+ ========= =========================================================================================
420
+ ``A`` A ``capture`` stretch to the circuit.
421
+
422
+ ``O`` A locally declared stretch to the circuit.
423
+
424
+ ========= =========================================================================================
425
+
426
+ Changes to EXPRESSION
427
+ ---------------------
428
+
429
+ The EXPRESSION type code has a new possible entry, ``s``, corresponding to :class:`.expr.Stretch`
430
+ nodes.
431
+
432
+ ======================= ========= ====================================================== ========
433
+ Qiskit class Type code Payload Children
434
+ ======================= ========= ====================================================== ========
435
+ :class:`~.expr.Stretch` ``s`` One ``unsigned short var_index`` 0
436
+ ======================= ========= ====================================================== ========
437
+
438
+ Changes to EXPR_TYPE
439
+ ~~~~~~~~~~~~~~~~~~~~
440
+
441
+ The following table shows the new type classes added in the version:
442
+
443
+ ========================= ========= ==============================================================
444
+ Qiskit class Type code Payload
445
+ ========================= ========= ==============================================================
446
+ :class:`~.types.Float` ``f`` None.
447
+
448
+ :class:`~.types.Duration` ``d`` None.
449
+
450
+ ========================= ========= ==============================================================
451
+
452
+ Changes to EXPR_VALUE
453
+ ~~~~~~~~~~~~~~~~~~~~~
454
+
455
+ The classical expression's type system now supports new encoding types for value literals, in
456
+ addition to the existing encodings for int and bool. The new value type encodings are below:
457
+
458
+ =========================== ========= ============================================================
459
+ Python type Type code Payload
460
+ =========================== ========= ============================================================
461
+ ``float`` ``f`` One ``double value``.
462
+
463
+ :class:`~.circuit.Duration` ``t`` One ``DURATION``.
464
+
465
+ =========================== ========= ============================================================
466
+
345
467
  .. _qpy_version_13:
346
468
 
347
469
  Version 13
@@ -874,7 +996,7 @@ Version 7
874
996
  ---------
875
997
 
876
998
  Version 7 adds support for :class:`.~Reference` instruction and serialization of
877
- a :class:`.~ScheduleBlock` program while keeping its reference to subroutines::
999
+ a ``ScheduleBlock`` program while keeping its reference to subroutines::
878
1000
 
879
1001
  from qiskit import pulse
880
1002
  from qiskit import qpy
@@ -946,12 +1068,12 @@ identical to :ref:`qpy_version_5`.
946
1068
  Version 5
947
1069
  ---------
948
1070
 
949
- Version 5 changes from :ref:`qpy_version_4` by adding support for :class:`.~ScheduleBlock`
1071
+ Version 5 changes from :ref:`qpy_version_4` by adding support for ``ScheduleBlock``
950
1072
  and changing two payloads the INSTRUCTION metadata payload and the CUSTOM_INSTRUCTION block.
951
1073
  These now have new fields to better account for :class:`~.ControlledGate` objects in a circuit.
952
1074
  In addition, new payload MAP_ITEM is defined to implement the :ref:`qpy_mapping` block.
953
1075
 
954
- With the support of :class:`.~ScheduleBlock`, now :class:`~.QuantumCircuit` can be
1076
+ With the support of ``ScheduleBlock``, now :class:`~.QuantumCircuit` can be
955
1077
  serialized together with :attr:`~.QuantumCircuit.calibrations`, or
956
1078
  `Pulse Gates <https://docs.quantum.ibm.com/guides/pulse>`_.
957
1079
  In QPY version 5 and above, :ref:`qpy_circuit_calibrations` payload is
@@ -968,7 +1090,7 @@ In QPY version 5 and above,
968
1090
  immediately follows the file header block to represent the program type stored in the file.
969
1091
 
970
1092
  - When ``type==c``, :class:`~.QuantumCircuit` payload follows
971
- - When ``type==s``, :class:`~.ScheduleBlock` payload follows
1093
+ - When ``type==s``, ``ScheduleBlock`` payload follows
972
1094
 
973
1095
  .. note::
974
1096
 
@@ -981,7 +1103,7 @@ immediately follows the file header block to represent the program type stored i
981
1103
  SCHEDULE_BLOCK
982
1104
  ~~~~~~~~~~~~~~
983
1105
 
984
- :class:`~.ScheduleBlock` is first supported in QPY Version 5. This allows
1106
+ ``ScheduleBlock`` is first supported in QPY Version 5. This allows
985
1107
  users to save pulse programs in the QPY binary format as follows:
986
1108
 
987
1109
  .. code-block:: python
@@ -992,10 +1114,10 @@ users to save pulse programs in the QPY binary format as follows:
992
1114
  pulse.play(pulse.Gaussian(160, 0.1, 40), pulse.DriveChannel(0))
993
1115
 
994
1116
  with open('schedule.qpy', 'wb') as fd:
995
- qpy.dump(qc, fd)
1117
+ qpy.dump(schedule, fd)
996
1118
 
997
1119
  with open('schedule.qpy', 'rb') as fd:
998
- new_qc = qpy.load(fd)[0]
1120
+ new_schedule = qpy.load(fd)[0]
999
1121
 
1000
1122
  Note that circuit and schedule block are serialized and deserialized through
1001
1123
  the same QPY interface. Input data type is implicitly analyzed and
@@ -1006,7 +1128,7 @@ no extra option is required to save the schedule block.
1006
1128
  SCHEDULE_BLOCK_HEADER
1007
1129
  ~~~~~~~~~~~~~~~~~~~~~
1008
1130
 
1009
- :class:`~.ScheduleBlock` block starts with the following header:
1131
+ ``ScheduleBlock`` block starts with the following header:
1010
1132
 
1011
1133
  .. code-block:: c
1012
1134
 
@@ -1206,8 +1328,8 @@ the gate name, ``num_qubits`` length of integers representing a sequence of qubi
1206
1328
  and ``num_params`` length of INSTRUCTION_PARAM payload for parameters
1207
1329
  associated to the custom instruction.
1208
1330
  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.
1331
+ ``ScheduleBlock`` or :class:`~.Schedule`. As of QPY Version 5,
1332
+ only ``ScheduleBlock`` payload is supported.
1211
1333
  Finally, :ref:`qpy_schedule_block` payload is packed for each CALIBRATION_DEF entry.
1212
1334
 
1213
1335
  .. _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"))
672
+
673
+ for _ in range(defheader.num_params): # read params info
674
+ value.read_value(file_obj, version, vectors)
670
675
 
671
- return calibrations
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
@@ -801,6 +808,12 @@ def _write_instruction(
801
808
  instruction.operation.target,
802
809
  tuple(instruction.operation.cases_specifier()),
803
810
  ]
811
+ elif isinstance(instruction.operation, controlflow.BoxOp):
812
+ instruction_params = [
813
+ instruction.operation.blocks[0],
814
+ instruction.operation.duration,
815
+ instruction.operation.unit,
816
+ ]
804
817
  elif isinstance(instruction.operation, Clifford):
805
818
  instruction_params = [instruction.operation.tableau]
806
819
  elif isinstance(instruction.operation, AnnotatedOperation):
@@ -999,34 +1012,6 @@ def _write_custom_operation(
999
1012
  return new_custom_instruction
1000
1013
 
1001
1014
 
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
1015
  def _write_registers(file_obj, in_circ_regs, full_bits):
1031
1016
  bitmap = {bit: index for index, bit in enumerate(full_bits)}
1032
1017
 
@@ -1037,7 +1022,9 @@ def _write_registers(file_obj, in_circ_regs, full_bits):
1037
1022
 
1038
1023
  for regs, is_in_circuit in [(in_circ_regs, True), (out_circ_regs, False)]:
1039
1024
  for reg in regs:
1040
- standalone = all(bit._register is reg for bit in reg)
1025
+ standalone = all(
1026
+ bit._register == reg and bit._index == index for index, bit in enumerate(reg)
1027
+ )
1041
1028
  reg_name = reg.name.encode(common.ENCODE)
1042
1029
  reg_type = reg.prefix.encode(common.ENCODE)
1043
1030
  file_obj.write(
@@ -1243,48 +1230,25 @@ def write_circuit(
1243
1230
  num_registers = num_qregs + num_cregs
1244
1231
 
1245
1232
  # 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 = {}
1233
+ header_raw = formats.CIRCUIT_HEADER_V12(
1234
+ name_size=len(circuit_name),
1235
+ global_phase_type=global_phase_type,
1236
+ global_phase_size=len(global_phase_data),
1237
+ num_qubits=circuit.num_qubits,
1238
+ num_clbits=circuit.num_clbits,
1239
+ metadata_size=metadata_size,
1240
+ num_registers=num_registers,
1241
+ num_instructions=num_instructions,
1242
+ num_vars=circuit.num_identifiers,
1243
+ )
1244
+ header = struct.pack(formats.CIRCUIT_HEADER_V12_PACK, *header_raw)
1245
+ file_obj.write(header)
1246
+ file_obj.write(circuit_name)
1247
+ file_obj.write(global_phase_data)
1248
+ file_obj.write(metadata_raw)
1249
+ # Write header payload
1250
+ file_obj.write(registers_raw)
1251
+ standalone_var_indices = value.write_standalone_vars(file_obj, circuit, version)
1288
1252
 
1289
1253
  instruction_buffer = io.BytesIO()
1290
1254
  custom_operations = {}
@@ -1327,14 +1291,15 @@ def write_circuit(
1327
1291
  file_obj.write(instruction_buffer.getvalue())
1328
1292
  instruction_buffer.close()
1329
1293
 
1330
- # Write calibrations
1331
- _write_calibrations(file_obj, circuit._calibrations_prop, metadata_serializer, version=version)
1294
+ # Pulse has been removed in Qiskit 2.0. As long as we keep QPY at version 13,
1295
+ # we need to write an empty calibrations header since read_circuit expects it
1296
+ header = struct.pack(formats.CALIBRATION_PACK, 0)
1297
+ file_obj.write(header)
1298
+
1332
1299
  _write_layout(file_obj, circuit)
1333
1300
 
1334
1301
 
1335
- def read_circuit(
1336
- file_obj, version, metadata_deserializer=None, use_symengine=False, trust_input=False
1337
- ):
1302
+ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=False):
1338
1303
  """Read a single QuantumCircuit object from the file like object.
1339
1304
 
1340
1305
  Args:
@@ -1352,7 +1317,6 @@ def read_circuit(
1352
1317
  supported in all platforms. Please check that your target platform is supported by
1353
1318
  the symengine library before setting this option, as it will be required by qpy to
1354
1319
  deserialize the payload.
1355
- trust_input (bool): If true, deserialize vulnerable schedule block payloads.
1356
1320
  Returns:
1357
1321
  QuantumCircuit: The circuit object from the file.
1358
1322
 
@@ -1376,7 +1340,7 @@ def read_circuit(
1376
1340
  num_clbits = header["num_clbits"]
1377
1341
  num_registers = header["num_registers"]
1378
1342
  num_instructions = header["num_instructions"]
1379
- num_vars = header.get("num_vars", 0)
1343
+ num_identifiers = header.get("num_vars", 0)
1380
1344
  # `out_registers` is two "name: register" maps segregated by type for the rest of QPY, and
1381
1345
  # `all_registers` is the complete ordered list used to construct the `QuantumCircuit`.
1382
1346
  out_registers = {"q": {}, "c": {}}
@@ -1433,7 +1397,7 @@ def read_circuit(
1433
1397
  "q": [Qubit() for _ in out_bits["q"]],
1434
1398
  "c": [Clbit() for _ in out_bits["c"]],
1435
1399
  }
1436
- var_segments, standalone_var_indices = value.read_standalone_vars(file_obj, num_vars)
1400
+ var_segments, standalone_var_indices = value.read_standalone_vars(file_obj, num_identifiers)
1437
1401
  circ = QuantumCircuit(
1438
1402
  out_bits["q"],
1439
1403
  out_bits["c"],
@@ -1442,10 +1406,15 @@ def read_circuit(
1442
1406
  global_phase=global_phase,
1443
1407
  metadata=metadata,
1444
1408
  inputs=var_segments[type_keys.ExprVarDeclaration.INPUT],
1445
- captures=var_segments[type_keys.ExprVarDeclaration.CAPTURE],
1409
+ captures=itertools.chain(
1410
+ var_segments[type_keys.ExprVarDeclaration.CAPTURE],
1411
+ var_segments[type_keys.ExprVarDeclaration.STRETCH_CAPTURE],
1412
+ ),
1446
1413
  )
1447
1414
  for declaration in var_segments[type_keys.ExprVarDeclaration.LOCAL]:
1448
1415
  circ.add_uninitialized_var(declaration)
1416
+ for stretch in var_segments[type_keys.ExprVarDeclaration.STRETCH_LOCAL]:
1417
+ circ.add_stretch(stretch)
1449
1418
  custom_operations = _read_custom_operations(file_obj, version, vectors)
1450
1419
  for _instruction in range(num_instructions):
1451
1420
  _read_instruction(
@@ -1459,15 +1428,9 @@ def read_circuit(
1459
1428
  standalone_var_indices,
1460
1429
  )
1461
1430
 
1462
- # Read calibrations
1431
+ # Consume calibrations, but don't use them since pulse gates are not supported as of Qiskit 2.0
1463
1432
  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
- )
1433
+ _read_calibrations(file_obj, version, vectors, metadata_deserializer)
1471
1434
 
1472
1435
  for vec_name, (vector, initialized_params) in vectors.items():
1473
1436
  if len(initialized_params) != len(vector):