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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +236 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +469 -154
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +11 -0
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/circuit/tools/pi_check.py +3 -0
  104. qiskit/compiler/__init__.py +1 -7
  105. qiskit/compiler/transpiler.py +38 -196
  106. qiskit/converters/circuit_to_dag.py +6 -4
  107. qiskit/converters/circuit_to_dagdependency.py +0 -2
  108. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  109. qiskit/converters/circuit_to_gate.py +1 -1
  110. qiskit/converters/circuit_to_instruction.py +16 -29
  111. qiskit/converters/dag_to_circuit.py +7 -8
  112. qiskit/converters/dag_to_dagdependency.py +0 -1
  113. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  114. qiskit/converters/dagdependency_to_circuit.py +0 -6
  115. qiskit/converters/dagdependency_to_dag.py +0 -6
  116. qiskit/dagcircuit/collect_blocks.py +32 -20
  117. qiskit/dagcircuit/dagdependency.py +3 -37
  118. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  119. qiskit/dagcircuit/dagnode.py +14 -2
  120. qiskit/passmanager/__init__.py +24 -6
  121. qiskit/passmanager/passmanager.py +26 -24
  122. qiskit/primitives/__init__.py +44 -35
  123. qiskit/primitives/backend_estimator_v2.py +102 -23
  124. qiskit/primitives/backend_sampler_v2.py +5 -20
  125. qiskit/primitives/base/__init__.py +4 -4
  126. qiskit/primitives/base/base_estimator.py +77 -82
  127. qiskit/primitives/base/base_primitive_job.py +2 -2
  128. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  129. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  130. qiskit/primitives/base/base_sampler.py +52 -60
  131. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  132. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  133. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  134. qiskit/primitives/containers/bindings_array.py +3 -1
  135. qiskit/primitives/containers/bit_array.py +23 -0
  136. qiskit/primitives/containers/data_bin.py +3 -1
  137. qiskit/primitives/containers/observables_array.py +19 -2
  138. qiskit/primitives/statevector_sampler.py +6 -8
  139. qiskit/primitives/utils.py +14 -189
  140. qiskit/providers/__init__.py +4 -130
  141. qiskit/providers/backend.py +11 -314
  142. qiskit/providers/basic_provider/__init__.py +3 -1
  143. qiskit/providers/basic_provider/basic_provider.py +29 -9
  144. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  145. qiskit/providers/exceptions.py +0 -33
  146. qiskit/providers/fake_provider/__init__.py +0 -37
  147. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  148. qiskit/qasm2/__init__.py +21 -6
  149. qiskit/qasm2/export.py +2 -10
  150. qiskit/qasm2/parse.py +11 -25
  151. qiskit/qasm3/__init__.py +5 -1
  152. qiskit/qasm3/ast.py +44 -0
  153. qiskit/qasm3/exporter.py +65 -27
  154. qiskit/qasm3/printer.py +35 -4
  155. qiskit/qpy/__init__.py +162 -19
  156. qiskit/qpy/binary_io/__init__.py +0 -1
  157. qiskit/qpy/binary_io/circuits.py +96 -116
  158. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  159. qiskit/qpy/binary_io/schedules.py +61 -388
  160. qiskit/qpy/binary_io/value.py +159 -33
  161. qiskit/qpy/common.py +10 -7
  162. qiskit/qpy/formats.py +41 -0
  163. qiskit/qpy/interface.py +29 -62
  164. qiskit/qpy/type_keys.py +58 -221
  165. qiskit/quantum_info/analysis/distance.py +3 -1
  166. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  167. qiskit/quantum_info/operators/operator.py +6 -2
  168. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  169. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  170. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  171. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  172. qiskit/quantum_info/states/densitymatrix.py +16 -6
  173. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  174. qiskit/quantum_info/states/statevector.py +16 -6
  175. qiskit/result/__init__.py +5 -17
  176. qiskit/result/models.py +18 -11
  177. qiskit/result/result.py +38 -134
  178. qiskit/result/sampled_expval.py +1 -2
  179. qiskit/result/utils.py +3 -4
  180. qiskit/synthesis/__init__.py +21 -1
  181. qiskit/synthesis/arithmetic/__init__.py +3 -1
  182. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  183. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  184. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  185. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  186. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  187. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  188. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  189. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  190. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  191. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  192. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  193. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  194. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  195. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  196. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  197. qiskit/synthesis/evolution/product_formula.py +44 -35
  198. qiskit/synthesis/evolution/qdrift.py +17 -24
  199. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  200. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  201. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  202. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  203. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  204. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  205. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  206. qiskit/synthesis/two_qubit/__init__.py +1 -0
  207. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  208. qiskit/transpiler/__init__.py +32 -232
  209. qiskit/transpiler/basepasses.py +20 -51
  210. qiskit/transpiler/layout.py +1 -1
  211. qiskit/transpiler/passes/__init__.py +4 -40
  212. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  213. qiskit/transpiler/passes/basis/decompose.py +1 -15
  214. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  215. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  216. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  217. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  218. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  219. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  220. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  221. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  222. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  223. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  224. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  225. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  226. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  227. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  228. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  229. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  230. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  231. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  232. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  233. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  234. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  235. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  236. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  237. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  238. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
  239. qiskit/transpiler/passes/routing/__init__.py +0 -1
  240. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  241. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  242. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  243. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  244. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  245. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  246. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  247. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  248. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  249. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  250. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  251. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  252. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  253. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  254. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  255. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  256. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  257. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  258. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  259. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  260. qiskit/transpiler/passes/utils/__init__.py +0 -1
  261. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  262. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  263. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  264. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  265. qiskit/transpiler/passmanager.py +13 -0
  266. qiskit/transpiler/passmanager_config.py +5 -81
  267. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  268. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  269. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  270. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  272. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  273. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  274. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  275. qiskit/transpiler/target.py +78 -524
  276. qiskit/user_config.py +8 -4
  277. qiskit/utils/__init__.py +13 -12
  278. qiskit/utils/deprecation.py +4 -112
  279. qiskit/utils/optionals.py +11 -4
  280. qiskit/utils/parallel.py +214 -87
  281. qiskit/utils/units.py +4 -1
  282. qiskit/visualization/__init__.py +3 -7
  283. qiskit/visualization/array.py +4 -1
  284. qiskit/visualization/bloch.py +1 -1
  285. qiskit/visualization/circuit/_utils.py +19 -19
  286. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  287. qiskit/visualization/circuit/matplotlib.py +13 -23
  288. qiskit/visualization/circuit/text.py +7 -3
  289. qiskit/visualization/counts_visualization.py +4 -0
  290. qiskit/visualization/dag_visualization.py +2 -1
  291. qiskit/visualization/gate_map.py +39 -154
  292. qiskit/visualization/library.py +4 -1
  293. qiskit/visualization/pass_manager_visualization.py +6 -2
  294. qiskit/visualization/state_visualization.py +19 -2
  295. qiskit/visualization/timeline/core.py +19 -13
  296. qiskit/visualization/timeline/interface.py +19 -18
  297. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  298. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  299. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
  300. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
  301. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  302. qiskit/assembler/__init__.py +0 -42
  303. qiskit/assembler/assemble_circuits.py +0 -451
  304. qiskit/assembler/assemble_schedules.py +0 -367
  305. qiskit/assembler/disassemble.py +0 -310
  306. qiskit/assembler/run_config.py +0 -77
  307. qiskit/circuit/bit.py +0 -106
  308. qiskit/circuit/classicalfunction/__init__.py +0 -152
  309. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  310. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  311. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  312. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  313. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  314. qiskit/circuit/classicalfunction/types.py +0 -18
  315. qiskit/circuit/classicalfunction/utils.py +0 -91
  316. qiskit/circuit/classicalregister.py +0 -57
  317. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  318. qiskit/circuit/quantumregister.py +0 -75
  319. qiskit/circuit/register.py +0 -246
  320. qiskit/compiler/assembler.py +0 -689
  321. qiskit/compiler/scheduler.py +0 -109
  322. qiskit/compiler/sequencer.py +0 -71
  323. qiskit/primitives/backend_estimator.py +0 -486
  324. qiskit/primitives/backend_sampler.py +0 -222
  325. qiskit/primitives/estimator.py +0 -172
  326. qiskit/primitives/sampler.py +0 -162
  327. qiskit/providers/backend_compat.py +0 -507
  328. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  333. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  351. qiskit/providers/fake_provider/fake_1q.py +0 -91
  352. qiskit/providers/fake_provider/fake_backend.py +0 -165
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  357. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  358. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  359. qiskit/providers/models/__init__.py +0 -89
  360. qiskit/providers/models/backendconfiguration.py +0 -1040
  361. qiskit/providers/models/backendproperties.py +0 -535
  362. qiskit/providers/models/backendstatus.py +0 -104
  363. qiskit/providers/models/jobstatus.py +0 -77
  364. qiskit/providers/models/pulsedefaults.py +0 -305
  365. qiskit/providers/provider.py +0 -95
  366. qiskit/pulse/__init__.py +0 -158
  367. qiskit/pulse/builder.py +0 -2262
  368. qiskit/pulse/calibration_entries.py +0 -381
  369. qiskit/pulse/channels.py +0 -227
  370. qiskit/pulse/configuration.py +0 -245
  371. qiskit/pulse/exceptions.py +0 -45
  372. qiskit/pulse/filters.py +0 -309
  373. qiskit/pulse/instruction_schedule_map.py +0 -424
  374. qiskit/pulse/instructions/__init__.py +0 -67
  375. qiskit/pulse/instructions/acquire.py +0 -150
  376. qiskit/pulse/instructions/delay.py +0 -71
  377. qiskit/pulse/instructions/directives.py +0 -154
  378. qiskit/pulse/instructions/frequency.py +0 -135
  379. qiskit/pulse/instructions/instruction.py +0 -270
  380. qiskit/pulse/instructions/phase.py +0 -152
  381. qiskit/pulse/instructions/play.py +0 -99
  382. qiskit/pulse/instructions/reference.py +0 -100
  383. qiskit/pulse/instructions/snapshot.py +0 -82
  384. qiskit/pulse/library/__init__.py +0 -97
  385. qiskit/pulse/library/continuous.py +0 -430
  386. qiskit/pulse/library/pulse.py +0 -148
  387. qiskit/pulse/library/samplers/__init__.py +0 -15
  388. qiskit/pulse/library/samplers/decorators.py +0 -295
  389. qiskit/pulse/library/samplers/strategies.py +0 -71
  390. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  391. qiskit/pulse/library/waveform.py +0 -136
  392. qiskit/pulse/macros.py +0 -262
  393. qiskit/pulse/parameter_manager.py +0 -445
  394. qiskit/pulse/parser.py +0 -314
  395. qiskit/pulse/reference_manager.py +0 -58
  396. qiskit/pulse/schedule.py +0 -1854
  397. qiskit/pulse/transforms/__init__.py +0 -106
  398. qiskit/pulse/transforms/alignments.py +0 -406
  399. qiskit/pulse/transforms/base_transforms.py +0 -71
  400. qiskit/pulse/transforms/canonicalization.py +0 -498
  401. qiskit/pulse/transforms/dag.py +0 -122
  402. qiskit/pulse/utils.py +0 -149
  403. qiskit/qobj/__init__.py +0 -75
  404. qiskit/qobj/common.py +0 -81
  405. qiskit/qobj/converters/__init__.py +0 -18
  406. qiskit/qobj/converters/lo_config.py +0 -177
  407. qiskit/qobj/converters/pulse_instruction.py +0 -897
  408. qiskit/qobj/pulse_qobj.py +0 -709
  409. qiskit/qobj/qasm_qobj.py +0 -708
  410. qiskit/qobj/utils.py +0 -46
  411. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  412. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  413. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  414. qiskit/result/mitigation/utils.py +0 -217
  415. qiskit/scheduler/__init__.py +0 -40
  416. qiskit/scheduler/config.py +0 -37
  417. qiskit/scheduler/lowering.py +0 -187
  418. qiskit/scheduler/methods/__init__.py +0 -15
  419. qiskit/scheduler/methods/basic.py +0 -140
  420. qiskit/scheduler/schedule_circuit.py +0 -69
  421. qiskit/scheduler/sequence.py +0 -104
  422. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  423. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  424. qiskit/transpiler/passes/calibration/builders.py +0 -20
  425. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  426. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  427. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  428. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  429. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  430. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  431. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  432. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  433. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  434. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  435. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  436. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  437. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  438. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  439. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  440. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  441. qiskit/utils/deprecate_pulse.py +0 -119
  442. qiskit/utils/multiprocessing.py +0 -56
  443. qiskit/visualization/pulse_v2/__init__.py +0 -21
  444. qiskit/visualization/pulse_v2/core.py +0 -901
  445. qiskit/visualization/pulse_v2/device_info.py +0 -173
  446. qiskit/visualization/pulse_v2/drawings.py +0 -253
  447. qiskit/visualization/pulse_v2/events.py +0 -254
  448. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  449. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  450. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  451. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  452. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  453. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  454. qiskit/visualization/pulse_v2/interface.py +0 -459
  455. qiskit/visualization/pulse_v2/layouts.py +0 -387
  456. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  457. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  458. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  459. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  460. qiskit/visualization/pulse_v2/types.py +0 -242
  461. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  462. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -50,6 +50,5 @@ def dag_to_dagdependency(dag, create_preds_and_succs=True):
