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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +236 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +469 -154
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +11 -0
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/circuit/tools/pi_check.py +3 -0
  104. qiskit/compiler/__init__.py +1 -7
  105. qiskit/compiler/transpiler.py +38 -196
  106. qiskit/converters/circuit_to_dag.py +6 -4
  107. qiskit/converters/circuit_to_dagdependency.py +0 -2
  108. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  109. qiskit/converters/circuit_to_gate.py +1 -1
  110. qiskit/converters/circuit_to_instruction.py +16 -29
  111. qiskit/converters/dag_to_circuit.py +7 -8
  112. qiskit/converters/dag_to_dagdependency.py +0 -1
  113. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  114. qiskit/converters/dagdependency_to_circuit.py +0 -6
  115. qiskit/converters/dagdependency_to_dag.py +0 -6
  116. qiskit/dagcircuit/collect_blocks.py +32 -20
  117. qiskit/dagcircuit/dagdependency.py +3 -37
  118. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  119. qiskit/dagcircuit/dagnode.py +14 -2
  120. qiskit/passmanager/__init__.py +24 -6
  121. qiskit/passmanager/passmanager.py +26 -24
  122. qiskit/primitives/__init__.py +44 -35
  123. qiskit/primitives/backend_estimator_v2.py +102 -23
  124. qiskit/primitives/backend_sampler_v2.py +5 -20
  125. qiskit/primitives/base/__init__.py +4 -4
  126. qiskit/primitives/base/base_estimator.py +77 -82
  127. qiskit/primitives/base/base_primitive_job.py +2 -2
  128. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  129. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  130. qiskit/primitives/base/base_sampler.py +52 -60
  131. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  132. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  133. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  134. qiskit/primitives/containers/bindings_array.py +3 -1
  135. qiskit/primitives/containers/bit_array.py +23 -0
  136. qiskit/primitives/containers/data_bin.py +3 -1
  137. qiskit/primitives/containers/observables_array.py +19 -2
  138. qiskit/primitives/statevector_sampler.py +6 -8
  139. qiskit/primitives/utils.py +14 -189
  140. qiskit/providers/__init__.py +4 -130
  141. qiskit/providers/backend.py +11 -314
  142. qiskit/providers/basic_provider/__init__.py +3 -1
  143. qiskit/providers/basic_provider/basic_provider.py +29 -9
  144. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  145. qiskit/providers/exceptions.py +0 -33
  146. qiskit/providers/fake_provider/__init__.py +0 -37
  147. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  148. qiskit/qasm2/__init__.py +21 -6
  149. qiskit/qasm2/export.py +2 -10
  150. qiskit/qasm2/parse.py +11 -25
  151. qiskit/qasm3/__init__.py +5 -1
  152. qiskit/qasm3/ast.py +44 -0
  153. qiskit/qasm3/exporter.py +65 -27
  154. qiskit/qasm3/printer.py +35 -4
  155. qiskit/qpy/__init__.py +162 -19
  156. qiskit/qpy/binary_io/__init__.py +0 -1
  157. qiskit/qpy/binary_io/circuits.py +96 -116
  158. qiskit/qpy/binary_io/parse_sympy_repr.py +121 -0
  159. qiskit/qpy/binary_io/schedules.py +61 -388
  160. qiskit/qpy/binary_io/value.py +159 -33
  161. qiskit/qpy/common.py +10 -7
  162. qiskit/qpy/formats.py +41 -0
  163. qiskit/qpy/interface.py +29 -62
  164. qiskit/qpy/type_keys.py +58 -221
  165. qiskit/quantum_info/analysis/distance.py +3 -1
  166. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  167. qiskit/quantum_info/operators/operator.py +6 -2
  168. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  169. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  170. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  171. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  172. qiskit/quantum_info/states/densitymatrix.py +16 -6
  173. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  174. qiskit/quantum_info/states/statevector.py +16 -6
  175. qiskit/result/__init__.py +5 -17
  176. qiskit/result/models.py +18 -11
  177. qiskit/result/result.py +38 -134
  178. qiskit/result/sampled_expval.py +1 -2
  179. qiskit/result/utils.py +3 -4
  180. qiskit/synthesis/__init__.py +21 -1
  181. qiskit/synthesis/arithmetic/__init__.py +3 -1
  182. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  183. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  184. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  185. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  186. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  187. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  188. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  189. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  190. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  191. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  192. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  193. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  194. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  195. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  196. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  197. qiskit/synthesis/evolution/product_formula.py +44 -35
  198. qiskit/synthesis/evolution/qdrift.py +17 -24
  199. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  200. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  201. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  202. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  203. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  204. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  205. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  206. qiskit/synthesis/two_qubit/__init__.py +1 -0
  207. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  208. qiskit/transpiler/__init__.py +32 -232
  209. qiskit/transpiler/basepasses.py +20 -51
  210. qiskit/transpiler/layout.py +1 -1
  211. qiskit/transpiler/passes/__init__.py +4 -40
  212. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  213. qiskit/transpiler/passes/basis/decompose.py +1 -15
  214. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  215. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  216. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  217. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  218. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  219. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  220. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  221. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  222. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  223. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  224. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  225. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  226. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  227. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  228. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  229. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  230. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  231. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  232. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  233. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  234. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  235. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  236. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  237. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  238. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +3 -2
  239. qiskit/transpiler/passes/routing/__init__.py +0 -1
  240. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  241. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  242. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  243. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  244. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  245. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  246. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  247. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  248. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  249. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  250. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  251. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  252. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  253. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  254. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  255. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  256. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  257. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  258. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  259. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  260. qiskit/transpiler/passes/utils/__init__.py +0 -1
  261. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  262. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  263. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  264. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  265. qiskit/transpiler/passmanager.py +13 -0
  266. qiskit/transpiler/passmanager_config.py +5 -81
  267. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  268. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  269. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  270. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  272. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  273. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  274. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  275. qiskit/transpiler/target.py +78 -524
  276. qiskit/user_config.py +8 -4
  277. qiskit/utils/__init__.py +13 -12
  278. qiskit/utils/deprecation.py +4 -112
  279. qiskit/utils/optionals.py +11 -4
  280. qiskit/utils/parallel.py +214 -87
  281. qiskit/utils/units.py +4 -1
  282. qiskit/visualization/__init__.py +3 -7
  283. qiskit/visualization/array.py +4 -1
  284. qiskit/visualization/bloch.py +1 -1
  285. qiskit/visualization/circuit/_utils.py +19 -19
  286. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  287. qiskit/visualization/circuit/matplotlib.py +13 -23
  288. qiskit/visualization/circuit/text.py +7 -3
  289. qiskit/visualization/counts_visualization.py +4 -0
  290. qiskit/visualization/dag_visualization.py +2 -1
  291. qiskit/visualization/gate_map.py +39 -154
  292. qiskit/visualization/library.py +4 -1
  293. qiskit/visualization/pass_manager_visualization.py +6 -2
  294. qiskit/visualization/state_visualization.py +19 -2
  295. qiskit/visualization/timeline/core.py +19 -13
  296. qiskit/visualization/timeline/interface.py +19 -18
  297. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  298. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  299. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/RECORD +303 -449
  300. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/WHEEL +1 -1
  301. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  302. qiskit/assembler/__init__.py +0 -42
  303. qiskit/assembler/assemble_circuits.py +0 -451
  304. qiskit/assembler/assemble_schedules.py +0 -367
  305. qiskit/assembler/disassemble.py +0 -310
  306. qiskit/assembler/run_config.py +0 -77
  307. qiskit/circuit/bit.py +0 -106
  308. qiskit/circuit/classicalfunction/__init__.py +0 -152
  309. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  310. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  311. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  312. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  313. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  314. qiskit/circuit/classicalfunction/types.py +0 -18
  315. qiskit/circuit/classicalfunction/utils.py +0 -91
  316. qiskit/circuit/classicalregister.py +0 -57
  317. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  318. qiskit/circuit/quantumregister.py +0 -75
  319. qiskit/circuit/register.py +0 -246
  320. qiskit/compiler/assembler.py +0 -689
  321. qiskit/compiler/scheduler.py +0 -109
  322. qiskit/compiler/sequencer.py +0 -71
  323. qiskit/primitives/backend_estimator.py +0 -486
  324. qiskit/primitives/backend_sampler.py +0 -222
  325. qiskit/primitives/estimator.py +0 -172
  326. qiskit/primitives/sampler.py +0 -162
  327. qiskit/providers/backend_compat.py +0 -507
  328. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  333. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  351. qiskit/providers/fake_provider/fake_1q.py +0 -91
  352. qiskit/providers/fake_provider/fake_backend.py +0 -165
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  357. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  358. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  359. qiskit/providers/models/__init__.py +0 -89
  360. qiskit/providers/models/backendconfiguration.py +0 -1040
  361. qiskit/providers/models/backendproperties.py +0 -535
  362. qiskit/providers/models/backendstatus.py +0 -104
  363. qiskit/providers/models/jobstatus.py +0 -77
  364. qiskit/providers/models/pulsedefaults.py +0 -305
  365. qiskit/providers/provider.py +0 -95
  366. qiskit/pulse/__init__.py +0 -158
  367. qiskit/pulse/builder.py +0 -2262
  368. qiskit/pulse/calibration_entries.py +0 -381
  369. qiskit/pulse/channels.py +0 -227
  370. qiskit/pulse/configuration.py +0 -245
  371. qiskit/pulse/exceptions.py +0 -45
  372. qiskit/pulse/filters.py +0 -309
  373. qiskit/pulse/instruction_schedule_map.py +0 -424
  374. qiskit/pulse/instructions/__init__.py +0 -67
  375. qiskit/pulse/instructions/acquire.py +0 -150
  376. qiskit/pulse/instructions/delay.py +0 -71
  377. qiskit/pulse/instructions/directives.py +0 -154
  378. qiskit/pulse/instructions/frequency.py +0 -135
  379. qiskit/pulse/instructions/instruction.py +0 -270
  380. qiskit/pulse/instructions/phase.py +0 -152
  381. qiskit/pulse/instructions/play.py +0 -99
  382. qiskit/pulse/instructions/reference.py +0 -100
  383. qiskit/pulse/instructions/snapshot.py +0 -82
  384. qiskit/pulse/library/__init__.py +0 -97
  385. qiskit/pulse/library/continuous.py +0 -430
  386. qiskit/pulse/library/pulse.py +0 -148
  387. qiskit/pulse/library/samplers/__init__.py +0 -15
  388. qiskit/pulse/library/samplers/decorators.py +0 -295
  389. qiskit/pulse/library/samplers/strategies.py +0 -71
  390. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  391. qiskit/pulse/library/waveform.py +0 -136
  392. qiskit/pulse/macros.py +0 -262
  393. qiskit/pulse/parameter_manager.py +0 -445
  394. qiskit/pulse/parser.py +0 -314
  395. qiskit/pulse/reference_manager.py +0 -58
  396. qiskit/pulse/schedule.py +0 -1854
  397. qiskit/pulse/transforms/__init__.py +0 -106
  398. qiskit/pulse/transforms/alignments.py +0 -406
  399. qiskit/pulse/transforms/base_transforms.py +0 -71
  400. qiskit/pulse/transforms/canonicalization.py +0 -498
  401. qiskit/pulse/transforms/dag.py +0 -122
  402. qiskit/pulse/utils.py +0 -149
  403. qiskit/qobj/__init__.py +0 -75
  404. qiskit/qobj/common.py +0 -81
  405. qiskit/qobj/converters/__init__.py +0 -18
  406. qiskit/qobj/converters/lo_config.py +0 -177
  407. qiskit/qobj/converters/pulse_instruction.py +0 -897
  408. qiskit/qobj/pulse_qobj.py +0 -709
  409. qiskit/qobj/qasm_qobj.py +0 -708
  410. qiskit/qobj/utils.py +0 -46
  411. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  412. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  413. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  414. qiskit/result/mitigation/utils.py +0 -217
  415. qiskit/scheduler/__init__.py +0 -40
  416. qiskit/scheduler/config.py +0 -37
  417. qiskit/scheduler/lowering.py +0 -187
  418. qiskit/scheduler/methods/__init__.py +0 -15
  419. qiskit/scheduler/methods/basic.py +0 -140
  420. qiskit/scheduler/schedule_circuit.py +0 -69
  421. qiskit/scheduler/sequence.py +0 -104
  422. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  423. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  424. qiskit/transpiler/passes/calibration/builders.py +0 -20
  425. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  426. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  427. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  428. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  429. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  430. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  431. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  432. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  433. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  434. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  435. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  436. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  437. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  438. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  439. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  440. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  441. qiskit/utils/deprecate_pulse.py +0 -119
  442. qiskit/utils/multiprocessing.py +0 -56
  443. qiskit/visualization/pulse_v2/__init__.py +0 -21
  444. qiskit/visualization/pulse_v2/core.py +0 -901
  445. qiskit/visualization/pulse_v2/device_info.py +0 -173
  446. qiskit/visualization/pulse_v2/drawings.py +0 -253
  447. qiskit/visualization/pulse_v2/events.py +0 -254
  448. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  449. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  450. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  451. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  452. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  453. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  454. qiskit/visualization/pulse_v2/interface.py +0 -459
  455. qiskit/visualization/pulse_v2/layouts.py +0 -387
  456. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  457. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  458. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  459. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  460. qiskit/visualization/pulse_v2/types.py +0 -242
  461. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  462. {qiskit-1.4.1.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -25,13 +25,13 @@ import typing
25
25
  from typing import Collection, Iterable, FrozenSet, Tuple, Union, Optional, Sequence
26
26
 
27
27
  from qiskit._accelerate.circuit import CircuitData
28
+ from qiskit.circuit import Register
28
29
  from qiskit.circuit.classical import expr
29
- from qiskit.circuit.classicalregister import Clbit, ClassicalRegister
30
+ from qiskit.circuit import Clbit, ClassicalRegister
30
31
  from qiskit.circuit.exceptions import CircuitError
31
32
  from qiskit.circuit.instruction import Instruction
32
33
  from qiskit.circuit.quantumcircuitdata import CircuitInstruction
33
- from qiskit.circuit.quantumregister import Qubit, QuantumRegister
34
- from qiskit.circuit.register import Register
34
+ from qiskit.circuit import Qubit, QuantumRegister
35
35
 
36
36
  from ._builder_utils import condition_resources, node_resources
37
37
 
@@ -121,6 +121,18 @@ class CircuitScopeInterface(abc.ABC):
121
121
  redefines an existing name.
122
122
  """
123
123
 
124
+ @abc.abstractmethod
125
+ def add_stretch(self, stretch: expr.Stretch):
126
+ """Add a stretch to the circuit scope.
127
+
128
+ Args:
129
+ stretch: the stretch to add, if valid.
130
+
131
+ Raises:
132
+ CircuitError: if the stretch cannot be added, such as because it invalidly shadows or
133
+ redefines an existing name.
134
+ """
135
+
124
136
  @abc.abstractmethod
125
137
  def remove_var(self, var: expr.Var):
126
138
  """Remove a variable from the locals of this scope.
@@ -133,6 +145,18 @@ class CircuitScopeInterface(abc.ABC):
133
145
  :meth:`add_uninitialized_var` call.
134
146
  """
135
147
 
148
+ @abc.abstractmethod
149
+ def remove_stretch(self, stretch: expr.Stretch):
150
+ """Remove a stretch from the locals of this scope.
151
+
152
+ This is only called in the case that an exception occurred while initializing the stretch,
153
+ and is not exposed to users.
154
+
155
+ Args:
156
+ stretch: the stretch to remove. It can be assumed that this was already the subject of an
157
+ :meth:`add_stretch` call.
158
+ """
159
+
136
160
  @abc.abstractmethod
137
161
  def use_var(self, var: expr.Var):
138
162
  """Called for every standalone classical real-time variable being used by some circuit
@@ -145,13 +169,21 @@ class CircuitScopeInterface(abc.ABC):
145
169
  Args:
146
170
  var: the variable to validate.
147
171
 
148
- Returns:
149
- the same variable.
150
-
151
172
  Raises:
152
173
  CircuitError: if the variable is not valid for this scope.
153
174
  """
154
175
 
176
+ @abc.abstractmethod
177
+ def use_stretch(self, stretch: expr.Stretch):
178
+ """Called for every stretch being used by some circuit instruction.
179
+
180
+ Args:
181
+ stretch: the stretch to validate.
182
+
183
+ Raises:
184
+ CircuitError: if the stretch is not valid for this scope.
185
+ """
186
+
155
187
  @abc.abstractmethod
156
188
  def get_var(self, name: str) -> Optional[expr.Var]:
157
189
  """Get the variable (if any) in scope with the given name.
@@ -166,6 +198,27 @@ class CircuitScopeInterface(abc.ABC):
166
198
  the variable if it is found, otherwise ``None``.
167
199
  """
168
200
 
201
+ @abc.abstractmethod
202
+ def get_stretch(self, name: str) -> Optional[expr.Stretch]:
203
+ """Get the stretch (if any) in scope with the given name.
204
+
205
+ This should call up to the parent scope if in a control-flow builder scope, in case the
206
+ stretch exists in an outer scope.
207
+
208
+ Args:
209
+ name: the name of the symbol to lookup.
210
+
211
+ Returns:
212
+ the stretch if it is found, otherwise ``None``.
213
+ """
214
+
215
+ @abc.abstractmethod
216
+ def use_qubit(self, qubit: Qubit):
217
+ """Called to mark that a :class:`~.circuit.Qubit` should be considered "used" by this scope,
218
+ without appending an explicit instruction.
219
+
220
+ The subclass may assume that the ``qubit`` is valid for the root scope."""
221
+
169
222
 
170
223
  class InstructionResources(typing.NamedTuple):
171
224
  """The quantum and classical resources used within a particular instruction.
@@ -198,10 +251,12 @@ class InstructionPlaceholder(Instruction, abc.ABC):
198
251
  with qc.for_loop(range(5)):
199
252
  qc.h(0)
200
253
  qc.measure(0, 0)
201
- qc.break_loop().c_if(0, 0)
254
+ with qc.if_test((0, 0)):
255
+ qc.break_loop()
202
256
 
203
- since ``qc.break_loop()`` needs to return a (mostly) functional
204
- :obj:`~qiskit.circuit.Instruction` in order for :meth:`.InstructionSet.c_if` to work correctly.
257
+ ``qc.break_loop()`` needed to return a (mostly) functional
258
+ :obj:`~qiskit.circuit.Instruction` in order for the historical ``.InstructionSet.c_if``
259
+ to work correctly.
205
260
 
206
261
  When appending a placeholder instruction into a circuit scope, you should create the
207
262
  placeholder, and then ask it what resources it should be considered as using from the start by
@@ -234,9 +289,6 @@ class InstructionPlaceholder(Instruction, abc.ABC):
234
289
  The caller of this function is responsible for ensuring that the inputs to this function
235
290
  are non-strict supersets of the bits returned by :meth:`placeholder_resources`.
236
291
 
237
- Any condition added in by a call to :obj:`.Instruction.c_if` will be propagated through, but
238
- set properties like ``duration`` will not; it doesn't make sense for control-flow operations
239
- to have pulse scheduling on them.
240
292
 
241
293
  Args:
242
294
  qubits: The qubits the created instruction should be defined across.
@@ -265,34 +317,9 @@ class InstructionPlaceholder(Instruction, abc.ABC):
265
317
  """
266
318
  raise NotImplementedError
267
319
 
268
- def _copy_mutable_properties(self, instruction: Instruction) -> Instruction:
269
- """Copy mutable properties from ourselves onto a non-placeholder instruction.
270
-
271
- The mutable properties are expected to be things like ``condition``, added onto a
272
- placeholder by the :meth:`c_if` method. This mutates ``instruction``, and returns the same
273
- instance that was passed. This is mostly intended to make writing concrete versions of
274
- :meth:`.concrete_instruction` easy.
275
-
276
- The complete list of mutations is:
277
-
278
- * ``condition``, added by :meth:`c_if`.
279
-
280
- Args:
281
- instruction: the concrete instruction instance to be mutated.
282
-
283
- Returns:
284
- The same instruction instance that was passed, but mutated to propagate the tracked
285
- changes to this class.
286
- """
287
- instruction._condition = self._condition
288
- return instruction
289
-
290
320
  # Provide some better error messages, just in case something goes wrong during development and
291
321
  # the placeholder type leaks out to somewhere visible.
292
322
 
293
- def assemble(self):
294
- raise CircuitError("Cannot assemble a placeholder instruction.")
295
-
296
323
  def repeat(self, n):
297
324
  raise CircuitError("Cannot repeat a placeholder instruction.")
298
325
 
@@ -336,6 +363,8 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
336
363
  "_forbidden_message",
337
364
  "_vars_local",
338
365
  "_vars_capture",
366
+ "_stretches_local",
367
+ "_stretches_capture",
339
368
  )
340
369
 
341
370
  def __init__(
@@ -378,6 +407,8 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
378
407
  self.global_phase = 0.0
379
408
  self._vars_local = {}
380
409
  self._vars_capture = {}
410
+ self._stretches_local = {}
411
+ self._stretches_capture = {}
381
412
  self._allow_jumps = allow_jumps
382
413
  self._parent = parent
383
414
  self._built = False
@@ -467,25 +498,64 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
467
498
  raise CircuitError("Cannot add resources after the scope has been built.")
468
499
  # We can shadow a name if it was declared in an outer scope, but only if we haven't already
469
500
  # captured it ourselves yet.
501
+ if (previous := self._stretches_local.get(var.name)) is not None:
502
+ raise CircuitError(f"cannot add '{var}' as its name shadows the existing '{previous}'")
470
503
  if (previous := self._vars_local.get(var.name)) is not None:
471
504
  if previous == var:
472
505
  raise CircuitError(f"'{var}' is already present in the scope")
473
506
  raise CircuitError(f"cannot add '{var}' as its name shadows the existing '{previous}'")
474
- if var.name in self._vars_capture:
507
+ if var.name in self._vars_capture or var.name in self._stretches_capture:
475
508
  raise CircuitError(f"cannot add '{var}' as its name shadows the existing '{previous}'")
476
509
  self._vars_local[var.name] = var
477
510
 
511
+ def add_stretch(self, stretch: expr.Stretch):
512
+ if self._built:
513
+ raise CircuitError("Cannot add resources after the scope has been built.")
514
+ # We can shadow a name if it was declared in an outer scope, but only if we haven't already
515
+ # captured it ourselves yet.
516
+ if (previous := self._vars_local.get(stretch.name)) is not None:
517
+ raise CircuitError(
518
+ f"cannot add '{stretch}' as its name shadows the existing '{previous}'"
519
+ )
520
+ if (previous := self._stretches_local.get(stretch.name)) is not None:
521
+ if previous == stretch:
522
+ raise CircuitError(f"'{stretch}' is already present in the scope")
523
+ raise CircuitError(
524
+ f"cannot add '{stretch}' as its name shadows the existing '{previous}'"
525
+ )
526
+ if stretch.name in self._vars_capture or stretch.name in self._stretches_capture:
527
+ raise CircuitError(
528
+ f"cannot add '{stretch}' as its name shadows the existing '{previous}'"
529
+ )
530
+ self._stretches_local[stretch.name] = stretch
531
+
478
532
  def remove_var(self, var: expr.Var):
479
533
  if self._built:
480
534
  raise RuntimeError("exception handler 'remove_var' called after scope built")
481
535
  self._vars_local.pop(var.name)
482
536
 
537
+ def remove_stretch(self, stretch: expr.Stretch):
538
+ if self._built:
539
+ raise RuntimeError("exception handler 'remove_stretch' called after scope built")
540
+ self._stretches_local.pop(stretch.name)
541
+
483
542
  def get_var(self, name: str):
543
+ if name in self._stretches_local:
544
+ return None
484
545
  if (out := self._vars_local.get(name)) is not None:
485
546
  return out
486
547
  return self._parent.get_var(name)
487
548
 
549
+ def get_stretch(self, name: str):
550
+ if name in self._vars_local:
551
+ return None
552
+ if (out := self._stretches_local.get(name)) is not None:
553
+ return out
554
+ return self._parent.get_stretch(name)
555
+
488
556
  def use_var(self, var: expr.Var):
557
+ if (local := self._stretches_local.get(var.name)) is not None:
558
+ raise CircuitError(f"cannot use '{var}' which is shadowed by the local '{local}'")
489
559
  if (local := self._vars_local.get(var.name)) is not None:
490
560
  if local == var:
491
561
  return
@@ -497,14 +567,39 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
497
567
  self._parent.use_var(var)
498
568
  self._vars_capture[var.name] = var
499
569
 
570
+ def use_stretch(self, stretch: expr.Stretch):
571
+ if (local := self._vars_local.get(stretch.name)) is not None:
572
+ raise CircuitError(f"cannot use '{stretch}' which is shadowed by the local '{local}'")
573
+ if (local := self._stretches_local.get(stretch.name)) is not None:
574
+ if local == stretch:
575
+ return
576
+ raise CircuitError(f"cannot use '{stretch}' which is shadowed by the local '{local}'")
577
+ if self._stretches_capture.get(stretch.name) == stretch:
578
+ return
579
+ if self._parent.get_stretch(stretch.name) != stretch:
580
+ raise CircuitError(f"cannot close over '{stretch}', which is not in scope")
581
+ self._parent.use_stretch(stretch)
582
+ self._stretches_capture[stretch.name] = stretch
583
+
584
+ def use_qubit(self, qubit: Qubit):
585
+ self._instructions.add_qubit(qubit, strict=False)
586
+
500
587
  def iter_local_vars(self):
501
588
  """Iterator over the variables currently declared in this scope."""
502
589
  return self._vars_local.values()
503
590
 
591
+ def iter_local_stretches(self):
592
+ """Iterator over the stretches currently declared in this scope."""
593
+ return self._stretches_local.values()
594
+
504
595
  def iter_captured_vars(self):
505
596
  """Iterator over the variables currently captured in this scope."""
506
597
  return self._vars_capture.values()
507
598
 
599
+ def iter_captured_stretches(self):
600
+ """Iterator over the stretches currently captured in this scope."""
601
+ return self._stretches_capture.values()
602
+
508
603
  def peek(self) -> CircuitInstruction:
509
604
  """Get the value of the most recent instruction tuple in this scope."""
510
605
  if not self._instructions:
@@ -605,13 +700,16 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
605
700
  self._instructions.clbits,
606
701
  *self.registers,
607
702
  global_phase=self.global_phase,
608
- captures=self._vars_capture.values(),
703
+ captures=itertools.chain(self._vars_capture.values(), self._stretches_capture.values()),
609
704
  )
610
705
  for var in self._vars_local.values():
611
706
  # The requisite `Store` instruction to initialise the variable will have been appended
612
707
  # into the instructions.
613
708
  out.add_uninitialized_var(var)
614
709
 
710
+ for var in self._stretches_local.values():
711
+ out.add_stretch(var)
712
+
615
713
  # Maps placeholder index to the newly concrete instruction.
616
714
  placeholder_to_concrete = {}
617
715
 
@@ -685,6 +783,8 @@ class ControlFlowBuilderBlock(CircuitScopeInterface):
685
783
  out.global_phase = self.global_phase
686
784
  out._vars_local = self._vars_local.copy()
687
785
  out._vars_capture = self._vars_capture.copy()
786
+ out._stretches_local = self._stretches_local.copy()
787
+ out._stretches_capture = self._stretches_capture.copy()
688
788
  out._parent = self._parent
689
789
  out._allow_jumps = self._allow_jumps
690
790
  out._forbidden_message = self._forbidden_message
@@ -48,9 +48,7 @@ class ContinueLoopPlaceholder(InstructionPlaceholder):
48
48
 
49
49
  def concrete_instruction(self, qubits, clbits):
50
50
  return (
51
- self._copy_mutable_properties(
52
- ContinueLoopOp(len(qubits), len(clbits), label=self.label)
53
- ),
51
+ ContinueLoopOp(len(qubits), len(clbits), label=self.label),
54
52
  InstructionResources(qubits=tuple(qubits), clbits=tuple(clbits)),
55
53
  )
56
54
 
@@ -82,3 +82,13 @@ class ControlFlowOp(Instruction, ABC):
82
82
  if var not in seen:
83
83
  seen.add(var)
84
84
  yield var
85
+
86
+ def iter_captured_stretches(self) -> typing.Iterable[expr.Stretch]:
87
+ """Get an iterator over the unique captured stretch variables in all blocks of this
88
+ construct."""
89
+ seen = set()
90
+ for block in self.blocks:
91
+ for stretch in block.iter_captured_stretches():
92
+ if stretch not in seen:
93
+ seen.add(stretch)
94
+ yield stretch
@@ -138,7 +138,8 @@ class ForLoopContext:
138
138
  qc.rx(i * math.pi/4, 0)
139
139
  qc.cx(0, 1)
140
140
  qc.measure(0, 0)
141
- qc.break_loop().c_if(0, True)
141
+ with qc.if_test((0, True)):
142
+ qc.break_loop()
142
143
 
143
144
  This context should almost invariably be created by a :meth:`.QuantumCircuit.for_loop` call, and
144
145
  the resulting instance is a "friend" of the calling circuit. The context will manipulate the
@@ -17,7 +17,7 @@ from __future__ import annotations
17
17
  from typing import Optional, Union, Iterable, TYPE_CHECKING
18
18
  import itertools
19
19
 
20
- from qiskit.circuit.classicalregister import ClassicalRegister, Clbit
20
+ from qiskit.circuit import ClassicalRegister, Clbit # pylint: disable=cyclic-import
21
21
  from qiskit.circuit.classical import expr
22
22
  from qiskit.circuit.instructionset import InstructionSet
23
23
  from qiskit.circuit.exceptions import CircuitError
@@ -95,6 +95,7 @@ class IfElseOp(ControlFlowOp):
95
95
 
96
96
  @property
97
97
  def condition(self):
98
+ """The condition for the if else operation."""
98
99
  return self._condition
99
100
 
100
101
  @condition.setter
@@ -162,12 +163,6 @@ class IfElseOp(ControlFlowOp):
162
163
  )
163
164
  return IfElseOp(self._condition, true_body, false_body=false_body, label=self.label)
164
165
 
165
- def c_if(self, classical, val):
166
- raise NotImplementedError(
167
- "IfElseOp cannot be classically controlled through Instruction.c_if. "
168
- "Please nest it in an IfElseOp instead."
169
- )
170
-
171
166
 
172
167
  class IfElsePlaceholder(InstructionPlaceholder):
173
168
  """A placeholder instruction to use in control-flow context managers, when calculating the
@@ -295,9 +290,7 @@ class IfElsePlaceholder(InstructionPlaceholder):
295
290
  (true_body, self.__false_block.build(qubits, clbits))
296
291
  )
