qiskit 1.0.0b1__cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.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 (1095) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +195 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_qasm2.abi3.so +0 -0
  5. qiskit/assembler/__init__.py +47 -0
  6. qiskit/assembler/assemble_circuits.py +408 -0
  7. qiskit/assembler/assemble_schedules.py +372 -0
  8. qiskit/assembler/disassemble.py +318 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +425 -0
  11. qiskit/circuit/_classical_resource_map.py +144 -0
  12. qiskit/circuit/_utils.py +170 -0
  13. qiskit/circuit/add_control.py +274 -0
  14. qiskit/circuit/annotated_operation.py +188 -0
  15. qiskit/circuit/barrier.py +51 -0
  16. qiskit/circuit/bit.py +142 -0
  17. qiskit/circuit/classical/__init__.py +41 -0
  18. qiskit/circuit/classical/expr/__init__.py +218 -0
  19. qiskit/circuit/classical/expr/constructors.py +473 -0
  20. qiskit/circuit/classical/expr/expr.py +356 -0
  21. qiskit/circuit/classical/expr/visitors.py +280 -0
  22. qiskit/circuit/classical/types/__init__.py +108 -0
  23. qiskit/circuit/classical/types/ordering.py +222 -0
  24. qiskit/circuit/classical/types/types.py +117 -0
  25. qiskit/circuit/classicalfunction/__init__.py +131 -0
  26. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  27. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  28. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  29. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  30. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  31. qiskit/circuit/classicalfunction/types.py +18 -0
  32. qiskit/circuit/classicalfunction/utils.py +91 -0
  33. qiskit/circuit/classicalregister.py +71 -0
  34. qiskit/circuit/commutation_checker.py +176 -0
  35. qiskit/circuit/controlflow/__init__.py +27 -0
  36. qiskit/circuit/controlflow/_builder_utils.py +199 -0
  37. qiskit/circuit/controlflow/break_loop.py +70 -0
  38. qiskit/circuit/controlflow/builder.py +651 -0
  39. qiskit/circuit/controlflow/continue_loop.py +72 -0
  40. qiskit/circuit/controlflow/control_flow.py +52 -0
  41. qiskit/circuit/controlflow/for_loop.py +232 -0
  42. qiskit/circuit/controlflow/if_else.py +517 -0
  43. qiskit/circuit/controlflow/switch_case.py +424 -0
  44. qiskit/circuit/controlflow/while_loop.py +177 -0
  45. qiskit/circuit/controlledgate.py +271 -0
  46. qiskit/circuit/delay.py +104 -0
  47. qiskit/circuit/duration.py +88 -0
  48. qiskit/circuit/equivalence.py +291 -0
  49. qiskit/circuit/equivalence_library.py +18 -0
  50. qiskit/circuit/exceptions.py +19 -0
  51. qiskit/circuit/gate.py +245 -0
  52. qiskit/circuit/instruction.py +655 -0
  53. qiskit/circuit/instructionset.py +191 -0
  54. qiskit/circuit/library/__init__.py +581 -0
  55. qiskit/circuit/library/arithmetic/__init__.py +27 -0
  56. qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
  57. qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
  58. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
  59. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
  60. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -0
  61. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  62. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  63. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  64. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  65. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  66. qiskit/circuit/library/arithmetic/multipliers/__init__.py +16 -0
  67. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
  68. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
  69. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -0
  70. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  71. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  72. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  73. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  74. qiskit/circuit/library/arithmetic/quadratic_form.py +197 -0
  75. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  76. qiskit/circuit/library/basis_change/__init__.py +15 -0
  77. qiskit/circuit/library/basis_change/qft.py +289 -0
  78. qiskit/circuit/library/blueprintcircuit.py +186 -0
  79. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  80. qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
  81. qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
  82. qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
  83. qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
  84. qiskit/circuit/library/data_preparation/__init__.py +47 -0
  85. qiskit/circuit/library/data_preparation/initializer.py +96 -0
  86. qiskit/circuit/library/data_preparation/pauli_feature_map.py +296 -0
  87. qiskit/circuit/library/data_preparation/state_preparation.py +526 -0
  88. qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
  89. qiskit/circuit/library/data_preparation/zz_feature_map.py +114 -0
  90. qiskit/circuit/library/evolved_operator_ansatz.py +245 -0
  91. qiskit/circuit/library/fourier_checking.py +97 -0
  92. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  93. qiskit/circuit/library/generalized_gates/diagonal.py +164 -0
  94. qiskit/circuit/library/generalized_gates/gms.py +121 -0
  95. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  96. qiskit/circuit/library/generalized_gates/isometry.py +573 -0
  97. qiskit/circuit/library/generalized_gates/linear_function.py +302 -0
  98. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +138 -0
  99. qiskit/circuit/library/generalized_gates/mcmt.py +254 -0
  100. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  101. qiskit/circuit/library/generalized_gates/permutation.py +190 -0
  102. qiskit/circuit/library/generalized_gates/rv.py +93 -0
  103. qiskit/circuit/library/generalized_gates/uc.py +304 -0
  104. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  105. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  106. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  108. qiskit/circuit/library/generalized_gates/unitary.py +198 -0
  109. qiskit/circuit/library/graph_state.py +86 -0
  110. qiskit/circuit/library/grover_operator.py +311 -0
  111. qiskit/circuit/library/hamiltonian_gate.py +146 -0
  112. qiskit/circuit/library/hidden_linear_function.py +98 -0
  113. qiskit/circuit/library/iqp.py +96 -0
  114. qiskit/circuit/library/n_local/__init__.py +31 -0
  115. qiskit/circuit/library/n_local/efficient_su2.py +162 -0
  116. qiskit/circuit/library/n_local/excitation_preserving.py +176 -0
  117. qiskit/circuit/library/n_local/n_local.py +1044 -0
  118. qiskit/circuit/library/n_local/pauli_two_design.py +131 -0
  119. qiskit/circuit/library/n_local/qaoa_ansatz.py +288 -0
  120. qiskit/circuit/library/n_local/real_amplitudes.py +189 -0
  121. qiskit/circuit/library/n_local/two_local.py +334 -0
  122. qiskit/circuit/library/overlap.py +111 -0
  123. qiskit/circuit/library/pauli_evolution.py +180 -0
  124. qiskit/circuit/library/phase_estimation.py +99 -0
  125. qiskit/circuit/library/phase_oracle.py +153 -0
  126. qiskit/circuit/library/quantum_volume.py +114 -0
  127. qiskit/circuit/library/standard_gates/__init__.py +116 -0
  128. qiskit/circuit/library/standard_gates/dcx.py +71 -0
  129. qiskit/circuit/library/standard_gates/ecr.py +114 -0
  130. qiskit/circuit/library/standard_gates/equivalence_library.py +1677 -0
  131. qiskit/circuit/library/standard_gates/global_phase.py +63 -0
  132. qiskit/circuit/library/standard_gates/h.py +224 -0
  133. qiskit/circuit/library/standard_gates/i.py +60 -0
  134. qiskit/circuit/library/standard_gates/iswap.py +129 -0
  135. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +390 -0
  136. qiskit/circuit/library/standard_gates/p.py +364 -0
  137. qiskit/circuit/library/standard_gates/r.py +101 -0
  138. qiskit/circuit/library/standard_gates/rx.py +246 -0
  139. qiskit/circuit/library/standard_gates/rxx.py +128 -0
  140. qiskit/circuit/library/standard_gates/ry.py +241 -0
  141. qiskit/circuit/library/standard_gates/ryy.py +128 -0
  142. qiskit/circuit/library/standard_gates/rz.py +261 -0
  143. qiskit/circuit/library/standard_gates/rzx.py +174 -0
  144. qiskit/circuit/library/standard_gates/rzz.py +141 -0
  145. qiskit/circuit/library/standard_gates/s.py +303 -0
  146. qiskit/circuit/library/standard_gates/swap.py +246 -0
  147. qiskit/circuit/library/standard_gates/sx.py +268 -0
  148. qiskit/circuit/library/standard_gates/t.py +150 -0
  149. qiskit/circuit/library/standard_gates/u.py +338 -0
  150. qiskit/circuit/library/standard_gates/u1.py +383 -0
  151. qiskit/circuit/library/standard_gates/u2.py +132 -0
  152. qiskit/circuit/library/standard_gates/u3.py +358 -0
  153. qiskit/circuit/library/standard_gates/x.py +1370 -0
  154. qiskit/circuit/library/standard_gates/xx_minus_yy.py +179 -0
  155. qiskit/circuit/library/standard_gates/xx_plus_yy.py +180 -0
  156. qiskit/circuit/library/standard_gates/y.py +221 -0
  157. qiskit/circuit/library/standard_gates/z.py +294 -0
  158. qiskit/circuit/library/templates/__init__.py +92 -0
  159. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  160. qiskit/circuit/library/templates/clifford/clifford_2_1.py +33 -0
  161. qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
  164. qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
  166. qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
  169. qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
  170. qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
  171. qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
  175. qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
  176. qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  179. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
  180. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
  182. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
  187. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
  188. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
  191. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
  192. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
  198. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
  226. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  227. qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
  228. qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
  229. qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
  230. qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
  231. qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
  233. qiskit/circuit/measure.py +41 -0
  234. qiskit/circuit/operation.py +62 -0
  235. qiskit/circuit/parameter.py +160 -0
  236. qiskit/circuit/parameterexpression.py +515 -0
  237. qiskit/circuit/parametertable.py +263 -0
  238. qiskit/circuit/parametervector.py +114 -0
  239. qiskit/circuit/qpy_serialization.py +28 -0
  240. qiskit/circuit/quantumcircuit.py +6074 -0
  241. qiskit/circuit/quantumcircuitdata.py +138 -0
  242. qiskit/circuit/quantumregister.py +90 -0
  243. qiskit/circuit/random/__init__.py +15 -0
  244. qiskit/circuit/random/utils.py +209 -0
  245. qiskit/circuit/register.py +256 -0
  246. qiskit/circuit/reset.py +31 -0
  247. qiskit/circuit/singleton.py +604 -0
  248. qiskit/circuit/store.py +87 -0
  249. qiskit/circuit/tools/__init__.py +16 -0
  250. qiskit/circuit/tools/pi_check.py +190 -0
  251. qiskit/compiler/__init__.py +33 -0
  252. qiskit/compiler/assembler.py +597 -0
  253. qiskit/compiler/scheduler.py +107 -0
  254. qiskit/compiler/sequencer.py +69 -0
  255. qiskit/compiler/transpiler.py +613 -0
  256. qiskit/converters/__init__.py +59 -0
  257. qiskit/converters/circuit_to_dag.py +96 -0
  258. qiskit/converters/circuit_to_dagdependency.py +51 -0
  259. qiskit/converters/circuit_to_gate.py +109 -0
  260. qiskit/converters/circuit_to_instruction.py +131 -0
  261. qiskit/converters/dag_to_circuit.py +77 -0
  262. qiskit/converters/dag_to_dagdependency.py +55 -0
  263. qiskit/converters/dagdependency_to_circuit.py +42 -0
  264. qiskit/converters/dagdependency_to_dag.py +49 -0
  265. qiskit/dagcircuit/__init__.py +44 -0
  266. qiskit/dagcircuit/collect_blocks.py +386 -0
  267. qiskit/dagcircuit/dagcircuit.py +2105 -0
  268. qiskit/dagcircuit/dagdependency.py +626 -0
  269. qiskit/dagcircuit/dagdepnode.py +157 -0
  270. qiskit/dagcircuit/dagnode.py +322 -0
  271. qiskit/dagcircuit/exceptions.py +42 -0
  272. qiskit/exceptions.py +97 -0
  273. qiskit/execute_function.py +354 -0
  274. qiskit/extensions/__init__.py +70 -0
  275. qiskit/extensions/exceptions.py +31 -0
  276. qiskit/extensions/quantum_initializer/__init__.py +26 -0
  277. qiskit/extensions/quantum_initializer/squ.py +163 -0
  278. qiskit/extensions/simulator/__init__.py +15 -0
  279. qiskit/extensions/simulator/snapshot.py +70 -0
  280. qiskit/namespace.py +76 -0
  281. qiskit/passmanager/__init__.py +242 -0
  282. qiskit/passmanager/base_tasks.py +230 -0
  283. qiskit/passmanager/compilation_status.py +74 -0
  284. qiskit/passmanager/exceptions.py +19 -0
  285. qiskit/passmanager/flow_controllers.py +336 -0
  286. qiskit/passmanager/passmanager.py +317 -0
  287. qiskit/primitives/__init__.py +62 -0
  288. qiskit/primitives/backend_estimator.py +473 -0
  289. qiskit/primitives/backend_sampler.py +209 -0
  290. qiskit/primitives/base/__init__.py +20 -0
  291. qiskit/primitives/base/base_estimator.py +256 -0
  292. qiskit/primitives/base/base_primitive.py +74 -0
  293. qiskit/primitives/base/base_result.py +87 -0
  294. qiskit/primitives/base/base_sampler.py +202 -0
  295. qiskit/primitives/base/estimator_result.py +46 -0
  296. qiskit/primitives/base/sampler_result.py +45 -0
  297. qiskit/primitives/base/validation.py +231 -0
  298. qiskit/primitives/estimator.py +158 -0
  299. qiskit/primitives/primitive_job.py +73 -0
  300. qiskit/primitives/sampler.py +155 -0
  301. qiskit/primitives/utils.py +216 -0
  302. qiskit/providers/__init__.py +773 -0
  303. qiskit/providers/backend.py +653 -0
  304. qiskit/providers/backend_compat.py +347 -0
  305. qiskit/providers/basicaer/__init__.py +73 -0
  306. qiskit/providers/basicaer/basicaerjob.py +65 -0
  307. qiskit/providers/basicaer/basicaerprovider.py +127 -0
  308. qiskit/providers/basicaer/basicaertools.py +186 -0
  309. qiskit/providers/basicaer/exceptions.py +30 -0
  310. qiskit/providers/basicaer/qasm_simulator.py +678 -0
  311. qiskit/providers/basicaer/statevector_simulator.py +121 -0
  312. qiskit/providers/basicaer/unitary_simulator.py +395 -0
  313. qiskit/providers/exceptions.py +45 -0
  314. qiskit/providers/fake_provider/__init__.py +267 -0
  315. qiskit/providers/fake_provider/backends/__init__.py +110 -0
  316. qiskit/providers/fake_provider/backends/almaden/__init__.py +16 -0
  317. qiskit/providers/fake_provider/backends/almaden/conf_almaden.json +1 -0
  318. qiskit/providers/fake_provider/backends/almaden/fake_almaden.py +58 -0
  319. qiskit/providers/fake_provider/backends/almaden/props_almaden.json +1 -0
  320. qiskit/providers/fake_provider/backends/armonk/__init__.py +16 -0
  321. qiskit/providers/fake_provider/backends/armonk/conf_armonk.json +1 -0
  322. qiskit/providers/fake_provider/backends/armonk/defs_armonk.json +1 -0
  323. qiskit/providers/fake_provider/backends/armonk/fake_armonk.py +48 -0
  324. qiskit/providers/fake_provider/backends/armonk/props_armonk.json +1 -0
  325. qiskit/providers/fake_provider/backends/athens/__init__.py +16 -0
  326. qiskit/providers/fake_provider/backends/athens/conf_athens.json +1 -0
  327. qiskit/providers/fake_provider/backends/athens/defs_athens.json +1 -0
  328. qiskit/providers/fake_provider/backends/athens/fake_athens.py +38 -0
  329. qiskit/providers/fake_provider/backends/athens/props_athens.json +1 -0
  330. qiskit/providers/fake_provider/backends/auckland/__init__.py +15 -0
  331. qiskit/providers/fake_provider/backends/auckland/conf_auckland.json +1 -0
  332. qiskit/providers/fake_provider/backends/auckland/defs_auckland.json +1 -0
  333. qiskit/providers/fake_provider/backends/auckland/fake_auckland.py +29 -0
  334. qiskit/providers/fake_provider/backends/auckland/props_auckland.json +1 -0
  335. qiskit/providers/fake_provider/backends/belem/__init__.py +16 -0
  336. qiskit/providers/fake_provider/backends/belem/conf_belem.json +1 -0
  337. qiskit/providers/fake_provider/backends/belem/defs_belem.json +1 -0
  338. qiskit/providers/fake_provider/backends/belem/fake_belem.py +38 -0
  339. qiskit/providers/fake_provider/backends/belem/props_belem.json +1 -0
  340. qiskit/providers/fake_provider/backends/boeblingen/__init__.py +16 -0
  341. qiskit/providers/fake_provider/backends/boeblingen/conf_boeblingen.json +1 -0
  342. qiskit/providers/fake_provider/backends/boeblingen/defs_boeblingen.json +1 -0
  343. qiskit/providers/fake_provider/backends/boeblingen/fake_boeblingen.py +60 -0
  344. qiskit/providers/fake_provider/backends/boeblingen/props_boeblingen.json +1 -0
  345. qiskit/providers/fake_provider/backends/bogota/__init__.py +16 -0
  346. qiskit/providers/fake_provider/backends/bogota/conf_bogota.json +1 -0
  347. qiskit/providers/fake_provider/backends/bogota/defs_bogota.json +1 -0
  348. qiskit/providers/fake_provider/backends/bogota/fake_bogota.py +38 -0
  349. qiskit/providers/fake_provider/backends/bogota/props_bogota.json +1 -0
  350. qiskit/providers/fake_provider/backends/brooklyn/__init__.py +16 -0
  351. qiskit/providers/fake_provider/backends/brooklyn/conf_brooklyn.json +1 -0
  352. qiskit/providers/fake_provider/backends/brooklyn/defs_brooklyn.json +1 -0
  353. qiskit/providers/fake_provider/backends/brooklyn/fake_brooklyn.py +38 -0
  354. qiskit/providers/fake_provider/backends/brooklyn/props_brooklyn.json +1 -0
  355. qiskit/providers/fake_provider/backends/burlington/__init__.py +16 -0
  356. qiskit/providers/fake_provider/backends/burlington/conf_burlington.json +1 -0
  357. qiskit/providers/fake_provider/backends/burlington/fake_burlington.py +50 -0
  358. qiskit/providers/fake_provider/backends/burlington/props_burlington.json +1 -0
  359. qiskit/providers/fake_provider/backends/cairo/__init__.py +16 -0
  360. qiskit/providers/fake_provider/backends/cairo/conf_cairo.json +1 -0
  361. qiskit/providers/fake_provider/backends/cairo/defs_cairo.json +1 -0
  362. qiskit/providers/fake_provider/backends/cairo/fake_cairo.py +38 -0
  363. qiskit/providers/fake_provider/backends/cairo/props_cairo.json +1 -0
  364. qiskit/providers/fake_provider/backends/cambridge/__init__.py +17 -0
  365. qiskit/providers/fake_provider/backends/cambridge/conf_cambridge.json +1 -0
  366. qiskit/providers/fake_provider/backends/cambridge/fake_cambridge.py +72 -0
  367. qiskit/providers/fake_provider/backends/cambridge/props_cambridge.json +1 -0
  368. qiskit/providers/fake_provider/backends/cambridge/props_cambridge_alt.json +1 -0
  369. qiskit/providers/fake_provider/backends/casablanca/__init__.py +16 -0
  370. qiskit/providers/fake_provider/backends/casablanca/conf_casablanca.json +1 -0
  371. qiskit/providers/fake_provider/backends/casablanca/defs_casablanca.json +1 -0
  372. qiskit/providers/fake_provider/backends/casablanca/fake_casablanca.py +38 -0
  373. qiskit/providers/fake_provider/backends/casablanca/props_casablanca.json +1 -0
  374. qiskit/providers/fake_provider/backends/essex/__init__.py +16 -0
  375. qiskit/providers/fake_provider/backends/essex/conf_essex.json +1 -0
  376. qiskit/providers/fake_provider/backends/essex/fake_essex.py +54 -0
  377. qiskit/providers/fake_provider/backends/essex/props_essex.json +1 -0
  378. qiskit/providers/fake_provider/backends/geneva/__init__.py +15 -0
  379. qiskit/providers/fake_provider/backends/geneva/conf_geneva.json +1 -0
  380. qiskit/providers/fake_provider/backends/geneva/defs_geneva.json +1 -0
  381. qiskit/providers/fake_provider/backends/geneva/fake_geneva.py +29 -0
  382. qiskit/providers/fake_provider/backends/geneva/props_geneva.json +1 -0
  383. qiskit/providers/fake_provider/backends/guadalupe/__init__.py +16 -0
  384. qiskit/providers/fake_provider/backends/guadalupe/conf_guadalupe.json +1 -0
  385. qiskit/providers/fake_provider/backends/guadalupe/defs_guadalupe.json +1 -0
  386. qiskit/providers/fake_provider/backends/guadalupe/fake_guadalupe.py +39 -0
  387. qiskit/providers/fake_provider/backends/guadalupe/props_guadalupe.json +1 -0
  388. qiskit/providers/fake_provider/backends/hanoi/__init__.py +16 -0
  389. qiskit/providers/fake_provider/backends/hanoi/conf_hanoi.json +1 -0
  390. qiskit/providers/fake_provider/backends/hanoi/defs_hanoi.json +1 -0
  391. qiskit/providers/fake_provider/backends/hanoi/fake_hanoi.py +38 -0
  392. qiskit/providers/fake_provider/backends/hanoi/props_hanoi.json +1 -0
  393. qiskit/providers/fake_provider/backends/jakarta/__init__.py +16 -0
  394. qiskit/providers/fake_provider/backends/jakarta/conf_jakarta.json +1 -0
  395. qiskit/providers/fake_provider/backends/jakarta/defs_jakarta.json +1 -0
  396. qiskit/providers/fake_provider/backends/jakarta/fake_jakarta.py +38 -0
  397. qiskit/providers/fake_provider/backends/jakarta/props_jakarta.json +1 -0
  398. qiskit/providers/fake_provider/backends/johannesburg/__init__.py +16 -0
  399. qiskit/providers/fake_provider/backends/johannesburg/conf_johannesburg.json +1 -0
  400. qiskit/providers/fake_provider/backends/johannesburg/fake_johannesburg.py +58 -0
  401. qiskit/providers/fake_provider/backends/johannesburg/props_johannesburg.json +1 -0
  402. qiskit/providers/fake_provider/backends/kolkata/__init__.py +16 -0
  403. qiskit/providers/fake_provider/backends/kolkata/conf_kolkata.json +1 -0
  404. qiskit/providers/fake_provider/backends/kolkata/defs_kolkata.json +1 -0
  405. qiskit/providers/fake_provider/backends/kolkata/fake_kolkata.py +38 -0
  406. qiskit/providers/fake_provider/backends/kolkata/props_kolkata.json +1 -0
  407. qiskit/providers/fake_provider/backends/lagos/__init__.py +16 -0
  408. qiskit/providers/fake_provider/backends/lagos/conf_lagos.json +1 -0
  409. qiskit/providers/fake_provider/backends/lagos/defs_lagos.json +1 -0
  410. qiskit/providers/fake_provider/backends/lagos/fake_lagos.py +38 -0
  411. qiskit/providers/fake_provider/backends/lagos/props_lagos.json +1 -0
  412. qiskit/providers/fake_provider/backends/lima/__init__.py +16 -0
  413. qiskit/providers/fake_provider/backends/lima/conf_lima.json +1 -0
  414. qiskit/providers/fake_provider/backends/lima/defs_lima.json +1 -0
  415. qiskit/providers/fake_provider/backends/lima/fake_lima.py +38 -0
  416. qiskit/providers/fake_provider/backends/lima/props_lima.json +1 -0
  417. qiskit/providers/fake_provider/backends/london/__init__.py +16 -0
  418. qiskit/providers/fake_provider/backends/london/conf_london.json +1 -0
  419. qiskit/providers/fake_provider/backends/london/fake_london.py +54 -0
  420. qiskit/providers/fake_provider/backends/london/props_london.json +1 -0
  421. qiskit/providers/fake_provider/backends/manhattan/__init__.py +16 -0
  422. qiskit/providers/fake_provider/backends/manhattan/conf_manhattan.json +1 -0
  423. qiskit/providers/fake_provider/backends/manhattan/defs_manhattan.json +1 -0
  424. qiskit/providers/fake_provider/backends/manhattan/fake_manhattan.py +38 -0
  425. qiskit/providers/fake_provider/backends/manhattan/props_manhattan.json +1 -0
  426. qiskit/providers/fake_provider/backends/manila/__init__.py +16 -0
  427. qiskit/providers/fake_provider/backends/manila/conf_manila.json +1 -0
  428. qiskit/providers/fake_provider/backends/manila/defs_manila.json +1 -0
  429. qiskit/providers/fake_provider/backends/manila/fake_manila.py +38 -0
  430. qiskit/providers/fake_provider/backends/manila/props_manila.json +1 -0
  431. qiskit/providers/fake_provider/backends/melbourne/__init__.py +16 -0
  432. qiskit/providers/fake_provider/backends/melbourne/conf_melbourne.json +1 -0
  433. qiskit/providers/fake_provider/backends/melbourne/fake_melbourne.py +91 -0
  434. qiskit/providers/fake_provider/backends/melbourne/props_melbourne.json +1 -0
  435. qiskit/providers/fake_provider/backends/montreal/__init__.py +16 -0
  436. qiskit/providers/fake_provider/backends/montreal/conf_montreal.json +1 -0
  437. qiskit/providers/fake_provider/backends/montreal/defs_montreal.json +1 -0
  438. qiskit/providers/fake_provider/backends/montreal/fake_montreal.py +38 -0
  439. qiskit/providers/fake_provider/backends/montreal/props_montreal.json +1 -0
  440. qiskit/providers/fake_provider/backends/mumbai/__init__.py +16 -0
  441. qiskit/providers/fake_provider/backends/mumbai/conf_mumbai.json +1 -0
  442. qiskit/providers/fake_provider/backends/mumbai/defs_mumbai.json +1 -0
  443. qiskit/providers/fake_provider/backends/mumbai/fake_mumbai.py +38 -0
  444. qiskit/providers/fake_provider/backends/mumbai/props_mumbai.json +1 -0
  445. qiskit/providers/fake_provider/backends/nairobi/__init__.py +16 -0
  446. qiskit/providers/fake_provider/backends/nairobi/conf_nairobi.json +1 -0
  447. qiskit/providers/fake_provider/backends/nairobi/defs_nairobi.json +1 -0
  448. qiskit/providers/fake_provider/backends/nairobi/fake_nairobi.py +38 -0
  449. qiskit/providers/fake_provider/backends/nairobi/props_nairobi.json +1 -0
  450. qiskit/providers/fake_provider/backends/oslo/__init__.py +15 -0
  451. qiskit/providers/fake_provider/backends/oslo/conf_oslo.json +1 -0
  452. qiskit/providers/fake_provider/backends/oslo/defs_oslo.json +1 -0
  453. qiskit/providers/fake_provider/backends/oslo/fake_oslo.py +29 -0
  454. qiskit/providers/fake_provider/backends/oslo/props_oslo.json +1 -0
  455. qiskit/providers/fake_provider/backends/ourense/__init__.py +16 -0
  456. qiskit/providers/fake_provider/backends/ourense/conf_ourense.json +1 -0
  457. qiskit/providers/fake_provider/backends/ourense/fake_ourense.py +50 -0
  458. qiskit/providers/fake_provider/backends/ourense/props_ourense.json +1 -0
  459. qiskit/providers/fake_provider/backends/paris/__init__.py +16 -0
  460. qiskit/providers/fake_provider/backends/paris/conf_paris.json +1 -0
  461. qiskit/providers/fake_provider/backends/paris/defs_paris.json +1 -0
  462. qiskit/providers/fake_provider/backends/paris/fake_paris.py +64 -0
  463. qiskit/providers/fake_provider/backends/paris/props_paris.json +1 -0
  464. qiskit/providers/fake_provider/backends/perth/__init__.py +15 -0
  465. qiskit/providers/fake_provider/backends/perth/conf_perth.json +1 -0
  466. qiskit/providers/fake_provider/backends/perth/defs_perth.json +1 -0
  467. qiskit/providers/fake_provider/backends/perth/fake_perth.py +29 -0
  468. qiskit/providers/fake_provider/backends/perth/props_perth.json +1 -0
  469. qiskit/providers/fake_provider/backends/poughkeepsie/__init__.py +16 -0
  470. qiskit/providers/fake_provider/backends/poughkeepsie/conf_poughkeepsie.json +1 -0
  471. qiskit/providers/fake_provider/backends/poughkeepsie/defs_poughkeepsie.json +1 -0
  472. qiskit/providers/fake_provider/backends/poughkeepsie/fake_poughkeepsie.py +124 -0
  473. qiskit/providers/fake_provider/backends/poughkeepsie/props_poughkeepsie.json +1 -0
  474. qiskit/providers/fake_provider/backends/prague/__init__.py +15 -0
  475. qiskit/providers/fake_provider/backends/prague/conf_prague.json +1 -0
  476. qiskit/providers/fake_provider/backends/prague/fake_prague.py +28 -0
  477. qiskit/providers/fake_provider/backends/prague/props_prague.json +1 -0
  478. qiskit/providers/fake_provider/backends/quito/__init__.py +16 -0
  479. qiskit/providers/fake_provider/backends/quito/conf_quito.json +1 -0
  480. qiskit/providers/fake_provider/backends/quito/defs_quito.json +1 -0
  481. qiskit/providers/fake_provider/backends/quito/fake_quito.py +38 -0
  482. qiskit/providers/fake_provider/backends/quito/props_quito.json +1 -0
  483. qiskit/providers/fake_provider/backends/rochester/__init__.py +16 -0
  484. qiskit/providers/fake_provider/backends/rochester/conf_rochester.json +1 -0
  485. qiskit/providers/fake_provider/backends/rochester/fake_rochester.py +36 -0
  486. qiskit/providers/fake_provider/backends/rochester/props_rochester.json +1 -0
  487. qiskit/providers/fake_provider/backends/rome/__init__.py +16 -0
  488. qiskit/providers/fake_provider/backends/rome/conf_rome.json +1 -0
  489. qiskit/providers/fake_provider/backends/rome/defs_rome.json +1 -0
  490. qiskit/providers/fake_provider/backends/rome/fake_rome.py +38 -0
  491. qiskit/providers/fake_provider/backends/rome/props_rome.json +1 -0
  492. qiskit/providers/fake_provider/backends/rueschlikon/__init__.py +15 -0
  493. qiskit/providers/fake_provider/backends/rueschlikon/fake_rueschlikon.py +74 -0
  494. qiskit/providers/fake_provider/backends/santiago/__init__.py +16 -0
  495. qiskit/providers/fake_provider/backends/santiago/conf_santiago.json +1 -0
  496. qiskit/providers/fake_provider/backends/santiago/defs_santiago.json +1 -0
  497. qiskit/providers/fake_provider/backends/santiago/fake_santiago.py +38 -0
  498. qiskit/providers/fake_provider/backends/santiago/props_santiago.json +1 -0
  499. qiskit/providers/fake_provider/backends/sherbrooke/__init__.py +17 -0
  500. qiskit/providers/fake_provider/backends/sherbrooke/conf_sherbrooke.json +1 -0
  501. qiskit/providers/fake_provider/backends/sherbrooke/defs_sherbrooke.json +1 -0
  502. qiskit/providers/fake_provider/backends/sherbrooke/fake_sherbrooke.py +28 -0
  503. qiskit/providers/fake_provider/backends/sherbrooke/props_sherbrooke.json +1 -0
  504. qiskit/providers/fake_provider/backends/singapore/__init__.py +16 -0
  505. qiskit/providers/fake_provider/backends/singapore/conf_singapore.json +1 -0
  506. qiskit/providers/fake_provider/backends/singapore/fake_singapore.py +58 -0
  507. qiskit/providers/fake_provider/backends/singapore/props_singapore.json +1 -0
  508. qiskit/providers/fake_provider/backends/sydney/__init__.py +16 -0
  509. qiskit/providers/fake_provider/backends/sydney/conf_sydney.json +1 -0
  510. qiskit/providers/fake_provider/backends/sydney/defs_sydney.json +1 -0
  511. qiskit/providers/fake_provider/backends/sydney/fake_sydney.py +38 -0
  512. qiskit/providers/fake_provider/backends/sydney/props_sydney.json +1 -0
  513. qiskit/providers/fake_provider/backends/tenerife/__init__.py +15 -0
  514. qiskit/providers/fake_provider/backends/tenerife/fake_tenerife.py +64 -0
  515. qiskit/providers/fake_provider/backends/tenerife/props_tenerife.json +1 -0
  516. qiskit/providers/fake_provider/backends/tokyo/__init__.py +15 -0
  517. qiskit/providers/fake_provider/backends/tokyo/fake_tokyo.py +137 -0
  518. qiskit/providers/fake_provider/backends/tokyo/props_tokyo.json +1 -0
  519. qiskit/providers/fake_provider/backends/toronto/__init__.py +16 -0
  520. qiskit/providers/fake_provider/backends/toronto/conf_toronto.json +1 -0
  521. qiskit/providers/fake_provider/backends/toronto/defs_toronto.json +1 -0
  522. qiskit/providers/fake_provider/backends/toronto/fake_toronto.py +38 -0
  523. qiskit/providers/fake_provider/backends/toronto/props_toronto.json +1 -0
  524. qiskit/providers/fake_provider/backends/valencia/__init__.py +16 -0
  525. qiskit/providers/fake_provider/backends/valencia/conf_valencia.json +1 -0
  526. qiskit/providers/fake_provider/backends/valencia/defs_valencia.json +1 -0
  527. qiskit/providers/fake_provider/backends/valencia/fake_valencia.py +38 -0
  528. qiskit/providers/fake_provider/backends/valencia/props_valencia.json +1 -0
  529. qiskit/providers/fake_provider/backends/vigo/__init__.py +16 -0
  530. qiskit/providers/fake_provider/backends/vigo/conf_vigo.json +1 -0
  531. qiskit/providers/fake_provider/backends/vigo/fake_vigo.py +50 -0
  532. qiskit/providers/fake_provider/backends/vigo/props_vigo.json +1 -0
  533. qiskit/providers/fake_provider/backends/washington/__init__.py +18 -0
  534. qiskit/providers/fake_provider/backends/washington/conf_washington.json +1 -0
  535. qiskit/providers/fake_provider/backends/washington/defs_washington.json +1 -0
  536. qiskit/providers/fake_provider/backends/washington/fake_washington.py +38 -0
  537. qiskit/providers/fake_provider/backends/washington/props_washington.json +1 -0
  538. qiskit/providers/fake_provider/backends/yorktown/__init__.py +16 -0
  539. qiskit/providers/fake_provider/backends/yorktown/conf_yorktown.json +1 -0
  540. qiskit/providers/fake_provider/backends/yorktown/fake_yorktown.py +54 -0
  541. qiskit/providers/fake_provider/backends/yorktown/props_yorktown.json +1 -0
  542. qiskit/providers/fake_provider/fake_1q.py +91 -0
  543. qiskit/providers/fake_provider/fake_backend.py +572 -0
  544. qiskit/providers/fake_provider/fake_backend_v2.py +217 -0
  545. qiskit/providers/fake_provider/fake_job.py +81 -0
  546. qiskit/providers/fake_provider/fake_mumbai_v2.py +637 -0
  547. qiskit/providers/fake_provider/fake_openpulse_2q.py +342 -0
  548. qiskit/providers/fake_provider/fake_openpulse_3q.py +332 -0
  549. qiskit/providers/fake_provider/fake_provider.py +214 -0
  550. qiskit/providers/fake_provider/fake_pulse_backend.py +43 -0
  551. qiskit/providers/fake_provider/fake_qasm_backend.py +72 -0
  552. qiskit/providers/fake_provider/fake_qasm_simulator.py +48 -0
  553. qiskit/providers/fake_provider/fake_qobj.py +44 -0
  554. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  555. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  556. qiskit/providers/fake_provider/utils/configurable_backend.py +360 -0
  557. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  558. qiskit/providers/job.py +142 -0
  559. qiskit/providers/jobstatus.py +30 -0
  560. qiskit/providers/models/__init__.py +52 -0
  561. qiskit/providers/models/backendconfiguration.py +994 -0
  562. qiskit/providers/models/backendproperties.py +490 -0
  563. qiskit/providers/models/backendstatus.py +94 -0
  564. qiskit/providers/models/jobstatus.py +66 -0
  565. qiskit/providers/models/pulsedefaults.py +304 -0
  566. qiskit/providers/options.py +273 -0
  567. qiskit/providers/provider.py +79 -0
  568. qiskit/providers/providerutils.py +99 -0
  569. qiskit/pulse/__init__.py +170 -0
  570. qiskit/pulse/builder.py +2733 -0
  571. qiskit/pulse/calibration_entries.py +357 -0
  572. qiskit/pulse/channels.py +221 -0
  573. qiskit/pulse/configuration.py +244 -0
  574. qiskit/pulse/exceptions.py +43 -0
  575. qiskit/pulse/filters.py +302 -0
  576. qiskit/pulse/instruction_schedule_map.py +406 -0
  577. qiskit/pulse/instructions/__init__.py +69 -0
  578. qiskit/pulse/instructions/acquire.py +150 -0
  579. qiskit/pulse/instructions/call.py +176 -0
  580. qiskit/pulse/instructions/delay.py +69 -0
  581. qiskit/pulse/instructions/directives.py +145 -0
  582. qiskit/pulse/instructions/frequency.py +132 -0
  583. qiskit/pulse/instructions/instruction.py +266 -0
  584. qiskit/pulse/instructions/phase.py +149 -0
  585. qiskit/pulse/instructions/play.py +96 -0
  586. qiskit/pulse/instructions/reference.py +99 -0
  587. qiskit/pulse/instructions/snapshot.py +80 -0
  588. qiskit/pulse/library/__init__.py +99 -0
  589. qiskit/pulse/library/continuous.py +430 -0
  590. qiskit/pulse/library/parametric_pulses.py +629 -0
  591. qiskit/pulse/library/pulse.py +137 -0
  592. qiskit/pulse/library/samplers/__init__.py +15 -0
  593. qiskit/pulse/library/samplers/decorators.py +299 -0
  594. qiskit/pulse/library/samplers/strategies.py +71 -0
  595. qiskit/pulse/library/symbolic_pulses.py +1962 -0
  596. qiskit/pulse/library/waveform.py +134 -0
  597. qiskit/pulse/macros.py +256 -0
  598. qiskit/pulse/parameter_manager.py +432 -0
  599. qiskit/pulse/parser.py +314 -0
  600. qiskit/pulse/reference_manager.py +58 -0
  601. qiskit/pulse/schedule.py +2002 -0
  602. qiskit/pulse/transforms/__init__.py +106 -0
  603. qiskit/pulse/transforms/alignments.py +406 -0
  604. qiskit/pulse/transforms/base_transforms.py +71 -0
  605. qiskit/pulse/transforms/canonicalization.py +514 -0
  606. qiskit/pulse/transforms/dag.py +107 -0
  607. qiskit/pulse/utils.py +109 -0
  608. qiskit/qasm/libs/qelib1.inc +266 -0
  609. qiskit/qasm/libs/stdgates.inc +75 -0
  610. qiskit/qasm2/__init__.py +658 -0
  611. qiskit/qasm2/exceptions.py +27 -0
  612. qiskit/qasm2/export.py +374 -0
  613. qiskit/qasm2/parse.py +403 -0
  614. qiskit/qasm3/__init__.py +255 -0
  615. qiskit/qasm3/ast.py +606 -0
  616. qiskit/qasm3/exceptions.py +27 -0
  617. qiskit/qasm3/experimental.py +30 -0
  618. qiskit/qasm3/exporter.py +1079 -0
  619. qiskit/qasm3/printer.py +545 -0
  620. qiskit/qobj/__init__.py +75 -0
  621. qiskit/qobj/common.py +71 -0
  622. qiskit/qobj/converters/__init__.py +18 -0
  623. qiskit/qobj/converters/lo_config.py +168 -0
  624. qiskit/qobj/converters/pulse_instruction.py +1070 -0
  625. qiskit/qobj/pulse_qobj.py +655 -0
  626. qiskit/qobj/qasm_qobj.py +656 -0
  627. qiskit/qobj/utils.py +37 -0
  628. qiskit/qpy/__init__.py +1348 -0
  629. qiskit/qpy/binary_io/__init__.py +36 -0
  630. qiskit/qpy/binary_io/circuits.py +1212 -0
  631. qiskit/qpy/binary_io/schedules.py +619 -0
  632. qiskit/qpy/binary_io/value.py +549 -0
  633. qiskit/qpy/common.py +305 -0
  634. qiskit/qpy/exceptions.py +28 -0
  635. qiskit/qpy/formats.py +360 -0
  636. qiskit/qpy/interface.py +308 -0
  637. qiskit/qpy/type_keys.py +544 -0
  638. qiskit/quantum_info/__init__.py +173 -0
  639. qiskit/quantum_info/analysis/__init__.py +17 -0
  640. qiskit/quantum_info/analysis/average.py +47 -0
  641. qiskit/quantum_info/analysis/distance.py +101 -0
  642. qiskit/quantum_info/analysis/make_observable.py +43 -0
  643. qiskit/quantum_info/analysis/z2_symmetries.py +483 -0
  644. qiskit/quantum_info/operators/__init__.py +28 -0
  645. qiskit/quantum_info/operators/base_operator.py +145 -0
  646. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  647. qiskit/quantum_info/operators/channel/chi.py +190 -0
  648. qiskit/quantum_info/operators/channel/choi.py +217 -0
  649. qiskit/quantum_info/operators/channel/kraus.py +336 -0
  650. qiskit/quantum_info/operators/channel/ptm.py +203 -0
  651. qiskit/quantum_info/operators/channel/quantum_channel.py +350 -0
  652. qiskit/quantum_info/operators/channel/stinespring.py +295 -0
  653. qiskit/quantum_info/operators/channel/superop.py +376 -0
  654. qiskit/quantum_info/operators/channel/transformations.py +467 -0
  655. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  656. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  657. qiskit/quantum_info/operators/dihedral/dihedral.py +508 -0
  658. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +218 -0
  659. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  660. qiskit/quantum_info/operators/dihedral/random.py +61 -0
  661. qiskit/quantum_info/operators/linear_op.py +25 -0
  662. qiskit/quantum_info/operators/measures.py +423 -0
  663. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  664. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  665. qiskit/quantum_info/operators/mixins/group.py +171 -0
  666. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  667. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  668. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  669. qiskit/quantum_info/operators/op_shape.py +533 -0
  670. qiskit/quantum_info/operators/operator.py +778 -0
  671. qiskit/quantum_info/operators/predicates.py +170 -0
  672. qiskit/quantum_info/operators/random.py +154 -0
  673. qiskit/quantum_info/operators/scalar_op.py +253 -0
  674. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  675. qiskit/quantum_info/operators/symplectic/base_pauli.py +720 -0
  676. qiskit/quantum_info/operators/symplectic/clifford.py +1022 -0
  677. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  678. qiskit/quantum_info/operators/symplectic/pauli.py +699 -0
  679. qiskit/quantum_info/operators/symplectic/pauli_list.py +1209 -0
  680. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  681. qiskit/quantum_info/operators/symplectic/random.py +264 -0
  682. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1156 -0
  683. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  684. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  685. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  686. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  687. qiskit/quantum_info/random.py +26 -0
  688. qiskit/quantum_info/states/__init__.py +28 -0
  689. qiskit/quantum_info/states/densitymatrix.py +848 -0
  690. qiskit/quantum_info/states/measures.py +288 -0
  691. qiskit/quantum_info/states/quantum_state.py +503 -0
  692. qiskit/quantum_info/states/random.py +157 -0
  693. qiskit/quantum_info/states/stabilizerstate.py +638 -0
  694. qiskit/quantum_info/states/statevector.py +961 -0
  695. qiskit/quantum_info/states/utils.py +245 -0
  696. qiskit/quantum_info/synthesis/__init__.py +20 -0
  697. qiskit/quantum_info/synthesis/clifford_decompose.py +69 -0
  698. qiskit/quantum_info/synthesis/cnotdihedral_decompose.py +50 -0
  699. qiskit/quantum_info/synthesis/ion_decompose.py +55 -0
  700. qiskit/quantum_info/synthesis/local_invariance.py +93 -0
  701. qiskit/quantum_info/synthesis/one_qubit_decompose.py +284 -0
  702. qiskit/quantum_info/synthesis/qsd.py +269 -0
  703. qiskit/quantum_info/synthesis/quaternion.py +156 -0
  704. qiskit/quantum_info/synthesis/two_qubit_decompose.py +1567 -0
  705. qiskit/quantum_info/synthesis/weyl.py +98 -0
  706. qiskit/quantum_info/synthesis/xx_decompose/__init__.py +19 -0
  707. qiskit/quantum_info/synthesis/xx_decompose/circuits.py +299 -0
  708. qiskit/quantum_info/synthesis/xx_decompose/decomposer.py +314 -0
  709. qiskit/quantum_info/synthesis/xx_decompose/embodiments.py +163 -0
  710. qiskit/quantum_info/synthesis/xx_decompose/paths.py +412 -0
  711. qiskit/quantum_info/synthesis/xx_decompose/polytopes.py +264 -0
  712. qiskit/quantum_info/synthesis/xx_decompose/utilities.py +40 -0
  713. qiskit/quantum_info/synthesis/xx_decompose/weyl.py +133 -0
  714. qiskit/result/__init__.py +67 -0
  715. qiskit/result/counts.py +189 -0
  716. qiskit/result/distributions/__init__.py +17 -0
  717. qiskit/result/distributions/probability.py +100 -0
  718. qiskit/result/distributions/quasi.py +154 -0
  719. qiskit/result/exceptions.py +40 -0
  720. qiskit/result/mitigation/__init__.py +13 -0
  721. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  722. qiskit/result/mitigation/correlated_readout_mitigator.py +268 -0
  723. qiskit/result/mitigation/local_readout_mitigator.py +319 -0
  724. qiskit/result/mitigation/utils.py +161 -0
  725. qiskit/result/models.py +233 -0
  726. qiskit/result/postprocess.py +239 -0
  727. qiskit/result/result.py +397 -0
  728. qiskit/result/sampled_expval.py +75 -0
  729. qiskit/result/utils.py +295 -0
  730. qiskit/scheduler/__init__.py +31 -0
  731. qiskit/scheduler/config.py +35 -0
  732. qiskit/scheduler/lowering.py +187 -0
  733. qiskit/scheduler/methods/__init__.py +22 -0
  734. qiskit/scheduler/methods/basic.py +137 -0
  735. qiskit/scheduler/schedule_circuit.py +67 -0
  736. qiskit/scheduler/sequence.py +102 -0
  737. qiskit/synthesis/__init__.py +122 -0
  738. qiskit/synthesis/clifford/__init__.py +19 -0
  739. qiskit/synthesis/clifford/clifford_decompose_ag.py +176 -0
  740. qiskit/synthesis/clifford/clifford_decompose_bm.py +276 -0
  741. qiskit/synthesis/clifford/clifford_decompose_full.py +61 -0
  742. qiskit/synthesis/clifford/clifford_decompose_greedy.py +347 -0
  743. qiskit/synthesis/clifford/clifford_decompose_layers.py +443 -0
  744. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  745. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +46 -0
  746. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +140 -0
  747. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +264 -0
  748. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  749. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  750. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  751. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  752. qiskit/synthesis/discrete_basis/solovay_kitaev.py +207 -0
  753. qiskit/synthesis/evolution/__init__.py +20 -0
  754. qiskit/synthesis/evolution/evolution_synthesis.py +46 -0
  755. qiskit/synthesis/evolution/lie_trotter.py +123 -0
  756. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  757. qiskit/synthesis/evolution/product_formula.py +328 -0
  758. qiskit/synthesis/evolution/qdrift.py +102 -0
  759. qiskit/synthesis/evolution/suzuki_trotter.py +145 -0
  760. qiskit/synthesis/linear/__init__.py +25 -0
  761. qiskit/synthesis/linear/cnot_synth.py +141 -0
  762. qiskit/synthesis/linear/linear_circuits_utils.py +127 -0
  763. qiskit/synthesis/linear/linear_depth_lnn.py +275 -0
  764. qiskit/synthesis/linear/linear_matrix_utils.py +175 -0
  765. qiskit/synthesis/linear_phase/__init__.py +17 -0
  766. qiskit/synthesis/linear_phase/cnot_phase_synth.py +203 -0
  767. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  768. qiskit/synthesis/linear_phase/cz_depth_lnn.py +206 -0
  769. qiskit/synthesis/permutation/__init__.py +17 -0
  770. qiskit/synthesis/permutation/permutation_full.py +90 -0
  771. qiskit/synthesis/permutation/permutation_lnn.py +68 -0
  772. qiskit/synthesis/permutation/permutation_utils.py +73 -0
  773. qiskit/synthesis/stabilizer/__init__.py +15 -0
  774. qiskit/synthesis/stabilizer/stabilizer_decompose.py +188 -0
  775. qiskit/test/__init__.py +18 -0
  776. qiskit/test/_canonical.py +125 -0
  777. qiskit/test/base.py +331 -0
  778. qiskit/test/decorators.py +308 -0
  779. qiskit/test/ibmq_mock.py +45 -0
  780. qiskit/test/mock/__init__.py +40 -0
  781. qiskit/test/mock/backends/__init__.py +32 -0
  782. qiskit/test/mock/backends/almaden/__init__.py +32 -0
  783. qiskit/test/mock/backends/armonk/__init__.py +32 -0
  784. qiskit/test/mock/backends/athens/__init__.py +32 -0
  785. qiskit/test/mock/backends/belem/__init__.py +32 -0
  786. qiskit/test/mock/backends/boeblingen/__init__.py +32 -0
  787. qiskit/test/mock/backends/bogota/__init__.py +32 -0
  788. qiskit/test/mock/backends/brooklyn/__init__.py +32 -0
  789. qiskit/test/mock/backends/burlington/__init__.py +32 -0
  790. qiskit/test/mock/backends/cairo/__init__.py +32 -0
  791. qiskit/test/mock/backends/cambridge/__init__.py +32 -0
  792. qiskit/test/mock/backends/casablanca/__init__.py +32 -0
  793. qiskit/test/mock/backends/essex/__init__.py +32 -0
  794. qiskit/test/mock/backends/guadalupe/__init__.py +32 -0
  795. qiskit/test/mock/backends/hanoi/__init__.py +32 -0
  796. qiskit/test/mock/backends/jakarta/__init__.py +32 -0
  797. qiskit/test/mock/backends/johannesburg/__init__.py +32 -0
  798. qiskit/test/mock/backends/kolkata/__init__.py +32 -0
  799. qiskit/test/mock/backends/lagos/__init__.py +32 -0
  800. qiskit/test/mock/backends/lima/__init__.py +32 -0
  801. qiskit/test/mock/backends/london/__init__.py +32 -0
  802. qiskit/test/mock/backends/manhattan/__init__.py +32 -0
  803. qiskit/test/mock/backends/manila/__init__.py +32 -0
  804. qiskit/test/mock/backends/melbourne/__init__.py +32 -0
  805. qiskit/test/mock/backends/montreal/__init__.py +32 -0
  806. qiskit/test/mock/backends/mumbai/__init__.py +32 -0
  807. qiskit/test/mock/backends/nairobi/__init__.py +32 -0
  808. qiskit/test/mock/backends/ourense/__init__.py +32 -0
  809. qiskit/test/mock/backends/paris/__init__.py +32 -0
  810. qiskit/test/mock/backends/poughkeepsie/__init__.py +32 -0
  811. qiskit/test/mock/backends/quito/__init__.py +32 -0
  812. qiskit/test/mock/backends/rochester/__init__.py +32 -0
  813. qiskit/test/mock/backends/rome/__init__.py +32 -0
  814. qiskit/test/mock/backends/rueschlikon/__init__.py +32 -0
  815. qiskit/test/mock/backends/santiago/__init__.py +32 -0
  816. qiskit/test/mock/backends/singapore/__init__.py +32 -0
  817. qiskit/test/mock/backends/sydney/__init__.py +32 -0
  818. qiskit/test/mock/backends/tenerife/__init__.py +32 -0
  819. qiskit/test/mock/backends/tokyo/__init__.py +32 -0
  820. qiskit/test/mock/backends/toronto/__init__.py +32 -0
  821. qiskit/test/mock/backends/valencia/__init__.py +32 -0
  822. qiskit/test/mock/backends/vigo/__init__.py +32 -0
  823. qiskit/test/mock/backends/washington/__init__.py +32 -0
  824. qiskit/test/mock/backends/yorktown/__init__.py +32 -0
  825. qiskit/test/providers/__init__.py +16 -0
  826. qiskit/test/providers/backend.py +75 -0
  827. qiskit/test/providers/provider.py +59 -0
  828. qiskit/test/reference_circuits.py +41 -0
  829. qiskit/test/testing_options.py +93 -0
  830. qiskit/test/utils.py +87 -0
  831. qiskit/tools/__init__.py +44 -0
  832. qiskit/tools/events/__init__.py +25 -0
  833. qiskit/tools/events/progressbar.py +195 -0
  834. qiskit/tools/events/pubsub.py +158 -0
  835. qiskit/tools/jupyter/__init__.py +138 -0
  836. qiskit/tools/jupyter/backend_monitor.py +588 -0
  837. qiskit/tools/jupyter/backend_overview.py +322 -0
  838. qiskit/tools/jupyter/copyright.py +42 -0
  839. qiskit/tools/jupyter/job_watcher.py +167 -0
  840. qiskit/tools/jupyter/job_widgets.py +160 -0
  841. qiskit/tools/jupyter/jupyter_magics.py +190 -0
  842. qiskit/tools/jupyter/library.py +189 -0
  843. qiskit/tools/jupyter/monospace.py +29 -0
  844. qiskit/tools/jupyter/progressbar.py +122 -0
  845. qiskit/tools/jupyter/version_table.py +67 -0
  846. qiskit/tools/jupyter/watcher_monitor.py +74 -0
  847. qiskit/tools/monitor/__init__.py +16 -0
  848. qiskit/tools/monitor/job_monitor.py +107 -0
  849. qiskit/tools/monitor/overview.py +247 -0
  850. qiskit/tools/parallel.py +198 -0
  851. qiskit/tools/visualization.py +16 -0
  852. qiskit/transpiler/__init__.py +1287 -0
  853. qiskit/transpiler/basepasses.py +221 -0
  854. qiskit/transpiler/coupling.py +500 -0
  855. qiskit/transpiler/exceptions.py +55 -0
  856. qiskit/transpiler/fencedobjs.py +78 -0
  857. qiskit/transpiler/instruction_durations.py +278 -0
  858. qiskit/transpiler/layout.py +658 -0
  859. qiskit/transpiler/passes/__init__.py +296 -0
  860. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  861. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  862. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  863. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  864. qiskit/transpiler/passes/analysis/depth.py +33 -0
  865. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  866. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  867. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  868. qiskit/transpiler/passes/analysis/size.py +36 -0
  869. qiskit/transpiler/passes/analysis/width.py +27 -0
  870. qiskit/transpiler/passes/basis/__init__.py +20 -0
  871. qiskit/transpiler/passes/basis/basis_translator.py +697 -0
  872. qiskit/transpiler/passes/basis/decompose.py +98 -0
  873. qiskit/transpiler/passes/basis/translate_parameterized.py +177 -0
  874. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +86 -0
  875. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +107 -0
  876. qiskit/transpiler/passes/basis/unroller.py +145 -0
  877. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  878. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  879. qiskit/transpiler/passes/calibration/builders.py +20 -0
  880. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  881. qiskit/transpiler/passes/calibration/pulse_gate.py +98 -0
  882. qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
  883. qiskit/transpiler/passes/calibration/rzx_builder.py +394 -0
  884. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  885. qiskit/transpiler/passes/layout/__init__.py +27 -0
  886. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  887. qiskit/transpiler/passes/layout/apply_layout.py +108 -0
  888. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  889. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  890. qiskit/transpiler/passes/layout/disjoint_utils.py +205 -0
  891. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  892. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  893. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  894. qiskit/transpiler/passes/layout/noise_adaptive_layout.py +311 -0
  895. qiskit/transpiler/passes/layout/sabre_layout.py +468 -0
  896. qiskit/transpiler/passes/layout/sabre_pre_layout.py +217 -0
  897. qiskit/transpiler/passes/layout/set_layout.py +64 -0
  898. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  899. qiskit/transpiler/passes/layout/vf2_layout.py +257 -0
  900. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  901. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  902. qiskit/transpiler/passes/optimization/__init__.py +38 -0
  903. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  904. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  905. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  906. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  907. qiskit/transpiler/passes/optimization/collect_cliffords.py +97 -0
  908. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  909. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  910. qiskit/transpiler/passes/optimization/commutation_analysis.py +93 -0
  911. qiskit/transpiler/passes/optimization/commutative_cancellation.py +207 -0
  912. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +97 -0
  913. qiskit/transpiler/passes/optimization/consolidate_blocks.py +219 -0
  914. qiskit/transpiler/passes/optimization/crosstalk_adaptive_schedule.py +732 -0
  915. qiskit/transpiler/passes/optimization/cx_cancellation.py +55 -0
  916. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
  917. qiskit/transpiler/passes/optimization/hoare_opt.py +416 -0
  918. qiskit/transpiler/passes/optimization/inverse_cancellation.py +177 -0
  919. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  920. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  921. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +263 -0
  922. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  923. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  924. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  925. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +69 -0
  926. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  927. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  928. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  929. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  930. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +454 -0
  931. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  932. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  933. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +629 -0
  934. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  935. qiskit/transpiler/passes/routing/__init__.py +21 -0
  936. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  937. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  938. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  939. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  940. qiskit/transpiler/passes/routing/basic_swap.py +155 -0
  941. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  942. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  943. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +387 -0
  944. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +141 -0
  945. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  946. qiskit/transpiler/passes/routing/layout_transformation.py +118 -0
  947. qiskit/transpiler/passes/routing/lookahead_swap.py +384 -0
  948. qiskit/transpiler/passes/routing/sabre_swap.py +430 -0
  949. qiskit/transpiler/passes/routing/stochastic_swap.py +512 -0
  950. qiskit/transpiler/passes/routing/utils.py +35 -0
  951. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  952. qiskit/transpiler/passes/scheduling/alap.py +155 -0
  953. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  954. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +256 -0
  955. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +75 -0
  956. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +97 -0
  957. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +241 -0
  958. qiskit/transpiler/passes/scheduling/asap.py +177 -0
  959. qiskit/transpiler/passes/scheduling/base_scheduler.py +289 -0
  960. qiskit/transpiler/passes/scheduling/calibration_creators.py +27 -0
  961. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +285 -0
  962. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  963. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  964. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +408 -0
  965. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -0
  966. qiskit/transpiler/passes/scheduling/rzx_templates.py +28 -0
  967. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  968. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  969. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  970. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +89 -0
  971. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  972. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +135 -0
  973. qiskit/transpiler/passes/synthesis/__init__.py +19 -0
  974. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +637 -0
  975. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +63 -0
  976. qiskit/transpiler/passes/synthesis/plugin.py +597 -0
  977. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +289 -0
  978. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +895 -0
  979. qiskit/transpiler/passes/utils/__init__.py +34 -0
  980. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -0
  981. qiskit/transpiler/passes/utils/block_to_matrix.py +47 -0
  982. qiskit/transpiler/passes/utils/check_gate_direction.py +87 -0
  983. qiskit/transpiler/passes/utils/check_map.py +94 -0
  984. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  985. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  986. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +89 -0
  987. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  988. qiskit/transpiler/passes/utils/error.py +69 -0
  989. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  990. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  991. qiskit/transpiler/passes/utils/gate_direction.py +347 -0
  992. qiskit/transpiler/passes/utils/gates_basis.py +75 -0
  993. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -0
  994. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  995. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  996. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  997. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  998. qiskit/transpiler/passmanager.py +617 -0
  999. qiskit/transpiler/passmanager_config.py +193 -0
  1000. qiskit/transpiler/preset_passmanagers/__init__.py +280 -0
  1001. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +971 -0
  1002. qiskit/transpiler/preset_passmanagers/common.py +651 -0
  1003. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  1004. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  1005. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  1006. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  1007. qiskit/transpiler/preset_passmanagers/plugin.py +345 -0
  1008. qiskit/transpiler/propertyset.py +19 -0
  1009. qiskit/transpiler/runningpassmanager.py +174 -0
  1010. qiskit/transpiler/synthesis/__init__.py +16 -0
  1011. qiskit/transpiler/synthesis/aqc/__init__.py +178 -0
  1012. qiskit/transpiler/synthesis/aqc/approximate.py +116 -0
  1013. qiskit/transpiler/synthesis/aqc/aqc.py +170 -0
  1014. qiskit/transpiler/synthesis/aqc/aqc_plugin.py +146 -0
  1015. qiskit/transpiler/synthesis/aqc/cnot_structures.py +299 -0
  1016. qiskit/transpiler/synthesis/aqc/cnot_unit_circuit.py +103 -0
  1017. qiskit/transpiler/synthesis/aqc/cnot_unit_objective.py +299 -0
  1018. qiskit/transpiler/synthesis/aqc/elementary_operations.py +108 -0
  1019. qiskit/transpiler/synthesis/aqc/fast_gradient/__init__.py +164 -0
  1020. qiskit/transpiler/synthesis/aqc/fast_gradient/fast_grad_utils.py +237 -0
  1021. qiskit/transpiler/synthesis/aqc/fast_gradient/fast_gradient.py +225 -0
  1022. qiskit/transpiler/synthesis/aqc/fast_gradient/layer.py +370 -0
  1023. qiskit/transpiler/synthesis/aqc/fast_gradient/pmatrix.py +312 -0
  1024. qiskit/transpiler/synthesis/graysynth.py +114 -0
  1025. qiskit/transpiler/target.py +1540 -0
  1026. qiskit/transpiler/timing_constraints.py +59 -0
  1027. qiskit/user_config.py +239 -0
  1028. qiskit/utils/__init__.py +66 -0
  1029. qiskit/utils/classtools.py +146 -0
  1030. qiskit/utils/deprecation.py +489 -0
  1031. qiskit/utils/lazy_tester.py +334 -0
  1032. qiskit/utils/multiprocessing.py +48 -0
  1033. qiskit/utils/optionals.py +320 -0
  1034. qiskit/utils/units.py +143 -0
  1035. qiskit/version.py +84 -0
  1036. qiskit/visualization/__init__.py +289 -0
  1037. qiskit/visualization/array.py +204 -0
  1038. qiskit/visualization/bloch.py +741 -0
  1039. qiskit/visualization/circuit/__init__.py +15 -0
  1040. qiskit/visualization/circuit/_utils.py +633 -0
  1041. qiskit/visualization/circuit/circuit_visualization.py +717 -0
  1042. qiskit/visualization/circuit/latex.py +659 -0
  1043. qiskit/visualization/circuit/matplotlib.py +1975 -0
  1044. qiskit/visualization/circuit/qcstyle.py +420 -0
  1045. qiskit/visualization/circuit/styles/bw.json +202 -0
  1046. qiskit/visualization/circuit/styles/clifford.json +202 -0
  1047. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  1048. qiskit/visualization/circuit/styles/iqp.json +214 -0
  1049. qiskit/visualization/circuit/styles/textbook.json +202 -0
  1050. qiskit/visualization/circuit/text.py +1802 -0
  1051. qiskit/visualization/circuit_visualization.py +19 -0
  1052. qiskit/visualization/counts_visualization.py +496 -0
  1053. qiskit/visualization/dag_visualization.py +224 -0
  1054. qiskit/visualization/exceptions.py +21 -0
  1055. qiskit/visualization/gate_map.py +1461 -0
  1056. qiskit/visualization/pass_manager_visualization.py +281 -0
  1057. qiskit/visualization/pulse_v2/__init__.py +21 -0
  1058. qiskit/visualization/pulse_v2/core.py +905 -0
  1059. qiskit/visualization/pulse_v2/device_info.py +146 -0
  1060. qiskit/visualization/pulse_v2/drawings.py +253 -0
  1061. qiskit/visualization/pulse_v2/events.py +254 -0
  1062. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  1063. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  1064. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  1065. qiskit/visualization/pulse_v2/generators/frame.py +437 -0
  1066. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  1067. qiskit/visualization/pulse_v2/generators/waveform.py +649 -0
  1068. qiskit/visualization/pulse_v2/interface.py +452 -0
  1069. qiskit/visualization/pulse_v2/layouts.py +395 -0
  1070. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  1071. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  1072. qiskit/visualization/pulse_v2/plotters/matplotlib.py +202 -0
  1073. qiskit/visualization/pulse_v2/stylesheet.py +322 -0
  1074. qiskit/visualization/pulse_v2/types.py +242 -0
  1075. qiskit/visualization/qcstyle.py +17 -0
  1076. qiskit/visualization/state_visualization.py +1518 -0
  1077. qiskit/visualization/timeline/__init__.py +21 -0
  1078. qiskit/visualization/timeline/core.py +457 -0
  1079. qiskit/visualization/timeline/drawings.py +260 -0
  1080. qiskit/visualization/timeline/generators.py +506 -0
  1081. qiskit/visualization/timeline/interface.py +414 -0
  1082. qiskit/visualization/timeline/layouts.py +115 -0
  1083. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  1084. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  1085. qiskit/visualization/timeline/plotters/matplotlib.py +193 -0
  1086. qiskit/visualization/timeline/stylesheet.py +311 -0
  1087. qiskit/visualization/timeline/types.py +148 -0
  1088. qiskit/visualization/transition_visualization.py +364 -0
  1089. qiskit/visualization/utils.py +49 -0
  1090. qiskit-1.0.0b1.dist-info/LICENSE.txt +203 -0
  1091. qiskit-1.0.0b1.dist-info/METADATA +430 -0
  1092. qiskit-1.0.0b1.dist-info/RECORD +1095 -0
  1093. qiskit-1.0.0b1.dist-info/WHEEL +6 -0
  1094. qiskit-1.0.0b1.dist-info/entry_points.txt +49 -0
  1095. qiskit-1.0.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1079 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2021.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """QASM3 Exporter"""
