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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (459) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +236 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +469 -154
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +7 -1
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/compiler/__init__.py +1 -7
  104. qiskit/compiler/transpiler.py +38 -196
  105. qiskit/converters/circuit_to_dag.py +6 -4
  106. qiskit/converters/circuit_to_dagdependency.py +0 -2
  107. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  108. qiskit/converters/circuit_to_gate.py +1 -1
  109. qiskit/converters/circuit_to_instruction.py +16 -29
  110. qiskit/converters/dag_to_circuit.py +7 -8
  111. qiskit/converters/dag_to_dagdependency.py +0 -1
  112. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  113. qiskit/converters/dagdependency_to_circuit.py +0 -6
  114. qiskit/converters/dagdependency_to_dag.py +0 -6
  115. qiskit/dagcircuit/collect_blocks.py +32 -20
  116. qiskit/dagcircuit/dagdependency.py +3 -37
  117. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  118. qiskit/dagcircuit/dagnode.py +14 -2
  119. qiskit/passmanager/__init__.py +24 -6
  120. qiskit/passmanager/passmanager.py +26 -24
  121. qiskit/primitives/__init__.py +44 -35
  122. qiskit/primitives/backend_estimator_v2.py +102 -23
  123. qiskit/primitives/backend_sampler_v2.py +5 -20
  124. qiskit/primitives/base/__init__.py +4 -4
  125. qiskit/primitives/base/base_estimator.py +77 -82
  126. qiskit/primitives/base/base_primitive_job.py +2 -2
  127. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  128. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  129. qiskit/primitives/base/base_sampler.py +52 -60
  130. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  131. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  132. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  133. qiskit/primitives/containers/bindings_array.py +3 -1
  134. qiskit/primitives/containers/bit_array.py +23 -0
  135. qiskit/primitives/containers/data_bin.py +3 -1
  136. qiskit/primitives/containers/observables_array.py +19 -2
  137. qiskit/primitives/statevector_sampler.py +6 -8
  138. qiskit/primitives/utils.py +14 -189
  139. qiskit/providers/__init__.py +4 -130
  140. qiskit/providers/backend.py +11 -314
  141. qiskit/providers/basic_provider/__init__.py +3 -1
  142. qiskit/providers/basic_provider/basic_provider.py +29 -9
  143. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  144. qiskit/providers/exceptions.py +0 -33
  145. qiskit/providers/fake_provider/__init__.py +0 -37
  146. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  147. qiskit/qasm2/__init__.py +21 -6
  148. qiskit/qasm2/export.py +2 -10
  149. qiskit/qasm2/parse.py +11 -25
  150. qiskit/qasm3/__init__.py +5 -1
  151. qiskit/qasm3/ast.py +44 -0
  152. qiskit/qasm3/exporter.py +65 -27
  153. qiskit/qasm3/printer.py +35 -4
  154. qiskit/qpy/__init__.py +162 -19
  155. qiskit/qpy/binary_io/__init__.py +0 -1
  156. qiskit/qpy/binary_io/circuits.py +98 -130
  157. qiskit/qpy/binary_io/schedules.py +69 -439
  158. qiskit/qpy/binary_io/value.py +154 -31
  159. qiskit/qpy/common.py +10 -7
  160. qiskit/qpy/formats.py +41 -0
  161. qiskit/qpy/interface.py +34 -81
  162. qiskit/qpy/type_keys.py +58 -221
  163. qiskit/quantum_info/analysis/distance.py +3 -1
  164. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  165. qiskit/quantum_info/operators/operator.py +6 -2
  166. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  167. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  168. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  169. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  170. qiskit/quantum_info/states/densitymatrix.py +16 -6
  171. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  172. qiskit/quantum_info/states/statevector.py +16 -6
  173. qiskit/result/__init__.py +5 -17
  174. qiskit/result/models.py +18 -11
  175. qiskit/result/result.py +38 -134
  176. qiskit/result/sampled_expval.py +1 -2
  177. qiskit/result/utils.py +3 -4
  178. qiskit/synthesis/__init__.py +21 -1
  179. qiskit/synthesis/arithmetic/__init__.py +3 -1
  180. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  182. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  183. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  184. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  185. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  186. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  188. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  189. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  190. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  191. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  192. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  193. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  194. qiskit/synthesis/evolution/product_formula.py +44 -35
  195. qiskit/synthesis/evolution/qdrift.py +17 -24
  196. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  197. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  198. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  199. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  200. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  201. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  202. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  203. qiskit/synthesis/two_qubit/__init__.py +1 -0
  204. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  205. qiskit/transpiler/__init__.py +32 -232
  206. qiskit/transpiler/basepasses.py +20 -51
  207. qiskit/transpiler/layout.py +1 -1
  208. qiskit/transpiler/passes/__init__.py +4 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  210. qiskit/transpiler/passes/basis/decompose.py +1 -15
  211. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  212. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  213. qiskit/transpiler/passes/layout/apply_layout.py +4 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -4
  216. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  217. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  218. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  219. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  220. qiskit/transpiler/passes/optimization/__init__.py +2 -3
  221. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  222. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  224. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  225. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  226. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  227. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  228. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  229. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  230. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  231. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  232. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  233. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  234. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  235. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  236. qiskit/transpiler/passes/routing/__init__.py +0 -1
  237. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  238. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  239. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  240. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  241. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  242. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  243. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  244. qiskit/transpiler/passes/scheduling/padding/base_padding.py +32 -4
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  247. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  248. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  249. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  250. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +134 -62
  251. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  252. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  253. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  254. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  255. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  256. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  257. qiskit/transpiler/passes/utils/__init__.py +0 -1
  258. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  259. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  260. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  261. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  262. qiskit/transpiler/passmanager.py +13 -0
  263. qiskit/transpiler/passmanager_config.py +5 -81
  264. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  265. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  266. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +107 -322
  267. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  268. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  269. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  270. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  272. qiskit/transpiler/target.py +78 -524
  273. qiskit/user_config.py +8 -4
  274. qiskit/utils/__init__.py +13 -12
  275. qiskit/utils/deprecation.py +4 -112
  276. qiskit/utils/optionals.py +11 -4
  277. qiskit/utils/parallel.py +214 -87
  278. qiskit/utils/units.py +4 -1
  279. qiskit/visualization/__init__.py +3 -7
  280. qiskit/visualization/array.py +4 -1
  281. qiskit/visualization/bloch.py +1 -1
  282. qiskit/visualization/circuit/_utils.py +19 -19
  283. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  284. qiskit/visualization/circuit/matplotlib.py +13 -23
  285. qiskit/visualization/circuit/text.py +7 -3
  286. qiskit/visualization/counts_visualization.py +4 -0
  287. qiskit/visualization/dag_visualization.py +2 -1
  288. qiskit/visualization/gate_map.py +39 -154
  289. qiskit/visualization/library.py +4 -1
  290. qiskit/visualization/pass_manager_visualization.py +6 -2
  291. qiskit/visualization/state_visualization.py +19 -2
  292. qiskit/visualization/timeline/core.py +19 -13
  293. qiskit/visualization/timeline/interface.py +19 -18
  294. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  295. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  296. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
  297. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
  298. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  299. qiskit/assembler/__init__.py +0 -42
  300. qiskit/assembler/assemble_circuits.py +0 -451
  301. qiskit/assembler/assemble_schedules.py +0 -367
  302. qiskit/assembler/disassemble.py +0 -310
  303. qiskit/assembler/run_config.py +0 -77
  304. qiskit/circuit/bit.py +0 -106
  305. qiskit/circuit/classicalfunction/__init__.py +0 -152
  306. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  307. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  308. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  309. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  310. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  311. qiskit/circuit/classicalfunction/types.py +0 -18
  312. qiskit/circuit/classicalfunction/utils.py +0 -91
  313. qiskit/circuit/classicalregister.py +0 -57
  314. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  315. qiskit/circuit/quantumregister.py +0 -75
  316. qiskit/circuit/register.py +0 -246
  317. qiskit/compiler/assembler.py +0 -689
  318. qiskit/compiler/scheduler.py +0 -109
  319. qiskit/compiler/sequencer.py +0 -71
  320. qiskit/primitives/backend_estimator.py +0 -486
  321. qiskit/primitives/backend_sampler.py +0 -222
  322. qiskit/primitives/estimator.py +0 -172
  323. qiskit/primitives/sampler.py +0 -162
  324. qiskit/providers/backend_compat.py +0 -507
  325. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  340. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/fake_1q.py +0 -91
  349. qiskit/providers/fake_provider/fake_backend.py +0 -165
  350. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  351. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  352. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  353. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  354. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  355. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  356. qiskit/providers/models/__init__.py +0 -89
  357. qiskit/providers/models/backendconfiguration.py +0 -1040
  358. qiskit/providers/models/backendproperties.py +0 -535
  359. qiskit/providers/models/backendstatus.py +0 -104
  360. qiskit/providers/models/jobstatus.py +0 -77
  361. qiskit/providers/models/pulsedefaults.py +0 -305
  362. qiskit/providers/provider.py +0 -95
  363. qiskit/pulse/__init__.py +0 -158
  364. qiskit/pulse/builder.py +0 -2262
  365. qiskit/pulse/calibration_entries.py +0 -381
  366. qiskit/pulse/channels.py +0 -227
  367. qiskit/pulse/configuration.py +0 -245
  368. qiskit/pulse/exceptions.py +0 -45
  369. qiskit/pulse/filters.py +0 -309
  370. qiskit/pulse/instruction_schedule_map.py +0 -424
  371. qiskit/pulse/instructions/__init__.py +0 -67
  372. qiskit/pulse/instructions/acquire.py +0 -150
  373. qiskit/pulse/instructions/delay.py +0 -71
  374. qiskit/pulse/instructions/directives.py +0 -154
  375. qiskit/pulse/instructions/frequency.py +0 -135
  376. qiskit/pulse/instructions/instruction.py +0 -270
  377. qiskit/pulse/instructions/phase.py +0 -152
  378. qiskit/pulse/instructions/play.py +0 -99
  379. qiskit/pulse/instructions/reference.py +0 -100
  380. qiskit/pulse/instructions/snapshot.py +0 -82
  381. qiskit/pulse/library/__init__.py +0 -97
  382. qiskit/pulse/library/continuous.py +0 -430
  383. qiskit/pulse/library/pulse.py +0 -148
  384. qiskit/pulse/library/samplers/__init__.py +0 -15
  385. qiskit/pulse/library/samplers/decorators.py +0 -295
  386. qiskit/pulse/library/samplers/strategies.py +0 -71
  387. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  388. qiskit/pulse/library/waveform.py +0 -136
  389. qiskit/pulse/macros.py +0 -262
  390. qiskit/pulse/parameter_manager.py +0 -445
  391. qiskit/pulse/parser.py +0 -314
  392. qiskit/pulse/reference_manager.py +0 -58
  393. qiskit/pulse/schedule.py +0 -1854
  394. qiskit/pulse/transforms/__init__.py +0 -106
  395. qiskit/pulse/transforms/alignments.py +0 -406
  396. qiskit/pulse/transforms/base_transforms.py +0 -71
  397. qiskit/pulse/transforms/canonicalization.py +0 -498
  398. qiskit/pulse/transforms/dag.py +0 -122
  399. qiskit/pulse/utils.py +0 -149
  400. qiskit/qobj/__init__.py +0 -75
  401. qiskit/qobj/common.py +0 -81
  402. qiskit/qobj/converters/__init__.py +0 -18
  403. qiskit/qobj/converters/lo_config.py +0 -177
  404. qiskit/qobj/converters/pulse_instruction.py +0 -897
  405. qiskit/qobj/pulse_qobj.py +0 -709
  406. qiskit/qobj/qasm_qobj.py +0 -708
  407. qiskit/qobj/utils.py +0 -46
  408. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  409. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  410. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  411. qiskit/result/mitigation/utils.py +0 -217
  412. qiskit/scheduler/__init__.py +0 -40
  413. qiskit/scheduler/config.py +0 -37
  414. qiskit/scheduler/lowering.py +0 -187
  415. qiskit/scheduler/methods/__init__.py +0 -15
  416. qiskit/scheduler/methods/basic.py +0 -140
  417. qiskit/scheduler/schedule_circuit.py +0 -69
  418. qiskit/scheduler/sequence.py +0 -104
  419. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  420. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  421. qiskit/transpiler/passes/calibration/builders.py +0 -20
  422. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  423. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  424. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  425. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  426. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  427. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  428. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  429. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  430. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  431. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  432. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  433. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  434. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  435. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  436. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  437. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  438. qiskit/utils/deprecate_pulse.py +0 -119
  439. qiskit/utils/multiprocessing.py +0 -56
  440. qiskit/visualization/pulse_v2/__init__.py +0 -21
  441. qiskit/visualization/pulse_v2/core.py +0 -901
  442. qiskit/visualization/pulse_v2/device_info.py +0 -173
  443. qiskit/visualization/pulse_v2/drawings.py +0 -253
  444. qiskit/visualization/pulse_v2/events.py +0 -254
  445. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  446. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  447. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  448. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  449. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  450. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  451. qiskit/visualization/pulse_v2/interface.py +0 -459
  452. qiskit/visualization/pulse_v2/layouts.py +0 -387
  453. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  454. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  455. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  456. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  457. qiskit/visualization/pulse_v2/types.py +0 -242
  458. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  459. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