297
292
  return (
298
- self._copy_mutable_properties(
299
- IfElseOp(self._condition, true_body, false_body, label=self.label)
300
- ),
293
+ IfElseOp(self._condition, true_body, false_body, label=self.label),
301
294
  InstructionResources(
302
295
  qubits=tuple(true_body.qubits),
303
296
  clbits=tuple(true_body.clbits),
@@ -306,12 +299,6 @@ class IfElsePlaceholder(InstructionPlaceholder):
306
299
  ),
307
300
  )
308
301
 
309
- def c_if(self, classical, val):
310
- raise NotImplementedError(
311
- "IfElseOp cannot be classically controlled through Instruction.c_if. "
312
- "Please nest it in another IfElseOp instead."
313
- )
314
-
315
302
 
316
303
  class IfContext:
317
304
  """A context manager for building up ``if`` statements onto circuits in a natural order, without
@@ -19,7 +19,7 @@ __all__ = ("SwitchCaseOp", "CASE_DEFAULT")
19
19
  import contextlib
20
20
  from typing import Union, Iterable, Any, Tuple, Optional, List, Literal, TYPE_CHECKING
21
21
 
22
- from qiskit.circuit.classicalregister import ClassicalRegister, Clbit
22
+ from qiskit.circuit import ClassicalRegister, Clbit # pylint: disable=cyclic-import
23
23
  from qiskit.circuit.classical import expr, types
24
24
  from qiskit.circuit.exceptions import CircuitError
25
25
 
@@ -182,12 +182,6 @@ class SwitchCaseOp(ControlFlowOp):
182
182
  raise CircuitError(f"needed {len(self._case_map)} blocks but received {len(blocks)}")
183
183
  return SwitchCaseOp(self.target, zip(self._label_spec, blocks))
184
184
 
185
- def c_if(self, classical, val):
186
- raise NotImplementedError(
187
- "SwitchCaseOp cannot be classically controlled through Instruction.c_if. "
188
- "Please nest it in an IfElseOp instead."
189
- )
190
-
191
185
 
192
186
  class SwitchCasePlaceholder(InstructionPlaceholder):
193
187
  """A placeholder instruction to use in control-flow context managers, when calculating the