50
50
 
51
51
  # copy metadata
52
52
  dagdependency.global_phase = dag.global_phase
53
- dagdependency._calibrations_prop = dag._calibrations_prop
54
53
 
55
54
  return dagdependency
@@ -27,7 +27,6 @@ def _dag_to_dagdependency_v2(dag):
27
27
  dagdependency.name = dag.name
28
28
  dagdependency.metadata = dag.metadata
29
29
  dagdependency.global_phase = dag.global_phase
30
- dagdependency.calibrations = dag._calibrations_prop
31
30
 
32
31
  dagdependency.add_qubits(dag.qubits)
33
32
  dagdependency.add_clbits(dag.clbits)
@@ -34,12 +34,6 @@ def dagdependency_to_circuit(dagdependency):
34
34
  )
35
35
  circuit.metadata = dagdependency.metadata
36
36
 
37
- if hasattr(dagdependency, "_calibrations_prop"):
38
- circuit._calibrations_prop = dagdependency._calibrations_prop
39
- else:
40
- # This can be _DAGDependencyV2
41
- circuit._calibrations_prop = dagdependency.calibrations
42
-
43
37
  for node in dagdependency.topological_nodes():
44
38
  circuit._append(CircuitInstruction(node.op.copy(), node.qargs, node.cargs))