qiskit/qasm2/__init__.py CHANGED
@@ -133,7 +133,10 @@ Exporting examples
133
133
 
134
134
  Export a simple :class:`.QuantumCircuit` to an OpenQASM 2 string:
135
135
 
136
- .. code-block:: python
136
+ .. plot::
137
+ :include-source:
138
+ :nofigs:
139
+ :context: reset
137
140
 
138
141
  import qiskit.qasm2
139
142
  from qiskit.circuit import QuantumCircuit
@@ -183,7 +186,9 @@ Parsing examples
183
186
 
184
187
  Use :func:`loads` to import an OpenQASM 2 program in a string into a :class:`.QuantumCircuit`:
185
188
 
186
- .. code-block:: python
189
+ .. plot::
190
+ :include-source:
191
+ :nofigs:
187
192
 
188
193
  import qiskit.qasm2
189
194
  program = """
@@ -259,7 +264,9 @@ Sometimes you may want to influence the :class:`.Gate` objects that the importer
259
264
  named instructions. Gates that are defined by the statement ``include "qelib1.inc";`` will
260
265
  automatically be associated with a suitable Qiskit circuit-library gate, but you can extend this:
261
266
 
262
- .. code-block:: python
267
+ .. plot::
268
+ :include-source:
269
+ :nofigs:
263
270
 
264
271
  from qiskit.circuit import Gate
265
272
  from qiskit.qasm2 import loads, CustomInstruction
@@ -292,7 +299,9 @@ defined gates (which are computed on demand). Here we provide a Python version
292
299
  which mathematically is :math:`\arctan(y/x)` but correctly handling angle quadrants and infinities,
293
300
  and a custom ``add_one`` function:
294
301
 
295
- .. code-block:: python
302
+ .. plot::
303
+ :include-source:
304
+ :nofigs:
296
305
 
297
306
  import math
298
307
  from qiskit.qasm2 import loads, CustomClassical
@@ -356,7 +365,10 @@ the header file, you can use :class:`CustomInstruction` to override how Qiskit b
356
365
  For the standard ``qelib1.inc`` include there is only one point of difference, and so the override
357
366
  needed to switch its phase convention is:
358
367
 
359
- .. code-block:: python
368
+ .. plot::
369
+ :include-source:
370
+ :nofigs:
371
+ :context: reset
360
372
 
361
373
  from qiskit import qasm2
362
374
  from qiskit.circuit.library import PhaseGate
@@ -376,7 +388,10 @@ needed to switch its phase convention is:
376
388
  This will use Qiskit's :class:`.PhaseGate` class to represent the ``rz`` instruction, which is
377
389
  equal (including the phase) to :class:`.U1Gate`:
378
390
 
379
- .. code-block:: python
391
+ .. plot::
392
+ :include-source:
393
+ :nofigs:
394
+ :context:
380
395
 
381
396
  Operator(qasm2.loads(program, custom_instructions=custom))
382
397
 
qiskit/qasm2/export.py CHANGED
@@ -116,10 +116,10 @@ def dump(circuit: QuantumCircuit, filename_or_stream: os.PathLike | io.TextIOBas
116
116
  QASM2ExportError: if the circuit cannot be represented by OpenQASM 2.
117
117
  """
