qiskit 1.4.1__cp39-abi3-win_amd64.whl → 2.0.0rc1__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 (456) 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 +2 -6
  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 +4 -0
  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 +91 -116
  156. qiskit/qpy/binary_io/schedules.py +61 -388
  157. qiskit/qpy/binary_io/value.py +154 -28
  158. qiskit/qpy/common.py +10 -7
  159. qiskit/qpy/formats.py +41 -0
  160. qiskit/qpy/interface.py +29 -62
  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/discrete_basis/generate_basis_approximations.py +2 -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 +2 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +4 -3
  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 +4 -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 +1 -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 +30 -2
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
  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 +127 -59
  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 +101 -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 +67 -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/dag_visualization.py +2 -1
  287. qiskit/visualization/gate_map.py +39 -154
  288. qiskit/visualization/pass_manager_visualization.py +6 -2
  289. qiskit/visualization/state_visualization.py +6 -0
  290. qiskit/visualization/timeline/core.py +18 -12
  291. qiskit/visualization/timeline/interface.py +19 -18
  292. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +1 -1
  295. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
  296. qiskit/assembler/__init__.py +0 -42
  297. qiskit/assembler/assemble_circuits.py +0 -451
  298. qiskit/assembler/assemble_schedules.py +0 -367
  299. qiskit/assembler/disassemble.py +0 -310
  300. qiskit/assembler/run_config.py +0 -77
  301. qiskit/circuit/bit.py +0 -106
  302. qiskit/circuit/classicalfunction/__init__.py +0 -152
  303. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  304. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  305. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  306. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  307. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  308. qiskit/circuit/classicalfunction/types.py +0 -18
  309. qiskit/circuit/classicalfunction/utils.py +0 -91
  310. qiskit/circuit/classicalregister.py +0 -57
  311. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  312. qiskit/circuit/quantumregister.py +0 -75
  313. qiskit/circuit/register.py +0 -246
  314. qiskit/compiler/assembler.py +0 -689
  315. qiskit/compiler/scheduler.py +0 -109
  316. qiskit/compiler/sequencer.py +0 -71
  317. qiskit/primitives/backend_estimator.py +0 -486
  318. qiskit/primitives/backend_sampler.py +0 -222
  319. qiskit/primitives/estimator.py +0 -172
  320. qiskit/primitives/sampler.py +0 -162
  321. qiskit/providers/backend_compat.py +0 -507
  322. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  323. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  324. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  325. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  330. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  332. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  333. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  337. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  338. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  341. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/fake_1q.py +0 -91
  346. qiskit/providers/fake_provider/fake_backend.py +0 -165
  347. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  348. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  349. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  350. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  351. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  352. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  353. qiskit/providers/models/__init__.py +0 -89
  354. qiskit/providers/models/backendconfiguration.py +0 -1040
  355. qiskit/providers/models/backendproperties.py +0 -535
  356. qiskit/providers/models/backendstatus.py +0 -104
  357. qiskit/providers/models/jobstatus.py +0 -77
  358. qiskit/providers/models/pulsedefaults.py +0 -305
  359. qiskit/providers/provider.py +0 -95
  360. qiskit/pulse/__init__.py +0 -158
  361. qiskit/pulse/builder.py +0 -2262
  362. qiskit/pulse/calibration_entries.py +0 -381
  363. qiskit/pulse/channels.py +0 -227
  364. qiskit/pulse/configuration.py +0 -245
  365. qiskit/pulse/exceptions.py +0 -45
  366. qiskit/pulse/filters.py +0 -309
  367. qiskit/pulse/instruction_schedule_map.py +0 -424
  368. qiskit/pulse/instructions/__init__.py +0 -67
  369. qiskit/pulse/instructions/acquire.py +0 -150
  370. qiskit/pulse/instructions/delay.py +0 -71
  371. qiskit/pulse/instructions/directives.py +0 -154
  372. qiskit/pulse/instructions/frequency.py +0 -135
  373. qiskit/pulse/instructions/instruction.py +0 -270
  374. qiskit/pulse/instructions/phase.py +0 -152
  375. qiskit/pulse/instructions/play.py +0 -99
  376. qiskit/pulse/instructions/reference.py +0 -100
  377. qiskit/pulse/instructions/snapshot.py +0 -82
  378. qiskit/pulse/library/__init__.py +0 -97
  379. qiskit/pulse/library/continuous.py +0 -430
  380. qiskit/pulse/library/pulse.py +0 -148
  381. qiskit/pulse/library/samplers/__init__.py +0 -15
  382. qiskit/pulse/library/samplers/decorators.py +0 -295
  383. qiskit/pulse/library/samplers/strategies.py +0 -71
  384. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  385. qiskit/pulse/library/waveform.py +0 -136
  386. qiskit/pulse/macros.py +0 -262
  387. qiskit/pulse/parameter_manager.py +0 -445
  388. qiskit/pulse/parser.py +0 -314
  389. qiskit/pulse/reference_manager.py +0 -58
  390. qiskit/pulse/schedule.py +0 -1854
  391. qiskit/pulse/transforms/__init__.py +0 -106
  392. qiskit/pulse/transforms/alignments.py +0 -406
  393. qiskit/pulse/transforms/base_transforms.py +0 -71
  394. qiskit/pulse/transforms/canonicalization.py +0 -498
  395. qiskit/pulse/transforms/dag.py +0 -122
  396. qiskit/pulse/utils.py +0 -149
  397. qiskit/qobj/__init__.py +0 -75
  398. qiskit/qobj/common.py +0 -81
  399. qiskit/qobj/converters/__init__.py +0 -18
  400. qiskit/qobj/converters/lo_config.py +0 -177
  401. qiskit/qobj/converters/pulse_instruction.py +0 -897
  402. qiskit/qobj/pulse_qobj.py +0 -709
  403. qiskit/qobj/qasm_qobj.py +0 -708
  404. qiskit/qobj/utils.py +0 -46
  405. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  406. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  407. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  408. qiskit/result/mitigation/utils.py +0 -217
  409. qiskit/scheduler/__init__.py +0 -40
  410. qiskit/scheduler/config.py +0 -37
  411. qiskit/scheduler/lowering.py +0 -187
  412. qiskit/scheduler/methods/__init__.py +0 -15
  413. qiskit/scheduler/methods/basic.py +0 -140
  414. qiskit/scheduler/schedule_circuit.py +0 -69
  415. qiskit/scheduler/sequence.py +0 -104
  416. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  417. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  418. qiskit/transpiler/passes/calibration/builders.py +0 -20
  419. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  420. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  421. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  422. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  423. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  424. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  425. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  426. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  427. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  428. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  429. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  430. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  431. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  432. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  433. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  434. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  435. qiskit/utils/deprecate_pulse.py +0 -119
  436. qiskit/utils/multiprocessing.py +0 -56
  437. qiskit/visualization/pulse_v2/__init__.py +0 -21
  438. qiskit/visualization/pulse_v2/core.py +0 -901
  439. qiskit/visualization/pulse_v2/device_info.py +0 -173
  440. qiskit/visualization/pulse_v2/drawings.py +0 -253
  441. qiskit/visualization/pulse_v2/events.py +0 -254
  442. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  443. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  444. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  445. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  446. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  447. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  448. qiskit/visualization/pulse_v2/interface.py +0 -459
  449. qiskit/visualization/pulse_v2/layouts.py +0 -387
  450. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  451. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  452. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  453. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  454. qiskit/visualization/pulse_v2/types.py +0 -242
  455. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.1.dist-info → qiskit-2.0.0rc1.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:
@@ -639,8 +651,7 @@ def _read_custom_operations(file_obj, version, vectors):
639
651
 
640
652
 
641
653
  def _read_calibrations(file_obj, version, vectors, metadata_deserializer):
642
- calibrations = {}
643
-
654
+ """Consume calibrations data, make the file handle point to the next section"""
644
655
  header = formats.CALIBRATION._make(
645
656
  struct.unpack(formats.CALIBRATION_PACK, file_obj.read(formats.CALIBRATION_SIZE))
646
657
  )
@@ -649,21 +660,20 @@ def _read_calibrations(file_obj, version, vectors, metadata_deserializer):
649
660
  struct.unpack(formats.CALIBRATION_DEF_PACK, file_obj.read(formats.CALIBRATION_DEF_SIZE))
650
661
  )
651
662
  name = file_obj.read(defheader.name_size).decode(common.ENCODE)
652
- qubits = tuple(
653
- struct.unpack("!q", file_obj.read(struct.calcsize("!q")))[0]
654
- for _ in range(defheader.num_qubits)
655
- )
656
- params = tuple(
657
- value.read_value(file_obj, version, vectors) for _ in range(defheader.num_params)
658
- )
659
- schedule = schedules.read_schedule_block(file_obj, version, metadata_deserializer)
663
+ if name:
664
+ warnings.warn(
665
+ category=UserWarning,
666
+ message="Support for loading pulse gates has been removed in Qiskit 2.0. "
667
+ f"If `{name}` is in the circuit it will be left as an opaque instruction.",
668
+ )
660
669
 
661
- if name not in calibrations:
662
- calibrations[name] = {(qubits, params): schedule}
663
- else:
664
- calibrations[name][(qubits, params)] = schedule
670
+ for _ in range(defheader.num_qubits): # read qubits info
671
+ file_obj.read(struct.calcsize("!q"))
672
+
673
+ for _ in range(defheader.num_params): # read params info
674
+ value.read_value(file_obj, version, vectors)
665
675
 