45
39
 
@@ -12,7 +12,6 @@
12
12
 
13
13
  """Helper function for converting a dag dependency to a dag circuit"""
14
14
  from qiskit.dagcircuit.dagcircuit import DAGCircuit
15
- from qiskit.dagcircuit.dagdependency import DAGDependency
16
15
 
17
16
 
18
17
  def dagdependency_to_dag(dagdependency):
@@ -45,10 +44,5 @@ def dagdependency_to_dag(dagdependency):
45
44
 
46
45
  # copy metadata
47
46
  dagcircuit.global_phase = dagdependency.global_phase
48
- if isinstance(dagdependency, DAGDependency):
49
- dagcircuit._calibrations_prop = dagdependency._calibrations_prop
50
- else:
51
- # This can be _DAGDependencyV2
52
- dagcircuit._calibrations_prop = dagdependency.calibrations
53
47
 
54
48
  return dagcircuit
@@ -139,7 +139,9 @@ class BlockCollector:
139
139
  """Returns whether there are uncollected (pending) nodes"""
140
140
  return len(self._pending_nodes) > 0
141
141
 
142
- def collect_matching_block(self, filter_fn: Callable) -> list[DAGOpNode | DAGDepNode]:
142
+ def collect_matching_block(
143
+ self, filter_fn: Callable, max_block_width: int | None
144
+ ) -> list[DAGOpNode | DAGDepNode]:
143
145
  """Iteratively collects the largest block of input nodes (that is, nodes with
144
146
  ``_in_degree`` equal to 0) that match a given filtering function.
145
147
  Examples of this include collecting blocks of swap gates,
@@ -150,6 +152,7 @@ class BlockCollector:
150
152
  Returns the block of collected nodes.
151
153
  """