@@ -269,7 +263,7 @@ class SwitchCasePlaceholder(InstructionPlaceholder):
269
263
  else:
270
264
  resources = self.__resources
271
265
  return (
272
- self._copy_mutable_properties(SwitchCaseOp(self.__target, cases, label=self.label)),
266
+ SwitchCaseOp(self.__target, cases, label=self.label),
273
267
  resources,
274
268
  )
275
269
 
@@ -16,7 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  from typing import TYPE_CHECKING
18
18
 
19
- from qiskit.circuit.classicalregister import Clbit, ClassicalRegister
19
+ from qiskit.circuit import ClassicalRegister, Clbit # pylint: disable=cyclic-import
20
20
  from qiskit.circuit.classical import expr
21
21
  from qiskit.circuit.exceptions import CircuitError
22
22
  from ._builder_utils import validate_condition, condition_resources
@@ -61,6 +61,7 @@ class WhileLoopOp(ControlFlowOp):
61
61
 
62
62
  @property
63
63
  def condition(self):
64
+ """The condition for the while loop."""
64
65
  return self._condition
65
66
 
66
67
  @condition.setter
@@ -98,12 +99,6 @@ class WhileLoopOp(ControlFlowOp):
98
99
  (body,) = blocks
99
100
  return WhileLoopOp(self._condition, body, label=self.label)
