qiskit 1.3.0b1__cp39-abi3-macosx_10_9_x86_64.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 (825) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +127 -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 +365 -0
  8. qiskit/assembler/disassemble.py +310 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +1270 -0
  11. qiskit/circuit/_classical_resource_map.py +148 -0
  12. qiskit/circuit/_standard_gates_commutations.py +3264 -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 +48 -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 +503 -0
  45. qiskit/circuit/controlflow/switch_case.py +417 -0
  46. qiskit/circuit/controlflow/while_loop.py +163 -0
  47. qiskit/circuit/controlledgate.py +274 -0
  48. qiskit/circuit/delay.py +106 -0
  49. qiskit/circuit/duration.py +95 -0
  50. qiskit/circuit/equivalence.py +295 -0
  51. qiskit/circuit/equivalence_library.py +18 -0
  52. qiskit/circuit/exceptions.py +19 -0
  53. qiskit/circuit/gate.py +261 -0
  54. qiskit/circuit/instruction.py +676 -0
  55. qiskit/circuit/instructionset.py +177 -0
  56. qiskit/circuit/library/__init__.py +572 -0
  57. qiskit/circuit/library/arithmetic/__init__.py +27 -0
  58. qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
  59. qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
  60. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
  61. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
  62. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -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 +16 -0
  69. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
  70. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
  71. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -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 +331 -0
  80. qiskit/circuit/library/blueprintcircuit.py +216 -0
  81. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  82. qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
  83. qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
  84. qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
  85. qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
  86. qiskit/circuit/library/data_preparation/__init__.py +54 -0
  87. qiskit/circuit/library/data_preparation/initializer.py +107 -0
  88. qiskit/circuit/library/data_preparation/pauli_feature_map.py +343 -0
  89. qiskit/circuit/library/data_preparation/state_preparation.py +336 -0
  90. qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
  91. qiskit/circuit/library/data_preparation/zz_feature_map.py +118 -0
  92. qiskit/circuit/library/fourier_checking.py +97 -0
  93. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  94. qiskit/circuit/library/generalized_gates/diagonal.py +165 -0
  95. qiskit/circuit/library/generalized_gates/gms.py +121 -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 +312 -0
  99. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +143 -0
  100. qiskit/circuit/library/generalized_gates/mcmt.py +256 -0
  101. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  102. qiskit/circuit/library/generalized_gates/permutation.py +192 -0
  103. qiskit/circuit/library/generalized_gates/rv.py +97 -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 +86 -0
  111. qiskit/circuit/library/grover_operator.py +311 -0
  112. qiskit/circuit/library/hamiltonian_gate.py +142 -0
  113. qiskit/circuit/library/hidden_linear_function.py +98 -0
  114. qiskit/circuit/library/iqp.py +96 -0
  115. qiskit/circuit/library/n_local/__init__.py +33 -0
  116. qiskit/circuit/library/n_local/efficient_su2.py +164 -0
  117. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +256 -0
  118. qiskit/circuit/library/n_local/excitation_preserving.py +173 -0
  119. qiskit/circuit/library/n_local/n_local.py +1071 -0
  120. qiskit/circuit/library/n_local/pauli_two_design.py +141 -0
  121. qiskit/circuit/library/n_local/qaoa_ansatz.py +287 -0
  122. qiskit/circuit/library/n_local/real_amplitudes.py +186 -0
  123. qiskit/circuit/library/n_local/two_local.py +282 -0
  124. qiskit/circuit/library/overlap.py +117 -0
  125. qiskit/circuit/library/pauli_evolution.py +184 -0
  126. qiskit/circuit/library/phase_estimation.py +99 -0
  127. qiskit/circuit/library/phase_oracle.py +153 -0
  128. qiskit/circuit/library/quantum_volume.py +115 -0
  129. qiskit/circuit/library/standard_gates/__init__.py +123 -0
  130. qiskit/circuit/library/standard_gates/dcx.py +77 -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 +257 -0
  135. qiskit/circuit/library/standard_gates/i.py +75 -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 +433 -0
  139. qiskit/circuit/library/standard_gates/r.py +117 -0
  140. qiskit/circuit/library/standard_gates/rx.py +302 -0
  141. qiskit/circuit/library/standard_gates/rxx.py +183 -0
  142. qiskit/circuit/library/standard_gates/ry.py +297 -0
  143. qiskit/circuit/library/standard_gates/ryy.py +183 -0
  144. qiskit/circuit/library/standard_gates/rz.py +318 -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 +314 -0
  150. qiskit/circuit/library/standard_gates/t.py +179 -0
  151. qiskit/circuit/library/standard_gates/u.py +395 -0
  152. qiskit/circuit/library/standard_gates/u1.py +451 -0
  153. qiskit/circuit/library/standard_gates/u2.py +146 -0
  154. qiskit/circuit/library/standard_gates/u3.py +408 -0
  155. qiskit/circuit/library/standard_gates/x.py +1527 -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 +261 -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 +33 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
  164. qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
  165. qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
  166. qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
  169. qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
  170. qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
  171. qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
  175. qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
  176. qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
  178. qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
  179. qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
  180. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
  182. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
  183. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
  187. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
  188. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
  191. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
  192. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
  198. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
  199. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
  203. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
  204. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
  226. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
  227. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
  228. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  229. qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
  230. qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
  231. qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
  233. qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
  234. qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
  235. qiskit/circuit/measure.py +44 -0
  236. qiskit/circuit/operation.py +67 -0
  237. qiskit/circuit/parameter.py +174 -0
  238. qiskit/circuit/parameterexpression.py +559 -0
  239. qiskit/circuit/parametertable.py +119 -0
  240. qiskit/circuit/parametervector.py +120 -0
  241. qiskit/circuit/quantumcircuit.py +6793 -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 +604 -0
  249. qiskit/circuit/store.py +95 -0
  250. qiskit/circuit/tools/__init__.py +16 -0
  251. qiskit/circuit/tools/pi_check.py +190 -0
  252. qiskit/compiler/__init__.py +33 -0
  253. qiskit/compiler/assembler.py +668 -0
  254. qiskit/compiler/scheduler.py +107 -0
  255. qiskit/compiler/sequencer.py +69 -0
  256. qiskit/compiler/transpiler.py +478 -0
  257. qiskit/converters/__init__.py +74 -0
  258. qiskit/converters/circuit_to_dag.py +78 -0
  259. qiskit/converters/circuit_to_dagdependency.py +51 -0
  260. qiskit/converters/circuit_to_dagdependency_v2.py +47 -0
  261. qiskit/converters/circuit_to_gate.py +107 -0
  262. qiskit/converters/circuit_to_instruction.py +155 -0
  263. qiskit/converters/dag_to_circuit.py +77 -0
  264. qiskit/converters/dag_to_dagdependency.py +55 -0
  265. qiskit/converters/dag_to_dagdependency_v2.py +44 -0
  266. qiskit/converters/dagdependency_to_circuit.py +42 -0
  267. qiskit/converters/dagdependency_to_dag.py +49 -0
  268. qiskit/dagcircuit/__init__.py +44 -0
  269. qiskit/dagcircuit/collect_blocks.py +391 -0
  270. qiskit/dagcircuit/dagcircuit.py +24 -0
  271. qiskit/dagcircuit/dagdependency.py +633 -0
  272. qiskit/dagcircuit/dagdependency_v2.py +641 -0
  273. qiskit/dagcircuit/dagdepnode.py +160 -0
  274. qiskit/dagcircuit/dagnode.py +176 -0
  275. qiskit/dagcircuit/exceptions.py +42 -0
  276. qiskit/exceptions.py +153 -0
  277. qiskit/passmanager/__init__.py +240 -0
  278. qiskit/passmanager/base_tasks.py +230 -0
  279. qiskit/passmanager/compilation_status.py +74 -0
  280. qiskit/passmanager/exceptions.py +19 -0
  281. qiskit/passmanager/flow_controllers.py +116 -0
  282. qiskit/passmanager/passmanager.py +333 -0
  283. qiskit/primitives/__init__.py +481 -0
  284. qiskit/primitives/backend_estimator.py +483 -0
  285. qiskit/primitives/backend_estimator_v2.py +434 -0
  286. qiskit/primitives/backend_sampler.py +222 -0
  287. qiskit/primitives/backend_sampler_v2.py +296 -0
  288. qiskit/primitives/base/__init__.py +20 -0
  289. qiskit/primitives/base/base_estimator.py +252 -0
  290. qiskit/primitives/base/base_primitive.py +45 -0
  291. qiskit/primitives/base/base_primitive_job.py +78 -0
  292. qiskit/primitives/base/base_result.py +65 -0
  293. qiskit/primitives/base/base_sampler.py +204 -0
  294. qiskit/primitives/base/estimator_result.py +46 -0
  295. qiskit/primitives/base/sampler_result.py +45 -0
  296. qiskit/primitives/base/validation.py +231 -0
  297. qiskit/primitives/containers/__init__.py +26 -0
  298. qiskit/primitives/containers/bindings_array.py +389 -0
  299. qiskit/primitives/containers/bit_array.py +741 -0
  300. qiskit/primitives/containers/data_bin.py +165 -0
  301. qiskit/primitives/containers/estimator_pub.py +222 -0
  302. qiskit/primitives/containers/object_array.py +94 -0
  303. qiskit/primitives/containers/observables_array.py +279 -0
  304. qiskit/primitives/containers/primitive_result.py +53 -0
  305. qiskit/primitives/containers/pub_result.py +51 -0
  306. qiskit/primitives/containers/sampler_pub.py +193 -0
  307. qiskit/primitives/containers/sampler_pub_result.py +74 -0
  308. qiskit/primitives/containers/shape.py +129 -0
  309. qiskit/primitives/estimator.py +172 -0
  310. qiskit/primitives/primitive_job.py +81 -0
  311. qiskit/primitives/sampler.py +162 -0
  312. qiskit/primitives/statevector_estimator.py +174 -0
  313. qiskit/primitives/statevector_sampler.py +292 -0
  314. qiskit/primitives/utils.py +247 -0
  315. qiskit/providers/__init__.py +803 -0
  316. qiskit/providers/backend.py +656 -0
  317. qiskit/providers/backend_compat.py +452 -0
  318. qiskit/providers/basic_provider/__init__.py +45 -0
  319. qiskit/providers/basic_provider/basic_provider.py +101 -0
  320. qiskit/providers/basic_provider/basic_provider_job.py +65 -0
  321. qiskit/providers/basic_provider/basic_provider_tools.py +218 -0
  322. qiskit/providers/basic_provider/basic_simulator.py +811 -0
  323. qiskit/providers/basic_provider/exceptions.py +30 -0
  324. qiskit/providers/exceptions.py +45 -0
  325. qiskit/providers/fake_provider/__init__.py +105 -0
  326. qiskit/providers/fake_provider/backends_v1/__init__.py +22 -0
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +18 -0
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +1 -0
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +1 -0
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +37 -0
  331. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +1 -0
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/__init__.py +18 -0
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +1 -0
  334. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +43 -0
  335. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +1 -0
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +18 -0
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +1 -0
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +1 -0
  339. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +50 -0
  340. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +1 -0
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +18 -0
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +1 -0
  343. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +41 -0
  344. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +1 -0
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +18 -0
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +1 -0
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +1 -0
  348. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +44 -0
  349. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +1 -0
  350. qiskit/providers/fake_provider/fake_1q.py +91 -0
  351. qiskit/providers/fake_provider/fake_backend.py +165 -0
  352. qiskit/providers/fake_provider/fake_openpulse_2q.py +391 -0
  353. qiskit/providers/fake_provider/fake_openpulse_3q.py +340 -0
  354. qiskit/providers/fake_provider/fake_pulse_backend.py +44 -0
  355. qiskit/providers/fake_provider/fake_qasm_backend.py +77 -0
  356. qiskit/providers/fake_provider/generic_backend_v2.py +1019 -0
  357. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  358. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  359. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  360. qiskit/providers/job.py +147 -0
  361. qiskit/providers/jobstatus.py +30 -0
  362. qiskit/providers/models/__init__.py +89 -0
  363. qiskit/providers/models/backendconfiguration.py +1040 -0
  364. qiskit/providers/models/backendproperties.py +517 -0
  365. qiskit/providers/models/backendstatus.py +94 -0
  366. qiskit/providers/models/jobstatus.py +66 -0
  367. qiskit/providers/models/pulsedefaults.py +303 -0
  368. qiskit/providers/options.py +273 -0
  369. qiskit/providers/provider.py +95 -0
  370. qiskit/providers/providerutils.py +110 -0
  371. qiskit/pulse/__init__.py +158 -0
  372. qiskit/pulse/builder.py +2213 -0
  373. qiskit/pulse/calibration_entries.py +378 -0
  374. qiskit/pulse/channels.py +225 -0
  375. qiskit/pulse/configuration.py +245 -0
  376. qiskit/pulse/exceptions.py +43 -0
  377. qiskit/pulse/filters.py +309 -0
  378. qiskit/pulse/instruction_schedule_map.py +409 -0
  379. qiskit/pulse/instructions/__init__.py +67 -0
  380. qiskit/pulse/instructions/acquire.py +148 -0
  381. qiskit/pulse/instructions/delay.py +69 -0
  382. qiskit/pulse/instructions/directives.py +146 -0
  383. qiskit/pulse/instructions/frequency.py +132 -0
  384. qiskit/pulse/instructions/instruction.py +268 -0
  385. qiskit/pulse/instructions/phase.py +149 -0
  386. qiskit/pulse/instructions/play.py +97 -0
  387. qiskit/pulse/instructions/reference.py +98 -0
  388. qiskit/pulse/instructions/snapshot.py +80 -0
  389. qiskit/pulse/library/__init__.py +97 -0
  390. qiskit/pulse/library/continuous.py +430 -0
  391. qiskit/pulse/library/pulse.py +146 -0
  392. qiskit/pulse/library/samplers/__init__.py +15 -0
  393. qiskit/pulse/library/samplers/decorators.py +295 -0
  394. qiskit/pulse/library/samplers/strategies.py +71 -0
  395. qiskit/pulse/library/symbolic_pulses.py +1960 -0
  396. qiskit/pulse/library/waveform.py +134 -0
  397. qiskit/pulse/macros.py +262 -0
  398. qiskit/pulse/parameter_manager.py +445 -0
  399. qiskit/pulse/parser.py +314 -0
  400. qiskit/pulse/reference_manager.py +58 -0
  401. qiskit/pulse/schedule.py +1855 -0
  402. qiskit/pulse/transforms/__init__.py +106 -0
  403. qiskit/pulse/transforms/alignments.py +404 -0
  404. qiskit/pulse/transforms/base_transforms.py +71 -0
  405. qiskit/pulse/transforms/canonicalization.py +498 -0
  406. qiskit/pulse/transforms/dag.py +115 -0
  407. qiskit/pulse/utils.py +149 -0
  408. qiskit/qasm/libs/dummy/stdgates.inc +75 -0
  409. qiskit/qasm/libs/qelib1.inc +266 -0
  410. qiskit/qasm/libs/stdgates.inc +82 -0
  411. qiskit/qasm2/__init__.py +654 -0
  412. qiskit/qasm2/exceptions.py +27 -0
  413. qiskit/qasm2/export.py +370 -0
  414. qiskit/qasm2/parse.py +408 -0
  415. qiskit/qasm3/__init__.py +366 -0
  416. qiskit/qasm3/ast.py +630 -0
  417. qiskit/qasm3/exceptions.py +27 -0
  418. qiskit/qasm3/experimental.py +70 -0
  419. qiskit/qasm3/exporter.py +1273 -0
  420. qiskit/qasm3/printer.py +577 -0
  421. qiskit/qobj/__init__.py +75 -0
  422. qiskit/qobj/common.py +81 -0
  423. qiskit/qobj/converters/__init__.py +18 -0
  424. qiskit/qobj/converters/lo_config.py +177 -0
  425. qiskit/qobj/converters/pulse_instruction.py +895 -0
  426. qiskit/qobj/pulse_qobj.py +709 -0
  427. qiskit/qobj/qasm_qobj.py +708 -0
  428. qiskit/qobj/utils.py +46 -0
  429. qiskit/qpy/__init__.py +1641 -0
  430. qiskit/qpy/binary_io/__init__.py +36 -0
  431. qiskit/qpy/binary_io/circuits.py +1460 -0
  432. qiskit/qpy/binary_io/schedules.py +636 -0
  433. qiskit/qpy/binary_io/value.py +728 -0
  434. qiskit/qpy/common.py +306 -0
  435. qiskit/qpy/exceptions.py +53 -0
  436. qiskit/qpy/formats.py +394 -0
  437. qiskit/qpy/interface.py +341 -0
  438. qiskit/qpy/type_keys.py +572 -0
  439. qiskit/quantum_info/__init__.py +158 -0
  440. qiskit/quantum_info/analysis/__init__.py +17 -0
  441. qiskit/quantum_info/analysis/average.py +47 -0
  442. qiskit/quantum_info/analysis/distance.py +102 -0
  443. qiskit/quantum_info/analysis/make_observable.py +44 -0
  444. qiskit/quantum_info/analysis/z2_symmetries.py +484 -0
  445. qiskit/quantum_info/operators/__init__.py +28 -0
  446. qiskit/quantum_info/operators/base_operator.py +145 -0
  447. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  448. qiskit/quantum_info/operators/channel/chi.py +191 -0
  449. qiskit/quantum_info/operators/channel/choi.py +218 -0
  450. qiskit/quantum_info/operators/channel/kraus.py +337 -0
  451. qiskit/quantum_info/operators/channel/ptm.py +204 -0
  452. qiskit/quantum_info/operators/channel/quantum_channel.py +348 -0
  453. qiskit/quantum_info/operators/channel/stinespring.py +296 -0
  454. qiskit/quantum_info/operators/channel/superop.py +377 -0
  455. qiskit/quantum_info/operators/channel/transformations.py +468 -0
  456. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  457. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  458. qiskit/quantum_info/operators/dihedral/dihedral.py +509 -0
  459. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +216 -0
  460. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  461. qiskit/quantum_info/operators/dihedral/random.py +64 -0
  462. qiskit/quantum_info/operators/linear_op.py +25 -0
  463. qiskit/quantum_info/operators/measures.py +418 -0
  464. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  465. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  466. qiskit/quantum_info/operators/mixins/group.py +171 -0
  467. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  468. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  469. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  470. qiskit/quantum_info/operators/op_shape.py +525 -0
  471. qiskit/quantum_info/operators/operator.py +819 -0
  472. qiskit/quantum_info/operators/operator_utils.py +76 -0
  473. qiskit/quantum_info/operators/predicates.py +183 -0
  474. qiskit/quantum_info/operators/random.py +154 -0
  475. qiskit/quantum_info/operators/scalar_op.py +254 -0
  476. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  477. qiskit/quantum_info/operators/symplectic/base_pauli.py +727 -0
  478. qiskit/quantum_info/operators/symplectic/clifford.py +1030 -0
  479. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  480. qiskit/quantum_info/operators/symplectic/pauli.py +751 -0
  481. qiskit/quantum_info/operators/symplectic/pauli_list.py +1230 -0
  482. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  483. qiskit/quantum_info/operators/symplectic/random.py +117 -0
  484. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1175 -0
  485. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  486. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  487. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  488. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  489. qiskit/quantum_info/quaternion.py +156 -0
  490. qiskit/quantum_info/random.py +26 -0
  491. qiskit/quantum_info/states/__init__.py +28 -0
  492. qiskit/quantum_info/states/densitymatrix.py +845 -0
  493. qiskit/quantum_info/states/measures.py +288 -0
  494. qiskit/quantum_info/states/quantum_state.py +503 -0
  495. qiskit/quantum_info/states/random.py +157 -0
  496. qiskit/quantum_info/states/stabilizerstate.py +773 -0
  497. qiskit/quantum_info/states/statevector.py +958 -0
  498. qiskit/quantum_info/states/utils.py +247 -0
  499. qiskit/result/__init__.py +73 -0
  500. qiskit/result/counts.py +189 -0
  501. qiskit/result/distributions/__init__.py +17 -0
  502. qiskit/result/distributions/probability.py +100 -0
  503. qiskit/result/distributions/quasi.py +154 -0
  504. qiskit/result/exceptions.py +40 -0
  505. qiskit/result/mitigation/__init__.py +13 -0
  506. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  507. qiskit/result/mitigation/correlated_readout_mitigator.py +269 -0
  508. qiskit/result/mitigation/local_readout_mitigator.py +320 -0
  509. qiskit/result/mitigation/utils.py +160 -0
  510. qiskit/result/models.py +234 -0
  511. qiskit/result/postprocess.py +239 -0
  512. qiskit/result/result.py +392 -0
  513. qiskit/result/sampled_expval.py +75 -0
  514. qiskit/result/utils.py +295 -0
  515. qiskit/scheduler/__init__.py +40 -0
  516. qiskit/scheduler/config.py +35 -0
  517. qiskit/scheduler/lowering.py +187 -0
  518. qiskit/scheduler/methods/__init__.py +15 -0
  519. qiskit/scheduler/methods/basic.py +137 -0
  520. qiskit/scheduler/schedule_circuit.py +67 -0
  521. qiskit/scheduler/sequence.py +102 -0
  522. qiskit/synthesis/__init__.py +195 -0
  523. qiskit/synthesis/clifford/__init__.py +19 -0
  524. qiskit/synthesis/clifford/clifford_decompose_ag.py +178 -0
  525. qiskit/synthesis/clifford/clifford_decompose_bm.py +47 -0
  526. qiskit/synthesis/clifford/clifford_decompose_full.py +64 -0
  527. qiskit/synthesis/clifford/clifford_decompose_greedy.py +57 -0
  528. qiskit/synthesis/clifford/clifford_decompose_layers.py +446 -0
  529. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  530. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +52 -0
  531. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +141 -0
  532. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +266 -0
  533. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  534. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  535. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  536. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  537. qiskit/synthesis/discrete_basis/solovay_kitaev.py +217 -0
  538. qiskit/synthesis/evolution/__init__.py +20 -0
  539. qiskit/synthesis/evolution/evolution_synthesis.py +48 -0
  540. qiskit/synthesis/evolution/lie_trotter.py +143 -0
  541. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  542. qiskit/synthesis/evolution/product_formula.py +384 -0
  543. qiskit/synthesis/evolution/qdrift.py +131 -0
  544. qiskit/synthesis/evolution/suzuki_trotter.py +155 -0
  545. qiskit/synthesis/linear/__init__.py +26 -0
  546. qiskit/synthesis/linear/cnot_synth.py +69 -0
  547. qiskit/synthesis/linear/linear_circuits_utils.py +128 -0
  548. qiskit/synthesis/linear/linear_depth_lnn.py +276 -0
  549. qiskit/synthesis/linear/linear_matrix_utils.py +27 -0
  550. qiskit/synthesis/linear_phase/__init__.py +17 -0
  551. qiskit/synthesis/linear_phase/cnot_phase_synth.py +206 -0
  552. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  553. qiskit/synthesis/linear_phase/cz_depth_lnn.py +58 -0
  554. qiskit/synthesis/multi_controlled/__init__.py +23 -0
  555. qiskit/synthesis/multi_controlled/mcx_synthesis.py +356 -0
  556. qiskit/synthesis/one_qubit/__init__.py +15 -0
  557. qiskit/synthesis/one_qubit/one_qubit_decompose.py +288 -0
  558. qiskit/synthesis/permutation/__init__.py +18 -0
  559. qiskit/synthesis/permutation/permutation_full.py +78 -0
  560. qiskit/synthesis/permutation/permutation_lnn.py +54 -0
  561. qiskit/synthesis/permutation/permutation_reverse_lnn.py +93 -0
  562. qiskit/synthesis/permutation/permutation_utils.py +16 -0
  563. qiskit/synthesis/qft/__init__.py +16 -0
  564. qiskit/synthesis/qft/qft_decompose_full.py +79 -0
  565. qiskit/synthesis/qft/qft_decompose_lnn.py +78 -0
  566. qiskit/synthesis/stabilizer/__init__.py +16 -0
  567. qiskit/synthesis/stabilizer/stabilizer_circuit.py +149 -0
  568. qiskit/synthesis/stabilizer/stabilizer_decompose.py +193 -0
  569. qiskit/synthesis/two_qubit/__init__.py +19 -0
  570. qiskit/synthesis/two_qubit/local_invariance.py +63 -0
  571. qiskit/synthesis/two_qubit/two_qubit_decompose.py +759 -0
  572. qiskit/synthesis/two_qubit/weyl.py +97 -0
  573. qiskit/synthesis/two_qubit/xx_decompose/__init__.py +19 -0
  574. qiskit/synthesis/two_qubit/xx_decompose/circuits.py +300 -0
  575. qiskit/synthesis/two_qubit/xx_decompose/decomposer.py +324 -0
  576. qiskit/synthesis/two_qubit/xx_decompose/embodiments.py +163 -0
  577. qiskit/synthesis/two_qubit/xx_decompose/paths.py +412 -0
  578. qiskit/synthesis/two_qubit/xx_decompose/polytopes.py +262 -0
  579. qiskit/synthesis/two_qubit/xx_decompose/utilities.py +40 -0
  580. qiskit/synthesis/two_qubit/xx_decompose/weyl.py +133 -0
  581. qiskit/synthesis/unitary/__init__.py +13 -0
  582. qiskit/synthesis/unitary/aqc/__init__.py +177 -0
  583. qiskit/synthesis/unitary/aqc/approximate.py +116 -0
  584. qiskit/synthesis/unitary/aqc/aqc.py +175 -0
  585. qiskit/synthesis/unitary/aqc/cnot_structures.py +300 -0
  586. qiskit/synthesis/unitary/aqc/cnot_unit_circuit.py +103 -0
  587. qiskit/synthesis/unitary/aqc/cnot_unit_objective.py +299 -0
  588. qiskit/synthesis/unitary/aqc/elementary_operations.py +108 -0
  589. qiskit/synthesis/unitary/aqc/fast_gradient/__init__.py +164 -0
  590. qiskit/synthesis/unitary/aqc/fast_gradient/fast_grad_utils.py +237 -0
  591. qiskit/synthesis/unitary/aqc/fast_gradient/fast_gradient.py +226 -0
  592. qiskit/synthesis/unitary/aqc/fast_gradient/layer.py +370 -0
  593. qiskit/synthesis/unitary/aqc/fast_gradient/pmatrix.py +312 -0
  594. qiskit/synthesis/unitary/qsd.py +288 -0
  595. qiskit/transpiler/__init__.py +1283 -0
  596. qiskit/transpiler/basepasses.py +221 -0
  597. qiskit/transpiler/coupling.py +500 -0
  598. qiskit/transpiler/exceptions.py +59 -0
  599. qiskit/transpiler/instruction_durations.py +281 -0
  600. qiskit/transpiler/layout.py +737 -0
  601. qiskit/transpiler/passes/__init__.py +310 -0
  602. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  603. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  604. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  605. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  606. qiskit/transpiler/passes/analysis/depth.py +33 -0
  607. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  608. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  609. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  610. qiskit/transpiler/passes/analysis/size.py +36 -0
  611. qiskit/transpiler/passes/analysis/width.py +27 -0
  612. qiskit/transpiler/passes/basis/__init__.py +19 -0
  613. qiskit/transpiler/passes/basis/basis_translator.py +693 -0
  614. qiskit/transpiler/passes/basis/decompose.py +98 -0
  615. qiskit/transpiler/passes/basis/translate_parameterized.py +175 -0
  616. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +88 -0
  617. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +109 -0
  618. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  619. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  620. qiskit/transpiler/passes/calibration/builders.py +20 -0
  621. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  622. qiskit/transpiler/passes/calibration/pulse_gate.py +98 -0
  623. qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
  624. qiskit/transpiler/passes/calibration/rzx_builder.py +395 -0
  625. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  626. qiskit/transpiler/passes/layout/__init__.py +26 -0
  627. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  628. qiskit/transpiler/passes/layout/apply_layout.py +123 -0
  629. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  630. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  631. qiskit/transpiler/passes/layout/disjoint_utils.py +217 -0
  632. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  633. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  634. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  635. qiskit/transpiler/passes/layout/sabre_layout.py +482 -0
  636. qiskit/transpiler/passes/layout/sabre_pre_layout.py +220 -0
  637. qiskit/transpiler/passes/layout/set_layout.py +69 -0
  638. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  639. qiskit/transpiler/passes/layout/vf2_layout.py +263 -0
  640. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  641. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  642. qiskit/transpiler/passes/optimization/__init__.py +42 -0
  643. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  644. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  645. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  646. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  647. qiskit/transpiler/passes/optimization/collect_cliffords.py +88 -0
  648. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  649. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  650. qiskit/transpiler/passes/optimization/commutation_analysis.py +44 -0
  651. qiskit/transpiler/passes/optimization/commutative_cancellation.py +82 -0
  652. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +140 -0
  653. qiskit/transpiler/passes/optimization/consolidate_blocks.py +232 -0
  654. qiskit/transpiler/passes/optimization/cx_cancellation.py +65 -0
  655. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
  656. qiskit/transpiler/passes/optimization/elide_permutations.py +114 -0
  657. qiskit/transpiler/passes/optimization/hoare_opt.py +420 -0
  658. qiskit/transpiler/passes/optimization/inverse_cancellation.py +93 -0
  659. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  660. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  661. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +260 -0
  662. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  663. qiskit/transpiler/passes/optimization/optimize_annotated.py +448 -0
  664. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  665. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  666. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +41 -0
  667. qiskit/transpiler/passes/optimization/remove_final_reset.py +37 -0
  668. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  669. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  670. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +40 -0
  671. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  672. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  673. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +452 -0
  674. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  675. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  676. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +638 -0
  677. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  678. qiskit/transpiler/passes/routing/__init__.py +22 -0
  679. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  680. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  681. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  682. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  683. qiskit/transpiler/passes/routing/basic_swap.py +166 -0
  684. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  685. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  686. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +395 -0
  687. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +145 -0
  688. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  689. qiskit/transpiler/passes/routing/layout_transformation.py +119 -0
  690. qiskit/transpiler/passes/routing/lookahead_swap.py +390 -0
  691. qiskit/transpiler/passes/routing/sabre_swap.py +443 -0
  692. qiskit/transpiler/passes/routing/star_prerouting.py +392 -0
  693. qiskit/transpiler/passes/routing/stochastic_swap.py +532 -0
  694. qiskit/transpiler/passes/routing/utils.py +35 -0
  695. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  696. qiskit/transpiler/passes/scheduling/alap.py +153 -0
  697. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  698. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +255 -0
  699. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +78 -0
  700. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +105 -0
  701. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +250 -0
  702. qiskit/transpiler/passes/scheduling/asap.py +175 -0
  703. qiskit/transpiler/passes/scheduling/base_scheduler.py +308 -0
  704. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +307 -0
  705. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  706. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  707. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +441 -0
  708. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -0
  709. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  710. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  711. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  712. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +90 -0
  713. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  714. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +160 -0
  715. qiskit/transpiler/passes/synthesis/__init__.py +20 -0
  716. qiskit/transpiler/passes/synthesis/aqc_plugin.py +153 -0
  717. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +691 -0
  718. qiskit/transpiler/passes/synthesis/hls_plugins.py +928 -0
  719. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +41 -0
  720. qiskit/transpiler/passes/synthesis/plugin.py +734 -0
  721. qiskit/transpiler/passes/synthesis/qubit_tracker.py +132 -0
  722. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +297 -0
  723. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +1055 -0
  724. qiskit/transpiler/passes/utils/__init__.py +33 -0
  725. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -0
  726. qiskit/transpiler/passes/utils/check_gate_direction.py +52 -0
  727. qiskit/transpiler/passes/utils/check_map.py +78 -0
  728. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  729. qiskit/transpiler/passes/utils/control_flow.py +65 -0
  730. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +88 -0
  731. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  732. qiskit/transpiler/passes/utils/error.py +69 -0
  733. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  734. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  735. qiskit/transpiler/passes/utils/gate_direction.py +349 -0
  736. qiskit/transpiler/passes/utils/gates_basis.py +74 -0
  737. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -0
  738. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  739. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  740. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  741. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  742. qiskit/transpiler/passmanager.py +490 -0
  743. qiskit/transpiler/passmanager_config.py +198 -0
  744. qiskit/transpiler/preset_passmanagers/__init__.py +73 -0
  745. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +1019 -0
  746. qiskit/transpiler/preset_passmanagers/common.py +647 -0
  747. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +543 -0
  748. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  749. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  750. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  751. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  752. qiskit/transpiler/preset_passmanagers/plugin.py +353 -0
  753. qiskit/transpiler/target.py +1261 -0
  754. qiskit/transpiler/timing_constraints.py +59 -0
  755. qiskit/user_config.py +262 -0
  756. qiskit/utils/__init__.py +89 -0
  757. qiskit/utils/classtools.py +146 -0
  758. qiskit/utils/deprecation.py +490 -0
  759. qiskit/utils/lazy_tester.py +363 -0
  760. qiskit/utils/multiprocessing.py +56 -0
  761. qiskit/utils/optionals.py +347 -0
  762. qiskit/utils/parallel.py +191 -0
  763. qiskit/utils/units.py +143 -0
  764. qiskit/version.py +84 -0
  765. qiskit/visualization/__init__.py +288 -0
  766. qiskit/visualization/array.py +204 -0
  767. qiskit/visualization/bloch.py +778 -0
  768. qiskit/visualization/circuit/__init__.py +15 -0
  769. qiskit/visualization/circuit/_utils.py +675 -0
  770. qiskit/visualization/circuit/circuit_visualization.py +726 -0
  771. qiskit/visualization/circuit/latex.py +661 -0
  772. qiskit/visualization/circuit/matplotlib.py +2029 -0
  773. qiskit/visualization/circuit/qcstyle.py +278 -0
  774. qiskit/visualization/circuit/styles/__init__.py +13 -0
  775. qiskit/visualization/circuit/styles/bw.json +202 -0
  776. qiskit/visualization/circuit/styles/clifford.json +202 -0
  777. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  778. qiskit/visualization/circuit/styles/iqp.json +214 -0
  779. qiskit/visualization/circuit/styles/textbook.json +202 -0
  780. qiskit/visualization/circuit/text.py +1844 -0
  781. qiskit/visualization/circuit_visualization.py +19 -0
  782. qiskit/visualization/counts_visualization.py +481 -0
  783. qiskit/visualization/dag_visualization.py +316 -0
  784. qiskit/visualization/exceptions.py +21 -0
  785. qiskit/visualization/gate_map.py +1485 -0
  786. qiskit/visualization/library.py +37 -0
  787. qiskit/visualization/pass_manager_visualization.py +319 -0
  788. qiskit/visualization/pulse_v2/__init__.py +21 -0
  789. qiskit/visualization/pulse_v2/core.py +901 -0
  790. qiskit/visualization/pulse_v2/device_info.py +173 -0
  791. qiskit/visualization/pulse_v2/drawings.py +253 -0
  792. qiskit/visualization/pulse_v2/events.py +254 -0
  793. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  794. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  795. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  796. qiskit/visualization/pulse_v2/generators/frame.py +436 -0
  797. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  798. qiskit/visualization/pulse_v2/generators/waveform.py +645 -0
  799. qiskit/visualization/pulse_v2/interface.py +456 -0
  800. qiskit/visualization/pulse_v2/layouts.py +387 -0
  801. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  802. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  803. qiskit/visualization/pulse_v2/plotters/matplotlib.py +201 -0
  804. qiskit/visualization/pulse_v2/stylesheet.py +312 -0
  805. qiskit/visualization/pulse_v2/types.py +242 -0
  806. qiskit/visualization/state_visualization.py +1518 -0
  807. qiskit/visualization/timeline/__init__.py +21 -0
  808. qiskit/visualization/timeline/core.py +457 -0
  809. qiskit/visualization/timeline/drawings.py +260 -0
  810. qiskit/visualization/timeline/generators.py +506 -0
  811. qiskit/visualization/timeline/interface.py +424 -0
  812. qiskit/visualization/timeline/layouts.py +115 -0
  813. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  814. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  815. qiskit/visualization/timeline/plotters/matplotlib.py +192 -0
  816. qiskit/visualization/timeline/stylesheet.py +301 -0
  817. qiskit/visualization/timeline/types.py +148 -0
  818. qiskit/visualization/transition_visualization.py +369 -0
  819. qiskit/visualization/utils.py +49 -0
  820. qiskit-1.3.0b1.dist-info/LICENSE.txt +203 -0
  821. qiskit-1.3.0b1.dist-info/METADATA +221 -0
  822. qiskit-1.3.0b1.dist-info/RECORD +825 -0
  823. qiskit-1.3.0b1.dist-info/WHEEL +5 -0
  824. qiskit-1.3.0b1.dist-info/entry_points.txt +57 -0
  825. qiskit-1.3.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,928 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2022, 2023.
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
+
16
+ High Level Synthesis Plugins
17
+ -----------------------------
18
+
19
+ Clifford Synthesis
20
+ ''''''''''''''''''
21
+
22
+ .. list-table:: Plugins for :class:`qiskit.quantum_info.Clifford` (key = ``"clifford"``)
23
+ :header-rows: 1
24
+
25
+ * - Plugin name
26
+ - Plugin class
27
+ - Targeted connectivity
28
+ - Description
29
+ * - ``"ag"``
30
+ - :class:`~.AGSynthesisClifford`
31
+ - all-to-all
32
+ - greedily optimizes CX-count
33
+ * - ``"bm"``
34
+ - :class:`~.BMSynthesisClifford`
35
+ - all-to-all
36
+ - optimal count for `n=2,3`; used in ``"default"`` for `n=2,3`
37
+ * - ``"greedy"``
38
+ - :class:`~.GreedySynthesisClifford`
39
+ - all-to-all
40
+ - greedily optimizes CX-count; used in ``"default"`` for `n>=4`
41
+ * - ``"layers"``
42
+ - :class:`~.LayerSynthesisClifford`
43
+ - all-to-all
44
+ -
45
+ * - ``"lnn"``
46
+ - :class:`~.LayerLnnSynthesisClifford`
47
+ - linear
48
+ - many CX-gates but guarantees CX-depth of at most `7*n+2`
49
+ * - ``"default"``
50
+ - :class:`~.DefaultSynthesisClifford`
51
+ - all-to-all
52
+ - usually best for optimizing CX-count (and optimal CX-count for `n=2,3`)
53
+
54
+ .. autosummary::
55
+ :toctree: ../stubs/
56
+
57
+ AGSynthesisClifford
58
+ BMSynthesisClifford
59
+ GreedySynthesisClifford
60
+ LayerSynthesisClifford
61
+ LayerLnnSynthesisClifford
62
+ DefaultSynthesisClifford
63
+
64
+
65
+ Linear Function Synthesis
66
+ '''''''''''''''''''''''''
67
+
68
+ .. list-table:: Plugins for :class:`.LinearFunction` (key = ``"linear"``)
69
+ :header-rows: 1
70
+
71
+ * - Plugin name
72
+ - Plugin class
73
+ - Targeted connectivity
74
+ - Description
75
+ * - ``"kms"``
76
+ - :class:`~.KMSSynthesisLinearFunction`
77
+ - linear
78
+ - many CX-gates but guarantees CX-depth of at most `5*n`
79
+ * - ``"pmh"``
80
+ - :class:`~.PMHSynthesisLinearFunction`
81
+ - all-to-all
82
+ - greedily optimizes CX-count; used in ``"default"``
83
+ * - ``"default"``
84
+ - :class:`~.DefaultSynthesisLinearFunction`
85
+ - all-to-all
86
+ - best for optimizing CX-count
87
+
88
+ .. autosummary::
89
+ :toctree: ../stubs/
90
+
91
+ KMSSynthesisLinearFunction
92
+ PMHSynthesisLinearFunction
93
+ DefaultSynthesisLinearFunction
94
+
95
+
96
+ Permutation Synthesis
97
+ '''''''''''''''''''''
98
+
99
+ .. list-table:: Plugins for :class:`.PermutationGate` (key = ``"permutation"``)
100
+ :header-rows: 1
101
+
102
+ * - Plugin name
103
+ - Plugin class
104
+ - Targeted connectivity
105
+ - Description
106
+ * - ``"basic"``
107
+ - :class:`~.BasicSynthesisPermutation`
108
+ - all-to-all
109
+ - optimal SWAP-count; used in ``"default"``
110
+ * - ``"acg"``
111
+ - :class:`~.ACGSynthesisPermutation`
112
+ - all-to-all
113
+ - guarantees SWAP-depth of at most `2`
114
+ * - ``"kms"``
115
+ - :class:`~.KMSSynthesisPermutation`
116
+ - linear
117
+ - many SWAP-gates, but guarantees SWAP-depth of at most `n`
118
+ * - ``"token_swapper"``
119
+ - :class:`~.TokenSwapperSynthesisPermutation`
120
+ - any
121
+ - greedily optimizes SWAP-count for arbitrary connectivity
122
+ * - ``"default"``
123
+ - :class:`~.BasicSynthesisPermutation`
124
+ - all-to-all
125
+ - best for optimizing SWAP-count
126
+
127
+ .. autosummary::
128
+ :toctree: ../stubs/
129
+
130
+ BasicSynthesisPermutation
131
+ ACGSynthesisPermutation
132
+ KMSSynthesisPermutation
133
+ TokenSwapperSynthesisPermutation
134
+
135
+
136
+ QFT Synthesis
137
+ '''''''''''''
138
+
139
+ .. list-table:: Plugins for :class:`.QFTGate` (key = ``"qft"``)
140
+ :header-rows: 1
141
+
142
+ * - Plugin name
143
+ - Plugin class
144
+ - Targeted connectivity
145
+ * - ``"full"``
146
+ - :class:`~.QFTSynthesisFull`
147
+ - all-to-all
148
+ * - ``"line"``
149
+ - :class:`~.QFTSynthesisLine`
150
+ - linear
151
+ * - ``"default"``
152
+ - :class:`~.QFTSynthesisFull`
153
+ - all-to-all
154
+
155
+ .. autosummary::
156
+ :toctree: ../stubs/
157
+
158
+ QFTSynthesisFull
159
+ QFTSynthesisLine
160
+
161
+
162
+ MCX Synthesis
163
+ '''''''''''''
164
+
165
+ The following table lists synthesis plugins available for an :class:`.MCXGate` gate
166
+ with `k` control qubits. If the available number of clean/dirty auxiliary qubits is
167
+ not sufficient, the corresponding synthesis method will return `None`.
168
+
169
+ .. list-table:: Plugins for :class:`.MCXGate` (key = ``"mcx"``)
170
+ :header-rows: 1
171
+
172
+ * - Plugin name
173
+ - Plugin class
174
+ - Number of clean ancillas
175
+ - Number of dirty ancillas
176
+ - Description
177
+ * - ``"gray_code"``
178
+ - :class:`~.MCXSynthesisGrayCode`
179
+ - `0`
180
+ - `0`
181
+ - exponentially many CX gates; use only for small values of `k`
182
+ * - ``"noaux_v24"``
183
+ - :class:`~.MCXSynthesisNoAuxV24`
184
+ - `0`
185
+ - `0`
186
+ - quadratic number of CX gates; use instead of ``"gray_code"`` for large values of `k`
187
+ * - ``"n_clean_m15"``
188
+ - :class:`~.MCXSynthesisNCleanM15`
189
+ - `k-2`
190
+ - `0`
191
+ - at most `6*k-6` CX gates
192
+ * - ``"n_dirty_i15"``
193
+ - :class:`~.MCXSynthesisNDirtyI15`
194
+ - `0`
195
+ - `k-2`
196
+ - at most `8*k-6` CX gates
197
+ * - ``"1_clean_b95"``
198
+ - :class:`~.MCXSynthesis1CleanB95`
199
+ - `1`
200
+ - `0`
201
+ - at most `16*k-8` CX gates
202
+ * - ``"default"``
203
+ - :class:`~.MCXSynthesisDefault`
204
+ - any
205
+ - any
206
+ - chooses the best algorithm based on the ancillas available
207
+
208
+ .. autosummary::
209
+ :toctree: ../stubs/
210
+
211
+ MCXSynthesisGrayCode
212
+ MCXSynthesisNoAuxV24
213
+ MCXSynthesisNCleanM15
214
+ MCXSynthesisNDirtyI15
215
+ MCXSynthesis1CleanB95
216
+ MCXSynthesisDefault
217
+ """
218
+
219
+ import numpy as np
220
+ import rustworkx as rx
221
+
222
+ from qiskit.circuit.quantumcircuit import QuantumCircuit
223
+ from qiskit.circuit.library import LinearFunction, QFTGate, MCXGate, C3XGate, C4XGate
224
+ from qiskit.transpiler.exceptions import TranspilerError
225
+ from qiskit.transpiler.coupling import CouplingMap
226
+
227
+ from qiskit.synthesis.clifford import (
228
+ synth_clifford_full,
229
+ synth_clifford_layers,
230
+ synth_clifford_depth_lnn,
231
+ synth_clifford_greedy,
232
+ synth_clifford_ag,
233
+ synth_clifford_bm,
234
+ )
235
+ from qiskit.synthesis.linear import (
236
+ synth_cnot_count_full_pmh,
237
+ synth_cnot_depth_line_kms,
238
+ calc_inverse_matrix,
239
+ )
240
+ from qiskit.synthesis.linear.linear_circuits_utils import transpose_cx_circ
241
+ from qiskit.synthesis.permutation import (
242
+ synth_permutation_basic,
243
+ synth_permutation_acg,
244
+ synth_permutation_depth_lnn_kms,
245
+ )
246
+ from qiskit.synthesis.qft import (
247
+ synth_qft_full,
248
+ synth_qft_line,
249
+ )
250
+ from qiskit.synthesis.multi_controlled import (
251
+ synth_mcx_n_dirty_i15,
252
+ synth_mcx_n_clean_m15,
253
+ synth_mcx_1_clean_b95,
254
+ synth_mcx_gray_code,
255
+ synth_mcx_noaux_v24,
256
+ )
257
+ from qiskit.transpiler.passes.routing.algorithms import ApproximateTokenSwapper
258
+ from .plugin import HighLevelSynthesisPlugin
259
+
260
+
261
+ class DefaultSynthesisClifford(HighLevelSynthesisPlugin):
262
+ """The default clifford synthesis plugin.
263
+
264
+ For N <= 3 qubits this is the optimal CX cost decomposition by Bravyi, Maslov.
265
+ For N > 3 qubits this is done using the general non-optimal greedy compilation
266
+ routine from reference by Bravyi, Hu, Maslov, Shaydulin.
267
+
268
+ This plugin name is :``clifford.default`` which can be used as the key on
269
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
270
+ """
271
+
272
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
273
+ """Run synthesis for the given Clifford."""
274
+ decomposition = synth_clifford_full(high_level_object)
275
+ return decomposition
276
+
277
+
278
+ class AGSynthesisClifford(HighLevelSynthesisPlugin):
279
+ """Clifford synthesis plugin based on the Aaronson-Gottesman method.
280
+
281
+ This plugin name is :``clifford.ag`` which can be used as the key on
282
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
283
+ """
284
+
285
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
286
+ """Run synthesis for the given Clifford."""
287
+ decomposition = synth_clifford_ag(high_level_object)
288
+ return decomposition
289
+
290
+
291
+ class BMSynthesisClifford(HighLevelSynthesisPlugin):
292
+ """Clifford synthesis plugin based on the Bravyi-Maslov method.
293
+
294
+ The method only works on Cliffords with at most 3 qubits, for which it
295
+ constructs the optimal CX cost decomposition.
296
+
297
+ This plugin name is :``clifford.bm`` which can be used as the key on
298
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
299
+ """
300
+
301
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
302
+ """Run synthesis for the given Clifford."""
303
+ if high_level_object.num_qubits <= 3:
304
+ decomposition = synth_clifford_bm(high_level_object)
305
+ else:
306
+ decomposition = None
307
+ return decomposition
308
+
309
+
310
+ class GreedySynthesisClifford(HighLevelSynthesisPlugin):
311
+ """Clifford synthesis plugin based on the greedy synthesis
312
+ Bravyi-Hu-Maslov-Shaydulin method.
313
+
314
+ This plugin name is :``clifford.greedy`` which can be used as the key on
315
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
316
+ """
317
+
318
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
319
+ """Run synthesis for the given Clifford."""
320
+ decomposition = synth_clifford_greedy(high_level_object)
321
+ return decomposition
322
+
323
+
324
+ class LayerSynthesisClifford(HighLevelSynthesisPlugin):
325
+ """Clifford synthesis plugin based on the Bravyi-Maslov method
326
+ to synthesize Cliffords into layers.
327
+
328
+ This plugin name is :``clifford.layers`` which can be used as the key on
329
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
330
+ """
331
+
332
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
333
+ """Run synthesis for the given Clifford."""
334
+ decomposition = synth_clifford_layers(high_level_object)
335
+ return decomposition
336
+
337
+
338
+ class LayerLnnSynthesisClifford(HighLevelSynthesisPlugin):
339
+ """Clifford synthesis plugin based on the Bravyi-Maslov method
340
+ to synthesize Cliffords into layers, with each layer synthesized
341
+ adhering to LNN connectivity.
342
+
343
+ This plugin name is :``clifford.lnn`` which can be used as the key on
344
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
345
+ """
346
+
347
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
348
+ """Run synthesis for the given Clifford."""
349
+ decomposition = synth_clifford_depth_lnn(high_level_object)
350
+ return decomposition
351
+
352
+
353
+ class DefaultSynthesisLinearFunction(HighLevelSynthesisPlugin):
354
+ """The default linear function synthesis plugin.
355
+
356
+ This plugin name is :``linear_function.default`` which can be used as the key on
357
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
358
+ """
359
+
360
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
361
+ """Run synthesis for the given LinearFunction."""
362
+ decomposition = synth_cnot_count_full_pmh(high_level_object.linear)
363
+ return decomposition
364
+
365
+
366
+ class KMSSynthesisLinearFunction(HighLevelSynthesisPlugin):
367
+ """Linear function synthesis plugin based on the Kutin-Moulton-Smithline method.
368
+
369
+ This plugin name is :``linear_function.kms`` which can be used as the key on
370
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
371
+
372
+ The plugin supports the following plugin-specific options:
373
+
374
+ * use_inverted: Indicates whether to run the algorithm on the inverse matrix
375
+ and to invert the synthesized circuit.
376
+ In certain cases this provides a better decomposition than the direct approach.
377
+ * use_transposed: Indicates whether to run the algorithm on the transposed matrix
378
+ and to invert the order of CX gates in the synthesized circuit.
379
+ In certain cases this provides a better decomposition than the direct approach.
380
+
381
+ """
382
+
383
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
384
+ """Run synthesis for the given LinearFunction."""
385
+
386
+ if not isinstance(high_level_object, LinearFunction):
387
+ raise TranspilerError(
388
+ "PMHSynthesisLinearFunction only accepts objects of type LinearFunction"
389
+ )
390
+
391
+ use_inverted = options.get("use_inverted", False)
392
+ use_transposed = options.get("use_transposed", False)
393
+
394
+ mat = high_level_object.linear.astype(bool, copy=False)
395
+
396
+ if use_transposed:
397
+ mat = np.transpose(mat)
398
+ if use_inverted:
399
+ mat = calc_inverse_matrix(mat)
400
+
401
+ decomposition = synth_cnot_depth_line_kms(mat)
402
+
403
+ if use_transposed:
404
+ decomposition = transpose_cx_circ(decomposition)
405
+ if use_inverted:
406
+ decomposition = decomposition.inverse()
407
+
408
+ return decomposition
409
+
410
+
411
+ class PMHSynthesisLinearFunction(HighLevelSynthesisPlugin):
412
+ """Linear function synthesis plugin based on the Patel-Markov-Hayes method.
413
+
414
+ This plugin name is :``linear_function.pmh`` which can be used as the key on
415
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
416
+
417
+ The plugin supports the following plugin-specific options:
418
+
419
+ * section size: The size of each section used in the Patel–Markov–Hayes algorithm [1].
420
+ * use_inverted: Indicates whether to run the algorithm on the inverse matrix
421
+ and to invert the synthesized circuit.
422
+ In certain cases this provides a better decomposition than the direct approach.
423
+ * use_transposed: Indicates whether to run the algorithm on the transposed matrix
424
+ and to invert the order of CX gates in the synthesized circuit.
425
+ In certain cases this provides a better decomposition than the direct approach.
426
+
427
+ References:
428
+ 1. Patel, Ketan N., Igor L. Markov, and John P. Hayes,
429
+ *Optimal synthesis of linear reversible circuits*,
430
+ Quantum Information & Computation 8.3 (2008): 282-294.
431
+ `arXiv:quant-ph/0302002 [quant-ph] <https://arxiv.org/abs/quant-ph/0302002>`_
432
+ """
433
+
434
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
435
+ """Run synthesis for the given LinearFunction."""
436
+
437
+ if not isinstance(high_level_object, LinearFunction):
438
+ raise TranspilerError(
439
+ "PMHSynthesisLinearFunction only accepts objects of type LinearFunction"
440
+ )
441
+
442
+ section_size = options.get("section_size", 2)
443
+ use_inverted = options.get("use_inverted", False)
444
+ use_transposed = options.get("use_transposed", False)
445
+
446
+ mat = high_level_object.linear.astype(bool, copy=False)
447
+
448
+ if use_transposed:
449
+ mat = np.transpose(mat)
450
+ if use_inverted:
451
+ mat = calc_inverse_matrix(mat)
452
+
453
+ decomposition = synth_cnot_count_full_pmh(mat, section_size=section_size)
454
+
455
+ if use_transposed:
456
+ decomposition = transpose_cx_circ(decomposition)
457
+ if use_inverted:
458
+ decomposition = decomposition.inverse()
459
+
460
+ return decomposition
461
+
462
+
463
+ class KMSSynthesisPermutation(HighLevelSynthesisPlugin):
464
+ """The permutation synthesis plugin based on the Kutin, Moulton, Smithline method.
465
+
466
+ This plugin name is :``permutation.kms`` which can be used as the key on
467
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
468
+ """
469
+
470
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
471
+ """Run synthesis for the given Permutation."""
472
+ decomposition = synth_permutation_depth_lnn_kms(high_level_object.pattern)
473
+ return decomposition
474
+
475
+
476
+ class BasicSynthesisPermutation(HighLevelSynthesisPlugin):
477
+ """The permutation synthesis plugin based on sorting.
478
+
479
+ This plugin name is :``permutation.basic`` which can be used as the key on
480
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
481
+ """
482
+
483
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
484
+ """Run synthesis for the given Permutation."""
485
+ decomposition = synth_permutation_basic(high_level_object.pattern)
486
+ return decomposition
487
+
488
+
489
+ class ACGSynthesisPermutation(HighLevelSynthesisPlugin):
490
+ """The permutation synthesis plugin based on the Alon, Chung, Graham method.
491
+
492
+ This plugin name is :``permutation.acg`` which can be used as the key on
493
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
494
+ """
495
+
496
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
497
+ """Run synthesis for the given Permutation."""
498
+ decomposition = synth_permutation_acg(high_level_object.pattern)
499
+ return decomposition
500
+
501
+
502
+ class QFTSynthesisFull(HighLevelSynthesisPlugin):
503
+ """Synthesis plugin for QFT gates using all-to-all connectivity.
504
+
505
+ This plugin name is :``qft.full`` which can be used as the key on
506
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
507
+
508
+ The plugin supports the following additional options:
509
+
510
+ * reverse_qubits (bool): Whether to synthesize the "QFT" operation (if ``False``,
511
+ which is the default) or the "QFT-with-reversal" operation (if ``True``).
512
+ Some implementation of the ``QFTGate`` include a layer of swap gates at the end
513
+ of the synthesized circuit, which can in principle be dropped if the ``QFTGate``
514
+ itself is the last gate in the circuit.
515
+ * approximation_degree (int): The degree of approximation (0 for no approximation).
516
+ It is possible to implement the QFT approximately by ignoring
517
+ controlled-phase rotations with the angle beneath a threshold. This is discussed
518
+ in more detail in [1] or [2].
519
+ * insert_barriers (bool): If True, barriers are inserted as visualization improvement.
520
+ * inverse (bool): If True, the inverse Fourier transform is constructed.
521
+ * name (str): The name of the circuit.
522
+
523
+ References:
524
+ 1. Adriano Barenco, Artur Ekert, Kalle-Antti Suominen, and Päivi Törmä,
525
+ *Approximate Quantum Fourier Transform and Decoherence*,
526
+ Physical Review A (1996).
527
+ `arXiv:quant-ph/9601018 [quant-ph] <https://arxiv.org/abs/quant-ph/9601018>`_
528
+ 2. Donny Cheung,
529
+ *Improved Bounds for the Approximate QFT* (2004),
530
+ `arXiv:quant-ph/0403071 [quant-ph] <https://https://arxiv.org/abs/quant-ph/0403071>`_
531
+ """
532
+
533
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
534
+ """Run synthesis for the given QFTGate."""
535
+ if not isinstance(high_level_object, QFTGate):
536
+ raise TranspilerError(
537
+ "The synthesis plugin 'qft.full` only applies to objects of type QFTGate."
538
+ )
539
+
540
+ reverse_qubits = options.get("reverse_qubits", False)
541
+ approximation_degree = options.get("approximation_degree", 0)
542
+ insert_barriers = options.get("insert_barriers", False)
543
+ inverse = options.get("inverse", False)
544
+ name = options.get("name", None)
545
+
546
+ decomposition = synth_qft_full(
547
+ num_qubits=high_level_object.num_qubits,
548
+ do_swaps=not reverse_qubits,
549
+ approximation_degree=approximation_degree,
550
+ insert_barriers=insert_barriers,
551
+ inverse=inverse,
552
+ name=name,
553
+ )
554
+ return decomposition
555
+
556
+
557
+ class QFTSynthesisLine(HighLevelSynthesisPlugin):
558
+ """Synthesis plugin for QFT gates using linear connectivity.
559
+
560
+ This plugin name is :``qft.line`` which can be used as the key on
561
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
562
+
563
+ The plugin supports the following additional options:
564
+
565
+ * reverse_qubits (bool): Whether to synthesize the "QFT" operation (if ``False``,
566
+ which is the default) or the "QFT-with-reversal" operation (if ``True``).
567
+ Some implementation of the ``QFTGate`` include a layer of swap gates at the end
568
+ of the synthesized circuit, which can in principle be dropped if the ``QFTGate``
569
+ itself is the last gate in the circuit.
570
+ * approximation_degree (int): the degree of approximation (0 for no approximation).
571
+ It is possible to implement the QFT approximately by ignoring
572
+ controlled-phase rotations with the angle beneath a threshold. This is discussed
573
+ in more detail in [1] or [2].
574
+
575
+ References:
576
+ 1. Adriano Barenco, Artur Ekert, Kalle-Antti Suominen, and Päivi Törmä,
577
+ *Approximate Quantum Fourier Transform and Decoherence*,
578
+ Physical Review A (1996).
579
+ `arXiv:quant-ph/9601018 [quant-ph] <https://arxiv.org/abs/quant-ph/9601018>`_
580
+ 2. Donny Cheung,
581
+ *Improved Bounds for the Approximate QFT* (2004),
582
+ `arXiv:quant-ph/0403071 [quant-ph] <https://https://arxiv.org/abs/quant-ph/0403071>`_
583
+ """
584
+
585
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
586
+ """Run synthesis for the given QFTGate."""
587
+ if not isinstance(high_level_object, QFTGate):
588
+ raise TranspilerError(
589
+ "The synthesis plugin 'qft.line` only applies to objects of type QFTGate."
590
+ )
591
+
592
+ reverse_qubits = options.get("reverse_qubits", False)
593
+ approximation_degree = options.get("approximation_degree", 0)
594
+
595
+ decomposition = synth_qft_line(
596
+ num_qubits=high_level_object.num_qubits,
597
+ do_swaps=not reverse_qubits,
598
+ approximation_degree=approximation_degree,
599
+ )
600
+ return decomposition
601
+
602
+
603
+ class TokenSwapperSynthesisPermutation(HighLevelSynthesisPlugin):
604
+ """The permutation synthesis plugin based on the token swapper algorithm.
605
+
606
+ This plugin name is :``permutation.token_swapper`` which can be used as the key on
607
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
608
+
609
+ In more detail, this plugin is used to synthesize objects of type `PermutationGate`.
610
+ When synthesis succeeds, the plugin outputs a quantum circuit consisting only of swap
611
+ gates. When synthesis does not succeed, the plugin outputs `None`.
612
+
613
+ If either `coupling_map` or `qubits` is None, then the synthesized circuit
614
+ is not required to adhere to connectivity constraints, as is the case
615
+ when the synthesis is done before layout/routing.
616
+
617
+ On the other hand, if both `coupling_map` and `qubits` are specified, the synthesized
618
+ circuit is supposed to adhere to connectivity constraints. At the moment, the
619
+ plugin only creates swap gates between qubits in `qubits`, i.e. it does not use
620
+ any other qubits in the coupling map (if such synthesis is not possible, the
621
+ plugin outputs `None`).
622
+
623
+ The plugin supports the following plugin-specific options:
624
+
625
+ * trials: The number of trials for the token swapper to perform the mapping. The
626
+ circuit with the smallest number of SWAPs is returned.
627
+ * seed: The argument to the token swapper specifying the seed for random trials.
628
+ * parallel_threshold: The argument to the token swapper specifying the number of nodes
629
+ in the graph beyond which the algorithm will use parallel processing.
630
+
631
+ For more details on the token swapper algorithm, see to the paper:
632
+ `arXiv:1902.09102 <https://arxiv.org/abs/1902.09102>`__.
633
+ """
634
+
635
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
636
+ """Run synthesis for the given Permutation."""
637
+
638
+ trials = options.get("trials", 5)
639
+ seed = options.get("seed", 0)
640
+ parallel_threshold = options.get("parallel_threshold", 50)
641
+
642
+ pattern = high_level_object.pattern
643
+ pattern_as_dict = {j: i for i, j in enumerate(pattern)}
644
+
645
+ # When the plugin is called from the HighLevelSynthesis transpiler pass,
646
+ # the coupling map already takes target into account.
647
+ if coupling_map is None or qubits is None:
648
+ # The abstract synthesis uses a fully connected coupling map, allowing
649
+ # arbitrary connections between qubits.
650
+ used_coupling_map = CouplingMap.from_full(len(pattern))
651
+ else:
652
+ # The concrete synthesis uses the coupling map restricted to the set of
653
+ # qubits over which the permutation gate is defined. If we allow using other
654
+ # qubits in the coupling map, replacing the node in the DAGCircuit that
655
+ # defines this PermutationGate by the DAG corresponding to the constructed
656
+ # decomposition becomes problematic. Note that we allow the reduced
657
+ # coupling map to be disconnected.
658
+ used_coupling_map = coupling_map.reduce(qubits, check_if_connected=False)
659
+
660
+ graph = used_coupling_map.graph.to_undirected()
661
+ swapper = ApproximateTokenSwapper(graph, seed=seed)
662
+
663
+ try:
664
+ swapper_result = swapper.map(
665
+ pattern_as_dict, trials, parallel_threshold=parallel_threshold
666
+ )
667
+ except rx.InvalidMapping:
668
+ swapper_result = None
669
+
670
+ if swapper_result is not None:
671
+ decomposition = QuantumCircuit(len(graph.node_indices()))
672
+ for swap in swapper_result:
673
+ decomposition.swap(*swap)
674
+ return decomposition
675
+
676
+ return None
677
+
678
+
679
+ class MCXSynthesisNDirtyI15(HighLevelSynthesisPlugin):
680
+ r"""Synthesis plugin for a multi-controlled X gate based on the paper
681
+ by Iten et al. (2016).
682
+
683
+ See [1] for details.
684
+
685
+ This plugin name is :``mcx.n_dirty_i15`` which can be used as the key on
686
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
687
+
688
+ For a multi-controlled X gate with :math:`k\ge 3` control qubits this synthesis
689
+ method requires :math:`k - 2` additional dirty auxiliary qubits. The synthesized
690
+ circuit consists of :math:`2 * k - 1` qubits and at most :math:`8 * k - 6` CX gates.
691
+
692
+ The plugin supports the following plugin-specific options:
693
+
694
+ * num_clean_ancillas: The number of clean auxiliary qubits available.
695
+ * num_dirty_ancillas: The number of dirty auxiliary qubits available.
696
+ * relative_phase: When set to ``True``, the method applies the optimized multi-controlled
697
+ X gate up to a relative phase, in a way that, by lemma 8 of [1], the relative
698
+ phases of the ``action part`` cancel out with the phases of the ``reset part``.
699
+ * action_only: when set to ``True``, the method applies only the ``action part``
700
+ of lemma 8 of [1].
701
+
702
+ References:
703
+ 1. Iten et. al., *Quantum Circuits for Isometries*, Phys. Rev. A 93, 032318 (2016),
704
+ `arXiv:1501.06911 <http://arxiv.org/abs/1501.06911>`_
705
+ """
706
+
707
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
708
+ """Run synthesis for the given MCX gate."""
709
+
710
+ if not isinstance(high_level_object, (MCXGate, C3XGate, C4XGate)):
711
+ # Unfortunately we occasionally have custom instructions called "mcx"
712
+ # which get wrongly caught by the plugin interface. A simple solution is
713
+ # to return None in this case, since HLS would proceed to examine
714
+ # their definition as it should.
715
+ return None
716
+
717
+ num_ctrl_qubits = high_level_object.num_ctrl_qubits
718
+ num_clean_ancillas = options.get("num_clean_ancillas", 0)
719
+ num_dirty_ancillas = options.get("num_dirty_ancillas", 0)
720
+ relative_phase = options.get("relative_phase", False)
721
+ action_only = options.get("actions_only", False)
722
+
723
+ if num_ctrl_qubits >= 3 and num_dirty_ancillas + num_clean_ancillas < num_ctrl_qubits - 2:
724
+ # This synthesis method is not applicable as there are not enough ancilla qubits
725
+ return None
726
+
727
+ decomposition = synth_mcx_n_dirty_i15(num_ctrl_qubits, relative_phase, action_only)
728
+ return decomposition
729
+
730
+
731
+ class MCXSynthesisNCleanM15(HighLevelSynthesisPlugin):
732
+ r"""Synthesis plugin for a multi-controlled X gate based on the paper by
733
+ Maslov (2016).
734
+
735
+ See [1] for details.
736
+
737
+ This plugin name is :``mcx.n_clean_m15`` which can be used as the key on
738
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
739
+
740
+ For a multi-controlled X gate with :math:`k\ge 3` control qubits this synthesis
741
+ method requires :math:`k - 2` additional clean auxiliary qubits. The synthesized
742
+ circuit consists of :math:`2 * k - 1` qubits and at most :math:`6 * k - 6` CX gates.
743
+
744
+ The plugin supports the following plugin-specific options:
745
+
746
+ * num_clean_ancillas: The number of clean auxiliary qubits available.
747
+
748
+ References:
749
+ 1. Maslov., Phys. Rev. A 93, 022311 (2016),
750
+ `arXiv:1508.03273 <https://arxiv.org/pdf/1508.03273>`_
751
+ """
752
+
753
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
754
+ """Run synthesis for the given MCX gate."""
755
+
756
+ if not isinstance(high_level_object, (MCXGate, C3XGate, C4XGate)):
757
+ # Unfortunately we occasionally have custom instructions called "mcx"
758
+ # which get wrongly caught by the plugin interface. A simple solution is
759
+ # to return None in this case, since HLS would proceed to examine
760
+ # their definition as it should.
761
+ return None
762
+
763
+ num_ctrl_qubits = high_level_object.num_ctrl_qubits
764
+ num_clean_ancillas = options.get("num_clean_ancillas", 0)
765
+
766
+ if num_ctrl_qubits >= 3 and num_clean_ancillas < num_ctrl_qubits - 2:
767
+ # This synthesis method is not applicable as there are not enough ancilla qubits
768
+ return None
769
+
770
+ decomposition = synth_mcx_n_clean_m15(num_ctrl_qubits)
771
+ return decomposition
772
+
773
+
774
+ class MCXSynthesis1CleanB95(HighLevelSynthesisPlugin):
775
+ r"""Synthesis plugin for a multi-controlled X gate based on the paper by
776
+ Barenco et al. (1995).
777
+
778
+ See [1] for details.
779
+
780
+ This plugin name is :``mcx.1_clean_b95`` which can be used as the key on
781
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
782
+
783
+ For a multi-controlled X gate with :math:`k\ge 5` control qubits this synthesis
784
+ method requires a single additional clean auxiliary qubit. The synthesized
785
+ circuit consists of :math:`k + 2` qubits and at most :math:`16 * k - 8` CX gates.
786
+
787
+ The plugin supports the following plugin-specific options:
788
+
789
+ * num_clean_ancillas: The number of clean auxiliary qubits available.
790
+
791
+ References:
792
+ 1. Barenco et. al., Phys.Rev. A52 3457 (1995),
793
+ `arXiv:quant-ph/9503016 <https://arxiv.org/abs/quant-ph/9503016>`_
794
+ """
795
+
796
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
797
+ """Run synthesis for the given MCX gate."""
798
+
799
+ if not isinstance(high_level_object, (MCXGate, C3XGate, C4XGate)):
800
+ # Unfortunately we occasionally have custom instructions called "mcx"
801
+ # which get wrongly caught by the plugin interface. A simple solution is
802
+ # to return None in this case, since HLS would proceed to examine
803
+ # their definition as it should.
804
+ return None
805
+
806
+ num_ctrl_qubits = high_level_object.num_ctrl_qubits
807
+
808
+ if num_ctrl_qubits <= 2:
809
+ # The method requires at least 3 control qubits
810
+ return None
811
+
812
+ num_clean_ancillas = options.get("num_clean_ancillas", 0)
813
+
814
+ if num_ctrl_qubits >= 5 and num_clean_ancillas == 0:
815
+ # This synthesis method is not applicable as there are not enough ancilla qubits
816
+ return None
817
+
818
+ decomposition = synth_mcx_1_clean_b95(num_ctrl_qubits)
819
+ return decomposition
820
+
821
+
822
+ class MCXSynthesisGrayCode(HighLevelSynthesisPlugin):
823
+ r"""Synthesis plugin for a multi-controlled X gate based on the Gray code.
824
+
825
+ This plugin name is :``mcx.gray_code`` which can be used as the key on
826
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
827
+
828
+ For a multi-controlled X gate with :math:`k` control qubits this synthesis
829
+ method requires no additional clean auxiliary qubits. The synthesized
830
+ circuit consists of :math:`k + 1` qubits.
831
+
832
+ It is not recommended to use this method for large values of :math:`k + 1`
833
+ as it produces exponentially many gates.
834
+ """
835
+
836
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
837
+ """Run synthesis for the given MCX gate."""
838
+
839
+ if not isinstance(high_level_object, (MCXGate, C3XGate, C4XGate)):
840
+ # Unfortunately we occasionally have custom instructions called "mcx"
841
+ # which get wrongly caught by the plugin interface. A simple solution is
842
+ # to return None in this case, since HLS would proceed to examine
843
+ # their definition as it should.
844
+ return None
845
+
846
+ num_ctrl_qubits = high_level_object.num_ctrl_qubits
847
+ decomposition = synth_mcx_gray_code(num_ctrl_qubits)
848
+ return decomposition
849
+
850
+
851
+ class MCXSynthesisNoAuxV24(HighLevelSynthesisPlugin):
852
+ r"""Synthesis plugin for a multi-controlled X gate based on the
853
+ implementation for MCPhaseGate, which is in turn based on the
854
+ paper by Vale et al. (2024).
855
+
856
+ See [1] for details.
857
+
858
+ This plugin name is :``mcx.noaux_v24`` which can be used as the key on
859
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
860
+
861
+ For a multi-controlled X gate with :math:`k` control qubits this synthesis
862
+ method requires no additional clean auxiliary qubits. The synthesized
863
+ circuit consists of :math:`k + 1` qubits.
864
+
865
+ References:
866
+ 1. Vale et. al., *Circuit Decomposition of Multicontrolled Special Unitary
867
+ Single-Qubit Gates*, IEEE TCAD 43(3) (2024),
868
+ `arXiv:2302.06377 <https://arxiv.org/abs/2302.06377>`_
869
+ """
870
+
871
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
872
+ """Run synthesis for the given MCX gate."""
873
+
874
+ if not isinstance(high_level_object, (MCXGate, C3XGate, C4XGate)):
875
+ # Unfortunately we occasionally have custom instructions called "mcx"
876
+ # which get wrongly caught by the plugin interface. A simple solution is
877
+ # to return None in this case, since HLS would proceed to examine
878
+ # their definition as it should.
879
+ return None
880
+
881
+ num_ctrl_qubits = high_level_object.num_ctrl_qubits
882
+ decomposition = synth_mcx_noaux_v24(num_ctrl_qubits)
883
+ return decomposition
884
+
885
+
886
+ class MCXSynthesisDefault(HighLevelSynthesisPlugin):
887
+ r"""The default synthesis plugin for a multi-controlled X gate.
888
+
889
+ This plugin name is :``mcx.default`` which can be used as the key on
890
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
891
+ """
892
+
893
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
894
+ """Run synthesis for the given MCX gate."""
895
+
896
+ if not isinstance(high_level_object, (MCXGate, C3XGate, C4XGate)):
897
+ # Unfortunately we occasionally have custom instructions called "mcx"
898
+ # which get wrongly caught by the plugin interface. A simple solution is
899
+ # to return None in this case, since HLS would proceed to examine
900
+ # their definition as it should.
901
+ return None
902
+
903
+ # Iteratively run other synthesis methods available
904
+
905
+ if (
906
+ decomposition := MCXSynthesisNCleanM15().run(
907
+ high_level_object, coupling_map, target, qubits, **options
908
+ )
909
+ ) is not None:
910
+ return decomposition
911
+
912
+ if (
913
+ decomposition := MCXSynthesisNDirtyI15().run(
914
+ high_level_object, coupling_map, target, qubits, **options
915
+ )
916
+ ) is not None:
917
+ return decomposition
918
+
919
+ if (
920
+ decomposition := MCXSynthesis1CleanB95().run(
921
+ high_level_object, coupling_map, target, qubits, **options
922
+ )
923
+ ) is not None:
924
+ return decomposition
925
+
926
+ return MCXSynthesisNoAuxV24().run(
927
+ high_level_object, coupling_map, target, qubits, **options
928
+ )