152
154
  current_block = []
155
+ current_block_qargs = set()
153
156
  unprocessed_pending_nodes = self._pending_nodes
154
157
  self._pending_nodes = []
155
158
 
@@ -158,19 +161,28 @@ class BlockCollector:
158
161
  # - any node that match filter_fn is added to the current_block,
159
162
  # and some of its successors may be moved to unprocessed_pending_nodes.
160
163
  while unprocessed_pending_nodes:
161
- new_pending_nodes = []
162
- for node in unprocessed_pending_nodes:
163
- if filter_fn(node):
164
- current_block.append(node)
165
-
166
- # update the _in_degree of node's successors
167
- for suc in self._direct_succs(node):
168
- self._in_degree[suc] -= 1
169
- if self._in_degree[suc] == 0:
170
- new_pending_nodes.append(suc)
171
- else:
172
- self._pending_nodes.append(node)
173
- unprocessed_pending_nodes = new_pending_nodes
164
+ node = unprocessed_pending_nodes.pop()
165
+
166
+ if max_block_width is not None:
167
+ # for efficiency, only update new_qargs when max_block_width is specified
168
+ new_qargs = current_block_qargs.copy()
169
+ new_qargs.update(node.qargs)
170
+ width_within_budget = len(new_qargs) <= max_block_width
171
+ else:
172
+ new_qargs = set()
173
+ width_within_budget = True
174
+
175
+ if filter_fn(node) and width_within_budget:
176
+ current_block.append(node)
177
+ current_block_qargs = new_qargs
178
+
179
+ # update the _in_degree of node's successors
180
+ for suc in self._direct_succs(node):
181
+ self._in_degree[suc] -= 1
182
+ if self._in_degree[suc] == 0:
183
+ unprocessed_pending_nodes.append(suc)
184
+ else:
185
+ self._pending_nodes.append(node)
174
186
 
175
187
  return current_block
176
188
 
@@ -181,6 +193,7 @@ class BlockCollector:
181
193
  min_block_size=2,
182
194
  split_layers=False,
183
195
  collect_from_back=False,
196
+ max_block_width=None,
184
197
  ):
