qiskit 1.3.0__cp39-abi3-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (836) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +146 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +73 -0
  5. qiskit/assembler/__init__.py +42 -0
  6. qiskit/assembler/assemble_circuits.py +451 -0
  7. qiskit/assembler/assemble_schedules.py +367 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1313 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3849 -0
  13. qiskit/circuit/_utils.py +167 -0
  14. qiskit/circuit/add_control.py +274 -0
  15. qiskit/circuit/annotated_operation.py +279 -0
  16. qiskit/circuit/barrier.py +50 -0
  17. qiskit/circuit/bit.py +94 -0
  18. qiskit/circuit/classical/__init__.py +41 -0
  19. qiskit/circuit/classical/expr/__init__.py +238 -0
  20. qiskit/circuit/classical/expr/constructors.py +556 -0
  21. qiskit/circuit/classical/expr/expr.py +397 -0
  22. qiskit/circuit/classical/expr/visitors.py +300 -0
  23. qiskit/circuit/classical/types/__init__.py +109 -0
  24. qiskit/circuit/classical/types/ordering.py +222 -0
  25. qiskit/circuit/classical/types/types.py +117 -0
  26. qiskit/circuit/classicalfunction/__init__.py +140 -0
  27. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  28. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  29. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  30. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  31. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  32. qiskit/circuit/classicalfunction/types.py +18 -0
  33. qiskit/circuit/classicalfunction/utils.py +91 -0
  34. qiskit/circuit/classicalregister.py +57 -0
  35. qiskit/circuit/commutation_checker.py +106 -0
  36. qiskit/circuit/commutation_library.py +20 -0
  37. qiskit/circuit/controlflow/__init__.py +28 -0
  38. qiskit/circuit/controlflow/_builder_utils.py +207 -0
  39. qiskit/circuit/controlflow/break_loop.py +56 -0
  40. qiskit/circuit/controlflow/builder.py +691 -0
  41. qiskit/circuit/controlflow/continue_loop.py +58 -0
  42. qiskit/circuit/controlflow/control_flow.py +84 -0
  43. qiskit/circuit/controlflow/for_loop.py +217 -0
  44. qiskit/circuit/controlflow/if_else.py +511 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +171 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +123 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +94 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +263 -0
  54. qiskit/circuit/instruction.py +697 -0
  55. qiskit/circuit/instructionset.py +179 -0
  56. qiskit/circuit/library/__init__.py +668 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +34 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +18 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +210 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +123 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +129 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +95 -0
  63. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  64. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  65. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  66. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  67. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  68. qiskit/circuit/library/arithmetic/multipliers/__init__.py +17 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +145 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +192 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +108 -0
  72. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  73. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  74. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  75. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  76. qiskit/circuit/library/arithmetic/quadratic_form.py +198 -0
  77. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  78. qiskit/circuit/library/basis_change/__init__.py +15 -0
  79. qiskit/circuit/library/basis_change/qft.py +313 -0
  80. qiskit/circuit/library/blueprintcircuit.py +280 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +155 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +200 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +202 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +165 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +57 -0
  87. qiskit/circuit/library/data_preparation/_z_feature_map.py +115 -0
  88. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  89. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  90. qiskit/circuit/library/data_preparation/pauli_feature_map.py +656 -0
  91. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  92. qiskit/circuit/library/fourier_checking.py +158 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +159 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +174 -0
  96. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  97. qiskit/circuit/library/generalized_gates/isometry.py +370 -0
  98. qiskit/circuit/library/generalized_gates/linear_function.py +318 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +316 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +194 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +96 -0
  104. qiskit/circuit/library/generalized_gates/uc.py +213 -0
  105. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  106. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  108. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  109. qiskit/circuit/library/generalized_gates/unitary.py +215 -0
  110. qiskit/circuit/library/graph_state.py +169 -0
  111. qiskit/circuit/library/grover_operator.py +579 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +161 -0
  114. qiskit/circuit/library/iqp.py +175 -0
  115. qiskit/circuit/library/n_local/__init__.py +45 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +277 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +515 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +297 -0
  119. qiskit/circuit/library/n_local/n_local.py +1472 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +243 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +366 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +306 -0
  123. qiskit/circuit/library/n_local/two_local.py +289 -0
  124. qiskit/circuit/library/overlap.py +182 -0
  125. qiskit/circuit/library/pauli_evolution.py +186 -0
  126. qiskit/circuit/library/phase_estimation.py +175 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +167 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +142 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +78 -0
  131. qiskit/circuit/library/standard_gates/ecr.py +130 -0
  132. qiskit/circuit/library/standard_gates/equivalence_library.py +1800 -0
  133. qiskit/circuit/library/standard_gates/global_phase.py +85 -0
  134. qiskit/circuit/library/standard_gates/h.py +258 -0
  135. qiskit/circuit/library/standard_gates/i.py +76 -0
  136. qiskit/circuit/library/standard_gates/iswap.py +134 -0
  137. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +405 -0
  138. qiskit/circuit/library/standard_gates/p.py +441 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +303 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +298 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +319 -0
  145. qiskit/circuit/library/standard_gates/rzx.py +229 -0
  146. qiskit/circuit/library/standard_gates/rzz.py +196 -0
  147. qiskit/circuit/library/standard_gates/s.py +428 -0
  148. qiskit/circuit/library/standard_gates/swap.py +288 -0
  149. qiskit/circuit/library/standard_gates/sx.py +315 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +403 -0
  152. qiskit/circuit/library/standard_gates/u1.py +501 -0
  153. qiskit/circuit/library/standard_gates/u2.py +149 -0
  154. qiskit/circuit/library/standard_gates/u3.py +436 -0
  155. qiskit/circuit/library/standard_gates/x.py +1529 -0
  156. qiskit/circuit/library/standard_gates/xx_minus_yy.py +235 -0
  157. qiskit/circuit/library/standard_gates/xx_plus_yy.py +239 -0
  158. qiskit/circuit/library/standard_gates/y.py +262 -0
  159. qiskit/circuit/library/standard_gates/z.py +348 -0
  160. qiskit/circuit/library/templates/__init__.py +92 -0
  161. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_1.py +34 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +35 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +34 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +35 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +38 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +37 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +38 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +37 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +40 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +40 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +40 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +40 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +38 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +40 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +42 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +42 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +41 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +34 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +35 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +37 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +43 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +41 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +39 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +41 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +39 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +40 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +40 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +40 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +40 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +41 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +41 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +41 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +41 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +43 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +43 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +43 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +43 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +45 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +43 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +44 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +44 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +44 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +44 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +44 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +44 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +44 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +44 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +44 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +44 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +44 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +43 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +44 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +44 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +44 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +44 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +44 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +44 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +44 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +44 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +44 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +47 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +54 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +45 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +69 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +59 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +59 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +178 -0
  238. qiskit/circuit/parameterexpression.py +692 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6829 -0
  242. qiskit/circuit/quantumcircuitdata.py +136 -0
  243. qiskit/circuit/quantumregister.py +75 -0
  244. qiskit/circuit/random/__init__.py +15 -0
  245. qiskit/circuit/random/utils.py +358 -0
  246. qiskit/circuit/register.py +233 -0
  247. qiskit/circuit/reset.py +34 -0
  248. qiskit/circuit/singleton.py +606 -0
  249. qiskit/circuit/store.py +97 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/circuit/twirling.py +145 -0
  253. qiskit/compiler/__init__.py +33 -0
  254. qiskit/compiler/assembler.py +681 -0
  255. qiskit/compiler/scheduler.py +109 -0
  256. qiskit/compiler/sequencer.py +71 -0
  257. qiskit/compiler/transpiler.py +533 -0
  258. qiskit/converters/__init__.py +74 -0
  259. qiskit/converters/circuit_to_dag.py +78 -0
  260. qiskit/converters/circuit_to_dagdependency.py +51 -0
  261. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  262. qiskit/converters/circuit_to_gate.py +107 -0
  263. qiskit/converters/circuit_to_instruction.py +155 -0
  264. qiskit/converters/dag_to_circuit.py +79 -0
  265. qiskit/converters/dag_to_dagdependency.py +55 -0
  266. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  267. qiskit/converters/dagdependency_to_circuit.py +46 -0
  268. qiskit/converters/dagdependency_to_dag.py +54 -0
  269. qiskit/dagcircuit/__init__.py +44 -0
  270. qiskit/dagcircuit/collect_blocks.py +391 -0
  271. qiskit/dagcircuit/dagcircuit.py +24 -0
  272. qiskit/dagcircuit/dagdependency.py +646 -0
  273. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  274. qiskit/dagcircuit/dagdepnode.py +160 -0
  275. qiskit/dagcircuit/dagnode.py +176 -0
  276. qiskit/dagcircuit/exceptions.py +42 -0
  277. qiskit/exceptions.py +153 -0
  278. qiskit/passmanager/__init__.py +240 -0
  279. qiskit/passmanager/base_tasks.py +230 -0
  280. qiskit/passmanager/compilation_status.py +74 -0
  281. qiskit/passmanager/exceptions.py +19 -0
  282. qiskit/passmanager/flow_controllers.py +116 -0
  283. qiskit/passmanager/passmanager.py +333 -0
  284. qiskit/primitives/__init__.py +481 -0
  285. qiskit/primitives/backend_estimator.py +486 -0
  286. qiskit/primitives/backend_estimator_v2.py +434 -0
  287. qiskit/primitives/backend_sampler.py +222 -0
  288. qiskit/primitives/backend_sampler_v2.py +339 -0
  289. qiskit/primitives/base/__init__.py +20 -0
  290. qiskit/primitives/base/base_estimator.py +252 -0
  291. qiskit/primitives/base/base_primitive.py +45 -0
  292. qiskit/primitives/base/base_primitive_job.py +78 -0
  293. qiskit/primitives/base/base_result.py +65 -0
  294. qiskit/primitives/base/base_sampler.py +204 -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/containers/__init__.py +26 -0
  299. qiskit/primitives/containers/bindings_array.py +389 -0
  300. qiskit/primitives/containers/bit_array.py +741 -0
  301. qiskit/primitives/containers/data_bin.py +173 -0
  302. qiskit/primitives/containers/estimator_pub.py +222 -0
  303. qiskit/primitives/containers/object_array.py +94 -0
  304. qiskit/primitives/containers/observables_array.py +279 -0
  305. qiskit/primitives/containers/primitive_result.py +53 -0
  306. qiskit/primitives/containers/pub_result.py +51 -0
  307. qiskit/primitives/containers/sampler_pub.py +193 -0
  308. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  309. qiskit/primitives/containers/shape.py +129 -0
  310. qiskit/primitives/estimator.py +172 -0
  311. qiskit/primitives/primitive_job.py +81 -0
  312. qiskit/primitives/sampler.py +162 -0
  313. qiskit/primitives/statevector_estimator.py +174 -0
  314. qiskit/primitives/statevector_sampler.py +292 -0
  315. qiskit/primitives/utils.py +247 -0
  316. qiskit/providers/__init__.py +803 -0
  317. qiskit/providers/backend.py +667 -0
  318. qiskit/providers/backend_compat.py +472 -0
  319. qiskit/providers/basic_provider/__init__.py +45 -0
  320. qiskit/providers/basic_provider/basic_provider.py +101 -0
  321. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  322. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  323. qiskit/providers/basic_provider/basic_simulator.py +821 -0
  324. qiskit/providers/basic_provider/exceptions.py +30 -0
  325. qiskit/providers/exceptions.py +45 -0
  326. qiskit/providers/fake_provider/__init__.py +105 -0
  327. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  350. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  351. qiskit/providers/fake_provider/fake_1q.py +91 -0
  352. qiskit/providers/fake_provider/fake_backend.py +165 -0
  353. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  354. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  355. qiskit/providers/fake_provider/fake_pulse_backend.py +49 -0
  356. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  357. qiskit/providers/fake_provider/generic_backend_v2.py +1035 -0
  358. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  359. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  360. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  361. qiskit/providers/job.py +147 -0
  362. qiskit/providers/jobstatus.py +30 -0
  363. qiskit/providers/models/__init__.py +89 -0
  364. qiskit/providers/models/backendconfiguration.py +1040 -0
  365. qiskit/providers/models/backendproperties.py +517 -0
  366. qiskit/providers/models/backendstatus.py +94 -0
  367. qiskit/providers/models/jobstatus.py +66 -0
  368. qiskit/providers/models/pulsedefaults.py +305 -0
  369. qiskit/providers/options.py +273 -0
  370. qiskit/providers/provider.py +95 -0
  371. qiskit/providers/providerutils.py +110 -0
  372. qiskit/pulse/__init__.py +158 -0
  373. qiskit/pulse/builder.py +2254 -0
  374. qiskit/pulse/calibration_entries.py +381 -0
  375. qiskit/pulse/channels.py +227 -0
  376. qiskit/pulse/configuration.py +245 -0
  377. qiskit/pulse/exceptions.py +45 -0
  378. qiskit/pulse/filters.py +309 -0
  379. qiskit/pulse/instruction_schedule_map.py +424 -0
  380. qiskit/pulse/instructions/__init__.py +67 -0
  381. qiskit/pulse/instructions/acquire.py +150 -0
  382. qiskit/pulse/instructions/delay.py +71 -0
  383. qiskit/pulse/instructions/directives.py +154 -0
  384. qiskit/pulse/instructions/frequency.py +135 -0
  385. qiskit/pulse/instructions/instruction.py +270 -0
  386. qiskit/pulse/instructions/phase.py +152 -0
  387. qiskit/pulse/instructions/play.py +99 -0
  388. qiskit/pulse/instructions/reference.py +100 -0
  389. qiskit/pulse/instructions/snapshot.py +82 -0
  390. qiskit/pulse/library/__init__.py +97 -0
  391. qiskit/pulse/library/continuous.py +430 -0
  392. qiskit/pulse/library/pulse.py +148 -0
  393. qiskit/pulse/library/samplers/__init__.py +15 -0
  394. qiskit/pulse/library/samplers/decorators.py +295 -0
  395. qiskit/pulse/library/samplers/strategies.py +71 -0
  396. qiskit/pulse/library/symbolic_pulses.py +1988 -0
  397. qiskit/pulse/library/waveform.py +136 -0
  398. qiskit/pulse/macros.py +262 -0
  399. qiskit/pulse/parameter_manager.py +445 -0
  400. qiskit/pulse/parser.py +314 -0
  401. qiskit/pulse/reference_manager.py +58 -0
  402. qiskit/pulse/schedule.py +1854 -0
  403. qiskit/pulse/transforms/__init__.py +106 -0
  404. qiskit/pulse/transforms/alignments.py +406 -0
  405. qiskit/pulse/transforms/base_transforms.py +71 -0
  406. qiskit/pulse/transforms/canonicalization.py +498 -0
  407. qiskit/pulse/transforms/dag.py +122 -0
  408. qiskit/pulse/utils.py +149 -0
  409. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  410. qiskit/qasm/libs/qelib1.inc +266 -0
  411. qiskit/qasm/libs/stdgates.inc +82 -0
  412. qiskit/qasm2/__init__.py +654 -0
  413. qiskit/qasm2/exceptions.py +27 -0
  414. qiskit/qasm2/export.py +372 -0
  415. qiskit/qasm2/parse.py +452 -0
  416. qiskit/qasm3/__init__.py +367 -0
  417. qiskit/qasm3/ast.py +738 -0
  418. qiskit/qasm3/exceptions.py +27 -0
  419. qiskit/qasm3/experimental.py +70 -0
  420. qiskit/qasm3/exporter.py +1299 -0
  421. qiskit/qasm3/printer.py +577 -0
  422. qiskit/qobj/__init__.py +75 -0
  423. qiskit/qobj/common.py +81 -0
  424. qiskit/qobj/converters/__init__.py +18 -0
  425. qiskit/qobj/converters/lo_config.py +177 -0
  426. qiskit/qobj/converters/pulse_instruction.py +897 -0
  427. qiskit/qobj/pulse_qobj.py +709 -0
  428. qiskit/qobj/qasm_qobj.py +708 -0
  429. qiskit/qobj/utils.py +46 -0
  430. qiskit/qpy/__init__.py +1822 -0
  431. qiskit/qpy/binary_io/__init__.py +36 -0
  432. qiskit/qpy/binary_io/circuits.py +1475 -0
  433. qiskit/qpy/binary_io/schedules.py +635 -0
  434. qiskit/qpy/binary_io/value.py +1025 -0
  435. qiskit/qpy/common.py +350 -0
  436. qiskit/qpy/exceptions.py +53 -0
  437. qiskit/qpy/formats.py +401 -0
  438. qiskit/qpy/interface.py +377 -0
  439. qiskit/qpy/type_keys.py +572 -0
  440. qiskit/quantum_info/__init__.py +162 -0
  441. qiskit/quantum_info/analysis/__init__.py +17 -0
  442. qiskit/quantum_info/analysis/average.py +47 -0
  443. qiskit/quantum_info/analysis/distance.py +102 -0
  444. qiskit/quantum_info/analysis/make_observable.py +44 -0
  445. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  446. qiskit/quantum_info/operators/__init__.py +28 -0
  447. qiskit/quantum_info/operators/base_operator.py +145 -0
  448. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  449. qiskit/quantum_info/operators/channel/chi.py +191 -0
  450. qiskit/quantum_info/operators/channel/choi.py +218 -0
  451. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  452. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  453. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  454. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  455. qiskit/quantum_info/operators/channel/superop.py +377 -0
  456. qiskit/quantum_info/operators/channel/transformations.py +475 -0
  457. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  458. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  460. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  461. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  462. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  463. qiskit/quantum_info/operators/linear_op.py +25 -0
  464. qiskit/quantum_info/operators/measures.py +418 -0
  465. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  466. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  467. qiskit/quantum_info/operators/mixins/group.py +171 -0
  468. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  469. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  470. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  471. qiskit/quantum_info/operators/op_shape.py +525 -0
  472. qiskit/quantum_info/operators/operator.py +865 -0
  473. qiskit/quantum_info/operators/operator_utils.py +76 -0
  474. qiskit/quantum_info/operators/predicates.py +183 -0
  475. qiskit/quantum_info/operators/random.py +154 -0
  476. qiskit/quantum_info/operators/scalar_op.py +254 -0
  477. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  478. qiskit/quantum_info/operators/symplectic/base_pauli.py +719 -0
  479. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  480. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  481. qiskit/quantum_info/operators/symplectic/pauli.py +753 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  483. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  484. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  485. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1196 -0
  486. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  487. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  489. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  490. qiskit/quantum_info/quaternion.py +156 -0
  491. qiskit/quantum_info/random.py +26 -0
  492. qiskit/quantum_info/states/__init__.py +28 -0
  493. qiskit/quantum_info/states/densitymatrix.py +845 -0
  494. qiskit/quantum_info/states/measures.py +288 -0
  495. qiskit/quantum_info/states/quantum_state.py +503 -0
  496. qiskit/quantum_info/states/random.py +157 -0
  497. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  498. qiskit/quantum_info/states/statevector.py +958 -0
  499. qiskit/quantum_info/states/utils.py +247 -0
  500. qiskit/result/__init__.py +73 -0
  501. qiskit/result/counts.py +189 -0
  502. qiskit/result/distributions/__init__.py +17 -0
  503. qiskit/result/distributions/probability.py +100 -0
  504. qiskit/result/distributions/quasi.py +154 -0
  505. qiskit/result/exceptions.py +40 -0
  506. qiskit/result/mitigation/__init__.py +13 -0
  507. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  508. qiskit/result/mitigation/correlated_readout_mitigator.py +277 -0
  509. qiskit/result/mitigation/local_readout_mitigator.py +328 -0
  510. qiskit/result/mitigation/utils.py +217 -0
  511. qiskit/result/models.py +234 -0
  512. qiskit/result/postprocess.py +239 -0
  513. qiskit/result/result.py +392 -0
  514. qiskit/result/sampled_expval.py +75 -0
  515. qiskit/result/utils.py +295 -0
  516. qiskit/scheduler/__init__.py +40 -0
  517. qiskit/scheduler/config.py +37 -0
  518. qiskit/scheduler/lowering.py +187 -0
  519. qiskit/scheduler/methods/__init__.py +15 -0
  520. qiskit/scheduler/methods/basic.py +140 -0
  521. qiskit/scheduler/schedule_circuit.py +69 -0
  522. qiskit/scheduler/sequence.py +104 -0
  523. qiskit/synthesis/__init__.py +220 -0
  524. qiskit/synthesis/arithmetic/__init__.py +16 -0
  525. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  526. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  527. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  528. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  529. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  530. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  531. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  532. qiskit/synthesis/clifford/__init__.py +19 -0
  533. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  534. qiskit/synthesis/clifford/clifford_decompose_bm.py +46 -0
  535. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  536. qiskit/synthesis/clifford/clifford_decompose_greedy.py +58 -0
  537. qiskit/synthesis/clifford/clifford_decompose_layers.py +447 -0
  538. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  539. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  540. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  541. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  542. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  543. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  544. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  545. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  546. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  547. qiskit/synthesis/evolution/__init__.py +21 -0
  548. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  549. qiskit/synthesis/evolution/lie_trotter.py +117 -0
  550. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  551. qiskit/synthesis/evolution/pauli_network.py +80 -0
  552. qiskit/synthesis/evolution/product_formula.py +311 -0
  553. qiskit/synthesis/evolution/qdrift.py +138 -0
  554. qiskit/synthesis/evolution/suzuki_trotter.py +215 -0
  555. qiskit/synthesis/linear/__init__.py +26 -0
  556. qiskit/synthesis/linear/cnot_synth.py +69 -0
  557. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  558. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  559. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  560. qiskit/synthesis/linear_phase/__init__.py +17 -0
  561. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  562. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  563. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  564. qiskit/synthesis/multi_controlled/__init__.py +24 -0
  565. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  566. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  567. qiskit/synthesis/one_qubit/__init__.py +15 -0
  568. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  569. qiskit/synthesis/permutation/__init__.py +18 -0
  570. qiskit/synthesis/permutation/permutation_full.py +78 -0
  571. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  572. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  573. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  574. qiskit/synthesis/qft/__init__.py +16 -0
  575. qiskit/synthesis/qft/qft_decompose_full.py +97 -0
  576. qiskit/synthesis/qft/qft_decompose_lnn.py +79 -0
  577. qiskit/synthesis/stabilizer/__init__.py +16 -0
  578. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  579. qiskit/synthesis/stabilizer/stabilizer_decompose.py +194 -0
  580. qiskit/synthesis/two_qubit/__init__.py +19 -0
  581. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  582. qiskit/synthesis/two_qubit/two_qubit_decompose.py +700 -0
  583. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  584. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  585. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  586. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  587. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  588. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  589. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  590. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  591. qiskit/synthesis/unitary/__init__.py +13 -0
  592. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  593. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  594. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  595. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  596. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  597. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  598. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  599. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  600. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  601. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  602. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  603. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  604. qiskit/synthesis/unitary/qsd.py +288 -0
  605. qiskit/transpiler/__init__.py +1290 -0
  606. qiskit/transpiler/basepasses.py +221 -0
  607. qiskit/transpiler/coupling.py +500 -0
  608. qiskit/transpiler/exceptions.py +59 -0
  609. qiskit/transpiler/instruction_durations.py +281 -0
  610. qiskit/transpiler/layout.py +737 -0
  611. qiskit/transpiler/passes/__init__.py +312 -0
  612. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  613. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  614. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  615. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  616. qiskit/transpiler/passes/analysis/depth.py +33 -0
  617. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  618. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  619. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  620. qiskit/transpiler/passes/analysis/size.py +36 -0
  621. qiskit/transpiler/passes/analysis/width.py +27 -0
  622. qiskit/transpiler/passes/basis/__init__.py +19 -0
  623. qiskit/transpiler/passes/basis/basis_translator.py +137 -0
  624. qiskit/transpiler/passes/basis/decompose.py +131 -0
  625. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  626. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  627. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  628. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  629. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  630. qiskit/transpiler/passes/calibration/builders.py +20 -0
  631. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  632. qiskit/transpiler/passes/calibration/pulse_gate.py +100 -0
  633. qiskit/transpiler/passes/calibration/rx_builder.py +164 -0
  634. qiskit/transpiler/passes/calibration/rzx_builder.py +411 -0
  635. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  636. qiskit/transpiler/passes/layout/__init__.py +26 -0
  637. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  638. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  639. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  640. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  641. qiskit/transpiler/passes/layout/disjoint_utils.py +219 -0
  642. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  643. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  644. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  645. qiskit/transpiler/passes/layout/sabre_layout.py +487 -0
  646. qiskit/transpiler/passes/layout/sabre_pre_layout.py +225 -0
  647. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  648. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  649. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  650. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  651. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  652. qiskit/transpiler/passes/optimization/__init__.py +43 -0
  653. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  654. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  655. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  656. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  657. qiskit/transpiler/passes/optimization/collect_cliffords.py +104 -0
  658. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  659. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  660. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  661. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  662. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  663. qiskit/transpiler/passes/optimization/consolidate_blocks.py +149 -0
  664. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  665. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +162 -0
  666. qiskit/transpiler/passes/optimization/elide_permutations.py +91 -0
  667. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  668. qiskit/transpiler/passes/optimization/inverse_cancellation.py +95 -0
  669. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  670. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  671. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +254 -0
  672. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  673. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  674. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  675. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  676. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  677. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  678. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  679. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  680. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  681. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  682. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  683. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  684. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  685. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  686. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  687. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  688. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  689. qiskit/transpiler/passes/routing/__init__.py +22 -0
  690. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  691. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  692. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  693. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  694. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  695. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  696. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  697. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  698. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  699. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  700. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  701. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  702. qiskit/transpiler/passes/routing/sabre_swap.py +447 -0
  703. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  704. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  705. qiskit/transpiler/passes/routing/utils.py +35 -0
  706. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  707. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  708. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  709. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  710. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  711. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +107 -0
  712. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  713. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  714. qiskit/transpiler/passes/scheduling/base_scheduler.py +310 -0
  715. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +312 -0
  716. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  717. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  718. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +452 -0
  719. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +82 -0
  720. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  721. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  722. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  723. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +94 -0
  724. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  725. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +165 -0
  726. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  727. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  728. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +854 -0
  729. qiskit/transpiler/passes/synthesis/hls_plugins.py +1559 -0
  730. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  731. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  732. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  733. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1076 -0
  734. qiskit/transpiler/passes/utils/__init__.py +33 -0
  735. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +41 -0
  736. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  737. qiskit/transpiler/passes/utils/check_map.py +78 -0
  738. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  739. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  740. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +93 -0
  741. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  742. qiskit/transpiler/passes/utils/error.py +69 -0
  743. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  744. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  745. qiskit/transpiler/passes/utils/gate_direction.py +86 -0
  746. qiskit/transpiler/passes/utils/gates_basis.py +51 -0
  747. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +163 -0
  748. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  749. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  750. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  751. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  752. qiskit/transpiler/passmanager.py +490 -0
  753. qiskit/transpiler/passmanager_config.py +216 -0
  754. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  755. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1045 -0
  756. qiskit/transpiler/preset_passmanagers/common.py +649 -0
  757. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +626 -0
  758. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  759. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  760. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  761. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  762. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  763. qiskit/transpiler/target.py +1319 -0
  764. qiskit/transpiler/timing_constraints.py +59 -0
  765. qiskit/user_config.py +262 -0
  766. qiskit/utils/__init__.py +89 -0
  767. qiskit/utils/classtools.py +146 -0
  768. qiskit/utils/deprecate_pulse.py +119 -0
  769. qiskit/utils/deprecation.py +490 -0
  770. qiskit/utils/lazy_tester.py +363 -0
  771. qiskit/utils/multiprocessing.py +56 -0
  772. qiskit/utils/optionals.py +347 -0
  773. qiskit/utils/parallel.py +191 -0
  774. qiskit/utils/units.py +143 -0
  775. qiskit/version.py +84 -0
  776. qiskit/visualization/__init__.py +288 -0
  777. qiskit/visualization/array.py +204 -0
  778. qiskit/visualization/bloch.py +778 -0
  779. qiskit/visualization/circuit/__init__.py +15 -0
  780. qiskit/visualization/circuit/_utils.py +675 -0
  781. qiskit/visualization/circuit/circuit_visualization.py +727 -0
  782. qiskit/visualization/circuit/latex.py +661 -0
  783. qiskit/visualization/circuit/matplotlib.py +2029 -0
  784. qiskit/visualization/circuit/qcstyle.py +278 -0
  785. qiskit/visualization/circuit/styles/__init__.py +13 -0
  786. qiskit/visualization/circuit/styles/bw.json +202 -0
  787. qiskit/visualization/circuit/styles/clifford.json +202 -0
  788. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  789. qiskit/visualization/circuit/styles/iqp.json +214 -0
  790. qiskit/visualization/circuit/styles/textbook.json +202 -0
  791. qiskit/visualization/circuit/text.py +1844 -0
  792. qiskit/visualization/circuit_visualization.py +19 -0
  793. qiskit/visualization/counts_visualization.py +481 -0
  794. qiskit/visualization/dag_visualization.py +316 -0
  795. qiskit/visualization/exceptions.py +21 -0
  796. qiskit/visualization/gate_map.py +1485 -0
  797. qiskit/visualization/library.py +37 -0
  798. qiskit/visualization/pass_manager_visualization.py +308 -0
  799. qiskit/visualization/pulse_v2/__init__.py +21 -0
  800. qiskit/visualization/pulse_v2/core.py +901 -0
  801. qiskit/visualization/pulse_v2/device_info.py +173 -0
  802. qiskit/visualization/pulse_v2/drawings.py +253 -0
  803. qiskit/visualization/pulse_v2/events.py +254 -0
  804. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  805. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  806. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  807. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  808. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  809. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  810. qiskit/visualization/pulse_v2/interface.py +458 -0
  811. qiskit/visualization/pulse_v2/layouts.py +387 -0
  812. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  813. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  814. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  815. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  816. qiskit/visualization/pulse_v2/types.py +242 -0
  817. qiskit/visualization/state_visualization.py +1518 -0
  818. qiskit/visualization/timeline/__init__.py +21 -0
  819. qiskit/visualization/timeline/core.py +480 -0
  820. qiskit/visualization/timeline/drawings.py +260 -0
  821. qiskit/visualization/timeline/generators.py +506 -0
  822. qiskit/visualization/timeline/interface.py +436 -0
  823. qiskit/visualization/timeline/layouts.py +115 -0
  824. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  825. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  826. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  827. qiskit/visualization/timeline/stylesheet.py +301 -0
  828. qiskit/visualization/timeline/types.py +148 -0
  829. qiskit/visualization/transition_visualization.py +369 -0
  830. qiskit/visualization/utils.py +49 -0
  831. qiskit-1.3.0.dist-info/LICENSE.txt +203 -0
  832. qiskit-1.3.0.dist-info/METADATA +222 -0
  833. qiskit-1.3.0.dist-info/RECORD +836 -0
  834. qiskit-1.3.0.dist-info/WHEEL +5 -0
  835. qiskit-1.3.0.dist-info/entry_points.txt +76 -0
  836. qiskit-1.3.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,803 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017.
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
+ """
14
+ =============================================
15
+ Providers Interface (:mod:`qiskit.providers`)
16
+ =============================================
17
+
18
+ .. currentmodule:: qiskit.providers
19
+
20
+ This module contains the classes used to build external providers for Qiskit. A
21
+ provider is anything that provides an external service to Qiskit. The typical
22
+ example of this is a Backend provider which provides
23
+ :class:`~qiskit.providers.Backend` objects which can be used for executing
24
+ :class:`~qiskit.circuit.QuantumCircuit` and/or :class:`~qiskit.pulse.Schedule`
25
+ objects. This module contains the abstract classes which are used to define the
26
+ interface between a provider and Qiskit.
27
+
28
+ Version Support
29
+ ===============
30
+
31
+ Each providers interface abstract class is individually versioned. When we
32
+ need to make a change to an interface a new abstract class will be created to
33
+ define the new interface. These interface changes are not guaranteed to be
34
+ backwards compatible between versions.
35
+
36
+ Version Changes
37
+ ----------------
38
+
39
+ Each minor version release of ``qiskit`` **may** increment the version of any
40
+ backend interface a single version number. It will be an aggregate of all
41
+ the interface changes for that release on that interface.
42
+
43
+ Version Support Policy
44
+ ----------------------
45
+
46
+ To enable providers to have time to adjust to changes in this interface
47
+ Qiskit will support multiple versions of each class at once. Given the
48
+ nature of one version per release the version deprecation policy is a bit
49
+ more conservative than the standard deprecation policy. Qiskit will support a
50
+ provider interface version for a minimum of 3 minor releases or the first
51
+ release after 6 months from the release that introduced a version, whichever is
52
+ longer, prior to a potential deprecation. After that the standard deprecation
53
+ policy will apply to that interface version. This will give providers and users
54
+ sufficient time to adapt to potential breaking changes in the interface. So for
55
+ example lets say in 0.19.0 ``BackendV2`` is introduced and in the 3 months after
56
+ the release of 0.19.0 we release 0.20.0, 0.21.0, and 0.22.0, then 7 months after
57
+ 0.19.0 we release 0.23.0. In 0.23.0 we can deprecate BackendV2, and it needs to
58
+ still be supported and can't be removed until the deprecation policy completes.
59
+
60
+ It's worth pointing out that Qiskit's version support policy doesn't mean
61
+ providers themselves will have the same support story, they can (and arguably
62
+ should) update to newer versions as soon as they can, the support window is
63
+ just for Qiskit's supported versions. Part of this lengthy window prior to
64
+ deprecation is to give providers enough time to do their own deprecation of a
65
+ potential end user impacting change in a user facing part of the interface
66
+ prior to bumping their version. For example, let's say we changed the signature
67
+ to ``Backend.run()`` in ``BackendV34`` in a backwards incompatible way. Before
68
+ Aer could update its :class:`~qiskit_aer.AerSimulator` class
69
+ to be based on version 34 they'd need to deprecate the old signature prior to switching
70
+ over. The changeover for Aer is not guaranteed to be lockstep with Qiskit, so we
71
+ need to ensure there is a sufficient amount of time for Aer to complete its
72
+ deprecation cycle prior to removing version 33 (ie making version 34
73
+ mandatory/the minimum version).
74
+
75
+ Abstract Classes
76
+ ================
77
+
78
+ Provider
79
+ --------
80
+
81
+ .. autosummary::
82
+ :toctree: ../stubs/
83
+
84
+ Provider
85
+ ProviderV1
86
+
87
+ Backend
88
+ -------
89
+
90
+ .. autosummary::
91
+ :toctree: ../stubs/
92
+
93
+ Backend
94
+ BackendV1
95
+ BackendV2
96
+ QubitProperties
97
+ BackendV2Converter
98
+ convert_to_target
99
+
100
+ Options
101
+ -------
102
+
103
+ .. autosummary::
104
+ :toctree: ../stubs/
105
+
106
+ Options
107
+
108
+ Job
109
+ ---
110
+
111
+ .. autosummary::
112
+ :toctree: ../stubs/
113
+
114
+ Job
115
+ JobV1
116
+
117
+ Job Status
118
+ ----------
119
+
120
+ .. autosummary::
121
+ :toctree: ../stubs/
122
+
123
+ JobStatus
124
+
125
+ Exceptions
126
+ ----------
127
+
128
+ .. autoexception:: QiskitBackendNotFoundError
129
+ .. autoexception:: BackendPropertyError
130
+ .. autoexception:: JobError
131
+ .. autoexception:: JobTimeoutError
132
+ .. autoexception:: BackendConfigurationError
133
+
134
+ Writing a New Backend
135
+ =====================
136
+
137
+ If you have a quantum device or simulator that you would like to integrate with
138
+ Qiskit you will need to write a backend. A provider is a collection of backends
139
+ and will provide Qiskit with a
140
+ method to get available :class:`~qiskit.providers.BackendV2` objects. The
141
+ :class:`~qiskit.providers.BackendV2` object provides both information describing
142
+ a backend and its operation for the :mod:`~qiskit.transpiler` so that circuits
143
+ can be compiled to something that is optimized and can execute on the
144
+ backend. It also provides the :meth:`~qiskit.providers.BackendV2.run` method which can
145
+ run the :class:`~qiskit.circuit.QuantumCircuit` objects and/or
146
+ :class:`~qiskit.pulse.Schedule` objects. This enables users and other Qiskit
147
+ APIs to get results from
148
+ executing circuits on devices in a standard
149
+ fashion regardless of how the backend is implemented. At a high level the basic
150
+ steps for writing a provider are:
151
+
152
+ * Implement a ``Provider`` class that handles access to the backend(s).
153
+ * Implement a :class:`~qiskit.providers.BackendV2` subclass and its
154
+ :meth:`~qiskit.providers.BackendV2.run` method.
155
+
156
+ * Add any custom gates for the backend's basis to the session
157
+ :class:`~qiskit.circuit.EquivalenceLibrary` instance.
158
+
159
+ * Implement a :class:`~qiskit.providers.JobV1` subclass that handles
160
+ interacting with a running job.
161
+
162
+ For a simple example of a provider, see the
163
+ `qiskit-aqt-provider <https://github.com/qiskit-community/qiskit-aqt-provider>`__
164
+
165
+ Provider
166
+ --------
167
+
168
+ A provider class serves a single purpose: to get backend objects that enable
169
+ executing circuits on a device or simulator. The expectation is that any
170
+ required credentials and/or authentication will be handled in the initialization
171
+ of a provider object. The provider object will then provide a list of backends,
172
+ and methods to filter and acquire backends (using the provided credentials if
173
+ required). An example provider class looks like::
174
+
175
+ from qiskit.providers.providerutils import filter_backends
176
+
177
+ from .backend import MyBackend
178
+
179
+ class MyProvider:
180
+
181
+ def __init__(self, token=None):
182
+ super().__init__()
183
+ self.token = token
184
+ self.backends = [MyBackend(provider=self)]
185
+
186
+ def backends(self, name=None, **kwargs):
187
+ if name:
188
+ backends = [
189
+ backend for backend in backends if backend.name() == name]
190
+ return filter_backends(backends, filters=filters, **kwargs)
191
+
192
+ Ensure that any necessary information for
193
+ authentication (if required) are present in the class and that the backends
194
+ method matches the required interface. The rest is up to the specific provider on how to implement.
195
+
196
+ Backend
197
+ -------
198
+
199
+ The backend classes are the core to the provider. These classes are what
200
+ provide the interface between Qiskit and the hardware or simulator that will
201
+ execute circuits. This includes providing the necessary information to
202
+ describe a backend to the compiler so that it can embed and optimize any
203
+ circuit for the backend. There are 4 required things in every backend object: a
204
+ :attr:`~qiskit.providers.BackendV2.target` property to define the model of the
205
+ backend for the compiler, a :attr:`~qiskit.providers.BackendV2.max_circuits`
206
+ property to define a limit on the number of circuits the backend can execute in
207
+ a single batch job (if there is no limit ``None`` can be used), a
208
+ :meth:`~qiskit.providers.BackendV2.run` method to accept job submissions, and
209
+ a :obj:`~qiskit.providers.BackendV2._default_options` method to define the
210
+ user configurable options and their default values. For example, a minimum working
211
+ example would be something like::
212
+
213
+ from qiskit.providers import BackendV2 as Backend
214
+ from qiskit.transpiler import Target
215
+ from qiskit.providers import Options
216
+ from qiskit.circuit import Parameter, Measure
217
+ from qiskit.circuit.library import PhaseGate, SXGate, UGate, CXGate, IGate
218
+
219
+
220
+ class Mybackend(Backend):
221
+
222
+ def __init__(self):
223
+ super().__init__()
224
+
225
+ # Create Target
226
+ self._target = Target("Target for My Backend")
227
+ # Instead of None for this and below instructions you can define
228
+ # a qiskit.transpiler.InstructionProperties object to define properties
229
+ # for an instruction.
230
+ lam = Parameter("λ")
231
+ p_props = {(qubit,): None for qubit in range(5)}
232
+ self._target.add_instruction(PhaseGate(lam), p_props)
233
+ sx_props = {(qubit,): None for qubit in range(5)}
234
+ self._target.add_instruction(SXGate(), sx_props)
235
+ phi = Parameter("φ")
236
+ theta = Parameter("ϴ")
237
+ u_props = {(qubit,): None for qubit in range(5)}
238
+ self._target.add_instruction(UGate(theta, phi, lam), u_props)
239
+ cx_props = {edge: None for edge in [(0, 1), (1, 2), (2, 3), (3, 4)]}
240
+ self._target.add_instruction(CXGate(), cx_props)
241
+ meas_props = {(qubit,): None for qubit in range(5)}
242
+ self._target.add_instruction(Measure(), meas_props)
243
+ id_props = {(qubit,): None for qubit in range(5)}
244
+ self._target.add_instruction(IGate(), id_props)
245
+
246
+ # Set option validators
247
+ self.options.set_validator("shots", (1, 4096))
248
+ self.options.set_validator("memory", bool)
249
+
250
+ @property
251
+ def target(self):
252
+ return self._target
253
+
254
+ @property
255
+ def max_circuits(self):
256
+ return 1024
257
+
258
+ @classmethod
259
+ def _default_options(cls):
260
+ return Options(shots=1024, memory=False)
261
+
262
+ def run(circuits, **kwargs):
263
+ # serialize circuits submit to backend and create a job
264
+ for kwarg in kwargs:
265
+ if not hasattr(kwarg, self.options):
266
+ warnings.warn(
267
+ "Option %s is not used by this backend" % kwarg,
268
+ UserWarning, stacklevel=2)
269
+ options = {
270
+ 'shots': kwargs.get('shots', self.options.shots),
271
+ 'memory': kwargs.get('memory', self.options.shots),
272
+ }
273
+ job_json = convert_to_wire_format(circuit, options)
274
+ job_handle = submit_to_backend(job_jsonb)
275
+ return MyJob(self. job_handle, job_json, circuit)
276
+
277
+
278
+ Backend's Transpiler Interface
279
+ ------------------------------
280
+
281
+ The key piece of the :class:`~qiskit.providers.Backend` object is how it describes itself to the
282
+ compiler. This is handled with the :class:`~qiskit.transpiler.Target` class which defines
283
+ a model of a backend for the transpiler. A backend object will need to return
284
+ a :class:`~qiskit.transpiler.Target` object from the :attr:`~qiskit.providers.BackendV2.target`
285
+ attribute which the :func:`~qiskit.compiler.transpile` function will use as
286
+ its model of a backend target for compilation.
287
+
288
+ .. _custom_basis_gates:
289
+
290
+ Custom Basis Gates
291
+ ^^^^^^^^^^^^^^^^^^
292
+
293
+ 1. If your backend doesn't use gates in the Qiskit circuit library
294
+ (:mod:`qiskit.circuit.library`) you can integrate support for this into your
295
+ provider. The basic method for doing this is first to define a
296
+ :class:`~qiskit.circuit.Gate` subclass for each custom gate in the basis
297
+ set. For example::
298
+
299
+ import numpy as np
300
+
301
+ from qiskit.circuit import Gate
302
+ from qiskit.circuit import QuantumCircuit
303
+
304
+ class SYGate(Gate):
305
+ def __init__(self, label=None):
306
+ super().__init__("sy", 1, [], label=label)
307
+
308
+ def _define(self):
309
+ qc = QuantumCircuit(1)
310
+ qc.ry(np.pi / 2, 0)
311
+ self.definition = qc
312
+
313
+ The key thing to ensure is that for any custom gates in your Backend's basis set
314
+ your custom gate's name attribute (the first param on
315
+ ``super().__init__()`` in the ``__init__`` definition above) does not conflict
316
+ with the name of any other gates. The name attribute is what is used to
317
+ identify the gate in the basis set for the transpiler. If there is a conflict
318
+ the transpiler will not know which gate to use.
319
+
320
+ 2. Add the custom gate to the target for your backend. This can be done with
321
+ the :meth:`.Target.add_instruction` method. You'll need to add an instance of
322
+ ``SYGate`` and its parameters to the target so the transpiler knows it
323
+ exists. For example, assuming this is part of your
324
+ :class:`~qiskit.providers.BackendV2` implementation for your backend::
325
+
326
+ from qiskit.transpiler import InstructionProperties
327
+
328
+ sy_props = {
329
+ (0,): InstructionProperties(duration=2.3e-6, error=0.0002)
330
+ (1,): InstructionProperties(duration=2.1e-6, error=0.0001)
331
+ (2,): InstructionProperties(duration=2.5e-6, error=0.0003)
332
+ (3,): InstructionProperties(duration=2.2e-6, error=0.0004)
333
+ }
334
+ self.target.add_instruction(SYGate(), sy_props)
335
+
336
+ The keys in ``sy_props`` define the qubits where the backend ``SYGate`` can
337
+ be used on, and the values define the properties of ``SYGate`` on that
338
+ qubit. For multiqubit gates the tuple keys contain all qubit combinations
339
+ the gate works on (order is significant, i.e. ``(0, 1)`` is different from
340
+ ``(1, 0)``).
341
+
342
+ 3. After you've defined the custom gates to use for the backend's basis set
343
+ then you need to add equivalence rules to the standard equivalence library
344
+ so that the :func:`~qiskit.compiler.transpile` function and
345
+ :mod:`~qiskit.transpiler` module can convert an arbitrary circuit using the
346
+ custom basis set. This can be done by defining equivalent circuits, in terms
347
+ of the custom gate, for standard gates. Typically if you can convert from a
348
+ :class:`~qiskit.circuit.library.CXGate` (if your basis doesn't include a
349
+ standard 2 qubit gate) and some commonly used single qubit rotation gates like
350
+ the :class:`~qiskit.circuit.library.HGate` and
351
+ :class:`~qiskit.circuit.library.UGate` that should be sufficient for the
352
+ transpiler to translate any circuit into the custom basis gates. But, the more
353
+ equivalence rules that are defined from standard gates to your basis the more
354
+ efficient translation from an arbitrary circuit to the target basis will be
355
+ (although not always, and there is a diminishing margin of return).
356
+
357
+ For example, if you were to add some rules for the above custom ``SYGate``
358
+ we could define the :class:`~qiskit.circuit.library.U2Gate` and
359
+ :class:`~qiskit.circuit.library.HGate`::
360
+
361
+ from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary
362
+ from qiskit.circuit.library import HGate
363
+ from qiskit.circuit.library import ZGate
364
+ from qiskit.circuit.library import RZGate
365
+ from qiskit.circuit.library import U2Gate
366
+
367
+
368
+ # H => Z SY
369
+ q = qiskit.QuantumRegister(1, "q")
370
+ def_sy_h = qiskit.QuantumCircuit(q)
371
+ def_sy_h.append(ZGate(), [q[0]], [])
372
+ def_sy_h.append(SYGate(), [q[0]], [])
373
+ SessionEquivalenceLibrary.add_equivalence(
374
+ HGate(), def_sy_h)
375
+
376
+ # u2 => Z SY Z
377
+ phi = qiskit.circuit.Parameter('phi')
378
+ lam = qiskit.circuit.Parameter('lambda')
379
+ q = qiskit.QuantumRegister(1, "q")
380
+ def_sy_u2 = qiskit.QuantumCircuit(q)
381
+ def_sy_u2.append(RZGate(lam), [q[0]], [])
382
+ def_sy_u2.append(SYGate(), [q[0]], [])
383
+ def_sy_u2.append(RZGate(phi), [q[0]], [])
384
+ SessionEquivalenceLibrary.add_equivalence(
385
+ U2Gate(phi, lam), def_sy_u2)
386
+
387
+
388
+ You will want this to be run on import so that as soon as the provider's
389
+ package is imported it will be run. This will ensure that any time the
390
+ :class:`~qiskit.transpiler.passes.BasisTranslator` pass is run with the
391
+ custom gates the equivalence rules are defined.
392
+
393
+ It's also worth noting that depending on the basis you're using, some optimization
394
+ passes in the transpiler, such as
395
+ :class:`~qiskit.transpiler.passes.Optimize1qGatesDecomposition`, may not
396
+ be able to operate with your custom basis. For our ``SYGate`` example, the
397
+ :class:`~qiskit.transpiler.passes.Optimize1qGatesDecomposition` will not be
398
+ able to simplify runs of single qubit gates into the SY basis. This is because
399
+ the :class:`~qiskit.quantum_info.OneQubitEulerDecomposer` class does not
400
+ know how to work in the SY basis. To solve this the ``SYGate`` class would
401
+ need to be added to Qiskit and
402
+ :class:`~qiskit.quantum_info.OneQubitEulerDecomposer` updated to support
403
+ decomposing to the ``SYGate``. Longer term that is likely a better direction
404
+ for custom basis gates and contributing the definitions and support in the
405
+ transpiler will ensure that it continues to be well supported by Qiskit
406
+ moving forward.
407
+
408
+ .. _custom_transpiler_backend:
409
+
410
+ Custom Transpiler Passes
411
+ ^^^^^^^^^^^^^^^^^^^^^^^^
412
+ The transpiler supports the ability for backends to provide custom transpiler
413
+ stage implementations to facilitate hardware specific optimizations and
414
+ circuit transformations. Currently there are two stages supported,
415
+ ``get_translation_stage_plugin()`` and ``get_scheduling_stage_plugin()``
416
+ which allow a backend to specify string plugin names to be used as the default
417
+ translation and scheduling stages, respectively. These
418
+ hook points in a :class:`~.BackendV2` class can be used if your
419
+ backend has requirements for compilation that are not met by the
420
+ current backend/:class:`~.Target` interface. Please also consider
421
+ submitting a Github issue describing your use case as there is interest
422
+ in improving these interfaces to be able to describe more hardware
423
+ architectures in greater depth.
424
+
425
+ To leverage these hook points you just need to add the methods to your
426
+ :class:`~.BackendV2` implementation and have them return a string plugin name.
427
+ For example::
428
+
429
+
430
+ class Mybackend(BackendV2):
431
+
432
+ def get_scheduling_stage_plugin(self):
433
+ return "SpecialDD"
434
+
435
+ def get_translation_stage_plugin(self):
436
+ return "BasisTranslatorWithCustom1qOptimization"
437
+
438
+ This snippet of a backend implementation will now have the :func:`~.transpile`
439
+ function use the ``SpecialDD`` plugin for the scheduling stage and
440
+ the ``BasisTranslatorWithCustom1qOptimization`` plugin for the translation
441
+ stage by default when the target is set to ``Mybackend``. Note that users may override these choices
442
+ by explicitly selecting a different plugin name. For this interface to work though transpiler
443
+ stage plugins must be implemented for the returned plugin name. You can refer
444
+ to :mod:`qiskit.transpiler.preset_passmanagers.plugin` module documentation for
445
+ details on how to implement plugins. The typical expectation is that if your backend
446
+ requires custom passes as part of a compilation stage the provider package will
447
+ include the transpiler stage plugins that use those passes. However, this is not
448
+ required and any valid method (from a built-in method or external plugin) can
449
+ be used.
450
+
451
+ This way if these two compilation steps are **required** for running or providing
452
+ efficient output on ``Mybackend`` the transpiler will be able to perform these
453
+ custom steps without any manual user input.
454
+
455
+ .. _providers-guide-real-time-variables:
456
+
457
+ Real-time variables
458
+ ^^^^^^^^^^^^^^^^^^^
459
+
460
+ The transpiler will automatically handle real-time typed classical variables (see
461
+ :mod:`qiskit.circuit.classical`) and treat the :class:`.Store` instruction as a built-in
462
+ "directive", similar to :class:`.Barrier`. No special handling from backends is necessary to permit
463
+ this.
464
+
465
+ If your backend is *unable* to handle classical variables and storage, we recommend that you comment
466
+ on this in your documentation, and insert a check into your :meth:`~.BackendV2.run` method (see
467
+ :ref:`providers-guide-backend-run`) to eagerly reject circuits containing them. You can examine
468
+ :attr:`.QuantumCircuit.num_vars` for the presence of variables at the top level. If you accept
469
+ :ref:`control-flow operations <circuit-control-flow-repr>`, you might need to recursively search the
470
+ internal :attr:`~.ControlFlowOp.blocks` of each for scope-local variables with
471
+ :attr:`.QuantumCircuit.num_declared_vars`.
472
+
473
+ For example, a function to check for the presence of any manual storage locations, or manual stores
474
+ to memory::
475
+
476
+ from qiskit.circuit import Store, ControlFlowOp, QuantumCircuit
477
+
478
+ def has_realtime_logic(circuit: QuantumCircuit) -> bool:
479
+ if circuit.num_vars:
480
+ return True
481
+ for instruction in circuit.data:
482
+ if isinstance(instruction.operation, Store):
483
+ return True
484
+ elif isinstance(instruction.operation, ControlFlowOp):
485
+ for block in instruction.operation.blocks:
486
+ if has_realtime_logic(block):
487
+ return True
488
+ return False
489
+
490
+ .. _providers-guide-backend-run:
491
+
492
+ Backend.run Method
493
+ ------------------
494
+
495
+ Of key importance is the :meth:`~qiskit.providers.BackendV2.run` method, which
496
+ is used to actually submit circuits to a device or simulator. The run method
497
+ handles submitting the circuits to the backend to be executed and returning a
498
+ :class:`~qiskit.providers.Job` object. Depending on the type of backend this
499
+ typically involves serializing the circuit object into the API format used by a
500
+ backend. For example, on IBM backends from the ``qiskit-ibm-provider``
501
+ package this involves converting from a quantum circuit and options into a
502
+ :mod:`.qpy` payload embedded in JSON and submitting that to the IBM Quantum
503
+ API. Since every backend interface is different (and in the case of the local
504
+ simulators serialization may not be needed) it is expected that the backend's
505
+ :obj:`~qiskit.providers.BackendV2.run` method will handle this conversion.
506
+
507
+ An example run method would be something like::
508
+
509
+ def run(self, circuits. **kwargs):
510
+ for kwarg in kwargs:
511
+ if not hasattr(kwarg, self.options):
512
+ warnings.warn(
513
+ "Option %s is not used by this backend" % kwarg,
514
+ UserWarning, stacklevel=2)
515
+ options = {
516
+ 'shots': kwargs.get('shots', self.options.shots)
517
+ 'memory': kwargs.get('memory', self.options.shots),
518
+ }
519
+ job_json = convert_to_wire_format(circuit, options)
520
+ job_handle = submit_to_backend(job_jsonb)
521
+ return MyJob(self. job_handle, job_json, circuit)
522
+
523
+ Backend Options
524
+ ---------------
525
+
526
+ There are often several options for a backend that control how a circuit is run.
527
+ The typical example of this is something like the number of ``shots`` which is
528
+ how many times the circuit is to be executed. The options available for a
529
+ backend are defined using an :class:`~qiskit.providers.Options` object. This
530
+ object is initially created by the
531
+ :obj:`~qiskit.providers.BackendV2._default_options` method of a Backend class.
532
+ The default options returns an initialized :class:`~qiskit.providers.Options`
533
+ object with all the default values for all the options a backend supports. For
534
+ example, if the backend supports only supports ``shots`` the
535
+ :obj:`~qiskit.providers.BackendV2._default_options` method would look like::
536
+
537
+ @classmethod
538
+ def _default_options(cls):
539
+ return Options(shots=1024)
540
+
541
+ You can also set validators on an :class:`~qiskit.providers.Options` object to
542
+ provide limits and validation on user provided values based on what's acceptable
543
+ for your backend. For example, if the ``"shots"`` option defined above can be set
544
+ to any value between 1 and 4096 you can set the validator on the options object
545
+ for you backend with::
546
+
547
+ self.options.set_validator("shots", (1, 4096))
548
+
549
+ you can refer to the :meth:`~qiskit.providers.Options.set_validator` documentation
550
+ for a full list of validation options.
551
+
552
+
553
+ Job
554
+ ---
555
+
556
+ The output from the :obj:`~qiskit.providers.BackendV2.run` method is a :class:`~qiskit.providers.JobV1`
557
+ object. Each provider is expected to implement a custom job subclass that
558
+ defines the behavior for the provider. There are 2 types of jobs depending on
559
+ the backend's execution method, either a sync or async. By default jobs are
560
+ considered async and the expectation is that it represents a handle to the
561
+ async execution of the circuits submitted with ``Backend.run()``. An async
562
+ job object provides users the ability to query the status of the execution,
563
+ cancel a running job, and block until the execution is finished. The
564
+ :obj:`~qiskit.providers.JobV1.result` is the primary user facing method
565
+ which will block until the execution is complete and then will return a
566
+ :class:`~qiskit.result.Result` object with results of the job.
567
+
568
+ For some backends (mainly local simulators) the execution of circuits is a
569
+ synchronous operation and there is no need to return a handle to a running job
570
+ elsewhere. For sync jobs its expected that the
571
+ :obj:`~qiskit.providers.BackendV1.run` method on the backend will block until a
572
+ :class:`~qiskit.result.Result` object is generated and the sync job will return
573
+ with that inner :class:`~qiskit.result.Result` object.
574
+
575
+ An example job class for an async API based backend would look something like::
576
+
577
+ from qiskit.providers import JobV1 as Job
578
+ from qiskit.providers import JobError
579
+ from qiskit.providers import JobTimeoutError
580
+ from qiskit.providers.jobstatus import JobStatus
581
+ from qiskit.result import Result
582
+
583
+
584
+ class MyJob(Job):
585
+ def __init__(self, backend, job_id, job_json, circuits):
586
+ super().__init__(backend, job_id)
587
+ self._backend = backend
588
+ self.job_json = job_json
589
+ self.circuits = circuits
590
+
591
+ def _wait_for_result(self, timeout=None, wait=5):
592
+ start_time = time.time()
593
+ result = None
594
+ while True:
595
+ elapsed = time.time() - start_time
596
+ if timeout and elapsed >= timeout:
597
+ raise JobTimeoutError('Timed out waiting for result')
598
+ result = get_job_status(self._job_id)
599
+ if result['status'] == 'complete':
600
+ break
601
+ if result['status'] == 'error':
602
+ raise JobError('Job error')
603
+ time.sleep(wait)
604
+ return result
605
+
606
+ def result(self, timeout=None, wait=5):
607
+ result = self._wait_for_result(timeout, wait)
608
+ results = [{'success': True, 'shots': len(result['counts']),
609
+ 'data': result['counts']}]
610
+ return Result.from_dict({
611
+ 'results': results,
612
+ 'backend_name': self._backend.configuration().backend_name,
613
+ 'backend_version': self._backend.configuration().backend_version,
614
+ 'job_id': self._job_id,
615
+ 'qobj_id': ', '.join(x.name for x in self.circuits),
616
+ 'success': True,
617
+ })
618
+
619
+ def status(self):
620
+ result = get_job_status(self._job_id)
621
+ if result['status'] == 'running':
622
+ status = JobStatus.RUNNING
623
+ elif result['status'] == 'complete':
624
+ status = JobStatus.DONE
625
+ else:
626
+ status = JobStatus.ERROR
627
+ return status
628
+
629
+ def submit(self):
630
+ raise NotImplementedError
631
+
632
+ and for a sync job::
633
+
634
+ class MySyncJob(Job):
635
+ _async = False
636
+
637
+ def __init__(self, backend, job_id, result):
638
+ super().__init__(backend, job_id)
639
+ self._result = result
640
+
641
+ def submit(self):
642
+ return
643
+
644
+ def result(self):
645
+ return self._result
646
+
647
+ def status(self):
648
+ return JobStatus.DONE
649
+
650
+ Primitives
651
+ ----------
652
+
653
+ While not directly part of the provider interface, the :mod:`qiskit.primitives`
654
+ module is tightly coupled with providers. Specifically the primitive
655
+ interfaces, such as :class:`~.BaseSampler` and :class:`~.BaseEstimator`,
656
+ are designed to enable provider implementations to provide custom
657
+ implementations which are optimized for the provider's backends. This can
658
+ include customizations like circuit transformations, additional pre- and
659
+ post-processing, batching, caching, error mitigation, etc. The concept of
660
+ the :mod:`qiskit.primitives` module is to explicitly enable this as the
661
+ primitive objects are higher level abstractions to produce processed higher
662
+ level outputs (such as probability distributions and expectation values)
663
+ that abstract away the mechanics of getting the best result efficiently, to
664
+ concentrate on higher level applications using these outputs.
665
+
666
+ For example, if your backends were well suited to leverage
667
+ `mthree <https://github.com/Qiskit/qiskit-addon-mthree>`__ measurement
668
+ mitigation to improve the quality of the results, you could implement a
669
+ provider-specific :class:`~.Sampler` implementation that leverages the
670
+ ``M3Mitigation`` class internally to run the circuits and return
671
+ quasi-probabilities directly from mthree in the result. Doing this would
672
+ enable algorithms to get the best results with
673
+ mitigation applied directly from your backends. You can refer to the
674
+ documentation in :mod:`qiskit.primitives` on how to write custom
675
+ implementations. Also the built-in implementations: :class:`~.Sampler`,
676
+ :class:`~.Estimator`, :class:`~.BackendSampler`, and :class:`~.BackendEstimator`
677
+ can serve as references/models on how to implement these as well.
678
+
679
+ Migrating from BackendV1 to BackendV2
680
+ =====================================
681
+
682
+ The :obj:`~BackendV2` class re-defined user access for most properties of a
683
+ backend to make them work with native Qiskit data structures and have flatter
684
+ access patterns. However this means when using a provider that upgrades
685
+ from :obj:`~BackendV1` to :obj:`~BackendV2` existing access patterns will need
686
+ to be adjusted. It is expected for existing providers to deprecate the old
687
+ access where possible to provide a graceful migration, but eventually users
688
+ will need to adjust code. The biggest change to adapt to in :obj:`~BackendV2` is
689
+ that most of the information accessible about a backend is contained in its
690
+ :class:`~qiskit.transpiler.Target` object and the backend's attributes often query
691
+ its :attr:`~qiskit.providers.BackendV2.target`
692
+ attribute to return information, however in many cases the attributes only provide
693
+ a subset of information the target can contain. For example, ``backend.coupling_map``
694
+ returns a :class:`~qiskit.transpiler.CouplingMap` constructed from the
695
+ :class:`~qiskit.transpiler.Target` accessible in the
696
+ :attr:`~qiskit.providers.BackendV2.target` attribute, however the target may contain
697
+ instructions that operate on more than two qubits (which can't be represented in a
698
+ :class:`~qiskit.transpiler.CouplingMap`) or has instructions that only operate on
699
+ a subset of qubits (or two qubit links for a two qubit instruction) which won't be
700
+ detailed in the full coupling map returned by
701
+ :attr:`~qiskit.providers.BackendV2.coupling_map`. So depending on your use case
702
+ it might be necessary to look deeper than just the equivalent access with
703
+ :obj:`~BackendV2`.
704
+
705
+ Below is a table of example access patterns in :obj:`~BackendV1` and the new form
706
+ with :obj:`~BackendV2`:
707
+
708
+ .. list-table:: Migrate from :obj:`~BackendV1` to :obj:`~BackendV2`
709
+ :header-rows: 1
710
+
711
+ * - :obj:`~BackendV1`
712
+ - :obj:`~BackendV2`
713
+ - Notes
714
+ * - ``backend.configuration().n_qubits``
715
+ - ``backend.num_qubits``
716
+ -
717
+ * - ``backend.configuration().coupling_map``
718
+ - ``backend.coupling_map``
719
+ - The return from :obj:`~BackendV2` is a :class:`~qiskit.transpiler.CouplingMap` object.
720
+ while in :obj:`~BackendV1` it is an edge list. Also this is just a view of
721
+ the information contained in ``backend.target`` which may only be a subset of the
722
+ information contained in :class:`~qiskit.transpiler.Target` object.
723
+ * - ``backend.configuration().backend_name``
724
+ - ``backend.name``
725
+ -
726
+ * - ``backend.configuration().backend_version``
727
+ - ``backend.backend_version``
728
+ - The :attr:`~qiskit.providers.BackendV2.version` attribute represents
729
+ the version of the abstract :class:`~qiskit.providers.Backend` interface
730
+ the object implements while :attr:`~qiskit.providers.BackendV2.backend_version`
731
+ is metadata about the version of the backend itself.
732
+ * - ``backend.configuration().basis_gates``
733
+ - ``backend.operation_names``
734
+ - The :obj:`~BackendV2` return is a list of operation names contained in the
735
+ ``backend.target`` attribute. The :class:`~qiskit.transpiler.Target` may contain more
736
+ information that can be expressed by this list of names. For example, that some
737
+ operations only work on a subset of qubits or that some names implement the same gate
738
+ with different parameters.
739
+ * - ``backend.configuration().dt``
740
+ - ``backend.dt``
741
+ -
742
+ * - ``backend.configuration().dtm``
743
+ - ``backend.dtm``
744
+ -
745
+ * - ``backend.configuration().max_experiments``
746
+ - ``backend.max_circuits``
747
+ -
748
+ * - ``backend.configuration().online_date``
749
+ - ``backend.online_date``
750
+ -
751
+ * - ``InstructionDurations.from_backend(backend)``
752
+ - ``backend.instruction_durations``
753
+ -
754
+ * - ``backend.defaults().instruction_schedule_map``
755
+ - ``backend.instruction_schedule_map``
756
+ -
757
+ * - ``backend.properties().t1(0)``
758
+ - ``backend.qubit_properties(0).t1``
759
+ -
760
+ * - ``backend.properties().t2(0)``
761
+ - ``backend.qubit_properties(0).t2``
762
+ -
763
+ * - ``backend.properties().frequency(0)``
764
+ - ``backend.qubit_properties(0).frequency``
765
+ -
766
+ * - ``backend.properties().readout_error(0)``
767
+ - ``backend.target["measure"][(0,)].error``
768
+ - In :obj:`~BackendV2` the error rate for the :class:`~qiskit.circuit.library.Measure`
769
+ operation on a given qubit is used to model the readout error. However a
770
+ :obj:`~BackendV2` can implement multiple measurement types and list them
771
+ separately in a :class:`~qiskit.transpiler.Target`.
772
+ * - ``backend.properties().readout_length(0)``
773
+ - ``backend.target["measure"][(0,)].duration``
774
+ - In :obj:`~BackendV2` the duration for the :class:`~qiskit.circuit.library.Measure`
775
+ operation on a given qubit is used to model the readout length. However, a
776
+ :obj:`~BackendV2` can implement multiple measurement types and list them
777
+ separately in a :class:`~qiskit.transpiler.Target`.
778
+
779
+ There is also a :class:`~.BackendV2Converter` class available that enables you
780
+ to wrap a :class:`~.BackendV1` object with a :class:`~.BackendV2` interface.
781
+ """
782
+
783
+ # Providers interface
784
+ from qiskit.providers.provider import Provider
785
+ from qiskit.providers.provider import ProviderV1
786
+ from qiskit.providers.backend import Backend
787
+ from qiskit.providers.backend import BackendV1
788
+ from qiskit.providers.backend import BackendV2
789
+ from qiskit.providers.backend import QubitProperties
790
+ from qiskit.providers.backend_compat import BackendV2Converter
791
+ from qiskit.providers.backend_compat import convert_to_target
792
+ from qiskit.providers.options import Options
793
+ from qiskit.providers.job import Job
794
+ from qiskit.providers.job import JobV1
795
+
796
+ from qiskit.providers.exceptions import (
797
+ JobError,
798
+ JobTimeoutError,
799
+ QiskitBackendNotFoundError,
800
+ BackendPropertyError,
801
+ BackendConfigurationError,
802
+ )
803
+ from qiskit.providers.jobstatus import JobStatus