118
118
  if isinstance(filename_or_stream, io.TextIOBase):
119
- print(dumps(circuit), file=filename_or_stream)
119
+ print(dumps(circuit), file=filename_or_stream) # pylint: disable=bad-builtin
120
120
  return
121
121
  with open(filename_or_stream, "w") as stream:
122
- print(dumps(circuit), file=stream)
122
+ print(dumps(circuit), file=stream) # pylint: disable=bad-builtin
123
123
 
124
124
 
125
125
  def dumps(circuit: QuantumCircuit, /) -> str:
@@ -246,14 +246,6 @@ def _instruction_call_site(operation):
246
246
  if operation.params:
247
247
  params = ",".join([pi_check(i, output="qasm", eps=1e-12) for i in operation.params])
248
248
  qasm2_call = f"{qasm2_call}({params})"
249
- if operation._condition is not None:
250
- if not isinstance(operation._condition[0], ClassicalRegister):
251
- raise QASM2ExportError(
252
- "OpenQASM 2 can only condition on registers, but got '{operation.condition[0]}'"
253
- )
254
- qasm2_call = (
255
- f"if({operation._condition[0].name}=={operation._condition[1]:d}) " + qasm2_call
256
- )
257
249
  return qasm2_call
258
250
 
259
251
 
qiskit/qasm2/parse.py CHANGED
@@ -11,7 +11,6 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
  """Python-space bytecode interpreter for the output of the main Rust parser logic."""