185
198
  """Collects all blocks that match a given filtering function filter_fn.
186
199
  This iteratively finds the largest block that does not match filter_fn,
@@ -193,6 +206,8 @@ class BlockCollector:
193
206
  qubit subsets. The option ``split_layers`` allows to split collected blocks
194
207
  into layers of non-overlapping instructions. The option ``min_block_size``
195
208
  specifies the minimum number of gates in the block for the block to be collected.
209
+ The option ``max_block_width`` specificies the maximum number of qubits over
210
+ which a block can be defined.
196
211
 
197
212
  By default, blocks are collected in the direction from the inputs towards the outputs
198
213
  of the circuit. The option ``collect_from_back`` allows to change this direction,
@@ -212,8 +227,8 @@ class BlockCollector:
212
227
  # Iteratively collect non-matching and matching blocks.
213
228
  matching_blocks: list[list[DAGOpNode | DAGDepNode]] = []
214
229
  while self._have_uncollected_nodes():
215
- self.collect_matching_block(not_filter_fn)
216
- matching_block = self.collect_matching_block(filter_fn)
230
+ self.collect_matching_block(not_filter_fn, max_block_width=None)
231
+ matching_block = self.collect_matching_block(filter_fn, max_block_width=max_block_width)
217
232
  if matching_block:
218
233
  matching_blocks.append(matching_block)
219
234
 
@@ -377,10 +392,7 @@ class BlockCollapser:
377
392
  wire_pos_map.update({qb: ix for ix, qb in enumerate(sorted_clbits)})
378
393
 
379
394
  for node in block:
380
- instructions = qc.append(CircuitInstruction(node.op, node.qargs, node.cargs))
381
- cond = getattr(node.op, "_condition", None)
382
- if cond is not None:
383
- instructions.c_if(*cond)
395
+ qc.append(CircuitInstruction(node.op, node.qargs, node.cargs))
384
396
 
385
397
  # Collapse this quantum circuit into an operation.
386
398
  op = collapse_fn(qc)
@@ -17,19 +17,17 @@ from __future__ import annotations
17
17
  import math
18
18
  import heapq
19
19
  import typing
20
- from collections import OrderedDict, defaultdict
20
+ from collections import OrderedDict
21
21
  from collections.abc import Iterator
22
22
 
23
23
  import rustworkx as rx
24
24
 
25
25
  from qiskit.circuit.commutation_library import SessionCommutationChecker as scc
26
26
  from qiskit.circuit.controlflow import condition_resources
27
- from qiskit.circuit.quantumregister import QuantumRegister, Qubit
28
- from qiskit.circuit.classicalregister import ClassicalRegister, Clbit
27
+ from qiskit.circuit import QuantumRegister, Qubit
28
+ from qiskit.circuit import ClassicalRegister, Clbit
29
29
  from qiskit.dagcircuit.exceptions import DAGDependencyError
30
30
  from qiskit.dagcircuit.dagdepnode import DAGDepNode
31
- from qiskit.pulse import Schedule
32
- from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
33
31
 
34
32
  if typing.TYPE_CHECKING:
35
33
  from qiskit.circuit.parameterexpression import ParameterExpression
@@ -115,7 +113,6 @@ class DAGDependency:
115
113
  self.clbits = []
116
114
 
117
115
  self._global_phase: float | ParameterExpression = 0.0
118
- self._calibrations: dict[str, dict[tuple, Schedule]] = defaultdict(dict)
119
116
 
120
117
  self.duration = None
121
118
  self.unit = "dt"
@@ -146,37 +143,6 @@ class DAGDependency:
146
143
  else:
147
144
  self._global_phase = angle % (2 * math.pi)
148
145
 
149
- @property
150
- @deprecate_pulse_dependency(is_property=True)
151
- def calibrations(self) -> dict[str, dict[tuple, Schedule]]:
152
- """Return calibration dictionary.
153
-
154
- The custom pulse definition of a given gate is of the form
155
- ``{'gate_name': {(qubits, params): schedule}}``.
156
- """
157
- return self._calibrations_prop
158
-
159
- @calibrations.setter
160
- @deprecate_pulse_dependency(is_property=True)
161
- def calibrations(self, calibrations: dict[str, dict[tuple, Schedule]]):
162
- """Set the circuit calibration data from a dictionary of calibration definition.
163
-
164
- Args:
165
- calibrations (dict): A dictionary of input in the format
166
- {'gate_name': {(qubits, gate_params): schedule}}
167
- """
168
- self._calibrations_prop = calibrations
169
-
170
- @property
171
- def _calibrations_prop(self) -> dict[str, dict[tuple, Schedule]]:
172
- """An alternative path to be used internally to avoid deprecation warnings"""
173
- return dict(self._calibrations)
174
-
175
- @_calibrations_prop.setter
176
- def _calibrations_prop(self, calibrations: dict[str, dict[tuple, Schedule]]):
177
- """An alternative path to be used internally to avoid deprecation warnings"""
178
- self._calibrations = defaultdict(dict, calibrations)
179
-
180
146
  def to_retworkx(self):
181
147
  """Returns the DAGDependency in retworkx format."""
182
148
  return self._multi_graph
@@ -15,10 +15,9 @@
15
15
 
16
16
  import itertools
17
17
  import math
18
- from collections import OrderedDict, defaultdict, namedtuple
18
+ from collections import OrderedDict, namedtuple
19
19
  from typing import Dict, List, Generator, Any
20
20
 
21
- import numpy as np
22
21
  import rustworkx as rx
23
22
 
24
23
  from qiskit.circuit import (
@@ -26,11 +25,10 @@ from qiskit.circuit import (
26
25
  ClassicalRegister,
27
26
  Qubit,
28
27
  Clbit,
29
- Gate,
30
28
  ParameterExpression,
31
29
  )
32
30
  from qiskit.circuit.controlflow import condition_resources
33
- from qiskit.circuit.bit import Bit
31
+ from qiskit.circuit import Bit
34
32
  from qiskit.dagcircuit.dagnode import DAGOpNode
35
33
  from qiskit.dagcircuit.exceptions import DAGDependencyError
36
34
  from qiskit.circuit.commutation_checker import CommutationChecker
@@ -110,7 +108,6 @@ class _DAGDependencyV2:
110
108
  self._clbit_indices: Dict[Clbit, BitLocations] = {}
111
109
 
112
110
  self._global_phase = 0
113
- self._calibrations = defaultdict(dict)
114
111
 
115
112
  # Map of number of each kind of op, keyed on op name
116
113
  self._op_names = {}
@@ -142,81 +139,6 @@ class _DAGDependencyV2:
142
139
  else:
143
140
  self._global_phase = angle % (2 * math.pi)
144
141
 
145
- @property
146
- def calibrations(self):
147
- """Return calibration dictionary.
148
-
149
- The custom pulse definition of a given gate is of the form
150
- ``{'gate_name': {(qubits, params): schedule}}``.
151
- """
152
- return dict(self._calibrations)
153
-
154
- @calibrations.setter
155
- def calibrations(self, calibrations):
156
- """Set the circuit calibration data from a dictionary of calibration definition.
157
-
158
- Args:
159
- calibrations (dict): A dictionary of input in the format
160
- {'gate_name': {(qubits, gate_params): schedule}}
161
- """
162
- self._calibrations = defaultdict(dict, calibrations)
163
-
164
- def add_calibration(self, gate, qubits, schedule, params=None):
165
- """Register a low-level, custom pulse definition for the given gate.
166
-
167
- Args:
168
- gate (Union[Gate, str]): Gate information.
169
- qubits (Union[int, Tuple[int]]): List of qubits to be measured.
170
- schedule (Schedule): Schedule information.
171
- params (Optional[List[Union[float, Parameter]]]): A list of parameters.
172
-
173
- Raises:
174
- Exception: if the gate is of type string and params is None.
175
- """
176
-
177
- def _format(operand):
178
- try:
179
- # Using float/complex value as a dict key is not good idea.
180
- # This makes the mapping quite sensitive to the rounding error.
181
- # However, the mechanism is already tied to the execution model (i.e. pulse gate)
182
- # and we cannot easily update this rule.
183
- # The same logic exists in QuantumCircuit.add_calibration.
184
- evaluated = complex(operand)
185
- if np.isreal(evaluated):
186
- evaluated = float(evaluated.real)
187
- if evaluated.is_integer():
188
- evaluated = int(evaluated)
189
- return evaluated
190
- except TypeError:
191
- # Unassigned parameter
192
- return operand
193
-
194
- if isinstance(gate, Gate):
195
- params = gate.params
196
- gate = gate.name
197
- if params is not None:
198
- params = tuple(map(_format, params))
199
- else:
200
- params = ()
201
-
202
- self._calibrations[gate][(tuple(qubits), params)] = schedule
203
-
204
- def has_calibration_for(self, node):
205
- """Return True if the dag has a calibration defined for the node operation. In this
206
- case, the operation does not need to be translated to the device basis.
207
- """
208
- if not self.calibrations or node.op.name not in self.calibrations:
209
- return False
210
- qubits = tuple(self.qubits.index(qubit) for qubit in node.qargs)
211
- params = []
212
- for p in node.op.params:
213
- if isinstance(p, ParameterExpression) and not p.parameters:
214
- params.append(float(p))
215
- else:
216
- params.append(p)
217
- params = tuple(params)
218
- return (qubits, params) in self.calibrations[node.op.name]
219
-
220
142
  def size(self):
221
143
  """Returns the number of gates in the circuit"""
222
144
  return len(self._multi_graph)
@@ -525,8 +447,6 @@ class _DAGDependencyV2:
525
447
  target_dag = _DAGDependencyV2()
526
448
  target_dag.name = self.name
527
449
  target_dag._global_phase = self._global_phase
528
- target_dag.duration = self.duration
529
- target_dag.unit = self.unit
530
450
  target_dag.metadata = self.metadata
531
451
  target_dag._key_cache = self._key_cache
532
452
  target_dag.comm_checker = self.comm_checker
@@ -534,6 +454,9 @@ class _DAGDependencyV2:
534
454
  target_dag.add_qubits(self.qubits)
535
455
  target_dag.add_clbits(self.clbits)
536
456
 
457
+ target_dag.duration = self.duration
458
+ target_dag.unit = self.unit
459
+
537
460
  for qreg in self.qregs.values():
538
461
  target_dag.add_qreg(qreg)
539
462
  for creg in self.cregs.values():
@@ -19,6 +19,7 @@ import uuid
19
19
 
20
20
  import qiskit._accelerate.circuit
21
21
  from qiskit.circuit import (
22
+ BoxOp,
22
23
  Clbit,
23
24
  ClassicalRegister,
24
25
  IfElseOp,
@@ -92,8 +93,12 @@ def _make_expr_key(bit_indices):
92
93
 
93
94
 
94
95
  def _condition_op_eq(node1, node2, bit_indices1, bit_indices2):
95
- cond1 = node1.condition
96
- cond2 = node2.condition
96
+ cond1 = None
97
+ cond2 = None
98
+ if node1.is_control_flow():
99
+ cond1 = node1.op.condition
100
+ if node2.is_control_flow():
101
+ cond2 = node2.op.condition
97
102
  if isinstance(cond1, expr.Expr) and isinstance(cond2, expr.Expr):
98
103
  if not expr.structurally_equivalent(
99
104
  cond1, cond2, _make_expr_key(bit_indices1), _make_expr_key(bit_indices2)
@@ -166,11 +171,18 @@ def _for_loop_eq(node1, node2, bit_indices1, bit_indices2):
166
171
  )
167
172
 
168
173
 
174
+ def _box_eq(node1, node2, bit_indices1, bit_indices2):
175
+ return node1.op.duration == node2.op.duration and _circuit_to_dag(
176
+ node1.op.blocks[0], node1.qargs, node1.cargs, bit_indices1
177
+ ) == _circuit_to_dag(node2.op.blocks[0], node2.qargs, node2.cargs, bit_indices2)
178
+
179
+
169
180
  _SEMANTIC_EQ_CONTROL_FLOW = {
170
181
  IfElseOp: _condition_op_eq,
171
182
  WhileLoopOp: _condition_op_eq,
172
183
  SwitchCaseOp: _switch_case_eq,
173
184
  ForLoopOp: _for_loop_eq,
185
+ BoxOp: _box_eq,
174
186
  }
175
187
 
176
188
  _SEMANTIC_EQ_SYMMETRIC = frozenset({"barrier", "swap", "break_loop", "continue_loop"})
@@ -87,7 +87,10 @@ Such task might be easily done by converting the input numbers into string.
87
87
  We use the pass manager framework here, putting the efficiency aside for
88
88
  a moment to learn how to build a custom Qiskit compiler.
89
89
 
90
- .. code-block:: python
90
+ .. plot::
91
+ :include-source:
92
+ :nofigs:
93
+ :context:
91
94
 
92
95
  from qiskit.passmanager import BasePassManager, GenericPass, ConditionalController
93
96
 
@@ -111,7 +114,10 @@ the final conversion.
111
114
 
112
115
  Next, we implement a pass that removes a digit when the number is five.
113
116
 
114
- .. code-block:: python
117
+ .. plot::
118
+ :include-source:
119
+ :nofigs:
120
+ :context:
115
121
 
116
122
  class RemoveFive(GenericPass):
117
123
 
@@ -124,7 +130,10 @@ Finally, we instantiate a pass manager and schedule the task with it.
124
130
  Running the pass manager with random row of numbers returns
125
131
  new numbers that don't contain five.
126
132
 
127
- .. code-block:: python
133
+ .. plot::
134
+ :include-source:
135
+ :nofigs:
136
+ :context:
128
137
 
129
138
  pm = ToyPassManager()
130
139
  pm.append(task)
@@ -143,7 +152,10 @@ six digits or less. Such control can be implemented by a flow controller.
143
152
  We start from an analysis pass that provides the flow controller
144
153
  with information about the number of digits.
145
154
 
146
- .. code-block:: python
155
+ .. plot::
156
+ :include-source:
157
+ :nofigs:
158
+ :context:
147
159
 
148
160
  class CountDigits(GenericPass):
149
161
 
@@ -155,7 +167,10 @@ with information about the number of digits.
155
167
  Then, we wrap the remove five task with the :class:`.ConditionalController`
156
168
  that runs the stored tasks only when the condition is met.
157
169
 
158
- .. code-block:: python
170
+ .. plot::
171
+ :include-source:
172
+ :nofigs:
173
+ :context:
159
174
 
160
175
  def digit_condition(property_set):
161
176
  # Return True when condition is met.
@@ -168,7 +183,10 @@ that runs the stored tasks only when the condition is met.
168
183
 
169
184
  As before, we schedule these passes with the pass manager and run.
170
185
 
171
- .. code-block:: python
186
+ .. plot::
187
+ :include-source:
188
+ :nofigs:
189
+ :context:
172
190
 
173
191
  pm = ToyPassManager()
174
192
  pm.append(analysis_task)
@@ -14,7 +14,6 @@
14
14
  from __future__ import annotations
15
15
 
16
16
  import logging
17
- import warnings
18
17
  from abc import ABC, abstractmethod
19
18
  from collections.abc import Callable, Iterable
20
19
  from itertools import chain
@@ -30,8 +29,6 @@ from .compilation_status import PropertySet, WorkflowStatus, PassManagerState
30
29
 
31
30
  logger = logging.getLogger(__name__)
32
31
 
33
- _MISSING = object()
34
-
35
32
 
36
33
  class BasePassManager(ABC):
37
34
  """Pass manager base class."""
@@ -178,7 +175,7 @@ class BasePassManager(ABC):
178
175
  callback: Callable = None,
179
176
  num_processes: int = None,
180
177
  *,
181
- property_set: object = _MISSING,
178
+ property_set: dict[str, object] | None = None,
182
179
  **kwargs,
183
180
  ) -> Any:
184
181
  """Run all the passes on the specified ``in_programs``.