666
- return calibrations
676
+ schedules.read_schedule_block(file_obj, version, metadata_deserializer)
667
677
 
668
678
 
669
679
  def _dumps_register(register, index_map):
@@ -746,13 +756,15 @@ def _write_instruction(
746
756
  or isinstance(instruction.operation, library.BlueprintCircuit)
747
757
  ):
748
758
  gate_class_name = instruction.operation.name
749
- if version >= 11:
750
- # Assign a uuid to each instance of a custom operation
759
+ # Assign a uuid to each instance of a custom operation
760
+ if instruction.operation.name not in {"ucrx_dg", "ucry_dg", "ucrz_dg"}:
751
761
  gate_class_name = f"{gate_class_name}_{uuid.uuid4().hex}"
752
- # ucr*_dg gates can have different numbers of parameters,
753
- # the uuid is appended to avoid storing a single definition
754
- # in circuits with multiple ucr*_dg gates.
755
- elif instruction.operation.name in {"ucrx_dg", "ucry_dg", "ucrz_dg"}:
762
+ else:
763
+ # ucr*_dg gates can have different numbers of parameters,
764
+ # the uuid is appended to avoid storing a single definition
765
+ # in circuits with multiple ucr*_dg gates. For legacy reasons
766
+ # the uuid is stored in a different format as this was done
767
+ # prior to QPY 11.
756
768
  gate_class_name = f"{gate_class_name}_{uuid.uuid4()}"
757
769
 
758
770
  custom_operations[gate_class_name] = instruction.operation
@@ -796,6 +808,12 @@ def _write_instruction(
796
808
  instruction.operation.target,
797
809
  tuple(instruction.operation.cases_specifier()),
798
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
+ ]
799
817
  elif isinstance(instruction.operation, Clifford):
800
818
  instruction_params = [instruction.operation.tableau]
801
819
  elif isinstance(instruction.operation, AnnotatedOperation):
@@ -994,34 +1012,6 @@ def _write_custom_operation(
994
1012
  return new_custom_instruction
995
1013
 
996
1014
 
997
- def _write_calibrations(file_obj, calibrations, metadata_serializer, version):
998
- flatten_dict = {}
999
- for gate, caldef in calibrations.items():
1000
- for (qubits, params), schedule in caldef.items():
1001
- key = (gate, qubits, params)
1002
- flatten_dict[key] = schedule
1003
- header = struct.pack(formats.CALIBRATION_PACK, len(flatten_dict))
1004
- file_obj.write(header)
1005
- for (name, qubits, params), schedule in flatten_dict.items():
1006
- # In principle ScheduleBlock and Schedule can be supported.
1007
- # As of version 5 only ScheduleBlock is supported.
1008
- name_bytes = name.encode(common.ENCODE)
1009
- defheader = struct.pack(
1010
- formats.CALIBRATION_DEF_PACK,
1011
- len(name_bytes),
1012
- len(qubits),
1013
- len(params),
1014
- type_keys.Program.assign(schedule),
1015
- )
1016
- file_obj.write(defheader)
1017
- file_obj.write(name_bytes)
1018
- for qubit in qubits:
1019
- file_obj.write(struct.pack("!q", qubit))
1020
- for param in params:
1021
- value.write_value(file_obj, param, version=version)
1022
- schedules.write_schedule_block(file_obj, schedule, metadata_serializer, version=version)
1023
-
1024
-
1025
1015
  def _write_registers(file_obj, in_circ_regs, full_bits):
1026
1016
  bitmap = {bit: index for index, bit in enumerate(full_bits)}
1027
1017
 
@@ -1032,7 +1022,9 @@ def _write_registers(file_obj, in_circ_regs, full_bits):
1032
1022
 
1033
1023
  for regs, is_in_circuit in [(in_circ_regs, True), (out_circ_regs, False)]:
1034
1024
  for reg in regs:
1035
- 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
+ )
1036
1028
  reg_name = reg.name.encode(common.ENCODE)
1037
1029
  reg_type = reg.prefix.encode(common.ENCODE)