100
101
 
101
- def c_if(self, classical, val):
102
- raise NotImplementedError(
103
- "WhileLoopOp cannot be classically controlled through Instruction.c_if. "
104
- "Please use an IfElseOp instead."
105
- )
106
-
107
102
 
108
103
  class WhileLoopContext:
109
104
  """A context manager for building up while loops onto circuits in a natural order, without
@@ -19,9 +19,9 @@ from typing import Optional, Union
19
19
  from qiskit.circuit.exceptions import CircuitError
20
20
 
21
21
  # pylint: disable=cyclic-import
22
+ from . import QuantumRegister
22
23
  from .quantumcircuit import QuantumCircuit
23
24
  from .gate import Gate
24
- from .quantumregister import QuantumRegister
25
25
  from ._utils import _ctrl_state_to_int
26
26
 
27
27
 
@@ -38,8 +38,6 @@ class ControlledGate(Gate):
38
38
  definition: Optional["QuantumCircuit"] = None,
39
39
  ctrl_state: Optional[Union[int, str]] = None,
40
40
  base_gate: Optional[Gate] = None,
41
- duration=None,
42
- unit=None,
43
41
  *,
44
42
  _base_label=None,
45
43
  ):
@@ -101,7 +99,7 @@ class ControlledGate(Gate):
101
99
  qc2.draw('mpl')
102
100
  """