@@ -216,25 +213,16 @@ class BasePassManager(ABC):
216
213
  execution is enabled. This argument overrides ``num_processes`` in the user
217
214
  configuration file, and the ``QISKIT_NUM_PROCS`` environment variable. If set
218
215
  to ``None`` the system default or local user configuration will be used.
219
- property_set: Currently a key that will be interpreted as all other arbitrary
220
- ``kwargs``. In Qiskit 2.0, this will instead seed the :class:`.PropertySet` of the
221
- compilation (but does not do so in this version).
216
+ property_set: If given, the initial value to use as the :class:`.PropertySet` for the
217
+ pass manager pipeline. This can be used to persist analysis from one run to
218
+ another, in cases where you know the analysis is safe to share. Beware that some
219
+ analysis will be specific to the input circuit and the particular :class:`.Target`,
220
+ so you should take a lot of care when using this argument.
222
221
  kwargs: Arbitrary arguments passed to the compiler frontend and backend.
223
222
 
224
223
  Returns:
225
224
  The transformed program(s).
226
225
  """
227
- if property_set is not _MISSING:
228
- warnings.warn(
229
- "From Qiskit 2.0, 'property_set' will be a reserved keyword argument of"
230
- " 'BasePassManager.run', and not passed on to the conversion functions."
231
- " This subclass of 'BasePassManager' needs to use a different keyword argument"
232
- " for passing on this data.",
233
- FutureWarning,
234
- stacklevel=2,
235
- )
236
- kwargs["property_set"] = property_set
237
-
238
226
  if not self._tasks and not kwargs and callback is None:
239
227
  return in_programs
240
228
 
@@ -247,7 +235,13 @@ class BasePassManager(ABC):
247
235
  # ourselves, since that can be quite expensive.
248
236
  if len(in_programs) == 1 or not should_run_in_parallel(num_processes):
249
237
  out = [
250
- _run_workflow(program=program, pass_manager=self, callback=callback, **kwargs)
238
+ _run_workflow(
239
+ program=program,
240
+ pass_manager=self,
241
+ callback=callback,
242
+ initial_property_set=property_set,
243
+ **kwargs,
244
+ )
251
245
  for program in in_programs
252
246
  ]
253
247
  if len(in_programs) == 1 and not is_list:
@@ -264,7 +258,10 @@ class BasePassManager(ABC):
264
258
  return parallel_map(
265
259
  _run_workflow_in_new_process,
266
260
  values=in_programs,
267
- task_kwargs={"pass_manager_bin": dill.dumps(self)},
261
+ task_kwargs={
262
+ "pass_manager_bin": dill.dumps(self),
263
+ "initial_property_set": property_set,
264
+ },
268
265
  num_processes=num_processes,
269
266
  )
270
267
 
@@ -288,6 +285,8 @@ class BasePassManager(ABC):
288
285
  def _run_workflow(
289
286
  program: Any,
290
287
  pass_manager: BasePassManager,
288
+ *,
289
+ initial_property_set: dict[str, object] | None = None,
291
290
  **kwargs,
292
291
  ) -> Any:
293
292
  """Run single program optimization with a pass manager.