14
+
15
+ import collections
16
+ import re
17
+ import io
18
+ import itertools
19
+ import numbers
20
+ from os.path import dirname, join, abspath
21
+ from typing import Iterable, List, Sequence, Union
22
+
23
+ from qiskit.circuit import (
24
+ Barrier,
25
+ CircuitInstruction,
26
+ Clbit,
27
+ Gate,
28
+ Instruction,
29
+ Measure,
30
+ Parameter,
31
+ ParameterExpression,
32
+ QuantumCircuit,
33
+ Qubit,
34
+ Reset,
35
+ Delay,
36
+ )
37
+ from qiskit.circuit.bit import Bit
38
+ from qiskit.circuit.classical import expr, types
39
+ from qiskit.circuit.controlflow import (
40
+ IfElseOp,
41
+ ForLoopOp,
42
+ WhileLoopOp,
43
+ SwitchCaseOp,
44
+ ControlFlowOp,
45
+ BreakLoopOp,
46
+ ContinueLoopOp,
47
+ CASE_DEFAULT,
48
+ )
49
+ from qiskit.circuit.library import standard_gates
50
+ from qiskit.circuit.register import Register
51
+ from qiskit.circuit.tools import pi_check
52
+
53
+ from . import ast
54
+ from .experimental import ExperimentalFeatures
55
+ from .exceptions import QASM3ExporterError
56
+ from .printer import BasicPrinter
57
+
58
+
59
+ # Reserved keywords that gates and variables cannot be named. It is possible that some of these
60
+ # _could_ be accepted as variable names by OpenQASM 3 parsers, but it's safer for us to just be very
61
+ # conservative.
62
+ _RESERVED_KEYWORDS = frozenset(
63
+ {
64
+ "OPENQASM",
65
+ "U",
66
+ "angle",
67
+ "array",
68
+ "barrier",
69
+ "bit",
70
+ "bool",
71
+ "box",
72
+ "break",
73
+ "cal",
74
+ "complex",
75
+ "const",
76
+ "continue",
77
+ "creg",
78
+ "ctrl",
79
+ "def",
80
+ "defcal",
81
+ "defcalgrammar",
82
+ "delay",
83
+ "duration",
84
+ "durationof",
85
+ "else",
86
+ "end",
87
+ "extern",
88
+ "float",
89
+ "for",
90
+ "gate",
91
+ "gphase",
92
+ "if",
93
+ "in",
94
+ "include",
95
+ "input",
96
+ "int",
97
+ "inv",
98
+ "let",
99
+ "measure",
100
+ "mutable",
101
+ "negctrl",
102
+ "output",
103
+ "pow",
104
+ "qreg",
105
+ "qubit",
106
+ "reset",
107
+ "return",
108
+ "sizeof",
109
+ "stretch",
110
+ "uint",
111
+ "while",
112
+ }
113
+ )
114
+
115
+ # This probably isn't precisely the same as the OQ3 spec, but we'd need an extra dependency to fully
116
+ # handle all Unicode character classes, and this should be close enough for users who aren't
117
+ # actively _trying_ to break us (fingers crossed).
118
+ _VALID_IDENTIFIER = re.compile(r"[\w][\w\d]*", flags=re.U)
119
+
120
+
121
+ def _escape_invalid_identifier(name: str) -> str:
122
+ if name in _RESERVED_KEYWORDS or not _VALID_IDENTIFIER.fullmatch(name):
123
+ name = "_" + re.sub(r"[^\w\d]", "_", name)
124
+ return name
125
+
126
+
127
+ class Exporter:
128
+ """QASM3 exporter main class."""
129
+
130
+ def __init__(
131
+ self,
132
+ includes: Sequence[str] = ("stdgates.inc",),
133
+ basis_gates: Sequence[str] = ("U",),
134
+ disable_constants: bool = False,
135
+ alias_classical_registers: bool = None,
136
+ allow_aliasing: bool = None,
137
+ indent: str = " ",
138
+ experimental: ExperimentalFeatures = ExperimentalFeatures(0),
139
+ ):
140
+ """
141
+ Args:
142
+ includes: the filenames that should be emitted as includes. These files will be parsed
143
+ for gates, and any objects dumped from this exporter will use those definitions
144
+ where possible.
145
+ basis_gates: the basic defined gate set of the backend.
146
+ disable_constants: if ``True``, always emit floating-point constants for numeric
147
+ parameter values. If ``False`` (the default), then values close to multiples of
148
+ OpenQASM 3 constants (``pi``, ``euler``, and ``tau``) will be emitted in terms of those
149
+ constants instead, potentially improving accuracy in the output.
150
+ alias_classical_registers: If ``True``, then bits may be contained in more than one
151
+ register. If so, the registers will be emitted using "alias" definitions, which
152
+ might not be well supported by consumers of OpenQASM 3.
153
+
154
+ .. seealso::
155
+ Parameter ``allow_aliasing``
156
+ A value for ``allow_aliasing`` overrides any value given here, and
157
+ supersedes this parameter.
158
+ allow_aliasing: If ``True``, then bits may be contained in more than one register. If
159
+ so, the registers will be emitted using "alias" definitions, which might not be
160
+ well supported by consumers of OpenQASM 3. Defaults to ``False`` or the value of
161
+ ``alias_classical_registers``.
162
+
163
+ .. versionadded:: 0.25.0
164
+ indent: the indentation string to use for each level within an indented block. Can be
165
+ set to the empty string to disable indentation.
166
+ experimental: any experimental features to enable during the export. See
167
+ :class:`ExperimentalFeatures` for more details.
168
+ """
169
+ self.basis_gates = basis_gates
170
+ self.disable_constants = disable_constants
171
+ self.allow_aliasing = (
172
+ allow_aliasing if allow_aliasing is not None else (alias_classical_registers or False)
173
+ )
174
+ self.includes = list(includes)
175
+ self.indent = indent
176
+ self.experimental = experimental
177
+
178
+ def dumps(self, circuit):
179
+ """Convert the circuit to OpenQASM 3, returning the result as a string."""
180
+ with io.StringIO() as stream:
181
+ self.dump(circuit, stream)
182
+ return stream.getvalue()
183
+
184
+ def dump(self, circuit, stream):
185
+ """Convert the circuit to OpenQASM 3, dumping the result to a file or text stream."""
186
+ builder = QASM3Builder(
187
+ circuit,
188
+ includeslist=self.includes,
189
+ basis_gates=self.basis_gates,
190
+ disable_constants=self.disable_constants,
191
+ allow_aliasing=self.allow_aliasing,
192
+ experimental=self.experimental,
193
+ )
194
+ BasicPrinter(stream, indent=self.indent, experimental=self.experimental).visit(
195
+ builder.build_program()
196
+ )
197
+
198
+
199
+ class GlobalNamespace:
200
+ """Global namespace dict-like."""
201
+
202
+ BASIS_GATE = object()
203
+
204
+ qiskit_gates = {
205
+ "p": standard_gates.PhaseGate,
206
+ "x": standard_gates.XGate,
207
+ "y": standard_gates.YGate,
208
+ "z": standard_gates.ZGate,
209
+ "h": standard_gates.HGate,
210
+ "s": standard_gates.SGate,
211
+ "sdg": standard_gates.SdgGate,
212
+ "t": standard_gates.TGate,
213
+ "tdg": standard_gates.TdgGate,
214
+ "sx": standard_gates.SXGate,
215
+ "rx": standard_gates.RXGate,
216
+ "ry": standard_gates.RYGate,
217
+ "rz": standard_gates.RZGate,
218
+ "cx": standard_gates.CXGate,
219
+ "cy": standard_gates.CYGate,
220
+ "cz": standard_gates.CZGate,
221
+ "cp": standard_gates.CPhaseGate,
222
+ "crx": standard_gates.CRXGate,
223
+ "cry": standard_gates.CRYGate,
224
+ "crz": standard_gates.CRZGate,
225
+ "ch": standard_gates.CHGate,
226
+ "swap": standard_gates.SwapGate,
227
+ "ccx": standard_gates.CCXGate,
228
+ "cswap": standard_gates.CSwapGate,
229
+ "cu": standard_gates.CUGate,
230
+ "CX": standard_gates.CXGate,
231
+ "phase": standard_gates.PhaseGate,
232
+ "cphase": standard_gates.CPhaseGate,
233
+ "id": standard_gates.IGate,
234
+ "u1": standard_gates.U1Gate,
235
+ "u2": standard_gates.U2Gate,
236
+ "u3": standard_gates.U3Gate,
237
+ }
238
+ include_paths = [abspath(join(dirname(__file__), "..", "qasm", "libs"))]
239
+
240
+ def __init__(self, includelist, basis_gates=()):
241
+ self._data = {gate: self.BASIS_GATE for gate in basis_gates}
242
+
243
+ for includefile in includelist:
244
+ if includefile == "stdgates.inc":
245
+ self._data.update(self.qiskit_gates)
246
+ else:
247
+ # TODO What do if an inc file is not standard?
248
+ # Should it be parsed?
249
+ pass
250
+
251
+ def __setitem__(self, name_str, instruction):
252
+ self._data[name_str] = instruction.base_class
253
+ self._data[id(instruction)] = name_str
254
+
255
+ def __getitem__(self, key):
256
+ if isinstance(key, Instruction):
257
+ try:
258
+ # Registered gates.
259
+ return self._data[id(key)]
260
+ except KeyError:
261
+ pass
262
+ # Built-in gates.
263
+ if key.name not in self._data:
264
+ raise KeyError(key)
265
+ return key.name
266
+ return self._data[key]
267
+
268
+ def __iter__(self):
269
+ return iter(self._data)
270
+
271
+ def __contains__(self, instruction):
272
+ if isinstance(instruction, standard_gates.UGate):
273
+ return True
274
+ if id(instruction) in self._data:
275
+ return True
276
+ if self._data.get(instruction.name) is self.BASIS_GATE:
277
+ return True
278
+ if type(instruction) in [Gate, Instruction]: # user-defined instructions/gate
279
+ return self._data.get(instruction.name, None) == instruction
280
+ type_ = self._data.get(instruction.name)
281
+ if isinstance(type_, type) and isinstance(instruction, type_):
282
+ return True
283
+ return False
284
+
285
+ def register(self, instruction):
286
+ """Register an instruction in the namespace"""
287
+ # The second part of the condition is a nasty hack to ensure that gates that come with at
288
+ # least one parameter always have their id in the name. This is a workaround a bug, where
289
+ # gates with parameters do not contain the information required to build the gate definition
290
+ # in symbolic form (unless the parameters are all symbolic). The exporter currently
291
+ # (2021-12-01) builds gate declarations with parameters in the signature, but then ignores
292
+ # those parameters during the body, and just uses the concrete values from the first
293
+ # instance of the gate it sees, such as:
294
+ # gate rzx(_gate_p_0) _gate_q_0, _gate_q_1 {
295
+ # h _gate_q_1;
296
+ # cx _gate_q_0, _gate_q_1;
297
+ # rz(0.2) _gate_q_1; // <- note the concrete value.
298
+ # cx _gate_q_0, _gate_q_1;
299
+ # h _gate_q_1;
300
+ # }
301
+ # This then means that multiple calls to the same gate with different parameters will be
302
+ # incorrect. By forcing all gates to be defined including their id, we generate a QASM3
303
+ # program that does what was intended, even though the output QASM3 is silly. See gh-7335.
304
+ if instruction.name in self._data or (
305
+ isinstance(instruction, Gate)
306
+ and not all(isinstance(param, Parameter) for param in instruction.params)
307
+ ):
308
+ key = f"{instruction.name}_{id(instruction)}"
309
+ else:
310
+ key = instruction.name
311
+ self[key] = instruction
312
+
313
+
314
+ # A _Scope is the structure used in the builder to store the contexts and re-mappings of bits from
315
+ # the top-level scope where the bits were actually defined. In the class, 'circuit' is an instance
316
+ # of QuantumCircuit that defines this level, and 'bit_map' is a mapping of 'Bit: Bit', where the
317
+ # keys are bits in the circuit in this scope, and the values are the Bit in the top-level scope in
318
+ # this context that this bit actually represents. 'symbol_map' is a bidirectional mapping of
319
+ # '<Terra object>: Identifier' and 'str: <Terra object>', where the string in the second map is the
320
+ # name of the identifier. This is a cheap hack around actually implementing a proper symbol table.
321
+ _Scope = collections.namedtuple("_Scope", ("circuit", "bit_map", "symbol_map"))
322
+
323
+
324
+ class QASM3Builder:
325
+ """QASM3 builder constructs an AST from a QuantumCircuit."""
326
+
327
+ builtins = (Barrier, Measure, Reset, Delay, BreakLoopOp, ContinueLoopOp)
328
+ loose_bit_prefix = "_bit"
329
+ loose_qubit_prefix = "_qubit"
330
+ gate_parameter_prefix = "_gate_p"
331
+ gate_qubit_prefix = "_gate_q"
332
+
333
+ def __init__(
334
+ self,
335
+ quantumcircuit,
336
+ includeslist,
337
+ basis_gates,
338
+ disable_constants,
339
+ allow_aliasing,
340
+ experimental=ExperimentalFeatures(0),
341
+ ):
342
+ # This is a stack of stacks; the outer stack is a list of "outer" look-up contexts, and the
343
+ # inner stack is for scopes within these. A "outer" look-up context in this sense means
344
+ # the main program body or a gate/subroutine definition, whereas the scopes are for things
345
+ # like the body of a ``for`` loop construct.
346
+ self._circuit_ctx = []
347
+ self.push_context(quantumcircuit)
348
+ self.includeslist = includeslist
349
+ # `_global_io_declarations` and `_global_classical_declarations` are stateful, and any
350
+ # operation that needs a parameter can append to them during the build. We make all
351
+ # classical declarations global because the IBM QSS stack (our initial consumer of OQ3
352
+ # strings) prefers declarations to all be global, and it's valid OQ3, so it's not vendor
353
+ # lock-in. It's possibly slightly memory inefficient, but that's not likely to be a problem
354
+ # in the near term.
355
+ self._global_io_declarations = []
356
+ self._global_classical_declarations = []
357
+ self._gate_to_declare = {}
358
+ self._opaque_to_declare = {}
359
+ # An arbitrary counter to help with generation of unique ids for symbol names when there are
360
+ # clashes (though we generally prefer to keep user names if possible).
361
+ self._counter = itertools.count()
362
+ self.disable_constants = disable_constants
363
+ self.allow_aliasing = allow_aliasing
364
+ self.global_namespace = GlobalNamespace(includeslist, basis_gates)
365
+ self.experimental = experimental
366
+
367
+ def _unique_name(self, prefix: str, scope: _Scope) -> str:
368
+ table = scope.symbol_map
369
+ name = basename = _escape_invalid_identifier(prefix)
370
+ while name in table or name in _RESERVED_KEYWORDS:
371
+ name = f"{basename}__generated{next(self._counter)}"
372
+ return name
373
+
374
+ def _register_gate(self, gate):
375
+ self.global_namespace.register(gate)
376
+ self._gate_to_declare[id(gate)] = gate
377
+
378
+ def _register_opaque(self, instruction):
379
+ if instruction not in self.global_namespace:
380
+ self.global_namespace.register(instruction)
381
+ self._opaque_to_declare[id(instruction)] = instruction
382
+
383
+ def _register_variable(self, variable, scope: _Scope, name=None) -> ast.Identifier:
384
+ """Register a variable in the symbol table for the given scope, returning the name that
385
+ should be used to refer to the variable. The same name will be returned by subsequent calls
386
+ to :meth:`_lookup_variable` within the same scope.
387
+
388
+ If ``name`` is given explicitly, it must not already be defined in the scope.
389
+ """
390
+ # Note that the registration only checks for the existence of a variable that was declared
391
+ # in the current scope, not just one that's available. This is a rough implementation of
392
+ # the shadowing proposal currently being drafted for OpenQASM 3, though we expect it to be
393
+ # expanded and modified in the future (2022-03-07).
394
+ table = scope.symbol_map
395
+ if name is not None:
396
+ if name in _RESERVED_KEYWORDS:
397
+ raise QASM3ExporterError(f"cannot reserve the keyword '{name}' as a variable name")
398
+ if name in table:
399
+ raise QASM3ExporterError(
400
+ f"tried to reserve '{name}', but it is already used by '{table[name]}'"
401
+ )
402
+ else:
403
+ name = self._unique_name(variable.name, scope)
404
+ identifier = ast.Identifier(name)
405
+ table[identifier.string] = variable
406
+ table[variable] = identifier
407
+ return identifier
408
+
409
+ def _reserve_variable_name(self, name: ast.Identifier, scope: _Scope) -> ast.Identifier:
410
+ """Reserve a variable name in the given scope, raising a :class:`.QASM3ExporterError` if
411
+ the name is already in use.
412
+
413
+ This is useful for autogenerated names that the exporter itself reserves when dealing with
414
+ objects that have no standard Terra object backing them.
415
+
416
+ Returns the same identifier, for convenience in chaining."""
417
+ table = scope.symbol_map
418
+ if name.string in table:
419
+ variable = table[name.string]
420
+ raise QASM3ExporterError(
421
+ f"tried to reserve '{name.string}', but it is already used by '{variable}'"
422
+ )
423
+ table[name.string] = "<internal object>"
424
+ return name
425
+
426
+ def _lookup_variable(self, variable) -> ast.Identifier:
427
+ """Lookup a Terra object within the current context, and return the name that should be used
428
+ to represent it in OpenQASM 3 programmes."""
429
+ if isinstance(variable, Bit):
430
+ variable = self.current_scope().bit_map[variable]
431
+ for scope in reversed(self.current_context()):
432
+ if variable in scope.symbol_map:
433
+ return scope.symbol_map[variable]
434
+ raise KeyError(f"'{variable}' is not defined in the current context")
435
+
436
+ def build_header(self):
437
+ """Builds a Header"""
438
+ version = ast.Version("3")
439
+ includes = self.build_includes()
440
+ return ast.Header(version, includes)
441
+
442
+ def build_program(self):
443
+ """Builds a Program"""
444
+ self.hoist_declarations(self.global_scope(assert_=True).circuit.data)
445
+ return ast.Program(self.build_header(), self.build_global_statements())
446
+
447
+ def hoist_declarations(self, instructions):
448
+ """Walks the definitions in gates/instructions to make a list of gates to declare."""
449
+ for instruction in instructions:
450
+ if isinstance(instruction.operation, ControlFlowOp):
451
+ for block in instruction.operation.blocks:
452
+ self.hoist_declarations(block.data)
453
+ continue
454
+ if instruction.operation in self.global_namespace or isinstance(
455
+ instruction.operation, self.builtins
456
+ ):
457
+ continue
458
+
459
+ if isinstance(instruction.operation, standard_gates.CXGate):
460
+ # CX gets super duper special treatment because it's the base of Terra's definition
461
+ # tree, but isn't an OQ3 built-in. We use `isinstance` because we haven't fully
462
+ # fixed what the name/class distinction is (there's a test from the original OQ3
463
+ # exporter that tries a naming collision with 'cx').
464
+ if instruction.operation not in self.global_namespace:
465
+ self._register_gate(instruction.operation)
466
+ if instruction.operation.definition is None:
467
+ self._register_opaque(instruction.operation)
468
+ elif not isinstance(instruction.operation, Gate):
469
+ raise QASM3ExporterError("Exporting non-unitary instructions is not yet supported.")
470
+ else:
471
+ self.hoist_declarations(instruction.operation.definition.data)
472
+ self._register_gate(instruction.operation)
473
+
474
+ def global_scope(self, assert_=False):
475
+ """Return the global circuit scope that is used as the basis of the full program. If
476
+ ``assert_=True``, then this raises :obj:`.QASM3ExporterError` if the current context is not
477
+ the global one."""
478
+ if assert_ and len(self._circuit_ctx) != 1 and len(self._circuit_ctx[0]) != 1:
479
+ # Defensive code to help catch logic errors.
480
+ raise QASM3ExporterError( # pragma: no cover
481
+ f"Not currently in the global context. Current contexts are: {self._circuit_ctx}"
482
+ )
483
+ return self._circuit_ctx[0][0]
484
+
485
+ def current_scope(self):
486
+ """Return the current circuit scope."""
487
+ return self._circuit_ctx[-1][-1]
488
+
489
+ def current_context(self):
490
+ """Return the current context (list of scopes)."""
491
+ return self._circuit_ctx[-1]
492
+
493
+ def push_scope(self, circuit: QuantumCircuit, qubits: Iterable[Qubit], clbits: Iterable[Clbit]):
494
+ """Push a new scope (like a ``for`` or ``while`` loop body) onto the current context
495
+ stack."""
496
+ current_map = self.current_scope().bit_map
497
+ qubits = tuple(current_map[qubit] for qubit in qubits)
498
+ clbits = tuple(current_map[clbit] for clbit in clbits)
499
+ if circuit.num_qubits != len(qubits):
500
+ raise QASM3ExporterError( # pragma: no cover
501
+ f"Tried to push a scope whose circuit needs {circuit.num_qubits} qubits, but only"
502
+ f" provided {len(qubits)} qubits to create the mapping."
503
+ )
504
+ if circuit.num_clbits != len(clbits):
505
+ raise QASM3ExporterError( # pragma: no cover
506
+ f"Tried to push a scope whose circuit needs {circuit.num_clbits} clbits, but only"
507
+ f" provided {len(clbits)} clbits to create the mapping."
508
+ )
509
+ mapping = dict(itertools.chain(zip(circuit.qubits, qubits), zip(circuit.clbits, clbits)))
510
+ self.current_context().append(_Scope(circuit, mapping, {}))
511
+
512
+ def pop_scope(self) -> _Scope:
513
+ """Pop the current scope (like a ``for`` or ``while`` loop body) off the current context
514
+ stack."""
515
+ if len(self._circuit_ctx[-1]) <= 1:
516
+ raise QASM3ExporterError( # pragma: no cover
517
+ "Tried to pop a scope from the current context, but there are no current scopes."
518
+ )
519
+ return self._circuit_ctx[-1].pop()
520
+
521
+ def push_context(self, outer_context: QuantumCircuit):
522
+ """Push a new context (like for a ``gate`` or ``def`` body) onto the stack."""
523
+ mapping = {bit: bit for bit in itertools.chain(outer_context.qubits, outer_context.clbits)}
524
+ self._circuit_ctx.append([_Scope(outer_context, mapping, {})])
525
+
526
+ def pop_context(self):
527
+ """Pop the current context (like for a ``gate`` or ``def`` body) onto the stack."""
528
+ if len(self._circuit_ctx) == 1:
529
+ raise QASM3ExporterError( # pragma: no cover
530
+ "Tried to pop the current context, but that is the global context."
531
+ )
532
+ if len(self._circuit_ctx[-1]) != 1:
533
+ raise QASM3ExporterError( # pragma: no cover
534
+ "Tried to pop the current context while there are still"
535
+ f" {len(self._circuit_ctx[-1]) - 1} unclosed scopes."
536
+ )
537
+ self._circuit_ctx.pop()
538
+
539
+ def build_includes(self):
540
+ """Builds a list of included files."""
541
+ return [ast.Include(filename) for filename in self.includeslist]
542
+
543
+ def build_global_statements(self) -> List[ast.Statement]:
544
+ """Get a list of the statements that form the global scope of the program."""
545
+ definitions = self.build_definitions()
546
+ # These two "declarations" functions populate stateful variables, since the calls to
547
+ # `build_quantum_instructions` might also append to those declarations.
548
+ self.build_parameter_declarations()
549
+ self.build_classical_declarations()
550
+ context = self.global_scope(assert_=True).circuit
551
+ quantum_declarations = self.build_quantum_declarations()
552
+ quantum_instructions = self.build_quantum_instructions(context.data)
553
+
554
+ return [
555
+ statement
556
+ for source in (
557
+ # In older versions of the reference OQ3 grammar, IO declarations had to come before
558
+ # anything else, so we keep doing that as a courtesy.
559
+ self._global_io_declarations,
560
+ definitions,
561
+ self._global_classical_declarations,
562
+ quantum_declarations,
563
+ quantum_instructions,
564
+ )
565
+ for statement in source
566
+ ]
567
+
568
+ def build_definitions(self):
569
+ """Builds all the definition."""
570
+ ret = []
571
+ for instruction in self._opaque_to_declare.values():
572
+ ret.append(self.build_opaque_definition(instruction))
573
+ for instruction in self._gate_to_declare.values():
574
+ ret.append(self.build_gate_definition(instruction))
575
+ return ret
576
+
577
+ def build_opaque_definition(self, instruction):
578
+ """Builds an Opaque gate definition as a CalibrationDefinition"""
579
+ # We can't do anything sensible with this yet, so it's better to loudly say that.
580
+ raise QASM3ExporterError(
581
+ "Exporting opaque instructions with pulse-level calibrations is not yet supported by"
582
+ " the OpenQASM 3 exporter. Received this instruction, which appears opaque:"
583
+ f"\n{instruction}"
584
+ )
585
+
586
+ def build_gate_definition(self, gate):
587
+ """Builds a QuantumGateDefinition"""
588
+ if isinstance(gate, standard_gates.CXGate):
589
+ # CX gets super duper special treatment because it's the base of Terra's definition
590
+ # tree, but isn't an OQ3 built-in. We use `isinstance` because we haven't fully
591
+ # fixed what the name/class distinction is (there's a test from the original OQ3
592
+ # exporter that tries a naming collision with 'cx').
593
+ control, target = ast.Identifier("c"), ast.Identifier("t")
594
+ call = ast.QuantumGateCall(
595
+ ast.Identifier("U"),
596
+ [control, target],
597
+ parameters=[ast.Constant.PI, ast.IntegerLiteral(0), ast.Constant.PI],
598
+ modifiers=[ast.QuantumGateModifier(ast.QuantumGateModifierName.CTRL)],
599
+ )
600
+ return ast.QuantumGateDefinition(
601
+ ast.QuantumGateSignature(ast.Identifier("cx"), [control, target]),
602
+ ast.QuantumBlock([call]),
603
+ )
604
+
605
+ self.push_context(gate.definition)
606
+ signature = self.build_gate_signature(gate)
607
+ body = ast.QuantumBlock(self.build_quantum_instructions(gate.definition.data))
608
+ self.pop_context()
609
+ return ast.QuantumGateDefinition(signature, body)
610
+
611
+ def build_gate_signature(self, gate):
612
+ """Builds a QuantumGateSignature"""
613
+ name = self.global_namespace[gate]
614
+ params = []
615
+ definition = gate.definition
616
+ # Dummy parameters
617
+ scope = self.current_scope()
618
+ for num in range(len(gate.params) - len(definition.parameters)):
619
+ param_name = f"{self.gate_parameter_prefix}_{num}"
620
+ params.append(self._reserve_variable_name(ast.Identifier(param_name), scope))
621
+ params += [self._register_variable(param, scope) for param in definition.parameters]
622
+ quantum_arguments = [
623
+ self._register_variable(
624
+ qubit, scope, self._unique_name(f"{self.gate_qubit_prefix}_{i}", scope)
625
+ )
626
+ for i, qubit in enumerate(definition.qubits)
627
+ ]
628
+ return ast.QuantumGateSignature(ast.Identifier(name), quantum_arguments, params or None)
629
+
630
+ def build_parameter_declarations(self):
631
+ """Builds lists of the input, output and standard variables used in this program."""
632
+ global_scope = self.global_scope(assert_=True)
633
+ for parameter in global_scope.circuit.parameters:
634
+ parameter_name = self._register_variable(parameter, global_scope)
635
+ declaration = _infer_variable_declaration(
636
+ global_scope.circuit, parameter, parameter_name
637
+ )
638
+ if declaration is None:
639
+ continue
640
+ if isinstance(declaration, ast.IODeclaration):
641
+ self._global_io_declarations.append(declaration)
642
+ else:
643
+ self._global_classical_declarations.append(declaration)
644
+
645
+ def build_classical_declarations(self):
646
+ """Extend the global classical declarations with AST nodes declaring all the classical bits
647
+ and registers.
648
+
649
+ The behaviour of this function depends on the setting ``allow_aliasing``. If this
650
+ is ``True``, then the output will be in the same form as the output of
651
+ :meth:`.build_classical_declarations`, with the registers being aliases. If ``False``, it
652
+ will instead return a :obj:`.ast.ClassicalDeclaration` for each classical register, and one
653
+ for the loose :obj:`.Clbit` instances, and will raise :obj:`QASM3ExporterError` if any
654
+ registers overlap.
655
+ """
656
+ scope = self.global_scope(assert_=True)
657
+ if any(len(scope.circuit.find_bit(q).registers) > 1 for q in scope.circuit.clbits):
658
+ # There are overlapping registers, so we need to use aliases to emit the structure.
659
+ if not self.allow_aliasing:
660
+ raise QASM3ExporterError(
661
+ "Some classical registers in this circuit overlap and need aliases to express,"
662
+ " but 'allow_aliasing' is false."
663
+ )
664
+ clbits = (
665
+ ast.ClassicalDeclaration(
666
+ ast.BitType(),
667
+ self._register_variable(
668
+ clbit, scope, self._unique_name(f"{self.loose_bit_prefix}{i}", scope)
669
+ ),
670
+ )
671
+ for i, clbit in enumerate(scope.circuit.clbits)
672
+ )
673
+ self._global_classical_declarations.extend(clbits)
674
+ self._global_classical_declarations.extend(self.build_aliases(scope.circuit.cregs))
675
+ return
676
+ # If we're here, we're in the clbit happy path where there are no clbits that are in more
677
+ # than one register. We can output things very naturally.
678
+ self._global_classical_declarations.extend(
679
+ ast.ClassicalDeclaration(
680
+ ast.BitType(),
681
+ self._register_variable(
682
+ clbit, scope, self._unique_name(f"{self.loose_bit_prefix}{i}", scope)
683
+ ),
684
+ )
685
+ for i, clbit in enumerate(scope.circuit.clbits)
686
+ if not scope.circuit.find_bit(clbit).registers
687
+ )
688
+ for register in scope.circuit.cregs:
689
+ name = self._register_variable(register, scope)
690
+ for i, bit in enumerate(register):
691
+ scope.symbol_map[bit] = ast.SubscriptedIdentifier(
692
+ name.string, ast.IntegerLiteral(i)
693
+ )
694
+ self._global_classical_declarations.append(
695
+ ast.ClassicalDeclaration(ast.BitArrayType(len(register)), name)
696
+ )
697
+
698
+ def build_quantum_declarations(self):
699
+ """Return a list of AST nodes declaring all the qubits in the current scope, and all the
700
+ alias declarations for these qubits."""
701
+ scope = self.global_scope(assert_=True)
702
+ if scope.circuit.layout is not None:
703
+ # We're referring to physical qubits. These can't be declared in OQ3, but we need to
704
+ # track the bit -> expression mapping in our symbol table.
705
+ for i, bit in enumerate(scope.circuit.qubits):
706
+ scope.symbol_map[bit] = ast.Identifier(f"${i}")
707
+ return []
708
+ if any(len(scope.circuit.find_bit(q).registers) > 1 for q in scope.circuit.qubits):
709
+ # There are overlapping registers, so we need to use aliases to emit the structure.
710
+ if not self.allow_aliasing:
711
+ raise QASM3ExporterError(
712
+ "Some quantum registers in this circuit overlap and need aliases to express,"
713
+ " but 'allow_aliasing' is false."
714
+ )
715
+ qubits = [
716
+ ast.QuantumDeclaration(
717
+ self._register_variable(
718
+ qubit, scope, self._unique_name(f"{self.loose_qubit_prefix}{i}", scope)
719
+ )
720
+ )
721
+ for i, qubit in enumerate(scope.circuit.qubits)
722
+ ]
723
+ return qubits + self.build_aliases(scope.circuit.qregs)
724
+ # If we're here, we're in the virtual-qubit happy path where there are no qubits that are in
725
+ # more than one register. We can output things very naturally.
726
+ loose_qubits = [
727
+ ast.QuantumDeclaration(
728
+ self._register_variable(
729
+ qubit, scope, self._unique_name(f"{self.loose_qubit_prefix}{i}", scope)
730
+ )
731
+ )
732
+ for i, qubit in enumerate(scope.circuit.qubits)
733
+ if not scope.circuit.find_bit(qubit).registers
734
+ ]
735
+ registers = []
736
+ for register in scope.circuit.qregs:
737
+ name = self._register_variable(register, scope)
738
+ for i, bit in enumerate(register):
739
+ scope.symbol_map[bit] = ast.SubscriptedIdentifier(
740
+ name.string, ast.IntegerLiteral(i)
741
+ )
742
+ registers.append(
743
+ ast.QuantumDeclaration(name, ast.Designator(ast.IntegerLiteral(len(register))))
744
+ )
745
+ return loose_qubits + registers
746
+
747
+ def build_aliases(self, registers: Iterable[Register]) -> List[ast.AliasStatement]:
748
+ """Return a list of alias declarations for the given registers. The registers can be either
749
+ classical or quantum."""
750
+ scope = self.current_scope()
751
+ out = []
752
+ for register in registers:
753
+ name = self._register_variable(register, scope)
754
+ elements = [self._lookup_variable(bit) for bit in register]
755
+ for i, bit in enumerate(register):
756
+ # This might shadow previous definitions, but that's not a problem.
757
+ scope.symbol_map[bit] = ast.SubscriptedIdentifier(
758
+ name.string, ast.IntegerLiteral(i)
759
+ )
760
+ out.append(ast.AliasStatement(name, ast.IndexSet(elements)))
761
+ return out
762
+
763
+ def build_quantum_instructions(self, instructions):
764
+ """Builds a list of call statements"""
765
+ ret = []
766
+ for instruction in instructions:
767
+ if isinstance(instruction.operation, ForLoopOp):
768
+ ret.append(self.build_for_loop(instruction))
769
+ continue
770
+ if isinstance(instruction.operation, WhileLoopOp):
771
+ ret.append(self.build_while_loop(instruction))
772
+ continue
773
+ if isinstance(instruction.operation, IfElseOp):
774
+ ret.append(self.build_if_statement(instruction))
775
+ continue
776
+ if isinstance(instruction.operation, SwitchCaseOp):
777
+ ret.extend(self.build_switch_statement(instruction))
778
+ continue
779
+ # Build the node, ignoring any condition.
780
+ if isinstance(instruction.operation, Gate):
781
+ nodes = [self.build_gate_call(instruction)]
782
+ elif isinstance(instruction.operation, Barrier):
783
+ operands = [self._lookup_variable(operand) for operand in instruction.qubits]
784
+ nodes = [ast.QuantumBarrier(operands)]
785
+ elif isinstance(instruction.operation, Measure):
786
+ measurement = ast.QuantumMeasurement(
787
+ [self._lookup_variable(operand) for operand in instruction.qubits]
788
+ )
789
+ qubit = self._lookup_variable(instruction.clbits[0])
790
+ nodes = [ast.QuantumMeasurementAssignment(qubit, measurement)]
791
+ elif isinstance(instruction.operation, Reset):
792
+ nodes = [
793
+ ast.QuantumReset(self._lookup_variable(operand))
794
+ for operand in instruction.qubits
795
+ ]
796
+ elif isinstance(instruction.operation, Delay):
797
+ nodes = [self.build_delay(instruction)]
798
+ elif isinstance(instruction.operation, BreakLoopOp):
799
+ nodes = [ast.BreakStatement()]
800
+ elif isinstance(instruction.operation, ContinueLoopOp):
801
+ nodes = [ast.ContinueStatement()]
802
+ else:
803
+ nodes = [self.build_subroutine_call(instruction)]
804
+
805
+ if instruction.operation.condition is None:
806
+ ret.extend(nodes)
807
+ else:
808
+ body = ast.ProgramBlock(nodes)
809
+ ret.append(
810
+ ast.BranchingStatement(
811
+ self.build_expression(_lift_condition(instruction.operation.condition)),
812
+ body,
813
+ )
814
+ )
815
+ return ret
816
+
817
+ def build_if_statement(self, instruction: CircuitInstruction) -> ast.BranchingStatement:
818
+ """Build an :obj:`.IfElseOp` into a :obj:`.ast.BranchingStatement`."""
819
+ condition = self.build_expression(_lift_condition(instruction.operation.condition))
820
+
821
+ true_circuit = instruction.operation.blocks[0]
822
+ self.push_scope(true_circuit, instruction.qubits, instruction.clbits)
823
+ true_body = self.build_program_block(true_circuit.data)
824
+ self.pop_scope()
825
+ if len(instruction.operation.blocks) == 1:
826
+ return ast.BranchingStatement(condition, true_body, None)
827
+
828
+ false_circuit = instruction.operation.blocks[1]
829
+ self.push_scope(false_circuit, instruction.qubits, instruction.clbits)
830
+ false_body = self.build_program_block(false_circuit.data)
831
+ self.pop_scope()
832
+ return ast.BranchingStatement(condition, true_body, false_body)
833
+
834
+ def build_switch_statement(self, instruction: CircuitInstruction) -> Iterable[ast.Statement]:
835
+ """Build a :obj:`.SwitchCaseOp` into a :class:`.ast.SwitchStatement`."""
836
+ if ExperimentalFeatures.SWITCH_CASE_V1 not in self.experimental:
837
+ raise QASM3ExporterError(
838
+ "'switch' statements are not stabilized in OpenQASM 3 yet."
839
+ " To enable experimental support, set the flag"
840
+ " 'ExperimentalFeatures.SWITCH_CASE_V1' in the 'experimental' keyword"
841
+ " argument of the exporter."
842
+ )
843
+
844
+ real_target = self.build_expression(expr.lift(instruction.operation.target))
845
+ global_scope = self.global_scope()
846
+ target = self._reserve_variable_name(
847
+ ast.Identifier(self._unique_name("switch_dummy", global_scope)), global_scope
848
+ )
849
+ self._global_classical_declarations.append(
850
+ ast.ClassicalDeclaration(ast.IntType(), target, None)
851
+ )
852
+
853
+ def case(values, case_block):
854
+ values = [
855
+ ast.DefaultCase() if v is CASE_DEFAULT else self.build_integer(v) for v in values
856
+ ]
857
+ self.push_scope(case_block, instruction.qubits, instruction.clbits)
858
+ case_body = self.build_program_block(case_block.data)
859
+ self.pop_scope()
860
+ return values, case_body
861
+
862
+ return [
863
+ ast.AssignmentStatement(target, real_target),
864
+ ast.SwitchStatement(
865
+ target,
866
+ (case(values, block) for values, block in instruction.operation.cases_specifier()),
867
+ ),
868
+ ]
869
+
870
+ def build_while_loop(self, instruction: CircuitInstruction) -> ast.WhileLoopStatement:
871
+ """Build a :obj:`.WhileLoopOp` into a :obj:`.ast.WhileLoopStatement`."""
872
+ condition = self.build_expression(_lift_condition(instruction.operation.condition))
873
+ loop_circuit = instruction.operation.blocks[0]
874
+ self.push_scope(loop_circuit, instruction.qubits, instruction.clbits)
875
+ loop_body = self.build_program_block(loop_circuit.data)
876
+ self.pop_scope()
877
+ return ast.WhileLoopStatement(condition, loop_body)
878
+
879
+ def build_for_loop(self, instruction: CircuitInstruction) -> ast.ForLoopStatement:
880
+ """Build a :obj:`.ForLoopOp` into a :obj:`.ast.ForLoopStatement`."""
881
+ indexset, loop_parameter, loop_circuit = instruction.operation.params
882
+ self.push_scope(loop_circuit, instruction.qubits, instruction.clbits)
883
+ scope = self.current_scope()
884
+ if loop_parameter is None:
885
+ # The loop parameter is implicitly declared by the ``for`` loop (see also
886
+ # _infer_parameter_declaration), so it doesn't matter that we haven't declared this.
887
+ loop_parameter_ast = self._reserve_variable_name(ast.Identifier("_"), scope)
888
+ else:
889
+ loop_parameter_ast = self._register_variable(loop_parameter, scope)
890
+ if isinstance(indexset, range):
891
+ # OpenQASM 3 uses inclusive ranges on both ends, unlike Python.
892
+ indexset_ast = ast.Range(
893
+ start=self.build_integer(indexset.start),
894
+ end=self.build_integer(indexset.stop - 1),
895
+ step=self.build_integer(indexset.step) if indexset.step != 1 else None,
896
+ )
897
+ else:
898
+ try:
899
+ indexset_ast = ast.IndexSet([self.build_integer(value) for value in indexset])
900
+ except QASM3ExporterError:
901
+ raise QASM3ExporterError(
902
+ "The values in OpenQASM 3 'for' loops must all be integers, but received"
903
+ f" '{indexset}'."
904
+ ) from None
905
+ body_ast = self.build_program_block(loop_circuit)
906
+ self.pop_scope()
907
+ return ast.ForLoopStatement(indexset_ast, loop_parameter_ast, body_ast)
908
+
909
+ def build_expression(self, node: expr.Expr) -> ast.Expression:
910
+ """Build an expression."""
911
+ return node.accept(_ExprBuilder(self._lookup_variable))
912
+
913
+ def build_delay(self, instruction: CircuitInstruction) -> ast.QuantumDelay:
914
+ """Build a built-in delay statement."""
915
+ if instruction.clbits:
916
+ raise QASM3ExporterError(
917
+ f"Found a delay instruction acting on classical bits: {instruction}"
918
+ )
919
+ duration_value, unit = instruction.operation.duration, instruction.operation.unit
920
+ if unit == "ps":
921
+ duration = ast.DurationLiteral(1000 * duration_value, ast.DurationUnit.NANOSECOND)
922
+ else:
923
+ unit_map = {
924
+ "ns": ast.DurationUnit.NANOSECOND,
925
+ "us": ast.DurationUnit.MICROSECOND,
926
+ "ms": ast.DurationUnit.MILLISECOND,
927
+ "s": ast.DurationUnit.SECOND,
928
+ "dt": ast.DurationUnit.SAMPLE,
929
+ }
930
+ duration = ast.DurationLiteral(duration_value, unit_map[unit])
931
+ return ast.QuantumDelay(
932
+ duration, [self._lookup_variable(qubit) for qubit in instruction.qubits]
933
+ )
934
+
935
+ def build_integer(self, value) -> ast.IntegerLiteral:
936
+ """Build an integer literal, raising a :obj:`.QASM3ExporterError` if the input is not
937
+ actually an
938
+ integer."""
939
+ if not isinstance(value, numbers.Integral):
940
+ # This is meant to be purely defensive, in case a non-integer slips into the logic
941
+ # somewhere, but no valid Terra object should trigger this.
942
+ raise QASM3ExporterError(f"'{value}' is not an integer") # pragma: no cover
943
+ return ast.IntegerLiteral(int(value))
944
+
945
+ def build_program_block(self, instructions):
946
+ """Builds a ProgramBlock"""
947
+ return ast.ProgramBlock(self.build_quantum_instructions(instructions))
948
+
949
+ def _rebind_scoped_parameters(self, expression):
950
+ """If the input is a :class:`.ParameterExpression`, rebind any internal
951
+ :class:`.Parameter`\\ s so that their names match their names in the scope. Other inputs
952
+ are returned unchanged."""
953
+ # This is a little hacky, but the entirety of the Expression handling is essentially
954
+ # missing, pending a new system in Terra to replace it (2022-03-07).
955
+ if not isinstance(expression, ParameterExpression):
956
+ return expression
957
+ return expression.subs(
958
+ {
959
+ param: Parameter(self._lookup_variable(param).string)
960
+ for param in expression.parameters
961
+ }
962
+ )
963
+
964
+ def build_gate_call(self, instruction: CircuitInstruction):
965
+ """Builds a QuantumGateCall"""
966
+ if isinstance(instruction.operation, standard_gates.UGate):
967
+ gate_name = ast.Identifier("U")
968
+ else:
969
+ gate_name = ast.Identifier(self.global_namespace[instruction.operation])
970
+ qubits = [self._lookup_variable(qubit) for qubit in instruction.qubits]
971
+ if self.disable_constants:
972
+ parameters = [
973
+ ast.StringifyAndPray(self._rebind_scoped_parameters(param))
974
+ for param in instruction.operation.params
975
+ ]
976
+ else:
977
+ parameters = [
978
+ ast.StringifyAndPray(pi_check(self._rebind_scoped_parameters(param), output="qasm"))
979
+ for param in instruction.operation.params
980
+ ]
981
+
982
+ return ast.QuantumGateCall(gate_name, qubits, parameters=parameters)
983
+
984
+
985
+ def _infer_variable_declaration(
986
+ circuit: QuantumCircuit, parameter: Parameter, parameter_name: ast.Identifier
987
+ ) -> Union[ast.ClassicalDeclaration, None]:
988
+ """Attempt to infer what type a parameter should be declared as to work with a circuit.
989
+
990
+ This is very simplistic; it assumes all parameters are real numbers that need to be input to the
991
+ program, unless one is used as a loop variable, in which case it shouldn't be declared at all,
992
+ because the ``for`` loop declares it implicitly (per the Qiskit/QSS reading of the OpenQASM
993
+ spec at Qiskit/openqasm@8ee55ec).
994
+
995
+ .. note::
996
+
997
+ This is a hack around not having a proper type system implemented in Terra, and really this
998
+ whole function should be removed in favour of proper symbol-table building and lookups.
999
+ This function is purely to try and hack the parameters for ``for`` loops into the exporter
1000
+ for now.
1001
+
1002
+ Args:
1003
+ circuit: The global-scope circuit, which is the base of the exported program.
1004
+ parameter: The parameter to infer the type of.
1005
+ parameter_name: The name of the parameter to use in the declaration.
1006
+
1007
+ Returns:
1008
+ A suitable :obj:`.ast.ClassicalDeclaration` node, or, if the parameter should *not* be
1009
+ declared, then ``None``.
1010
+ """
1011
+
1012
+ def is_loop_variable(circuit, parameter):
1013
+ """Recurse into the instructions a parameter is used in, checking at every level if it is
1014
+ used as the loop variable of a ``for`` loop."""
1015
+ # This private access is hacky, and shouldn't need to happen; the type of a parameter
1016
+ # _should_ be an intrinsic part of the parameter, or somewhere publicly accessible, but
1017
+ # Terra doesn't have those concepts yet. We can only try and guess at the type by looking
1018
+ # at all the places it's used in the circuit.
1019
+ for instruction, index in circuit._parameter_table[parameter]:
1020
+ if isinstance(instruction, ForLoopOp):
1021
+ # The parameters of ForLoopOp are (indexset, loop_parameter, body).
1022
+ if index == 1:
1023
+ return True
1024
+ if isinstance(instruction, ControlFlowOp):
1025
+ if is_loop_variable(instruction.params[index], parameter):
1026
+ return True
1027
+ return False
1028
+
1029
+ if is_loop_variable(circuit, parameter):
1030
+ return None
1031
+ # Arbitrary choice of double-precision float for all other parameters, but it's what we actually
1032
+ # expect people to be binding to their Parameters right now.
1033
+ return ast.IODeclaration(ast.IOModifier.INPUT, ast.FloatType.DOUBLE, parameter_name)
1034
+
1035
+
1036
+ def _lift_condition(condition):
1037
+ if isinstance(condition, expr.Expr):
1038
+ return condition
1039
+ return expr.lift_legacy_condition(condition)
1040
+
1041
+
1042
+ class _ExprBuilder(expr.ExprVisitor[ast.Expression]):
1043
+ __slots__ = ("lookup",)
1044
+
1045
+ # This is a very simple, non-contextual converter. As the type system expands, we may well end
1046
+ # up with some places where Terra's abstract type system needs to be lowered to OQ3 rather than
1047
+ # mapping 100% directly, which might need a more contextual visitor.
1048
+
1049
+ def __init__(self, lookup):
1050
+ self.lookup = lookup
1051
+
1052
+ def visit_var(self, node, /):
1053
+ return self.lookup(node.var)
1054
+
1055
+ def visit_value(self, node, /):
1056
+ if node.type.kind is types.Bool:
1057
+ return ast.BooleanLiteral(node.value)
1058
+ if node.type.kind is types.Uint:
1059
+ return ast.IntegerLiteral(node.value)
1060
+ raise RuntimeError(f"unhandled Value type '{node}'")
1061
+
1062
+ def visit_cast(self, node, /):
1063
+ if node.implicit:
1064
+ return node.accept(self)
1065
+ if node.type.kind is types.Bool:
1066
+ oq3_type = ast.BoolType()
1067
+ elif node.type.kind is types.Uint:
1068
+ oq3_type = ast.BitArrayType(node.type.width)
1069
+ else:
1070
+ raise RuntimeError(f"unhandled cast type '{node.type}'")
1071
+ return ast.Cast(oq3_type, node.operand.accept(self))
1072
+
1073
+ def visit_unary(self, node, /):
1074
+ return ast.Unary(ast.Unary.Op[node.op.name], node.operand.accept(self))
1075
+
1076
+ def visit_binary(self, node, /):
1077
+ return ast.Binary(
1078
+ ast.Binary.Op[node.op.name], node.left.accept(self), node.right.accept(self)
1079
+ )