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
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()