@@ -307,12 +306,12 @@ def _run_workflow(
307
306
  input_program=program,
308
307
  **kwargs,
309
308
  )
309
+ property_set = (
310
+ PropertySet() if initial_property_set is None else PropertySet(initial_property_set)
311
+ )
310
312
  passmanager_ir, final_state = flow_controller.execute(
311
313
  passmanager_ir=passmanager_ir,
312
- state=PassManagerState(
313
- workflow_status=initial_status,
314
- property_set=PropertySet(),
315
- ),
314
+ state=PassManagerState(workflow_status=initial_status, property_set=property_set),
316
315
  callback=kwargs.get("callback", None),
317
316
  )
318
317
  # The `property_set` has historically been returned as a mutable attribute on `PassManager`
@@ -335,6 +334,8 @@ def _run_workflow(
335
334
  def _run_workflow_in_new_process(
336
335
  program: Any,
337
336
  pass_manager_bin: bytes,
337
+ *,
338
+ initial_property_set: dict[str, object] | None,
338
339
  ) -> Any:
339
340
  """Run single program optimization in new process.
340
341
 
@@ -348,4 +349,5 @@ def _run_workflow_in_new_process(
348
349
  return _run_workflow(
349
350
  program=program,
350
351
  pass_manager=dill.loads(pass_manager_bin),
352
+ initial_property_set=initial_property_set,
351
353
  )