14
- import warnings
15
14
  import dataclasses
16
15
  import math
17
16
  from typing import Iterable, Callable
@@ -255,37 +254,25 @@ def from_bytecode(bytecode, custom_instructions: Iterable[CustomInstruction]):
255
254
  CircuitInstruction(gates[gate_id](*parameters), [qubits[q] for q in op_qubits])
256
255
  )
257
256
  elif opcode == OpCode.ConditionedGate:
258
- warnings.warn(
259
- "Conditioned gates in qasm2 will be loaded as an IfElseOp starting in Qiskit 2.0",
260
- FutureWarning,
261
- stacklevel=3,
262
- )
263
257
  gate_id, parameters, op_qubits, creg, value = op.operands
264
- gate = gates[gate_id](*parameters).c_if(qc.cregs[creg], value)
265
- qc._append(CircuitInstruction(gate, [qubits[q] for q in op_qubits]))
258
+ with qc.if_test((qc.cregs[creg], value)):
259
+ gate = gates[gate_id](*parameters)
260
+ qc.append(gate, [qubits[q] for q in op_qubits])
266
261
  elif opcode == OpCode.Measure:
267
262
  qubit, clbit = op.operands
268
263
  qc._append(CircuitInstruction(Measure(), (qubits[qubit],), (clbits[clbit],)))
269
264
  elif opcode == OpCode.ConditionedMeasure:
270
- warnings.warn(
271
- "Conditioned measurements in qasm2 will be loaded as an IfElseOp starting in Qiskit 2.0",
272
- FutureWarning,
273
- stacklevel=3,
274
- )
275
265
  qubit, clbit, creg, value = op.operands