1038
1030
  file_obj.write(
@@ -1238,48 +1230,25 @@ def write_circuit(
1238
1230
  num_registers = num_qregs + num_cregs
1239
1231
 
1240
1232
  # Write circuit header
1241
- if version >= 12:
1242
- header_raw = formats.CIRCUIT_HEADER_V12(
1243
- name_size=len(circuit_name),
1244
- global_phase_type=global_phase_type,
1245
- global_phase_size=len(global_phase_data),
1246
- num_qubits=circuit.num_qubits,
1247
- num_clbits=circuit.num_clbits,
1248
- metadata_size=metadata_size,
1249
- num_registers=num_registers,
1250
- num_instructions=num_instructions,
1251
- num_vars=circuit.num_vars,
1252
- )
1253
- header = struct.pack(formats.CIRCUIT_HEADER_V12_PACK, *header_raw)
1254
- file_obj.write(header)
1255
- file_obj.write(circuit_name)
1256
- file_obj.write(global_phase_data)
1257
- file_obj.write(metadata_raw)
1258
- # Write header payload
1259
- file_obj.write(registers_raw)
1260
- standalone_var_indices = value.write_standalone_vars(file_obj, circuit)
1261
- else:
1262
- if circuit.num_vars:
1263
- raise exceptions.UnsupportedFeatureForVersion(
1264
- "circuits containing realtime variables", required=12, target=version
1265
- )
1266
- header_raw = formats.CIRCUIT_HEADER_V2(
1267
- name_size=len(circuit_name),
1268
- global_phase_type=global_phase_type,
1269
- global_phase_size=len(global_phase_data),
1270
- num_qubits=circuit.num_qubits,
1271
- num_clbits=circuit.num_clbits,
1272
- metadata_size=metadata_size,
1273
- num_registers=num_registers,
1274
- num_instructions=num_instructions,
1275
- )
1276
- header = struct.pack(formats.CIRCUIT_HEADER_V2_PACK, *header_raw)
1277
- file_obj.write(header)
1278
- file_obj.write(circuit_name)
1279
- file_obj.write(global_phase_data)
1280
- file_obj.write(metadata_raw)
1281
- file_obj.write(registers_raw)
1282
- standalone_var_indices = {}
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)
1283
1252
 
1284
1253
  instruction_buffer = io.BytesIO()
1285
1254
  custom_operations = {}
@@ -1322,8 +1291,11 @@ def write_circuit(
1322
1291
  file_obj.write(instruction_buffer.getvalue())
1323
1292
  instruction_buffer.close()
1324
1293
 
1325
- # Write calibrations
1326
- _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
+
1327
1299
  _write_layout(file_obj, circuit)
1328
1300
 
1329
1301
 
@@ -1368,7 +1340,7 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
1368
1340
  num_clbits = header["num_clbits"]
1369
1341
  num_registers = header["num_registers"]
1370
1342
  num_instructions = header["num_instructions"]
1371
- num_vars = header.get("num_vars", 0)
1343
+ num_identifiers = header.get("num_vars", 0)
1372
1344
  # `out_registers` is two "name: register" maps segregated by type for the rest of QPY, and
1373
1345
  # `all_registers` is the complete ordered list used to construct the `QuantumCircuit`.
1374
1346
  out_registers = {"q": {}, "c": {}}
@@ -1425,7 +1397,7 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
1425
1397
  "q": [Qubit() for _ in out_bits["q"]],
1426
1398
  "c": [Clbit() for _ in out_bits["c"]],
1427
1399
  }
1428
- 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)
1429
1401
  circ = QuantumCircuit(
1430
1402
  out_bits["q"],
1431
1403
  out_bits["c"],
@@ -1434,10 +1406,15 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
1434
1406
  global_phase=global_phase,
1435
1407
  metadata=metadata,
1436
1408
  inputs=var_segments[type_keys.ExprVarDeclaration.INPUT],
1437
- 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
+ ),
1438
1413
  )
1439
1414
  for declaration in var_segments[type_keys.ExprVarDeclaration.LOCAL]:
1440
1415
  circ.add_uninitialized_var(declaration)
1416
+ for stretch in var_segments[type_keys.ExprVarDeclaration.STRETCH_LOCAL]:
1417
+ circ.add_stretch(stretch)
1441
1418
  custom_operations = _read_custom_operations(file_obj, version, vectors)
1442
1419
  for _instruction in range(num_instructions):
1443
1420
  _read_instruction(
@@ -1451,11 +1428,9 @@ def read_circuit(file_obj, version, metadata_deserializer=None, use_symengine=Fa
1451
1428
  standalone_var_indices,
1452
1429
  )
1453
1430
 
1454
- # Read calibrations
1431
+ # Consume calibrations, but don't use them since pulse gates are not supported as of Qiskit 2.0
1455
1432
  if version >= 5:
1456
- circ._calibrations_prop = _read_calibrations(
1457
- file_obj, version, vectors, metadata_deserializer
1458
- )
1433
+ _read_calibrations(file_obj, version, vectors, metadata_deserializer)
1459
1434
 
1460
1435
  for vec_name, (vector, initialized_params) in vectors.items():
1461
1436
  if len(initialized_params) != len(vector):