103
101
  self.base_gate = None if base_gate is None else base_gate.copy()
104
- super().__init__(name, num_qubits, params, label=label, duration=duration, unit=unit)
102
+ super().__init__(name, num_qubits, params, label=label)
105
103
  self._num_ctrl_qubits = 1
106
104
  self.num_ctrl_qubits = num_ctrl_qubits
107
105
  self.definition = copy.deepcopy(definition)
qiskit/circuit/delay.py CHANGED
@@ -14,25 +14,51 @@
14
14
  Delay instruction (for circuit module).
15
15
  """
16
16
  import numpy as np
17
+
18
+ from qiskit.circuit.classical import expr, types
17
19
  from qiskit.circuit.exceptions import CircuitError
18
20
  from qiskit.circuit.instruction import Instruction
19
21
  from qiskit.circuit.gate import Gate
20
22
  from qiskit.circuit import _utils
21
23
  from qiskit.circuit.parameterexpression import ParameterExpression
22
- from qiskit.utils import deprecate_func
24
+ from qiskit._accelerate.circuit import StandardInstructionType
23
25
 
24
26
 
25
27
  @_utils.with_gate_array(np.eye(2, dtype=complex))
26
28
  class Delay(Instruction):
27
29
  """Do nothing and just delay/wait/idle for a specified duration."""
28
30
 
29
- def __init__(self, duration, unit="dt"):
31
+ _standard_instruction_type = StandardInstructionType.Delay
32
+
33
+ def __init__(self, duration, unit=None):
30
34
  """