276
- measure = Measure().c_if(qc.cregs[creg], value)
277
- qc._append(CircuitInstruction(measure, (qubits[qubit],), (clbits[clbit],)))
266
+ with qc.if_test((qc.cregs[creg], value)):
267
+ measure = Measure()
268
+ qc.append(measure, (qubits[qubit],), (clbits[clbit],))
278
269
  elif opcode == OpCode.Reset:
279
270
  qc._append(CircuitInstruction(Reset(), (qubits[op.operands[0]],)))
280
271
  elif opcode == OpCode.ConditionedReset:
281
- warnings.warn(
282
- "Conditioned resets in qasm2 will be loaded as an IfElseOp starting in Qiskit 2.0",
283
- FutureWarning,
284
- stacklevel=3,
285
- )
286
272
  qubit, creg, value = op.operands
287
- reset = Reset().c_if(qc.cregs[creg], value)
288
- qc._append(CircuitInstruction(reset, (qubits[qubit],)))
273
+ with qc.if_test((qc.cregs[creg], value)):
274
+ reset = Reset()
275
+ qc.append(reset, (qubits[qubit],))
289
276
  elif opcode == OpCode.Barrier:
290
277
  op_qubits = op.operands[0]
291
278
  qc._append(CircuitInstruction(Barrier(len(op_qubits)), [qubits[q] for q in op_qubits]))
@@ -371,15 +358,14 @@ class _DefinedGate(Gate):
371
358
  # to pickle ourselves, we just eagerly create the definition and pickle that.
372
359
 
373
360
  def __getstate__(self):
374
- return (self.name, self.num_qubits, self.params, self.definition, self._condition)
361
+ return (self.name, self.num_qubits, self.params, self.definition)
375
362
 
376
363
  def __setstate__(self, state):
377
- name, num_qubits, params, definition, condition = state
364
+ name, num_qubits, params, definition = state
378
365
  super().__init__(name, num_qubits, params)
379
366
  self._gates = ()
380
367
  self._bytecode = ()
381
368
  self._definition = definition
382
- self._condition = condition
383
369
 
384
370
 
385
371
  def _gate_builder(name, num_qubits, known_gates, bytecode):
qiskit/qasm3/__init__.py CHANGED
@@ -59,7 +59,11 @@ are:
59
59
  If you want to enable multiple experimental features, you should combine the flags using the ``|``
60
60
  operator, such as ``flag1 | flag2``.
61
61
 
62
- For example, to perform an export using the early semantics of ``switch`` support::
62
+ For example, to perform an export using the early semantics of ``switch`` support:
63
+
64
+ .. plot::
65
+ :include-source:
66
+ :nofigs:
63
67
 
64
68
  from qiskit import qasm3, QuantumCircuit, QuantumRegister, ClassicalRegister
65
69
 
qiskit/qasm3/ast.py CHANGED
@@ -14,6 +14,8 @@
14
14
 
15
15
  """QASM3 AST Nodes"""
16
16
 
17
+ from __future__ import annotations
18
+
17
19
  import enum
18
20
  from typing import Optional, List, Union, Iterable, Tuple, Sequence
19
21
 
@@ -173,6 +175,12 @@ class BitType(ClassicalType):
173
175
  __slots__ = ()
174
176
 
175
177
 
178
+ class DurationType(ClassicalType):
179
+ """Type information for a duration."""
180
+
181
+ __slots__ = ()
182
+
183
+
176
184
  class BitArrayType(ClassicalType):
177
185
  """Type information for a sized number of classical bits."""
178
186
 
@@ -242,6 +250,13 @@ class IntegerLiteral(Expression):
242
250
  self.value = value
243
251
 
244
252
 
253
+ class FloatLiteral(Expression):
254
+ __slots__ = ("value",)
255
+
256
+ def __init__(self, value):
257
+ self.value = value
258
+
259
+
245
260
  class BooleanLiteral(Expression):
246
261
  __slots__ = ("value",)
247
262
 
@@ -304,6 +319,10 @@ class Binary(Expression):
304
319
  NOT_EQUAL = "!="
305
320
  SHIFT_LEFT = "<<"
306
321
  SHIFT_RIGHT = ">>"
322
+ ADD = "+"
323
+ SUB = "-"
324
+ MUL = "*"
325
+ DIV = "/"
307
326
 
308
327
  def __init__(self, op: Op, left: Expression, right: Expression):
309
328
  self.op = op
@@ -389,6 +408,17 @@ class ClassicalDeclaration(Statement):
389
408
  self.initializer = initializer
390
409
 
391
410
 
411
+ class StretchDeclaration(Statement):
412
+ """Declaration of a stretch variable, optionally with a lower bound
413
+ expression."""
414
+
415
+ __slots__ = ("identifier", "bound")
416
+
417
+ def __init__(self, identifier: Identifier, bound=None):
418
+ self.identifier = identifier
419
+ self.bound = bound
420
+
421
+
392
422
  class AssignmentStatement(Statement):
393
423
  """Assignment of an expression to an l-value."""