31
35
  Args:
32
- duration: the length of time of the duration. Given in units of ``unit``.
33
- unit: the unit of the duration. Must be ``"dt"`` or an SI-prefixed seconds unit.
36
+ duration: the length of time of the duration. If this is an
37
+ :class:`~.expr.Expr`, it must be a constant expression of type
38
+ :class:`~.types.Duration` and the ``unit`` parameter should be
39
+ omitted (or MUST be "expr" if it is specified).
40
+ unit: the unit of the duration, if ``duration`` is a numeric
41
+ value. Must be ``"dt"``, an SI-prefixed seconds unit, or "expr".
42
+
43
+ Raises:
44
+ CircuitError: A ``duration`` expression was specified with a resolved
45
+ type that is not timing-based, or the ``unit`` was improperly specified.
34
46
  """
35
- if unit not in {"s", "ms", "us", "ns", "ps", "dt"}:
47
+ if isinstance(duration, expr.Expr):
48
+ if unit is not None and unit != "expr":
49
+ raise CircuitError(
50
+ "Argument 'unit' must not be specified for a duration expression."
51
+ )
52
+ if duration.type.kind is not types.Duration:
53
+ raise CircuitError(
54
+ f"Expression of type '{duration.type}' is not valid for 'duration'."
55
+ )
56
+ if not duration.const:
57
+ raise CircuitError("Duration expressions must be constant.")
58
+ unit = "expr"
59
+ elif unit is None:
60
+ unit = "dt"
61
+ elif unit not in {"s", "ms", "us", "ns", "ps", "dt"}:
36
62
  raise CircuitError(f"Unknown unit {unit} is specified.")
37
63
  # Double underscore to differentiate from the private attribute in
38
64
  # `Instruction`. This can be changed to `_unit` in 2.0 after we
@@ -47,13 +73,9 @@ class Delay(Instruction):
47
73
  """Special case. Return self."""
48
74
  return self
49
75
 
50
- @deprecate_func(since="1.3.0", removal_timeline="in 2.0.0")
51
- def c_if(self, classical, val):
52
- raise CircuitError("Conditional Delay is not yet implemented.")
53
-
54
76
  @property
55
77
  def unit(self):
56
-
78
+ """The unit for the duration of the delay in :attr`.params`"""
57
79
  return self.__unit
58
80
 
59
81
  @unit.setter
@@ -90,8 +112,9 @@ class Delay(Instruction):
90
112
  """Return the official string representing the delay."""
91
113
  return f"{self.__class__.__name__}(duration={self.params[0]}[unit={self.unit}])"
92
114
 
115
+ # pylint: disable=too-many-return-statements
93
116
  def validate_parameter(self, parameter):
94
- """Delay parameter (i.e. duration) must be int, float or ParameterExpression."""
117
+ """Delay parameter (i.e. duration) must be Expr, int, float or ParameterExpression."""
95
118
  if isinstance(parameter, int):
96
119
  if parameter < 0:
97
120
  raise CircuitError(
@@ -109,6 +132,12 @@ class Delay(Instruction):
109
132
  raise CircuitError("Integer duration is expected for 'dt' unit.")
110
133
  return parameter_int
111
134
  return parameter
135
+ elif isinstance(parameter, expr.Expr):
136
+ if parameter.type.kind is not types.Duration:
137
+ raise CircuitError(f"Expression duration of type '{parameter.type}' is not valid.")
138
+ if not parameter.const:
139
+ raise CircuitError("Duration expressions must be constant.")
140
+ return parameter
112
141
  elif isinstance(parameter, ParameterExpression):
113
142
  if len(parameter.parameters) > 0:
114
143
  return parameter # expression has free parameters, we cannot validate it
@@ -63,21 +63,6 @@ def convert_durations_to_dt(qc: QuantumCircuit, dt_in_sec: float, inplace=True):
63
63
  else:
64
64
  circ = qc.copy()
65
65
 
66
- for instruction in circ.data:
67
- operation = instruction.operation
68
- if operation.unit == "dt" or operation.duration is None:
69
- continue
70
-
71
- if not operation.unit.endswith("s"):
72
- raise CircuitError(f"Invalid time unit: '{operation.unit}'")
73
-
74
- duration = operation.duration
75
- if operation.unit != "s":
76
- duration = apply_prefix(duration, operation.unit)
77
-
78
- operation.duration = duration_in_dt(duration, dt_in_sec)
79
- operation.unit = "dt"
80
-
81
66
  if circ.duration is not None and circ.unit != "dt":
82
67
  if not circ.unit.endswith("s"):
83
68
  raise CircuitError(f"Invalid time unit: '{circ.unit}'")
qiskit/circuit/gate.py CHANGED
@@ -31,8 +31,6 @@ class Gate(Instruction):
31
31
  num_qubits: int,
32
32
  params: list,
33
33
  label: str | None = None,
34
- duration=None,
35
- unit="dt",
36
34
  ) -> None:
37
35
  """Create a new gate.
38
36
 
@@ -43,7 +41,7 @@ class Gate(Instruction):
43
41
  label: An optional label for the gate.
44
42
  """
45
43
  self.definition = None
46
- super().__init__(name, num_qubits, 0, params, label=label, duration=duration, unit=unit)
44
+ super().__init__(name, num_qubits, 0, params, label=label)
47
45
 
48
46
  # Set higher priority than Numpy array and matrix classes
49
47
  __array_priority__ = 20
@@ -137,7 +135,7 @@ class Gate(Instruction):
137
135
  """
138
136
  if not annotated: # captures both None and False
139
137
  # pylint: disable=cyclic-import
140
- from .add_control import add_control
138
+ from ._add_control import add_control
141
139
 
142
140
  return add_control(self, num_ctrl_qubits, label, ctrl_state)
143
141