394
424
 
@@ -668,6 +698,20 @@ class WhileLoopStatement(Statement):
668
698
  self.body = body
669
699
 
670
700
 
701
+ class BoxStatement(Statement):
702
+ """Like ``box[duration] { statements* }``."""
703
+
704
+ __slots__ = ("duration", "body")
705
+
706
+ def __init__(
707
+ self,
708
+ body: ProgramBlock,
709
+ duration: Expression | None = None,
710
+ ):
711
+ self.body = body
712
+ self.duration = duration
713
+
714
+
671
715
  class BreakStatement(Statement):
672
716
  """AST node for ``break`` statements. Has no associated information."""
673
717
 
qiskit/qasm3/exporter.py CHANGED
@@ -39,10 +39,12 @@ from qiskit.circuit import (
39
39
  Reset,
40
40
  Delay,
41
41
  Store,
42
+ Bit,
43
+ Register,
42
44
  )
43
- from qiskit.circuit.bit import Bit
44
45
  from qiskit.circuit.classical import expr, types
45
46
  from qiskit.circuit.controlflow import (
47
+ BoxOp,
46
48
  IfElseOp,
47
49
  ForLoopOp,
48
50
  WhileLoopOp,
@@ -52,7 +54,6 @@ from qiskit.circuit.controlflow import (
52
54
  ContinueLoopOp,
53
55
  CASE_DEFAULT,
54
56
  )
55
- from qiskit.circuit.register import Register
56
57
  from qiskit.circuit.tools import pi_check
57
58
 
58
59
  from . import ast
@@ -60,7 +61,6 @@ from .experimental import ExperimentalFeatures
60
61
  from .exceptions import QASM3ExporterError
61
62
  from .printer import BasicPrinter
62
63
 
63
-
64
64
  # Reserved keywords that gates and variables cannot be named. It is possible that some of these
65
65
  # _could_ be accepted as variable names by OpenQASM 3 parsers, but it's safer for us to just be very
66
66
  # conservative.
@@ -626,7 +626,7 @@ class QASM3Builder:
626
626
  def build_program(self):
627
627
  """Builds a Program"""
628
628
  circuit = self.scope.circuit
629
- if circuit.num_captured_vars:
629
+ if circuit.num_captured_vars or circuit.num_captured_stretches:
630
630
  raise QASM3ExporterError(
631
631
  "cannot export an inner scope with captured variables as a top-level program"
632
632
  )
@@ -958,6 +958,14 @@ class QASM3Builder:
958
958
  )
959
959
  for var in self.scope.circuit.iter_declared_vars()
960
960
  ]
961
+
962
+ for stretch in self.scope.circuit.iter_declared_stretches():
963
+ statements.append(
964
+ ast.StretchDeclaration(
965
+ self.symbols.register_variable(stretch.name, stretch, allow_rename=True),
966
+ )
967
+ )
968
+
961
969
  for instruction in self.scope.circuit.data:
962
970
  if isinstance(instruction.operation, ControlFlowOp):
963
971
  if isinstance(instruction.operation, ForLoopOp):
@@ -968,6 +976,8 @@ class QASM3Builder:
968
976
  statements.append(self.build_if_statement(instruction))
969
977
  elif isinstance(instruction.operation, SwitchCaseOp):
970
978
  statements.extend(self.build_switch_statement(instruction))
979
+ elif isinstance(instruction.operation, BoxOp):
980
+ statements.append(self.build_box(instruction))
971
981
  else:
972
982
  raise RuntimeError(f"unhandled control-flow construct: {instruction.operation}")
973
983
  continue
@@ -1006,16 +1016,7 @@ class QASM3Builder:
1006
1016
  f" but received '{instruction.operation}'"
1007
1017
  )
1008
1018
 
1009
- if instruction.operation._condition is None:
1010
- statements.extend(nodes)
1011
- else:
1012
- body = ast.ProgramBlock(nodes)
1013
- statements.append(
1014
- ast.BranchingStatement(
1015
- self.build_expression(_lift_condition(instruction.operation._condition)),
1016
- body,
1017
- )
1018
- )
1019
+ statements.extend(nodes)
1019
1020
  return statements
1020
1021
 
1021
1022
  def build_if_statement(self, instruction: CircuitInstruction) -> ast.BranchingStatement:
@@ -1085,6 +1086,15 @@ class QASM3Builder:
1085
1086
  ast.SwitchStatement(target, cases, default=default),
1086
1087
  ]
1087
1088
 
1089
+ def build_box(self, instruction: CircuitInstruction) -> ast.BoxStatement:
1090
+ """Build a :class:`.BoxOp` into a :class:`.ast.BoxStatement`."""
1091
+ duration = self.build_duration(instruction.operation.duration, instruction.operation.unit)
1092
+ body_circuit = instruction.operation.blocks[0]
1093
+ with self.new_scope(body_circuit, instruction.qubits, instruction.clbits):
1094
+ # TODO: handle no-op qubits (see https://github.com/openqasm/openqasm/issues/584).
1095
+ body = ast.ProgramBlock(self.build_current_scope())
1096
+ return ast.BoxStatement(body, duration)
1097
+
1088
1098
  def build_while_loop(self, instruction: CircuitInstruction) -> ast.WhileLoopStatement:
1089
1099
  """Build a :obj:`.WhileLoopOp` into a :obj:`.ast.WhileLoopStatement`."""
1090
1100
  condition = self.build_expression(_lift_condition(instruction.operation.condition))
@@ -1134,20 +1144,26 @@ class QASM3Builder:
1134
1144
  raise QASM3ExporterError(
1135
1145
  f"Found a delay instruction acting on classical bits: {instruction}"
1136
1146
  )
1137
- duration_value, unit = instruction.operation.duration, instruction.operation.unit
1138
- if unit == "ps":
1139
- duration = ast.DurationLiteral(1000 * duration_value, ast.DurationUnit.NANOSECOND)
1140
- else:
1141
- unit_map = {
1142
- "ns": ast.DurationUnit.NANOSECOND,
1143
- "us": ast.DurationUnit.MICROSECOND,
1144
- "ms": ast.DurationUnit.MILLISECOND,
1145
- "s": ast.DurationUnit.SECOND,
1146
- "dt": ast.DurationUnit.SAMPLE,
1147
- }
1148
- duration = ast.DurationLiteral(duration_value, unit_map[unit])
1147
+ duration = self.build_duration(instruction.operation.duration, instruction.operation.unit)
1149
1148
  return ast.QuantumDelay(duration, [self._lookup_bit(qubit) for qubit in instruction.qubits])
1150
1149
 
1150
+ def build_duration(self, duration, unit) -> ast.Expression | None:
1151
+ """Build the expression of a given duration (if not ``None``)."""
1152
+ if duration is None:
1153
+ return None
1154
+ if unit == "expr":
1155
+ return self.build_expression(duration)
1156
+ if unit == "ps":
1157
+ return ast.DurationLiteral(1000 * duration, ast.DurationUnit.NANOSECOND)
1158
+ unit_map = {
1159
+ "ns": ast.DurationUnit.NANOSECOND,
1160
+ "us": ast.DurationUnit.MICROSECOND,
1161
+ "ms": ast.DurationUnit.MILLISECOND,
1162
+ "s": ast.DurationUnit.SECOND,
1163
+ "dt": ast.DurationUnit.SAMPLE,
1164
+ }
1165
+ return ast.DurationLiteral(duration, unit_map[unit])
1166
+
1151
1167
  def build_integer(self, value) -> ast.IntegerLiteral:
1152
1168
  """Build an integer literal, raising a :obj:`.QASM3ExporterError` if the input is not
1153
1169
  actually an
@@ -1262,6 +1278,10 @@ def _build_ast_type(type_: types.Type) -> ast.ClassicalType:
1262
1278
  return ast.BoolType()
1263
1279
  if type_.kind is types.Uint:
1264
1280
  return ast.UintType(type_.width)
1281
+ if type_.kind is types.Float:
1282
+ return ast.FloatType.DOUBLE
1283
+ if type_.kind is types.Duration:
1284
+ return ast.DurationType()
1265
1285
  raise RuntimeError(f"unhandled expr type '{type_}'")
1266
1286
 
1267
1287
 
@@ -1269,7 +1289,7 @@ class _ExprBuilder(expr.ExprVisitor[ast.Expression]):
1269
1289
  __slots__ = ("lookup",)
1270
1290
 
1271
1291
  # This is a very simple, non-contextual converter. As the type system expands, we may well end
1272
- # up with some places where Terra's abstract type system needs to be lowered to OQ3 rather than
1292
+ # up with some places where Qiskit's abstract type system needs to be lowered to OQ3 rather than
1273
1293
  # mapping 100% directly, which might need a more contextual visitor.
1274
1294
 
1275
1295
  def __init__(self, lookup):
@@ -1278,11 +1298,29 @@ class _ExprBuilder(expr.ExprVisitor[ast.Expression]):
1278
1298
  def visit_var(self, node, /):
1279
1299
  return self.lookup(node) if node.standalone else self.lookup(node.var)
1280
1300
 
1301
+ def visit_stretch(self, node, /):
1302
+ return self.lookup(node)
1303
+
1304
+ # pylint: disable=too-many-return-statements
1281
1305
  def visit_value(self, node, /):
1282
1306
  if node.type.kind is types.Bool:
1283
1307
  return ast.BooleanLiteral(node.value)
1284
1308
  if node.type.kind is types.Uint:
1285
1309
  return ast.IntegerLiteral(node.value)
1310
+ if node.type.kind is types.Float:
1311
+ return ast.FloatLiteral(node.value)
1312
+ if node.type.kind is types.Duration:
1313
+ unit = node.value.unit()
1314
+ if unit == "dt":
1315
+ return ast.DurationLiteral(node.value.value(), ast.DurationUnit.SAMPLE)
1316
+ if unit == "ns":
1317
+ return ast.DurationLiteral(node.value.value(), ast.DurationUnit.NANOSECOND)
1318
+ if unit == "us":
1319
+ return ast.DurationLiteral(node.value.value(), ast.DurationUnit.MICROSECOND)
1320
+ if unit == "ms":
1321
+ return ast.DurationLiteral(node.value.value(), ast.DurationUnit.MILLISECOND)
1322
+ if unit == "s":
1323
+ return ast.DurationLiteral(node.value.value(), ast.DurationUnit.SECOND)
1286
1324
  raise RuntimeError(f"unhandled Value type '{node}'")
1287
1325
 
1288
1326
  def visit_cast(self, node, /):
qiskit/qasm3/printer.py CHANGED
@@ -39,8 +39,12 @@ _BINDING_POWER = {
39
39
  ast.Unary.Op.LOGIC_NOT: _BindingPower(right=22),
40
40
  ast.Unary.Op.BIT_NOT: _BindingPower(right=22),
41
41
  #
42
- # Multiplication/division/modulo: (19, 20)
43
- # Addition/subtraction: (17, 18)
42
+ # Modulo: (19, 20)
43
+ ast.Binary.Op.MUL: _BindingPower(19, 20),
44
+ ast.Binary.Op.DIV: _BindingPower(19, 20),
45
+ #
46
+ ast.Binary.Op.ADD: _BindingPower(17, 18),
47
+ ast.Binary.Op.SUB: _BindingPower(17, 18),
44
48
  #
45
49
  ast.Binary.Op.SHIFT_LEFT: _BindingPower(15, 16),
46
50
  ast.Binary.Op.SHIFT_RIGHT: _BindingPower(15, 16),
@@ -78,7 +82,7 @@ class BasicPrinter:
78
82
  ast.QuantumGateModifierName.POW: "pow",
79
83
  }
80
84
 
81
- _FLOAT_WIDTH_LOOKUP = {type: str(type.value) for type in ast.FloatType}
85
+ _FLOAT_TYPE_LOOKUP = {type: f"float[{type.value}]" for type in ast.FloatType}
82
86
 
83
87
  # The visitor names include the class names, so they mix snake_case with PascalCase.
84
88
  # pylint: disable=invalid-name
@@ -205,11 +209,14 @@ class BasicPrinter:
205
209
  self._write_statement(f'defcalgrammar "{node.name}"')
206
210
 
207
211
  def _visit_FloatType(self, node: ast.FloatType) -> None:
208
- self.stream.write(f"float[{self._FLOAT_WIDTH_LOOKUP[node]}]")
212
+ self.stream.write(self._FLOAT_TYPE_LOOKUP[node])
209
213
 
210
214
  def _visit_BoolType(self, _node: ast.BoolType) -> None:
211
215
  self.stream.write("bool")
212
216
 
217
+ def _visit_DurationType(self, _node: ast.DurationType) -> None:
218
+ self.stream.write("duration")
219
+
213
220
  def _visit_IntType(self, node: ast.IntType) -> None:
214
221
  self.stream.write("int")
215
222
  if node.size is not None:
@@ -282,6 +289,9 @@ class BasicPrinter:
282
289
  def _visit_IntegerLiteral(self, node: ast.IntegerLiteral) -> None:
283
290
  self.stream.write(str(node.value))
284
291
 
292
+ def _visit_FloatLiteral(self, node: ast.FloatLiteral) -> None:
293
+ self.stream.write(str(node.value))
294
+
285
295
  def _visit_BooleanLiteral(self, node: ast.BooleanLiteral):
286
296
  self.stream.write("true" if node.value else "false")
287
297
 
@@ -356,6 +366,16 @@ class BasicPrinter:
356
366
  self.visit(node.initializer)
357
367
  self._end_statement()
358
368
 
369
+ def _visit_StretchDeclaration(self, node: ast.StretchDeclaration) -> None:
370
+ self._start_line()
371
+ self.stream.write("stretch")
372
+ self.stream.write(" ")
373
+ self.visit(node.identifier)
374
+ if node.bound is not None:
375
+ self.stream.write(" = ")
376
+ self.visit(node.bound)
377
+ self._end_statement()
378
+
359
379
  def _visit_AssignmentStatement(self, node: ast.AssignmentStatement) -> None:
360
380
  self._start_line()
361
381
  self.visit(node.lvalue)
@@ -575,3 +595,14 @@ class BasicPrinter:
575
595
 
576
596
  def _visit_DefaultCase(self, _node: ast.DefaultCase) -> None:
577
597
  self.stream.write("default")
598
+
599
+ def _visit_BoxStatement(self, node: ast.BoxStatement) -> None:
600
+ self._start_line()
601
+ self.stream.write("box")
602
+ if node.duration is not None:
603
+ self.stream.write("[")
604
+ self.visit(node.duration)
605
+ self.stream.write("]")
606
+ self.stream.write(" ")
607
+ self.visit(node.body)
608
+ self._end_line()