qiskit 1.0.0b1__cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1095) hide show
  1. qiskit/VERSION.txt +1 -0
  2. qiskit/__init__.py +195 -0
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_qasm2.abi3.so +0 -0
  5. qiskit/assembler/__init__.py +47 -0
  6. qiskit/assembler/assemble_circuits.py +408 -0
  7. qiskit/assembler/assemble_schedules.py +372 -0
  8. qiskit/assembler/disassemble.py +318 -0
  9. qiskit/assembler/run_config.py +77 -0
  10. qiskit/circuit/__init__.py +425 -0
  11. qiskit/circuit/_classical_resource_map.py +144 -0
  12. qiskit/circuit/_utils.py +170 -0
  13. qiskit/circuit/add_control.py +274 -0
  14. qiskit/circuit/annotated_operation.py +188 -0
  15. qiskit/circuit/barrier.py +51 -0
  16. qiskit/circuit/bit.py +142 -0
  17. qiskit/circuit/classical/__init__.py +41 -0
  18. qiskit/circuit/classical/expr/__init__.py +218 -0
  19. qiskit/circuit/classical/expr/constructors.py +473 -0
  20. qiskit/circuit/classical/expr/expr.py +356 -0
  21. qiskit/circuit/classical/expr/visitors.py +280 -0
  22. qiskit/circuit/classical/types/__init__.py +108 -0
  23. qiskit/circuit/classical/types/ordering.py +222 -0
  24. qiskit/circuit/classical/types/types.py +117 -0
  25. qiskit/circuit/classicalfunction/__init__.py +131 -0
  26. qiskit/circuit/classicalfunction/boolean_expression.py +129 -0
  27. qiskit/circuit/classicalfunction/classical_element.py +54 -0
  28. qiskit/circuit/classicalfunction/classical_function_visitor.py +155 -0
  29. qiskit/circuit/classicalfunction/classicalfunction.py +173 -0
  30. qiskit/circuit/classicalfunction/exceptions.py +35 -0
  31. qiskit/circuit/classicalfunction/types.py +18 -0
  32. qiskit/circuit/classicalfunction/utils.py +91 -0
  33. qiskit/circuit/classicalregister.py +71 -0
  34. qiskit/circuit/commutation_checker.py +176 -0
  35. qiskit/circuit/controlflow/__init__.py +27 -0
  36. qiskit/circuit/controlflow/_builder_utils.py +199 -0
  37. qiskit/circuit/controlflow/break_loop.py +70 -0
  38. qiskit/circuit/controlflow/builder.py +651 -0
  39. qiskit/circuit/controlflow/continue_loop.py +72 -0
  40. qiskit/circuit/controlflow/control_flow.py +52 -0
  41. qiskit/circuit/controlflow/for_loop.py +232 -0
  42. qiskit/circuit/controlflow/if_else.py +517 -0
  43. qiskit/circuit/controlflow/switch_case.py +424 -0
  44. qiskit/circuit/controlflow/while_loop.py +177 -0
  45. qiskit/circuit/controlledgate.py +271 -0
  46. qiskit/circuit/delay.py +104 -0
  47. qiskit/circuit/duration.py +88 -0
  48. qiskit/circuit/equivalence.py +291 -0
  49. qiskit/circuit/equivalence_library.py +18 -0
  50. qiskit/circuit/exceptions.py +19 -0
  51. qiskit/circuit/gate.py +245 -0
  52. qiskit/circuit/instruction.py +655 -0
  53. qiskit/circuit/instructionset.py +191 -0
  54. qiskit/circuit/library/__init__.py +581 -0
  55. qiskit/circuit/library/arithmetic/__init__.py +27 -0
  56. qiskit/circuit/library/arithmetic/adders/__init__.py +17 -0
  57. qiskit/circuit/library/arithmetic/adders/adder.py +58 -0
  58. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +159 -0
  59. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +116 -0
  60. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +165 -0
  61. qiskit/circuit/library/arithmetic/exact_reciprocal.py +88 -0
  62. qiskit/circuit/library/arithmetic/functional_pauli_rotations.py +114 -0
  63. qiskit/circuit/library/arithmetic/integer_comparator.py +243 -0
  64. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +196 -0
  65. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +189 -0
  66. qiskit/circuit/library/arithmetic/multipliers/__init__.py +16 -0
  67. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +138 -0
  68. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +101 -0
  69. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +101 -0
  70. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +353 -0
  71. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +277 -0
  72. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +317 -0
  73. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +335 -0
  74. qiskit/circuit/library/arithmetic/quadratic_form.py +197 -0
  75. qiskit/circuit/library/arithmetic/weighted_adder.py +337 -0
  76. qiskit/circuit/library/basis_change/__init__.py +15 -0
  77. qiskit/circuit/library/basis_change/qft.py +289 -0
  78. qiskit/circuit/library/blueprintcircuit.py +186 -0
  79. qiskit/circuit/library/boolean_logic/__init__.py +18 -0
  80. qiskit/circuit/library/boolean_logic/inner_product.py +78 -0
  81. qiskit/circuit/library/boolean_logic/quantum_and.py +97 -0
  82. qiskit/circuit/library/boolean_logic/quantum_or.py +98 -0
  83. qiskit/circuit/library/boolean_logic/quantum_xor.py +71 -0
  84. qiskit/circuit/library/data_preparation/__init__.py +47 -0
  85. qiskit/circuit/library/data_preparation/initializer.py +96 -0
  86. qiskit/circuit/library/data_preparation/pauli_feature_map.py +296 -0
  87. qiskit/circuit/library/data_preparation/state_preparation.py +526 -0
  88. qiskit/circuit/library/data_preparation/z_feature_map.py +104 -0
  89. qiskit/circuit/library/data_preparation/zz_feature_map.py +114 -0
  90. qiskit/circuit/library/evolved_operator_ansatz.py +245 -0
  91. qiskit/circuit/library/fourier_checking.py +97 -0
  92. qiskit/circuit/library/generalized_gates/__init__.py +30 -0
  93. qiskit/circuit/library/generalized_gates/diagonal.py +164 -0
  94. qiskit/circuit/library/generalized_gates/gms.py +121 -0
  95. qiskit/circuit/library/generalized_gates/gr.py +215 -0
  96. qiskit/circuit/library/generalized_gates/isometry.py +573 -0
  97. qiskit/circuit/library/generalized_gates/linear_function.py +302 -0
  98. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +138 -0
  99. qiskit/circuit/library/generalized_gates/mcmt.py +254 -0
  100. qiskit/circuit/library/generalized_gates/pauli.py +85 -0
  101. qiskit/circuit/library/generalized_gates/permutation.py +190 -0
  102. qiskit/circuit/library/generalized_gates/rv.py +93 -0
  103. qiskit/circuit/library/generalized_gates/uc.py +304 -0
  104. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +164 -0
  105. qiskit/circuit/library/generalized_gates/ucrx.py +32 -0
  106. qiskit/circuit/library/generalized_gates/ucry.py +32 -0
  107. qiskit/circuit/library/generalized_gates/ucrz.py +32 -0
  108. qiskit/circuit/library/generalized_gates/unitary.py +198 -0
  109. qiskit/circuit/library/graph_state.py +86 -0
  110. qiskit/circuit/library/grover_operator.py +311 -0
  111. qiskit/circuit/library/hamiltonian_gate.py +146 -0
  112. qiskit/circuit/library/hidden_linear_function.py +98 -0
  113. qiskit/circuit/library/iqp.py +96 -0
  114. qiskit/circuit/library/n_local/__init__.py +31 -0
  115. qiskit/circuit/library/n_local/efficient_su2.py +162 -0
  116. qiskit/circuit/library/n_local/excitation_preserving.py +176 -0
  117. qiskit/circuit/library/n_local/n_local.py +1044 -0
  118. qiskit/circuit/library/n_local/pauli_two_design.py +131 -0
  119. qiskit/circuit/library/n_local/qaoa_ansatz.py +288 -0
  120. qiskit/circuit/library/n_local/real_amplitudes.py +189 -0
  121. qiskit/circuit/library/n_local/two_local.py +334 -0
  122. qiskit/circuit/library/overlap.py +111 -0
  123. qiskit/circuit/library/pauli_evolution.py +180 -0
  124. qiskit/circuit/library/phase_estimation.py +99 -0
  125. qiskit/circuit/library/phase_oracle.py +153 -0
  126. qiskit/circuit/library/quantum_volume.py +114 -0
  127. qiskit/circuit/library/standard_gates/__init__.py +116 -0
  128. qiskit/circuit/library/standard_gates/dcx.py +71 -0
  129. qiskit/circuit/library/standard_gates/ecr.py +114 -0
  130. qiskit/circuit/library/standard_gates/equivalence_library.py +1677 -0
  131. qiskit/circuit/library/standard_gates/global_phase.py +63 -0
  132. qiskit/circuit/library/standard_gates/h.py +224 -0
  133. qiskit/circuit/library/standard_gates/i.py +60 -0
  134. qiskit/circuit/library/standard_gates/iswap.py +129 -0
  135. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +390 -0
  136. qiskit/circuit/library/standard_gates/p.py +364 -0
  137. qiskit/circuit/library/standard_gates/r.py +101 -0
  138. qiskit/circuit/library/standard_gates/rx.py +246 -0
  139. qiskit/circuit/library/standard_gates/rxx.py +128 -0
  140. qiskit/circuit/library/standard_gates/ry.py +241 -0
  141. qiskit/circuit/library/standard_gates/ryy.py +128 -0
  142. qiskit/circuit/library/standard_gates/rz.py +261 -0
  143. qiskit/circuit/library/standard_gates/rzx.py +174 -0
  144. qiskit/circuit/library/standard_gates/rzz.py +141 -0
  145. qiskit/circuit/library/standard_gates/s.py +303 -0
  146. qiskit/circuit/library/standard_gates/swap.py +246 -0
  147. qiskit/circuit/library/standard_gates/sx.py +268 -0
  148. qiskit/circuit/library/standard_gates/t.py +150 -0
  149. qiskit/circuit/library/standard_gates/u.py +338 -0
  150. qiskit/circuit/library/standard_gates/u1.py +383 -0
  151. qiskit/circuit/library/standard_gates/u2.py +132 -0
  152. qiskit/circuit/library/standard_gates/u3.py +358 -0
  153. qiskit/circuit/library/standard_gates/x.py +1370 -0
  154. qiskit/circuit/library/standard_gates/xx_minus_yy.py +179 -0
  155. qiskit/circuit/library/standard_gates/xx_plus_yy.py +180 -0
  156. qiskit/circuit/library/standard_gates/y.py +221 -0
  157. qiskit/circuit/library/standard_gates/z.py +294 -0
  158. qiskit/circuit/library/templates/__init__.py +92 -0
  159. qiskit/circuit/library/templates/clifford/__init__.py +33 -0
  160. qiskit/circuit/library/templates/clifford/clifford_2_1.py +33 -0
  161. qiskit/circuit/library/templates/clifford/clifford_2_2.py +34 -0
  162. qiskit/circuit/library/templates/clifford/clifford_2_3.py +32 -0
  163. qiskit/circuit/library/templates/clifford/clifford_2_4.py +33 -0
  164. qiskit/circuit/library/templates/clifford/clifford_3_1.py +34 -0
  165. qiskit/circuit/library/templates/clifford/clifford_4_1.py +37 -0
  166. qiskit/circuit/library/templates/clifford/clifford_4_2.py +36 -0
  167. qiskit/circuit/library/templates/clifford/clifford_4_3.py +37 -0
  168. qiskit/circuit/library/templates/clifford/clifford_4_4.py +36 -0
  169. qiskit/circuit/library/templates/clifford/clifford_5_1.py +39 -0
  170. qiskit/circuit/library/templates/clifford/clifford_6_1.py +39 -0
  171. qiskit/circuit/library/templates/clifford/clifford_6_2.py +39 -0
  172. qiskit/circuit/library/templates/clifford/clifford_6_3.py +39 -0
  173. qiskit/circuit/library/templates/clifford/clifford_6_4.py +37 -0
  174. qiskit/circuit/library/templates/clifford/clifford_6_5.py +39 -0
  175. qiskit/circuit/library/templates/clifford/clifford_8_1.py +41 -0
  176. qiskit/circuit/library/templates/clifford/clifford_8_2.py +41 -0
  177. qiskit/circuit/library/templates/clifford/clifford_8_3.py +40 -0
  178. qiskit/circuit/library/templates/nct/__init__.py +67 -0
  179. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +32 -0
  180. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +33 -0
  181. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +35 -0
  182. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +41 -0
  183. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +39 -0
  184. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +37 -0
  185. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +39 -0
  186. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +37 -0
  187. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +38 -0
  188. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +38 -0
  189. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +38 -0
  190. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +37 -0
  191. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +38 -0
  192. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +39 -0
  193. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +39 -0
  194. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +39 -0
  195. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +39 -0
  196. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +39 -0
  197. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +39 -0
  198. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +41 -0
  199. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +41 -0
  200. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +41 -0
  201. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +41 -0
  202. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +41 -0
  203. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +43 -0
  204. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +41 -0
  205. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +42 -0
  206. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +42 -0
  207. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +42 -0
  208. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +42 -0
  209. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +42 -0
  210. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +42 -0
  211. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +42 -0
  212. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +42 -0
  213. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +42 -0
  214. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +42 -0
  215. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +42 -0
  216. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +41 -0
  217. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +42 -0
  218. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +42 -0
  219. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +42 -0
  220. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +42 -0
  221. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +42 -0
  222. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +42 -0
  223. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +42 -0
  224. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +42 -0
  225. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +42 -0
  226. qiskit/circuit/library/templates/rzx/__init__.py +25 -0
  227. qiskit/circuit/library/templates/rzx/rzx_cy.py +46 -0
  228. qiskit/circuit/library/templates/rzx/rzx_xz.py +53 -0
  229. qiskit/circuit/library/templates/rzx/rzx_yz.py +43 -0
  230. qiskit/circuit/library/templates/rzx/rzx_zz1.py +67 -0
  231. qiskit/circuit/library/templates/rzx/rzx_zz2.py +58 -0
  232. qiskit/circuit/library/templates/rzx/rzx_zz3.py +57 -0
  233. qiskit/circuit/measure.py +41 -0
  234. qiskit/circuit/operation.py +62 -0
  235. qiskit/circuit/parameter.py +160 -0
  236. qiskit/circuit/parameterexpression.py +515 -0
  237. qiskit/circuit/parametertable.py +263 -0
  238. qiskit/circuit/parametervector.py +114 -0
  239. qiskit/circuit/qpy_serialization.py +28 -0
  240. qiskit/circuit/quantumcircuit.py +6074 -0
  241. qiskit/circuit/quantumcircuitdata.py +138 -0
  242. qiskit/circuit/quantumregister.py +90 -0
  243. qiskit/circuit/random/__init__.py +15 -0
  244. qiskit/circuit/random/utils.py +209 -0
  245. qiskit/circuit/register.py +256 -0
  246. qiskit/circuit/reset.py +31 -0
  247. qiskit/circuit/singleton.py +604 -0
  248. qiskit/circuit/store.py +87 -0
  249. qiskit/circuit/tools/__init__.py +16 -0
  250. qiskit/circuit/tools/pi_check.py +190 -0
  251. qiskit/compiler/__init__.py +33 -0
  252. qiskit/compiler/assembler.py +597 -0
  253. qiskit/compiler/scheduler.py +107 -0
  254. qiskit/compiler/sequencer.py +69 -0
  255. qiskit/compiler/transpiler.py +613 -0
  256. qiskit/converters/__init__.py +59 -0
  257. qiskit/converters/circuit_to_dag.py +96 -0
  258. qiskit/converters/circuit_to_dagdependency.py +51 -0
  259. qiskit/converters/circuit_to_gate.py +109 -0
  260. qiskit/converters/circuit_to_instruction.py +131 -0
  261. qiskit/converters/dag_to_circuit.py +77 -0
  262. qiskit/converters/dag_to_dagdependency.py +55 -0
  263. qiskit/converters/dagdependency_to_circuit.py +42 -0
  264. qiskit/converters/dagdependency_to_dag.py +49 -0
  265. qiskit/dagcircuit/__init__.py +44 -0
  266. qiskit/dagcircuit/collect_blocks.py +386 -0
  267. qiskit/dagcircuit/dagcircuit.py +2105 -0
  268. qiskit/dagcircuit/dagdependency.py +626 -0
  269. qiskit/dagcircuit/dagdepnode.py +157 -0
  270. qiskit/dagcircuit/dagnode.py +322 -0
  271. qiskit/dagcircuit/exceptions.py +42 -0
  272. qiskit/exceptions.py +97 -0
  273. qiskit/execute_function.py +354 -0
  274. qiskit/extensions/__init__.py +70 -0
  275. qiskit/extensions/exceptions.py +31 -0
  276. qiskit/extensions/quantum_initializer/__init__.py +26 -0
  277. qiskit/extensions/quantum_initializer/squ.py +163 -0
  278. qiskit/extensions/simulator/__init__.py +15 -0
  279. qiskit/extensions/simulator/snapshot.py +70 -0
  280. qiskit/namespace.py +76 -0
  281. qiskit/passmanager/__init__.py +242 -0
  282. qiskit/passmanager/base_tasks.py +230 -0
  283. qiskit/passmanager/compilation_status.py +74 -0
  284. qiskit/passmanager/exceptions.py +19 -0
  285. qiskit/passmanager/flow_controllers.py +336 -0
  286. qiskit/passmanager/passmanager.py +317 -0
  287. qiskit/primitives/__init__.py +62 -0
  288. qiskit/primitives/backend_estimator.py +473 -0
  289. qiskit/primitives/backend_sampler.py +209 -0
  290. qiskit/primitives/base/__init__.py +20 -0
  291. qiskit/primitives/base/base_estimator.py +256 -0
  292. qiskit/primitives/base/base_primitive.py +74 -0
  293. qiskit/primitives/base/base_result.py +87 -0
  294. qiskit/primitives/base/base_sampler.py +202 -0
  295. qiskit/primitives/base/estimator_result.py +46 -0
  296. qiskit/primitives/base/sampler_result.py +45 -0
  297. qiskit/primitives/base/validation.py +231 -0
  298. qiskit/primitives/estimator.py +158 -0
  299. qiskit/primitives/primitive_job.py +73 -0
  300. qiskit/primitives/sampler.py +155 -0
  301. qiskit/primitives/utils.py +216 -0
  302. qiskit/providers/__init__.py +773 -0
  303. qiskit/providers/backend.py +653 -0
  304. qiskit/providers/backend_compat.py +347 -0
  305. qiskit/providers/basicaer/__init__.py +73 -0
  306. qiskit/providers/basicaer/basicaerjob.py +65 -0
  307. qiskit/providers/basicaer/basicaerprovider.py +127 -0
  308. qiskit/providers/basicaer/basicaertools.py +186 -0
  309. qiskit/providers/basicaer/exceptions.py +30 -0
  310. qiskit/providers/basicaer/qasm_simulator.py +678 -0
  311. qiskit/providers/basicaer/statevector_simulator.py +121 -0
  312. qiskit/providers/basicaer/unitary_simulator.py +395 -0
  313. qiskit/providers/exceptions.py +45 -0
  314. qiskit/providers/fake_provider/__init__.py +267 -0
  315. qiskit/providers/fake_provider/backends/__init__.py +110 -0
  316. qiskit/providers/fake_provider/backends/almaden/__init__.py +16 -0
  317. qiskit/providers/fake_provider/backends/almaden/conf_almaden.json +1 -0
  318. qiskit/providers/fake_provider/backends/almaden/fake_almaden.py +58 -0
  319. qiskit/providers/fake_provider/backends/almaden/props_almaden.json +1 -0
  320. qiskit/providers/fake_provider/backends/armonk/__init__.py +16 -0
  321. qiskit/providers/fake_provider/backends/armonk/conf_armonk.json +1 -0
  322. qiskit/providers/fake_provider/backends/armonk/defs_armonk.json +1 -0
  323. qiskit/providers/fake_provider/backends/armonk/fake_armonk.py +48 -0
  324. qiskit/providers/fake_provider/backends/armonk/props_armonk.json +1 -0
  325. qiskit/providers/fake_provider/backends/athens/__init__.py +16 -0
  326. qiskit/providers/fake_provider/backends/athens/conf_athens.json +1 -0
  327. qiskit/providers/fake_provider/backends/athens/defs_athens.json +1 -0
  328. qiskit/providers/fake_provider/backends/athens/fake_athens.py +38 -0
  329. qiskit/providers/fake_provider/backends/athens/props_athens.json +1 -0
  330. qiskit/providers/fake_provider/backends/auckland/__init__.py +15 -0
  331. qiskit/providers/fake_provider/backends/auckland/conf_auckland.json +1 -0
  332. qiskit/providers/fake_provider/backends/auckland/defs_auckland.json +1 -0
  333. qiskit/providers/fake_provider/backends/auckland/fake_auckland.py +29 -0
  334. qiskit/providers/fake_provider/backends/auckland/props_auckland.json +1 -0
  335. qiskit/providers/fake_provider/backends/belem/__init__.py +16 -0
  336. qiskit/providers/fake_provider/backends/belem/conf_belem.json +1 -0
  337. qiskit/providers/fake_provider/backends/belem/defs_belem.json +1 -0
  338. qiskit/providers/fake_provider/backends/belem/fake_belem.py +38 -0
  339. qiskit/providers/fake_provider/backends/belem/props_belem.json +1 -0
  340. qiskit/providers/fake_provider/backends/boeblingen/__init__.py +16 -0
  341. qiskit/providers/fake_provider/backends/boeblingen/conf_boeblingen.json +1 -0
  342. qiskit/providers/fake_provider/backends/boeblingen/defs_boeblingen.json +1 -0
  343. qiskit/providers/fake_provider/backends/boeblingen/fake_boeblingen.py +60 -0
  344. qiskit/providers/fake_provider/backends/boeblingen/props_boeblingen.json +1 -0
  345. qiskit/providers/fake_provider/backends/bogota/__init__.py +16 -0
  346. qiskit/providers/fake_provider/backends/bogota/conf_bogota.json +1 -0
  347. qiskit/providers/fake_provider/backends/bogota/defs_bogota.json +1 -0
  348. qiskit/providers/fake_provider/backends/bogota/fake_bogota.py +38 -0
  349. qiskit/providers/fake_provider/backends/bogota/props_bogota.json +1 -0
  350. qiskit/providers/fake_provider/backends/brooklyn/__init__.py +16 -0
  351. qiskit/providers/fake_provider/backends/brooklyn/conf_brooklyn.json +1 -0
  352. qiskit/providers/fake_provider/backends/brooklyn/defs_brooklyn.json +1 -0
  353. qiskit/providers/fake_provider/backends/brooklyn/fake_brooklyn.py +38 -0
  354. qiskit/providers/fake_provider/backends/brooklyn/props_brooklyn.json +1 -0
  355. qiskit/providers/fake_provider/backends/burlington/__init__.py +16 -0
  356. qiskit/providers/fake_provider/backends/burlington/conf_burlington.json +1 -0
  357. qiskit/providers/fake_provider/backends/burlington/fake_burlington.py +50 -0
  358. qiskit/providers/fake_provider/backends/burlington/props_burlington.json +1 -0
  359. qiskit/providers/fake_provider/backends/cairo/__init__.py +16 -0
  360. qiskit/providers/fake_provider/backends/cairo/conf_cairo.json +1 -0
  361. qiskit/providers/fake_provider/backends/cairo/defs_cairo.json +1 -0
  362. qiskit/providers/fake_provider/backends/cairo/fake_cairo.py +38 -0
  363. qiskit/providers/fake_provider/backends/cairo/props_cairo.json +1 -0
  364. qiskit/providers/fake_provider/backends/cambridge/__init__.py +17 -0
  365. qiskit/providers/fake_provider/backends/cambridge/conf_cambridge.json +1 -0
  366. qiskit/providers/fake_provider/backends/cambridge/fake_cambridge.py +72 -0
  367. qiskit/providers/fake_provider/backends/cambridge/props_cambridge.json +1 -0
  368. qiskit/providers/fake_provider/backends/cambridge/props_cambridge_alt.json +1 -0
  369. qiskit/providers/fake_provider/backends/casablanca/__init__.py +16 -0
  370. qiskit/providers/fake_provider/backends/casablanca/conf_casablanca.json +1 -0
  371. qiskit/providers/fake_provider/backends/casablanca/defs_casablanca.json +1 -0
  372. qiskit/providers/fake_provider/backends/casablanca/fake_casablanca.py +38 -0
  373. qiskit/providers/fake_provider/backends/casablanca/props_casablanca.json +1 -0
  374. qiskit/providers/fake_provider/backends/essex/__init__.py +16 -0
  375. qiskit/providers/fake_provider/backends/essex/conf_essex.json +1 -0
  376. qiskit/providers/fake_provider/backends/essex/fake_essex.py +54 -0
  377. qiskit/providers/fake_provider/backends/essex/props_essex.json +1 -0
  378. qiskit/providers/fake_provider/backends/geneva/__init__.py +15 -0
  379. qiskit/providers/fake_provider/backends/geneva/conf_geneva.json +1 -0
  380. qiskit/providers/fake_provider/backends/geneva/defs_geneva.json +1 -0
  381. qiskit/providers/fake_provider/backends/geneva/fake_geneva.py +29 -0
  382. qiskit/providers/fake_provider/backends/geneva/props_geneva.json +1 -0
  383. qiskit/providers/fake_provider/backends/guadalupe/__init__.py +16 -0
  384. qiskit/providers/fake_provider/backends/guadalupe/conf_guadalupe.json +1 -0
  385. qiskit/providers/fake_provider/backends/guadalupe/defs_guadalupe.json +1 -0
  386. qiskit/providers/fake_provider/backends/guadalupe/fake_guadalupe.py +39 -0
  387. qiskit/providers/fake_provider/backends/guadalupe/props_guadalupe.json +1 -0
  388. qiskit/providers/fake_provider/backends/hanoi/__init__.py +16 -0
  389. qiskit/providers/fake_provider/backends/hanoi/conf_hanoi.json +1 -0
  390. qiskit/providers/fake_provider/backends/hanoi/defs_hanoi.json +1 -0
  391. qiskit/providers/fake_provider/backends/hanoi/fake_hanoi.py +38 -0
  392. qiskit/providers/fake_provider/backends/hanoi/props_hanoi.json +1 -0
  393. qiskit/providers/fake_provider/backends/jakarta/__init__.py +16 -0
  394. qiskit/providers/fake_provider/backends/jakarta/conf_jakarta.json +1 -0
  395. qiskit/providers/fake_provider/backends/jakarta/defs_jakarta.json +1 -0
  396. qiskit/providers/fake_provider/backends/jakarta/fake_jakarta.py +38 -0
  397. qiskit/providers/fake_provider/backends/jakarta/props_jakarta.json +1 -0
  398. qiskit/providers/fake_provider/backends/johannesburg/__init__.py +16 -0
  399. qiskit/providers/fake_provider/backends/johannesburg/conf_johannesburg.json +1 -0
  400. qiskit/providers/fake_provider/backends/johannesburg/fake_johannesburg.py +58 -0
  401. qiskit/providers/fake_provider/backends/johannesburg/props_johannesburg.json +1 -0
  402. qiskit/providers/fake_provider/backends/kolkata/__init__.py +16 -0
  403. qiskit/providers/fake_provider/backends/kolkata/conf_kolkata.json +1 -0
  404. qiskit/providers/fake_provider/backends/kolkata/defs_kolkata.json +1 -0
  405. qiskit/providers/fake_provider/backends/kolkata/fake_kolkata.py +38 -0
  406. qiskit/providers/fake_provider/backends/kolkata/props_kolkata.json +1 -0
  407. qiskit/providers/fake_provider/backends/lagos/__init__.py +16 -0
  408. qiskit/providers/fake_provider/backends/lagos/conf_lagos.json +1 -0
  409. qiskit/providers/fake_provider/backends/lagos/defs_lagos.json +1 -0
  410. qiskit/providers/fake_provider/backends/lagos/fake_lagos.py +38 -0
  411. qiskit/providers/fake_provider/backends/lagos/props_lagos.json +1 -0
  412. qiskit/providers/fake_provider/backends/lima/__init__.py +16 -0
  413. qiskit/providers/fake_provider/backends/lima/conf_lima.json +1 -0
  414. qiskit/providers/fake_provider/backends/lima/defs_lima.json +1 -0
  415. qiskit/providers/fake_provider/backends/lima/fake_lima.py +38 -0
  416. qiskit/providers/fake_provider/backends/lima/props_lima.json +1 -0
  417. qiskit/providers/fake_provider/backends/london/__init__.py +16 -0
  418. qiskit/providers/fake_provider/backends/london/conf_london.json +1 -0
  419. qiskit/providers/fake_provider/backends/london/fake_london.py +54 -0
  420. qiskit/providers/fake_provider/backends/london/props_london.json +1 -0
  421. qiskit/providers/fake_provider/backends/manhattan/__init__.py +16 -0
  422. qiskit/providers/fake_provider/backends/manhattan/conf_manhattan.json +1 -0
  423. qiskit/providers/fake_provider/backends/manhattan/defs_manhattan.json +1 -0
  424. qiskit/providers/fake_provider/backends/manhattan/fake_manhattan.py +38 -0
  425. qiskit/providers/fake_provider/backends/manhattan/props_manhattan.json +1 -0
  426. qiskit/providers/fake_provider/backends/manila/__init__.py +16 -0
  427. qiskit/providers/fake_provider/backends/manila/conf_manila.json +1 -0
  428. qiskit/providers/fake_provider/backends/manila/defs_manila.json +1 -0
  429. qiskit/providers/fake_provider/backends/manila/fake_manila.py +38 -0
  430. qiskit/providers/fake_provider/backends/manila/props_manila.json +1 -0
  431. qiskit/providers/fake_provider/backends/melbourne/__init__.py +16 -0
  432. qiskit/providers/fake_provider/backends/melbourne/conf_melbourne.json +1 -0
  433. qiskit/providers/fake_provider/backends/melbourne/fake_melbourne.py +91 -0
  434. qiskit/providers/fake_provider/backends/melbourne/props_melbourne.json +1 -0
  435. qiskit/providers/fake_provider/backends/montreal/__init__.py +16 -0
  436. qiskit/providers/fake_provider/backends/montreal/conf_montreal.json +1 -0
  437. qiskit/providers/fake_provider/backends/montreal/defs_montreal.json +1 -0
  438. qiskit/providers/fake_provider/backends/montreal/fake_montreal.py +38 -0
  439. qiskit/providers/fake_provider/backends/montreal/props_montreal.json +1 -0
  440. qiskit/providers/fake_provider/backends/mumbai/__init__.py +16 -0
  441. qiskit/providers/fake_provider/backends/mumbai/conf_mumbai.json +1 -0
  442. qiskit/providers/fake_provider/backends/mumbai/defs_mumbai.json +1 -0
  443. qiskit/providers/fake_provider/backends/mumbai/fake_mumbai.py +38 -0
  444. qiskit/providers/fake_provider/backends/mumbai/props_mumbai.json +1 -0
  445. qiskit/providers/fake_provider/backends/nairobi/__init__.py +16 -0
  446. qiskit/providers/fake_provider/backends/nairobi/conf_nairobi.json +1 -0
  447. qiskit/providers/fake_provider/backends/nairobi/defs_nairobi.json +1 -0
  448. qiskit/providers/fake_provider/backends/nairobi/fake_nairobi.py +38 -0
  449. qiskit/providers/fake_provider/backends/nairobi/props_nairobi.json +1 -0
  450. qiskit/providers/fake_provider/backends/oslo/__init__.py +15 -0
  451. qiskit/providers/fake_provider/backends/oslo/conf_oslo.json +1 -0
  452. qiskit/providers/fake_provider/backends/oslo/defs_oslo.json +1 -0
  453. qiskit/providers/fake_provider/backends/oslo/fake_oslo.py +29 -0
  454. qiskit/providers/fake_provider/backends/oslo/props_oslo.json +1 -0
  455. qiskit/providers/fake_provider/backends/ourense/__init__.py +16 -0
  456. qiskit/providers/fake_provider/backends/ourense/conf_ourense.json +1 -0
  457. qiskit/providers/fake_provider/backends/ourense/fake_ourense.py +50 -0
  458. qiskit/providers/fake_provider/backends/ourense/props_ourense.json +1 -0
  459. qiskit/providers/fake_provider/backends/paris/__init__.py +16 -0
  460. qiskit/providers/fake_provider/backends/paris/conf_paris.json +1 -0
  461. qiskit/providers/fake_provider/backends/paris/defs_paris.json +1 -0
  462. qiskit/providers/fake_provider/backends/paris/fake_paris.py +64 -0
  463. qiskit/providers/fake_provider/backends/paris/props_paris.json +1 -0
  464. qiskit/providers/fake_provider/backends/perth/__init__.py +15 -0
  465. qiskit/providers/fake_provider/backends/perth/conf_perth.json +1 -0
  466. qiskit/providers/fake_provider/backends/perth/defs_perth.json +1 -0
  467. qiskit/providers/fake_provider/backends/perth/fake_perth.py +29 -0
  468. qiskit/providers/fake_provider/backends/perth/props_perth.json +1 -0
  469. qiskit/providers/fake_provider/backends/poughkeepsie/__init__.py +16 -0
  470. qiskit/providers/fake_provider/backends/poughkeepsie/conf_poughkeepsie.json +1 -0
  471. qiskit/providers/fake_provider/backends/poughkeepsie/defs_poughkeepsie.json +1 -0
  472. qiskit/providers/fake_provider/backends/poughkeepsie/fake_poughkeepsie.py +124 -0
  473. qiskit/providers/fake_provider/backends/poughkeepsie/props_poughkeepsie.json +1 -0
  474. qiskit/providers/fake_provider/backends/prague/__init__.py +15 -0
  475. qiskit/providers/fake_provider/backends/prague/conf_prague.json +1 -0
  476. qiskit/providers/fake_provider/backends/prague/fake_prague.py +28 -0
  477. qiskit/providers/fake_provider/backends/prague/props_prague.json +1 -0
  478. qiskit/providers/fake_provider/backends/quito/__init__.py +16 -0
  479. qiskit/providers/fake_provider/backends/quito/conf_quito.json +1 -0
  480. qiskit/providers/fake_provider/backends/quito/defs_quito.json +1 -0
  481. qiskit/providers/fake_provider/backends/quito/fake_quito.py +38 -0
  482. qiskit/providers/fake_provider/backends/quito/props_quito.json +1 -0
  483. qiskit/providers/fake_provider/backends/rochester/__init__.py +16 -0
  484. qiskit/providers/fake_provider/backends/rochester/conf_rochester.json +1 -0
  485. qiskit/providers/fake_provider/backends/rochester/fake_rochester.py +36 -0
  486. qiskit/providers/fake_provider/backends/rochester/props_rochester.json +1 -0
  487. qiskit/providers/fake_provider/backends/rome/__init__.py +16 -0
  488. qiskit/providers/fake_provider/backends/rome/conf_rome.json +1 -0
  489. qiskit/providers/fake_provider/backends/rome/defs_rome.json +1 -0
  490. qiskit/providers/fake_provider/backends/rome/fake_rome.py +38 -0
  491. qiskit/providers/fake_provider/backends/rome/props_rome.json +1 -0
  492. qiskit/providers/fake_provider/backends/rueschlikon/__init__.py +15 -0
  493. qiskit/providers/fake_provider/backends/rueschlikon/fake_rueschlikon.py +74 -0
  494. qiskit/providers/fake_provider/backends/santiago/__init__.py +16 -0
  495. qiskit/providers/fake_provider/backends/santiago/conf_santiago.json +1 -0
  496. qiskit/providers/fake_provider/backends/santiago/defs_santiago.json +1 -0
  497. qiskit/providers/fake_provider/backends/santiago/fake_santiago.py +38 -0
  498. qiskit/providers/fake_provider/backends/santiago/props_santiago.json +1 -0
  499. qiskit/providers/fake_provider/backends/sherbrooke/__init__.py +17 -0
  500. qiskit/providers/fake_provider/backends/sherbrooke/conf_sherbrooke.json +1 -0
  501. qiskit/providers/fake_provider/backends/sherbrooke/defs_sherbrooke.json +1 -0
  502. qiskit/providers/fake_provider/backends/sherbrooke/fake_sherbrooke.py +28 -0
  503. qiskit/providers/fake_provider/backends/sherbrooke/props_sherbrooke.json +1 -0
  504. qiskit/providers/fake_provider/backends/singapore/__init__.py +16 -0
  505. qiskit/providers/fake_provider/backends/singapore/conf_singapore.json +1 -0
  506. qiskit/providers/fake_provider/backends/singapore/fake_singapore.py +58 -0
  507. qiskit/providers/fake_provider/backends/singapore/props_singapore.json +1 -0
  508. qiskit/providers/fake_provider/backends/sydney/__init__.py +16 -0
  509. qiskit/providers/fake_provider/backends/sydney/conf_sydney.json +1 -0
  510. qiskit/providers/fake_provider/backends/sydney/defs_sydney.json +1 -0
  511. qiskit/providers/fake_provider/backends/sydney/fake_sydney.py +38 -0
  512. qiskit/providers/fake_provider/backends/sydney/props_sydney.json +1 -0
  513. qiskit/providers/fake_provider/backends/tenerife/__init__.py +15 -0
  514. qiskit/providers/fake_provider/backends/tenerife/fake_tenerife.py +64 -0
  515. qiskit/providers/fake_provider/backends/tenerife/props_tenerife.json +1 -0
  516. qiskit/providers/fake_provider/backends/tokyo/__init__.py +15 -0
  517. qiskit/providers/fake_provider/backends/tokyo/fake_tokyo.py +137 -0
  518. qiskit/providers/fake_provider/backends/tokyo/props_tokyo.json +1 -0
  519. qiskit/providers/fake_provider/backends/toronto/__init__.py +16 -0
  520. qiskit/providers/fake_provider/backends/toronto/conf_toronto.json +1 -0
  521. qiskit/providers/fake_provider/backends/toronto/defs_toronto.json +1 -0
  522. qiskit/providers/fake_provider/backends/toronto/fake_toronto.py +38 -0
  523. qiskit/providers/fake_provider/backends/toronto/props_toronto.json +1 -0
  524. qiskit/providers/fake_provider/backends/valencia/__init__.py +16 -0
  525. qiskit/providers/fake_provider/backends/valencia/conf_valencia.json +1 -0
  526. qiskit/providers/fake_provider/backends/valencia/defs_valencia.json +1 -0
  527. qiskit/providers/fake_provider/backends/valencia/fake_valencia.py +38 -0
  528. qiskit/providers/fake_provider/backends/valencia/props_valencia.json +1 -0
  529. qiskit/providers/fake_provider/backends/vigo/__init__.py +16 -0
  530. qiskit/providers/fake_provider/backends/vigo/conf_vigo.json +1 -0
  531. qiskit/providers/fake_provider/backends/vigo/fake_vigo.py +50 -0
  532. qiskit/providers/fake_provider/backends/vigo/props_vigo.json +1 -0
  533. qiskit/providers/fake_provider/backends/washington/__init__.py +18 -0
  534. qiskit/providers/fake_provider/backends/washington/conf_washington.json +1 -0
  535. qiskit/providers/fake_provider/backends/washington/defs_washington.json +1 -0
  536. qiskit/providers/fake_provider/backends/washington/fake_washington.py +38 -0
  537. qiskit/providers/fake_provider/backends/washington/props_washington.json +1 -0
  538. qiskit/providers/fake_provider/backends/yorktown/__init__.py +16 -0
  539. qiskit/providers/fake_provider/backends/yorktown/conf_yorktown.json +1 -0
  540. qiskit/providers/fake_provider/backends/yorktown/fake_yorktown.py +54 -0
  541. qiskit/providers/fake_provider/backends/yorktown/props_yorktown.json +1 -0
  542. qiskit/providers/fake_provider/fake_1q.py +91 -0
  543. qiskit/providers/fake_provider/fake_backend.py +572 -0
  544. qiskit/providers/fake_provider/fake_backend_v2.py +217 -0
  545. qiskit/providers/fake_provider/fake_job.py +81 -0
  546. qiskit/providers/fake_provider/fake_mumbai_v2.py +637 -0
  547. qiskit/providers/fake_provider/fake_openpulse_2q.py +342 -0
  548. qiskit/providers/fake_provider/fake_openpulse_3q.py +332 -0
  549. qiskit/providers/fake_provider/fake_provider.py +214 -0
  550. qiskit/providers/fake_provider/fake_pulse_backend.py +43 -0
  551. qiskit/providers/fake_provider/fake_qasm_backend.py +72 -0
  552. qiskit/providers/fake_provider/fake_qasm_simulator.py +48 -0
  553. qiskit/providers/fake_provider/fake_qobj.py +44 -0
  554. qiskit/providers/fake_provider/utils/__init__.py +15 -0
  555. qiskit/providers/fake_provider/utils/backend_converter.py +150 -0
  556. qiskit/providers/fake_provider/utils/configurable_backend.py +360 -0
  557. qiskit/providers/fake_provider/utils/json_decoder.py +109 -0
  558. qiskit/providers/job.py +142 -0
  559. qiskit/providers/jobstatus.py +30 -0
  560. qiskit/providers/models/__init__.py +52 -0
  561. qiskit/providers/models/backendconfiguration.py +994 -0
  562. qiskit/providers/models/backendproperties.py +490 -0
  563. qiskit/providers/models/backendstatus.py +94 -0
  564. qiskit/providers/models/jobstatus.py +66 -0
  565. qiskit/providers/models/pulsedefaults.py +304 -0
  566. qiskit/providers/options.py +273 -0
  567. qiskit/providers/provider.py +79 -0
  568. qiskit/providers/providerutils.py +99 -0
  569. qiskit/pulse/__init__.py +170 -0
  570. qiskit/pulse/builder.py +2733 -0
  571. qiskit/pulse/calibration_entries.py +357 -0
  572. qiskit/pulse/channels.py +221 -0
  573. qiskit/pulse/configuration.py +244 -0
  574. qiskit/pulse/exceptions.py +43 -0
  575. qiskit/pulse/filters.py +302 -0
  576. qiskit/pulse/instruction_schedule_map.py +406 -0
  577. qiskit/pulse/instructions/__init__.py +69 -0
  578. qiskit/pulse/instructions/acquire.py +150 -0
  579. qiskit/pulse/instructions/call.py +176 -0
  580. qiskit/pulse/instructions/delay.py +69 -0
  581. qiskit/pulse/instructions/directives.py +145 -0
  582. qiskit/pulse/instructions/frequency.py +132 -0
  583. qiskit/pulse/instructions/instruction.py +266 -0
  584. qiskit/pulse/instructions/phase.py +149 -0
  585. qiskit/pulse/instructions/play.py +96 -0
  586. qiskit/pulse/instructions/reference.py +99 -0
  587. qiskit/pulse/instructions/snapshot.py +80 -0
  588. qiskit/pulse/library/__init__.py +99 -0
  589. qiskit/pulse/library/continuous.py +430 -0
  590. qiskit/pulse/library/parametric_pulses.py +629 -0
  591. qiskit/pulse/library/pulse.py +137 -0
  592. qiskit/pulse/library/samplers/__init__.py +15 -0
  593. qiskit/pulse/library/samplers/decorators.py +299 -0
  594. qiskit/pulse/library/samplers/strategies.py +71 -0
  595. qiskit/pulse/library/symbolic_pulses.py +1962 -0
  596. qiskit/pulse/library/waveform.py +134 -0
  597. qiskit/pulse/macros.py +256 -0
  598. qiskit/pulse/parameter_manager.py +432 -0
  599. qiskit/pulse/parser.py +314 -0
  600. qiskit/pulse/reference_manager.py +58 -0
  601. qiskit/pulse/schedule.py +2002 -0
  602. qiskit/pulse/transforms/__init__.py +106 -0
  603. qiskit/pulse/transforms/alignments.py +406 -0
  604. qiskit/pulse/transforms/base_transforms.py +71 -0
  605. qiskit/pulse/transforms/canonicalization.py +514 -0
  606. qiskit/pulse/transforms/dag.py +107 -0
  607. qiskit/pulse/utils.py +109 -0
  608. qiskit/qasm/libs/qelib1.inc +266 -0
  609. qiskit/qasm/libs/stdgates.inc +75 -0
  610. qiskit/qasm2/__init__.py +658 -0
  611. qiskit/qasm2/exceptions.py +27 -0
  612. qiskit/qasm2/export.py +374 -0
  613. qiskit/qasm2/parse.py +403 -0
  614. qiskit/qasm3/__init__.py +255 -0
  615. qiskit/qasm3/ast.py +606 -0
  616. qiskit/qasm3/exceptions.py +27 -0
  617. qiskit/qasm3/experimental.py +30 -0
  618. qiskit/qasm3/exporter.py +1079 -0
  619. qiskit/qasm3/printer.py +545 -0
  620. qiskit/qobj/__init__.py +75 -0
  621. qiskit/qobj/common.py +71 -0
  622. qiskit/qobj/converters/__init__.py +18 -0
  623. qiskit/qobj/converters/lo_config.py +168 -0
  624. qiskit/qobj/converters/pulse_instruction.py +1070 -0
  625. qiskit/qobj/pulse_qobj.py +655 -0
  626. qiskit/qobj/qasm_qobj.py +656 -0
  627. qiskit/qobj/utils.py +37 -0
  628. qiskit/qpy/__init__.py +1348 -0
  629. qiskit/qpy/binary_io/__init__.py +36 -0
  630. qiskit/qpy/binary_io/circuits.py +1212 -0
  631. qiskit/qpy/binary_io/schedules.py +619 -0
  632. qiskit/qpy/binary_io/value.py +549 -0
  633. qiskit/qpy/common.py +305 -0
  634. qiskit/qpy/exceptions.py +28 -0
  635. qiskit/qpy/formats.py +360 -0
  636. qiskit/qpy/interface.py +308 -0
  637. qiskit/qpy/type_keys.py +544 -0
  638. qiskit/quantum_info/__init__.py +173 -0
  639. qiskit/quantum_info/analysis/__init__.py +17 -0
  640. qiskit/quantum_info/analysis/average.py +47 -0
  641. qiskit/quantum_info/analysis/distance.py +101 -0
  642. qiskit/quantum_info/analysis/make_observable.py +43 -0
  643. qiskit/quantum_info/analysis/z2_symmetries.py +483 -0
  644. qiskit/quantum_info/operators/__init__.py +28 -0
  645. qiskit/quantum_info/operators/base_operator.py +145 -0
  646. qiskit/quantum_info/operators/channel/__init__.py +29 -0
  647. qiskit/quantum_info/operators/channel/chi.py +190 -0
  648. qiskit/quantum_info/operators/channel/choi.py +217 -0
  649. qiskit/quantum_info/operators/channel/kraus.py +336 -0
  650. qiskit/quantum_info/operators/channel/ptm.py +203 -0
  651. qiskit/quantum_info/operators/channel/quantum_channel.py +350 -0
  652. qiskit/quantum_info/operators/channel/stinespring.py +295 -0
  653. qiskit/quantum_info/operators/channel/superop.py +376 -0
  654. qiskit/quantum_info/operators/channel/transformations.py +467 -0
  655. qiskit/quantum_info/operators/custom_iterator.py +48 -0
  656. qiskit/quantum_info/operators/dihedral/__init__.py +18 -0
  657. qiskit/quantum_info/operators/dihedral/dihedral.py +508 -0
  658. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +218 -0
  659. qiskit/quantum_info/operators/dihedral/polynomial.py +313 -0
  660. qiskit/quantum_info/operators/dihedral/random.py +61 -0
  661. qiskit/quantum_info/operators/linear_op.py +25 -0
  662. qiskit/quantum_info/operators/measures.py +423 -0
  663. qiskit/quantum_info/operators/mixins/__init__.py +52 -0
  664. qiskit/quantum_info/operators/mixins/adjoint.py +52 -0
  665. qiskit/quantum_info/operators/mixins/group.py +171 -0
  666. qiskit/quantum_info/operators/mixins/linear.py +84 -0
  667. qiskit/quantum_info/operators/mixins/multiply.py +62 -0
  668. qiskit/quantum_info/operators/mixins/tolerances.py +72 -0
  669. qiskit/quantum_info/operators/op_shape.py +533 -0
  670. qiskit/quantum_info/operators/operator.py +778 -0
  671. qiskit/quantum_info/operators/predicates.py +170 -0
  672. qiskit/quantum_info/operators/random.py +154 -0
  673. qiskit/quantum_info/operators/scalar_op.py +253 -0
  674. qiskit/quantum_info/operators/symplectic/__init__.py +23 -0
  675. qiskit/quantum_info/operators/symplectic/base_pauli.py +720 -0
  676. qiskit/quantum_info/operators/symplectic/clifford.py +1022 -0
  677. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +558 -0
  678. qiskit/quantum_info/operators/symplectic/pauli.py +699 -0
  679. qiskit/quantum_info/operators/symplectic/pauli_list.py +1209 -0
  680. qiskit/quantum_info/operators/symplectic/pauli_utils.py +40 -0
  681. qiskit/quantum_info/operators/symplectic/random.py +264 -0
  682. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +1156 -0
  683. qiskit/quantum_info/operators/utils/__init__.py +20 -0
  684. qiskit/quantum_info/operators/utils/anti_commutator.py +36 -0
  685. qiskit/quantum_info/operators/utils/commutator.py +36 -0
  686. qiskit/quantum_info/operators/utils/double_commutator.py +76 -0
  687. qiskit/quantum_info/random.py +26 -0
  688. qiskit/quantum_info/states/__init__.py +28 -0
  689. qiskit/quantum_info/states/densitymatrix.py +848 -0
  690. qiskit/quantum_info/states/measures.py +288 -0
  691. qiskit/quantum_info/states/quantum_state.py +503 -0
  692. qiskit/quantum_info/states/random.py +157 -0
  693. qiskit/quantum_info/states/stabilizerstate.py +638 -0
  694. qiskit/quantum_info/states/statevector.py +961 -0
  695. qiskit/quantum_info/states/utils.py +245 -0
  696. qiskit/quantum_info/synthesis/__init__.py +20 -0
  697. qiskit/quantum_info/synthesis/clifford_decompose.py +69 -0
  698. qiskit/quantum_info/synthesis/cnotdihedral_decompose.py +50 -0
  699. qiskit/quantum_info/synthesis/ion_decompose.py +55 -0
  700. qiskit/quantum_info/synthesis/local_invariance.py +93 -0
  701. qiskit/quantum_info/synthesis/one_qubit_decompose.py +284 -0
  702. qiskit/quantum_info/synthesis/qsd.py +269 -0
  703. qiskit/quantum_info/synthesis/quaternion.py +156 -0
  704. qiskit/quantum_info/synthesis/two_qubit_decompose.py +1567 -0
  705. qiskit/quantum_info/synthesis/weyl.py +98 -0
  706. qiskit/quantum_info/synthesis/xx_decompose/__init__.py +19 -0
  707. qiskit/quantum_info/synthesis/xx_decompose/circuits.py +299 -0
  708. qiskit/quantum_info/synthesis/xx_decompose/decomposer.py +314 -0
  709. qiskit/quantum_info/synthesis/xx_decompose/embodiments.py +163 -0
  710. qiskit/quantum_info/synthesis/xx_decompose/paths.py +412 -0
  711. qiskit/quantum_info/synthesis/xx_decompose/polytopes.py +264 -0
  712. qiskit/quantum_info/synthesis/xx_decompose/utilities.py +40 -0
  713. qiskit/quantum_info/synthesis/xx_decompose/weyl.py +133 -0
  714. qiskit/result/__init__.py +67 -0
  715. qiskit/result/counts.py +189 -0
  716. qiskit/result/distributions/__init__.py +17 -0
  717. qiskit/result/distributions/probability.py +100 -0
  718. qiskit/result/distributions/quasi.py +154 -0
  719. qiskit/result/exceptions.py +40 -0
  720. qiskit/result/mitigation/__init__.py +13 -0
  721. qiskit/result/mitigation/base_readout_mitigator.py +79 -0
  722. qiskit/result/mitigation/correlated_readout_mitigator.py +268 -0
  723. qiskit/result/mitigation/local_readout_mitigator.py +319 -0
  724. qiskit/result/mitigation/utils.py +161 -0
  725. qiskit/result/models.py +233 -0
  726. qiskit/result/postprocess.py +239 -0
  727. qiskit/result/result.py +397 -0
  728. qiskit/result/sampled_expval.py +75 -0
  729. qiskit/result/utils.py +295 -0
  730. qiskit/scheduler/__init__.py +31 -0
  731. qiskit/scheduler/config.py +35 -0
  732. qiskit/scheduler/lowering.py +187 -0
  733. qiskit/scheduler/methods/__init__.py +22 -0
  734. qiskit/scheduler/methods/basic.py +137 -0
  735. qiskit/scheduler/schedule_circuit.py +67 -0
  736. qiskit/scheduler/sequence.py +102 -0
  737. qiskit/synthesis/__init__.py +122 -0
  738. qiskit/synthesis/clifford/__init__.py +19 -0
  739. qiskit/synthesis/clifford/clifford_decompose_ag.py +176 -0
  740. qiskit/synthesis/clifford/clifford_decompose_bm.py +276 -0
  741. qiskit/synthesis/clifford/clifford_decompose_full.py +61 -0
  742. qiskit/synthesis/clifford/clifford_decompose_greedy.py +347 -0
  743. qiskit/synthesis/clifford/clifford_decompose_layers.py +443 -0
  744. qiskit/synthesis/cnotdihedral/__init__.py +17 -0
  745. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +46 -0
  746. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +140 -0
  747. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_two_qubits.py +264 -0
  748. qiskit/synthesis/discrete_basis/__init__.py +16 -0
  749. qiskit/synthesis/discrete_basis/commutator_decompose.py +241 -0
  750. qiskit/synthesis/discrete_basis/gate_sequence.py +415 -0
  751. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +163 -0
  752. qiskit/synthesis/discrete_basis/solovay_kitaev.py +207 -0
  753. qiskit/synthesis/evolution/__init__.py +20 -0
  754. qiskit/synthesis/evolution/evolution_synthesis.py +46 -0
  755. qiskit/synthesis/evolution/lie_trotter.py +123 -0
  756. qiskit/synthesis/evolution/matrix_synthesis.py +47 -0
  757. qiskit/synthesis/evolution/product_formula.py +328 -0
  758. qiskit/synthesis/evolution/qdrift.py +102 -0
  759. qiskit/synthesis/evolution/suzuki_trotter.py +145 -0
  760. qiskit/synthesis/linear/__init__.py +25 -0
  761. qiskit/synthesis/linear/cnot_synth.py +141 -0
  762. qiskit/synthesis/linear/linear_circuits_utils.py +127 -0
  763. qiskit/synthesis/linear/linear_depth_lnn.py +275 -0
  764. qiskit/synthesis/linear/linear_matrix_utils.py +175 -0
  765. qiskit/synthesis/linear_phase/__init__.py +17 -0
  766. qiskit/synthesis/linear_phase/cnot_phase_synth.py +203 -0
  767. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +262 -0
  768. qiskit/synthesis/linear_phase/cz_depth_lnn.py +206 -0
  769. qiskit/synthesis/permutation/__init__.py +17 -0
  770. qiskit/synthesis/permutation/permutation_full.py +90 -0
  771. qiskit/synthesis/permutation/permutation_lnn.py +68 -0
  772. qiskit/synthesis/permutation/permutation_utils.py +73 -0
  773. qiskit/synthesis/stabilizer/__init__.py +15 -0
  774. qiskit/synthesis/stabilizer/stabilizer_decompose.py +188 -0
  775. qiskit/test/__init__.py +18 -0
  776. qiskit/test/_canonical.py +125 -0
  777. qiskit/test/base.py +331 -0
  778. qiskit/test/decorators.py +308 -0
  779. qiskit/test/ibmq_mock.py +45 -0
  780. qiskit/test/mock/__init__.py +40 -0
  781. qiskit/test/mock/backends/__init__.py +32 -0
  782. qiskit/test/mock/backends/almaden/__init__.py +32 -0
  783. qiskit/test/mock/backends/armonk/__init__.py +32 -0
  784. qiskit/test/mock/backends/athens/__init__.py +32 -0
  785. qiskit/test/mock/backends/belem/__init__.py +32 -0
  786. qiskit/test/mock/backends/boeblingen/__init__.py +32 -0
  787. qiskit/test/mock/backends/bogota/__init__.py +32 -0
  788. qiskit/test/mock/backends/brooklyn/__init__.py +32 -0
  789. qiskit/test/mock/backends/burlington/__init__.py +32 -0
  790. qiskit/test/mock/backends/cairo/__init__.py +32 -0
  791. qiskit/test/mock/backends/cambridge/__init__.py +32 -0
  792. qiskit/test/mock/backends/casablanca/__init__.py +32 -0
  793. qiskit/test/mock/backends/essex/__init__.py +32 -0
  794. qiskit/test/mock/backends/guadalupe/__init__.py +32 -0
  795. qiskit/test/mock/backends/hanoi/__init__.py +32 -0
  796. qiskit/test/mock/backends/jakarta/__init__.py +32 -0
  797. qiskit/test/mock/backends/johannesburg/__init__.py +32 -0
  798. qiskit/test/mock/backends/kolkata/__init__.py +32 -0
  799. qiskit/test/mock/backends/lagos/__init__.py +32 -0
  800. qiskit/test/mock/backends/lima/__init__.py +32 -0
  801. qiskit/test/mock/backends/london/__init__.py +32 -0
  802. qiskit/test/mock/backends/manhattan/__init__.py +32 -0
  803. qiskit/test/mock/backends/manila/__init__.py +32 -0
  804. qiskit/test/mock/backends/melbourne/__init__.py +32 -0
  805. qiskit/test/mock/backends/montreal/__init__.py +32 -0
  806. qiskit/test/mock/backends/mumbai/__init__.py +32 -0
  807. qiskit/test/mock/backends/nairobi/__init__.py +32 -0
  808. qiskit/test/mock/backends/ourense/__init__.py +32 -0
  809. qiskit/test/mock/backends/paris/__init__.py +32 -0
  810. qiskit/test/mock/backends/poughkeepsie/__init__.py +32 -0
  811. qiskit/test/mock/backends/quito/__init__.py +32 -0
  812. qiskit/test/mock/backends/rochester/__init__.py +32 -0
  813. qiskit/test/mock/backends/rome/__init__.py +32 -0
  814. qiskit/test/mock/backends/rueschlikon/__init__.py +32 -0
  815. qiskit/test/mock/backends/santiago/__init__.py +32 -0
  816. qiskit/test/mock/backends/singapore/__init__.py +32 -0
  817. qiskit/test/mock/backends/sydney/__init__.py +32 -0
  818. qiskit/test/mock/backends/tenerife/__init__.py +32 -0
  819. qiskit/test/mock/backends/tokyo/__init__.py +32 -0
  820. qiskit/test/mock/backends/toronto/__init__.py +32 -0
  821. qiskit/test/mock/backends/valencia/__init__.py +32 -0
  822. qiskit/test/mock/backends/vigo/__init__.py +32 -0
  823. qiskit/test/mock/backends/washington/__init__.py +32 -0
  824. qiskit/test/mock/backends/yorktown/__init__.py +32 -0
  825. qiskit/test/providers/__init__.py +16 -0
  826. qiskit/test/providers/backend.py +75 -0
  827. qiskit/test/providers/provider.py +59 -0
  828. qiskit/test/reference_circuits.py +41 -0
  829. qiskit/test/testing_options.py +93 -0
  830. qiskit/test/utils.py +87 -0
  831. qiskit/tools/__init__.py +44 -0
  832. qiskit/tools/events/__init__.py +25 -0
  833. qiskit/tools/events/progressbar.py +195 -0
  834. qiskit/tools/events/pubsub.py +158 -0
  835. qiskit/tools/jupyter/__init__.py +138 -0
  836. qiskit/tools/jupyter/backend_monitor.py +588 -0
  837. qiskit/tools/jupyter/backend_overview.py +322 -0
  838. qiskit/tools/jupyter/copyright.py +42 -0
  839. qiskit/tools/jupyter/job_watcher.py +167 -0
  840. qiskit/tools/jupyter/job_widgets.py +160 -0
  841. qiskit/tools/jupyter/jupyter_magics.py +190 -0
  842. qiskit/tools/jupyter/library.py +189 -0
  843. qiskit/tools/jupyter/monospace.py +29 -0
  844. qiskit/tools/jupyter/progressbar.py +122 -0
  845. qiskit/tools/jupyter/version_table.py +67 -0
  846. qiskit/tools/jupyter/watcher_monitor.py +74 -0
  847. qiskit/tools/monitor/__init__.py +16 -0
  848. qiskit/tools/monitor/job_monitor.py +107 -0
  849. qiskit/tools/monitor/overview.py +247 -0
  850. qiskit/tools/parallel.py +198 -0
  851. qiskit/tools/visualization.py +16 -0
  852. qiskit/transpiler/__init__.py +1287 -0
  853. qiskit/transpiler/basepasses.py +221 -0
  854. qiskit/transpiler/coupling.py +500 -0
  855. qiskit/transpiler/exceptions.py +55 -0
  856. qiskit/transpiler/fencedobjs.py +78 -0
  857. qiskit/transpiler/instruction_durations.py +278 -0
  858. qiskit/transpiler/layout.py +658 -0
  859. qiskit/transpiler/passes/__init__.py +296 -0
  860. qiskit/transpiler/passes/analysis/__init__.py +23 -0
  861. qiskit/transpiler/passes/analysis/count_ops.py +30 -0
  862. qiskit/transpiler/passes/analysis/count_ops_longest_path.py +26 -0
  863. qiskit/transpiler/passes/analysis/dag_longest_path.py +24 -0
  864. qiskit/transpiler/passes/analysis/depth.py +33 -0
  865. qiskit/transpiler/passes/analysis/num_qubits.py +26 -0
  866. qiskit/transpiler/passes/analysis/num_tensor_factors.py +26 -0
  867. qiskit/transpiler/passes/analysis/resource_estimation.py +41 -0
  868. qiskit/transpiler/passes/analysis/size.py +36 -0
  869. qiskit/transpiler/passes/analysis/width.py +27 -0
  870. qiskit/transpiler/passes/basis/__init__.py +20 -0
  871. qiskit/transpiler/passes/basis/basis_translator.py +697 -0
  872. qiskit/transpiler/passes/basis/decompose.py +98 -0
  873. qiskit/transpiler/passes/basis/translate_parameterized.py +177 -0
  874. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +86 -0
  875. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +107 -0
  876. qiskit/transpiler/passes/basis/unroller.py +145 -0
  877. qiskit/transpiler/passes/calibration/__init__.py +17 -0
  878. qiskit/transpiler/passes/calibration/base_builder.py +79 -0
  879. qiskit/transpiler/passes/calibration/builders.py +20 -0
  880. qiskit/transpiler/passes/calibration/exceptions.py +22 -0
  881. qiskit/transpiler/passes/calibration/pulse_gate.py +98 -0
  882. qiskit/transpiler/passes/calibration/rx_builder.py +160 -0
  883. qiskit/transpiler/passes/calibration/rzx_builder.py +394 -0
  884. qiskit/transpiler/passes/calibration/rzx_templates.py +51 -0
  885. qiskit/transpiler/passes/layout/__init__.py +27 -0
  886. qiskit/transpiler/passes/layout/_csp_custom_solver.py +65 -0
  887. qiskit/transpiler/passes/layout/apply_layout.py +108 -0
  888. qiskit/transpiler/passes/layout/csp_layout.py +132 -0
  889. qiskit/transpiler/passes/layout/dense_layout.py +202 -0
  890. qiskit/transpiler/passes/layout/disjoint_utils.py +205 -0
  891. qiskit/transpiler/passes/layout/enlarge_with_ancilla.py +49 -0
  892. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +117 -0
  893. qiskit/transpiler/passes/layout/layout_2q_distance.py +77 -0
  894. qiskit/transpiler/passes/layout/noise_adaptive_layout.py +311 -0
  895. qiskit/transpiler/passes/layout/sabre_layout.py +468 -0
  896. qiskit/transpiler/passes/layout/sabre_pre_layout.py +217 -0
  897. qiskit/transpiler/passes/layout/set_layout.py +64 -0
  898. qiskit/transpiler/passes/layout/trivial_layout.py +66 -0
  899. qiskit/transpiler/passes/layout/vf2_layout.py +257 -0
  900. qiskit/transpiler/passes/layout/vf2_post_layout.py +419 -0
  901. qiskit/transpiler/passes/layout/vf2_utils.py +260 -0
  902. qiskit/transpiler/passes/optimization/__init__.py +38 -0
  903. qiskit/transpiler/passes/optimization/_gate_extension.py +80 -0
  904. qiskit/transpiler/passes/optimization/collect_1q_runs.py +31 -0
  905. qiskit/transpiler/passes/optimization/collect_2q_blocks.py +35 -0
  906. qiskit/transpiler/passes/optimization/collect_and_collapse.py +115 -0
  907. qiskit/transpiler/passes/optimization/collect_cliffords.py +97 -0
  908. qiskit/transpiler/passes/optimization/collect_linear_functions.py +80 -0
  909. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +227 -0
  910. qiskit/transpiler/passes/optimization/commutation_analysis.py +93 -0
  911. qiskit/transpiler/passes/optimization/commutative_cancellation.py +207 -0
  912. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +97 -0
  913. qiskit/transpiler/passes/optimization/consolidate_blocks.py +219 -0
  914. qiskit/transpiler/passes/optimization/crosstalk_adaptive_schedule.py +732 -0
  915. qiskit/transpiler/passes/optimization/cx_cancellation.py +55 -0
  916. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +160 -0
  917. qiskit/transpiler/passes/optimization/hoare_opt.py +416 -0
  918. qiskit/transpiler/passes/optimization/inverse_cancellation.py +177 -0
  919. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +149 -0
  920. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +268 -0
  921. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +263 -0
  922. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +384 -0
  923. qiskit/transpiler/passes/optimization/optimize_cliffords.py +89 -0
  924. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +71 -0
  925. qiskit/transpiler/passes/optimization/remove_diagonal_gates_before_measure.py +69 -0
  926. qiskit/transpiler/passes/optimization/remove_reset_in_zero_state.py +37 -0
  927. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +47 -0
  928. qiskit/transpiler/passes/optimization/template_matching/__init__.py +19 -0
  929. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +749 -0
  930. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +454 -0
  931. qiskit/transpiler/passes/optimization/template_matching/maximal_matches.py +77 -0
  932. qiskit/transpiler/passes/optimization/template_matching/template_matching.py +370 -0
  933. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +629 -0
  934. qiskit/transpiler/passes/optimization/template_optimization.py +158 -0
  935. qiskit/transpiler/passes/routing/__init__.py +21 -0
  936. qiskit/transpiler/passes/routing/algorithms/__init__.py +33 -0
  937. qiskit/transpiler/passes/routing/algorithms/token_swapper.py +105 -0
  938. qiskit/transpiler/passes/routing/algorithms/types.py +46 -0
  939. qiskit/transpiler/passes/routing/algorithms/util.py +103 -0
  940. qiskit/transpiler/passes/routing/basic_swap.py +155 -0
  941. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/__init__.py +25 -0
  942. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_block.py +60 -0
  943. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +387 -0
  944. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/pauli_2q_evolution_commutation.py +141 -0
  945. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +306 -0
  946. qiskit/transpiler/passes/routing/layout_transformation.py +118 -0
  947. qiskit/transpiler/passes/routing/lookahead_swap.py +384 -0
  948. qiskit/transpiler/passes/routing/sabre_swap.py +430 -0
  949. qiskit/transpiler/passes/routing/stochastic_swap.py +512 -0
  950. qiskit/transpiler/passes/routing/utils.py +35 -0
  951. qiskit/transpiler/passes/scheduling/__init__.py +27 -0
  952. qiskit/transpiler/passes/scheduling/alap.py +155 -0
  953. qiskit/transpiler/passes/scheduling/alignments/__init__.py +81 -0
  954. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +256 -0
  955. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +75 -0
  956. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +97 -0
  957. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +241 -0
  958. qiskit/transpiler/passes/scheduling/asap.py +177 -0
  959. qiskit/transpiler/passes/scheduling/base_scheduler.py +289 -0
  960. qiskit/transpiler/passes/scheduling/calibration_creators.py +27 -0
  961. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +285 -0
  962. qiskit/transpiler/passes/scheduling/padding/__init__.py +16 -0
  963. qiskit/transpiler/passes/scheduling/padding/base_padding.py +256 -0
  964. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +408 -0
  965. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +79 -0
  966. qiskit/transpiler/passes/scheduling/rzx_templates.py +28 -0
  967. qiskit/transpiler/passes/scheduling/scheduling/__init__.py +17 -0
  968. qiskit/transpiler/passes/scheduling/scheduling/alap.py +127 -0
  969. qiskit/transpiler/passes/scheduling/scheduling/asap.py +131 -0
  970. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +89 -0
  971. qiskit/transpiler/passes/scheduling/scheduling/set_io_latency.py +64 -0
  972. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +135 -0
  973. qiskit/transpiler/passes/synthesis/__init__.py +19 -0
  974. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +637 -0
  975. qiskit/transpiler/passes/synthesis/linear_functions_synthesis.py +63 -0
  976. qiskit/transpiler/passes/synthesis/plugin.py +597 -0
  977. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +289 -0
  978. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +895 -0
  979. qiskit/transpiler/passes/utils/__init__.py +34 -0
  980. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +95 -0
  981. qiskit/transpiler/passes/utils/block_to_matrix.py +47 -0
  982. qiskit/transpiler/passes/utils/check_gate_direction.py +87 -0
  983. qiskit/transpiler/passes/utils/check_map.py +94 -0
  984. qiskit/transpiler/passes/utils/contains_instruction.py +45 -0
  985. qiskit/transpiler/passes/utils/control_flow.py +61 -0
  986. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +89 -0
  987. qiskit/transpiler/passes/utils/dag_fixed_point.py +36 -0
  988. qiskit/transpiler/passes/utils/error.py +69 -0
  989. qiskit/transpiler/passes/utils/filter_op_nodes.py +65 -0
  990. qiskit/transpiler/passes/utils/fixed_point.py +48 -0
  991. qiskit/transpiler/passes/utils/gate_direction.py +347 -0
  992. qiskit/transpiler/passes/utils/gates_basis.py +75 -0
  993. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +162 -0
  994. qiskit/transpiler/passes/utils/minimum_point.py +118 -0
  995. qiskit/transpiler/passes/utils/remove_barriers.py +49 -0
  996. qiskit/transpiler/passes/utils/remove_final_measurements.py +114 -0
  997. qiskit/transpiler/passes/utils/unroll_forloops.py +81 -0
  998. qiskit/transpiler/passmanager.py +617 -0
  999. qiskit/transpiler/passmanager_config.py +193 -0
  1000. qiskit/transpiler/preset_passmanagers/__init__.py +280 -0
  1001. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +971 -0
  1002. qiskit/transpiler/preset_passmanagers/common.py +651 -0
  1003. qiskit/transpiler/preset_passmanagers/level0.py +113 -0
  1004. qiskit/transpiler/preset_passmanagers/level1.py +120 -0
  1005. qiskit/transpiler/preset_passmanagers/level2.py +119 -0
  1006. qiskit/transpiler/preset_passmanagers/level3.py +119 -0
  1007. qiskit/transpiler/preset_passmanagers/plugin.py +345 -0
  1008. qiskit/transpiler/propertyset.py +19 -0
  1009. qiskit/transpiler/runningpassmanager.py +174 -0
  1010. qiskit/transpiler/synthesis/__init__.py +16 -0
  1011. qiskit/transpiler/synthesis/aqc/__init__.py +178 -0
  1012. qiskit/transpiler/synthesis/aqc/approximate.py +116 -0
  1013. qiskit/transpiler/synthesis/aqc/aqc.py +170 -0
  1014. qiskit/transpiler/synthesis/aqc/aqc_plugin.py +146 -0
  1015. qiskit/transpiler/synthesis/aqc/cnot_structures.py +299 -0
  1016. qiskit/transpiler/synthesis/aqc/cnot_unit_circuit.py +103 -0
  1017. qiskit/transpiler/synthesis/aqc/cnot_unit_objective.py +299 -0
  1018. qiskit/transpiler/synthesis/aqc/elementary_operations.py +108 -0
  1019. qiskit/transpiler/synthesis/aqc/fast_gradient/__init__.py +164 -0
  1020. qiskit/transpiler/synthesis/aqc/fast_gradient/fast_grad_utils.py +237 -0
  1021. qiskit/transpiler/synthesis/aqc/fast_gradient/fast_gradient.py +225 -0
  1022. qiskit/transpiler/synthesis/aqc/fast_gradient/layer.py +370 -0
  1023. qiskit/transpiler/synthesis/aqc/fast_gradient/pmatrix.py +312 -0
  1024. qiskit/transpiler/synthesis/graysynth.py +114 -0
  1025. qiskit/transpiler/target.py +1540 -0
  1026. qiskit/transpiler/timing_constraints.py +59 -0
  1027. qiskit/user_config.py +239 -0
  1028. qiskit/utils/__init__.py +66 -0
  1029. qiskit/utils/classtools.py +146 -0
  1030. qiskit/utils/deprecation.py +489 -0
  1031. qiskit/utils/lazy_tester.py +334 -0
  1032. qiskit/utils/multiprocessing.py +48 -0
  1033. qiskit/utils/optionals.py +320 -0
  1034. qiskit/utils/units.py +143 -0
  1035. qiskit/version.py +84 -0
  1036. qiskit/visualization/__init__.py +289 -0
  1037. qiskit/visualization/array.py +204 -0
  1038. qiskit/visualization/bloch.py +741 -0
  1039. qiskit/visualization/circuit/__init__.py +15 -0
  1040. qiskit/visualization/circuit/_utils.py +633 -0
  1041. qiskit/visualization/circuit/circuit_visualization.py +717 -0
  1042. qiskit/visualization/circuit/latex.py +659 -0
  1043. qiskit/visualization/circuit/matplotlib.py +1975 -0
  1044. qiskit/visualization/circuit/qcstyle.py +420 -0
  1045. qiskit/visualization/circuit/styles/bw.json +202 -0
  1046. qiskit/visualization/circuit/styles/clifford.json +202 -0
  1047. qiskit/visualization/circuit/styles/iqp-dark.json +214 -0
  1048. qiskit/visualization/circuit/styles/iqp.json +214 -0
  1049. qiskit/visualization/circuit/styles/textbook.json +202 -0
  1050. qiskit/visualization/circuit/text.py +1802 -0
  1051. qiskit/visualization/circuit_visualization.py +19 -0
  1052. qiskit/visualization/counts_visualization.py +496 -0
  1053. qiskit/visualization/dag_visualization.py +224 -0
  1054. qiskit/visualization/exceptions.py +21 -0
  1055. qiskit/visualization/gate_map.py +1461 -0
  1056. qiskit/visualization/pass_manager_visualization.py +281 -0
  1057. qiskit/visualization/pulse_v2/__init__.py +21 -0
  1058. qiskit/visualization/pulse_v2/core.py +905 -0
  1059. qiskit/visualization/pulse_v2/device_info.py +146 -0
  1060. qiskit/visualization/pulse_v2/drawings.py +253 -0
  1061. qiskit/visualization/pulse_v2/events.py +254 -0
  1062. qiskit/visualization/pulse_v2/generators/__init__.py +40 -0
  1063. qiskit/visualization/pulse_v2/generators/barrier.py +76 -0
  1064. qiskit/visualization/pulse_v2/generators/chart.py +208 -0
  1065. qiskit/visualization/pulse_v2/generators/frame.py +437 -0
  1066. qiskit/visualization/pulse_v2/generators/snapshot.py +133 -0
  1067. qiskit/visualization/pulse_v2/generators/waveform.py +649 -0
  1068. qiskit/visualization/pulse_v2/interface.py +452 -0
  1069. qiskit/visualization/pulse_v2/layouts.py +395 -0
  1070. qiskit/visualization/pulse_v2/plotters/__init__.py +17 -0
  1071. qiskit/visualization/pulse_v2/plotters/base_plotter.py +53 -0
  1072. qiskit/visualization/pulse_v2/plotters/matplotlib.py +202 -0
  1073. qiskit/visualization/pulse_v2/stylesheet.py +322 -0
  1074. qiskit/visualization/pulse_v2/types.py +242 -0
  1075. qiskit/visualization/qcstyle.py +17 -0
  1076. qiskit/visualization/state_visualization.py +1518 -0
  1077. qiskit/visualization/timeline/__init__.py +21 -0
  1078. qiskit/visualization/timeline/core.py +457 -0
  1079. qiskit/visualization/timeline/drawings.py +260 -0
  1080. qiskit/visualization/timeline/generators.py +506 -0
  1081. qiskit/visualization/timeline/interface.py +414 -0
  1082. qiskit/visualization/timeline/layouts.py +115 -0
  1083. qiskit/visualization/timeline/plotters/__init__.py +16 -0
  1084. qiskit/visualization/timeline/plotters/base_plotter.py +58 -0
  1085. qiskit/visualization/timeline/plotters/matplotlib.py +193 -0
  1086. qiskit/visualization/timeline/stylesheet.py +311 -0
  1087. qiskit/visualization/timeline/types.py +148 -0
  1088. qiskit/visualization/transition_visualization.py +364 -0
  1089. qiskit/visualization/utils.py +49 -0
  1090. qiskit-1.0.0b1.dist-info/LICENSE.txt +203 -0
  1091. qiskit-1.0.0b1.dist-info/METADATA +430 -0
  1092. qiskit-1.0.0b1.dist-info/RECORD +1095 -0
  1093. qiskit-1.0.0b1.dist-info/WHEEL +6 -0
  1094. qiskit-1.0.0b1.dist-info/entry_points.txt +49 -0
  1095. qiskit-1.0.0b1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,1975 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2017, 2018.
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
+ # pylint: disable=invalid-name,inconsistent-return-statements
14
+
15
+ """mpl circuit visualization backend."""
16
+
17
+ import collections
18
+ import itertools
19
+ import re
20
+ from io import StringIO
21
+
22
+ import numpy as np
23
+
24
+ from qiskit.circuit import (
25
+ QuantumCircuit,
26
+ Qubit,
27
+ Clbit,
28
+ ClassicalRegister,
29
+ ControlledGate,
30
+ Measure,
31
+ ControlFlowOp,
32
+ WhileLoopOp,
33
+ IfElseOp,
34
+ ForLoopOp,
35
+ SwitchCaseOp,
36
+ )
37
+ from qiskit.circuit.controlflow import condition_resources
38
+ from qiskit.circuit.classical import expr
39
+ from qiskit.circuit.library.standard_gates import (
40
+ SwapGate,
41
+ RZZGate,
42
+ U1Gate,
43
+ PhaseGate,
44
+ XGate,
45
+ ZGate,
46
+ )
47
+ from qiskit.qasm3.exporter import QASM3Builder
48
+ from qiskit.qasm3.printer import BasicPrinter
49
+
50
+ from qiskit.extensions import Initialize
51
+ from qiskit.circuit.tools.pi_check import pi_check
52
+ from qiskit.utils import optionals as _optionals
53
+
54
+ from .qcstyle import load_style
55
+ from ._utils import (
56
+ get_gate_ctrl_text,
57
+ get_param_str,
58
+ get_wire_map,
59
+ get_bit_register,
60
+ get_bit_reg_index,
61
+ get_wire_label,
62
+ get_condition_label_val,
63
+ _get_layered_instructions,
64
+ )
65
+ from ..utils import matplotlib_close_if_inline
66
+
67
+ # Default gate width and height
68
+ WID = 0.65
69
+ HIG = 0.65
70
+
71
+ # Z dimension order for different drawing types
72
+ PORDER_REGLINE = 1
73
+ PORDER_FLOW = 3
74
+ PORDER_MASK = 4
75
+ PORDER_LINE = 6
76
+ PORDER_LINE_PLUS = 7
77
+ PORDER_BARRIER = 8
78
+ PORDER_GATE = 10
79
+ PORDER_GATE_PLUS = 11
80
+ PORDER_TEXT = 13
81
+
82
+ INFINITE_FOLD = 10000000
83
+
84
+
85
+ @_optionals.HAS_MATPLOTLIB.require_in_instance
86
+ @_optionals.HAS_PYLATEX.require_in_instance
87
+ class MatplotlibDrawer:
88
+ """Matplotlib drawer class called from circuit_drawer"""
89
+
90
+ _mathmode_regex = re.compile(r"(?<!\\)\$(.*)(?<!\\)\$")
91
+
92
+ def __init__(
93
+ self,
94
+ qubits,
95
+ clbits,
96
+ nodes,
97
+ circuit,
98
+ scale=None,
99
+ style=None,
100
+ reverse_bits=False,
101
+ plot_barriers=True,
102
+ fold=25,
103
+ ax=None,
104
+ initial_state=False,
105
+ cregbundle=None,
106
+ with_layout=False,
107
+ expr_len=30,
108
+ ):
109
+ self._circuit = circuit
110
+ self._qubits = qubits
111
+ self._clbits = clbits
112
+ self._nodes = nodes
113
+ self._scale = 1.0 if scale is None else scale
114
+
115
+ self._style = style
116
+
117
+ self._plot_barriers = plot_barriers
118
+ self._reverse_bits = reverse_bits
119
+ if with_layout:
120
+ if self._circuit._layout:
121
+ self._layout = self._circuit._layout.initial_layout
122
+ else:
123
+ self._layout = None
124
+ else:
125
+ self._layout = None
126
+
127
+ self._fold = fold
128
+ if self._fold < 2:
129
+ self._fold = -1
130
+
131
+ self._ax = ax
132
+
133
+ self._initial_state = initial_state
134
+ self._global_phase = self._circuit.global_phase
135
+ self._calibrations = self._circuit.calibrations
136
+ self._expr_len = expr_len
137
+ self._cregbundle = cregbundle
138
+
139
+ self._lwidth1 = 1.0
140
+ self._lwidth15 = 1.5
141
+ self._lwidth2 = 2.0
142
+ self._lwidth3 = 3.0
143
+ self._lwidth4 = 4.0
144
+
145
+ # Class instances of MatplotlibDrawer for each flow gate - If/Else, For, While, Switch
146
+ self._flow_drawers = {}
147
+
148
+ # Set if gate is inside a flow gate
149
+ self._flow_parent = None
150
+ self._flow_wire_map = {}
151
+
152
+ # _char_list for finding text_width of names, labels, and params
153
+ self._char_list = {
154
+ " ": (0.0958, 0.0583),
155
+ "!": (0.1208, 0.0729),
156
+ '"': (0.1396, 0.0875),
157
+ "#": (0.2521, 0.1562),
158
+ "$": (0.1917, 0.1167),
159
+ "%": (0.2854, 0.1771),
160
+ "&": (0.2333, 0.1458),
161
+ "'": (0.0833, 0.0521),
162
+ "(": (0.1167, 0.0729),
163
+ ")": (0.1167, 0.0729),
164
+ "*": (0.15, 0.0938),
165
+ "+": (0.25, 0.1562),
166
+ ",": (0.0958, 0.0583),
167
+ "-": (0.1083, 0.0667),
168
+ ".": (0.0958, 0.0604),
169
+ "/": (0.1021, 0.0625),
170
+ "0": (0.1875, 0.1167),
171
+ "1": (0.1896, 0.1167),
172
+ "2": (0.1917, 0.1188),
173
+ "3": (0.1917, 0.1167),
174
+ "4": (0.1917, 0.1188),
175
+ "5": (0.1917, 0.1167),
176
+ "6": (0.1896, 0.1167),
177
+ "7": (0.1917, 0.1188),
178
+ "8": (0.1896, 0.1188),
179
+ "9": (0.1917, 0.1188),
180
+ ":": (0.1021, 0.0604),
181
+ ";": (0.1021, 0.0604),
182
+ "<": (0.25, 0.1542),
183
+ "=": (0.25, 0.1562),
184
+ ">": (0.25, 0.1542),
185
+ "?": (0.1583, 0.0979),
186
+ "@": (0.2979, 0.1854),
187
+ "A": (0.2062, 0.1271),
188
+ "B": (0.2042, 0.1271),
189
+ "C": (0.2083, 0.1292),
190
+ "D": (0.2312, 0.1417),
191
+ "E": (0.1875, 0.1167),
192
+ "F": (0.1708, 0.1062),
193
+ "G": (0.2312, 0.1438),
194
+ "H": (0.225, 0.1396),
195
+ "I": (0.0875, 0.0542),
196
+ "J": (0.0875, 0.0542),
197
+ "K": (0.1958, 0.1208),
198
+ "L": (0.1667, 0.1042),
199
+ "M": (0.2583, 0.1604),
200
+ "N": (0.225, 0.1396),
201
+ "O": (0.2354, 0.1458),
202
+ "P": (0.1812, 0.1125),
203
+ "Q": (0.2354, 0.1458),
204
+ "R": (0.2083, 0.1292),
205
+ "S": (0.1896, 0.1188),
206
+ "T": (0.1854, 0.1125),
207
+ "U": (0.2208, 0.1354),
208
+ "V": (0.2062, 0.1271),
209
+ "W": (0.2958, 0.1833),
210
+ "X": (0.2062, 0.1271),
211
+ "Y": (0.1833, 0.1125),
212
+ "Z": (0.2042, 0.1271),
213
+ "[": (0.1167, 0.075),
214
+ "\\": (0.1021, 0.0625),
215
+ "]": (0.1167, 0.0729),
216
+ "^": (0.2521, 0.1562),
217
+ "_": (0.1521, 0.0938),
218
+ "`": (0.15, 0.0938),
219
+ "a": (0.1854, 0.1146),
220
+ "b": (0.1917, 0.1167),
221
+ "c": (0.1646, 0.1021),
222
+ "d": (0.1896, 0.1188),
223
+ "e": (0.1854, 0.1146),
224
+ "f": (0.1042, 0.0667),
225
+ "g": (0.1896, 0.1188),
226
+ "h": (0.1896, 0.1188),
227
+ "i": (0.0854, 0.0521),
228
+ "j": (0.0854, 0.0521),
229
+ "k": (0.1729, 0.1083),
230
+ "l": (0.0854, 0.0521),
231
+ "m": (0.2917, 0.1812),
232
+ "n": (0.1896, 0.1188),
233
+ "o": (0.1833, 0.1125),
234
+ "p": (0.1917, 0.1167),
235
+ "q": (0.1896, 0.1188),
236
+ "r": (0.125, 0.0771),
237
+ "s": (0.1562, 0.0958),
238
+ "t": (0.1167, 0.0729),
239
+ "u": (0.1896, 0.1188),
240
+ "v": (0.1771, 0.1104),
241
+ "w": (0.2458, 0.1521),
242
+ "x": (0.1771, 0.1104),
243
+ "y": (0.1771, 0.1104),
244
+ "z": (0.1562, 0.0979),
245
+ "{": (0.1917, 0.1188),
246
+ "|": (0.1, 0.0604),
247
+ "}": (0.1896, 0.1188),
248
+ }
249
+
250
+ def draw(self, filename=None, verbose=False):
251
+ """Main entry point to 'matplotlib' ('mpl') drawer. Called from
252
+ ``visualization.circuit_drawer`` and from ``QuantumCircuit.draw`` through circuit_drawer.
253
+ """
254
+
255
+ # Import matplotlib and load all the figure, window, and style info
256
+ from matplotlib import patches
257
+ from matplotlib import pyplot as plt
258
+
259
+ # glob_data contains global values used throughout, "n_lines", "x_offset", "next_x_index",
260
+ # "patches_mod", "subfont_factor"
261
+ glob_data = {}
262
+
263
+ glob_data["patches_mod"] = patches
264
+ plt_mod = plt
265
+
266
+ self._style, def_font_ratio = load_style(self._style)
267
+
268
+ # If font/subfont ratio changes from default, have to scale width calculations for
269
+ # subfont. Font change is auto scaled in the mpl_figure.set_size_inches call in draw()
270
+ glob_data["subfont_factor"] = self._style["sfs"] * def_font_ratio / self._style["fs"]
271
+
272
+ # if no user ax, setup default figure. Else use the user figure.
273
+ if self._ax is None:
274
+ is_user_ax = False
275
+ mpl_figure = plt.figure()
276
+ mpl_figure.patch.set_facecolor(color=self._style["bg"])
277
+ self._ax = mpl_figure.add_subplot(111)
278
+ else:
279
+ is_user_ax = True
280
+ mpl_figure = self._ax.get_figure()
281
+ self._ax.axis("off")
282
+ self._ax.set_aspect("equal")
283
+ self._ax.tick_params(labelbottom=False, labeltop=False, labelleft=False, labelright=False)
284
+
285
+ # All information for the drawing is first loaded into node_data for the gates and into
286
+ # qubits_dict, clbits_dict, and wire_map for the qubits, clbits, and wires,
287
+ # followed by the coordinates for each gate.
288
+
289
+ # load the wire map
290
+ wire_map = get_wire_map(self._circuit, self._qubits + self._clbits, self._cregbundle)
291
+
292
+ # node_data per node filled with class NodeData attributes
293
+ node_data = {}
294
+
295
+ # dicts for the names and locations of register/bit labels
296
+ qubits_dict = {}
297
+ clbits_dict = {}
298
+
299
+ # load the _qubit_dict and _clbit_dict with register info
300
+ self._set_bit_reg_info(wire_map, qubits_dict, clbits_dict, glob_data)
301
+
302
+ # get layer widths - flow gates are initialized here
303
+ layer_widths = self._get_layer_widths(node_data, wire_map, self._circuit, glob_data)
304
+
305
+ # load the coordinates for each top level gate and compute number of folds.
306
+ # coordinates for flow gates are loaded before draw_ops
307
+ max_x_index = self._get_coords(
308
+ node_data, wire_map, self._circuit, layer_widths, qubits_dict, clbits_dict, glob_data
309
+ )
310
+ num_folds = max(0, max_x_index - 1) // self._fold if self._fold > 0 else 0
311
+
312
+ # The window size limits are computed, followed by one of the four possible ways
313
+ # of scaling the drawing.
314
+
315
+ # compute the window size
316
+ if max_x_index > self._fold > 0:
317
+ xmax = self._fold + glob_data["x_offset"] + 0.1
318
+ ymax = (num_folds + 1) * (glob_data["n_lines"] + 1) - 1
319
+ else:
320
+ x_incr = 0.4 if not self._nodes else 0.9
321
+ xmax = max_x_index + 1 + glob_data["x_offset"] - x_incr
322
+ ymax = glob_data["n_lines"]
323
+
324
+ xl = -self._style["margin"][0]
325
+ xr = xmax + self._style["margin"][1]
326
+ yb = -ymax - self._style["margin"][2] + 0.5
327
+ yt = self._style["margin"][3] + 0.5
328
+ self._ax.set_xlim(xl, xr)
329
+ self._ax.set_ylim(yb, yt)
330
+
331
+ # update figure size and, for backward compatibility,
332
+ # need to scale by a default value equal to (self._style["fs"] * 3.01 / 72 / 0.65)
333
+ base_fig_w = (xr - xl) * 0.8361111
334
+ base_fig_h = (yt - yb) * 0.8361111
335
+ scale = self._scale
336
+
337
+ # if user passes in an ax, this size takes priority over any other settings
338
+ if is_user_ax:
339
+ # from stackoverflow #19306510, get the bbox size for the ax and then reset scale
340
+ bbox = self._ax.get_window_extent().transformed(mpl_figure.dpi_scale_trans.inverted())
341
+ scale = bbox.width / base_fig_w / 0.8361111
342
+
343
+ # if scale not 1.0, use this scale factor
344
+ elif self._scale != 1.0:
345
+ mpl_figure.set_size_inches(base_fig_w * self._scale, base_fig_h * self._scale)
346
+
347
+ # if "figwidth" style param set, use this to scale
348
+ elif self._style["figwidth"] > 0.0:
349
+ # in order to get actual inches, need to scale by factor
350
+ adj_fig_w = self._style["figwidth"] * 1.282736
351
+ mpl_figure.set_size_inches(adj_fig_w, adj_fig_w * base_fig_h / base_fig_w)
352
+ scale = adj_fig_w / base_fig_w
353
+
354
+ # otherwise, display default size
355
+ else:
356
+ mpl_figure.set_size_inches(base_fig_w, base_fig_h)
357
+
358
+ # drawing will scale with 'set_size_inches', but fonts and linewidths do not
359
+ if scale != 1.0:
360
+ self._style["fs"] *= scale
361
+ self._style["sfs"] *= scale
362
+ self._lwidth1 = 1.0 * scale
363
+ self._lwidth15 = 1.5 * scale
364
+ self._lwidth2 = 2.0 * scale
365
+ self._lwidth3 = 3.0 * scale
366
+ self._lwidth4 = 4.0 * scale
367
+
368
+ # Once the scaling factor has been determined, the global phase, register names
369
+ # and numbers, wires, and gates are drawn
370
+ if self._global_phase:
371
+ plt_mod.text(xl, yt, "Global Phase: %s" % pi_check(self._global_phase, output="mpl"))
372
+ self._draw_regs_wires(num_folds, xmax, max_x_index, qubits_dict, clbits_dict, glob_data)
373
+ self._draw_ops(
374
+ self._nodes,
375
+ node_data,
376
+ wire_map,
377
+ self._circuit,
378
+ layer_widths,
379
+ qubits_dict,
380
+ clbits_dict,
381
+ glob_data,
382
+ verbose,
383
+ )
384
+ if filename:
385
+ mpl_figure.savefig(
386
+ filename,
387
+ dpi=self._style["dpi"],
388
+ bbox_inches="tight",
389
+ facecolor=mpl_figure.get_facecolor(),
390
+ )
391
+ if not is_user_ax:
392
+ matplotlib_close_if_inline(mpl_figure)
393
+ return mpl_figure
394
+
395
+ def _get_layer_widths(self, node_data, wire_map, outer_circuit, glob_data, builder=None):
396
+ """Compute the layer_widths for the layers"""
397
+
398
+ layer_widths = {}
399
+ for layer_num, layer in enumerate(self._nodes):
400
+ widest_box = WID
401
+ for i, node in enumerate(layer):
402
+ # Put the layer_num in the first node in the layer and put -1 in the rest
403
+ # so that layer widths are not counted more than once
404
+ if i != 0:
405
+ layer_num = -1
406
+ layer_widths[node] = [1, layer_num, self._flow_parent]
407
+
408
+ op = node.op
409
+ node_data[node] = NodeData()
410
+ node_data[node].width = WID
411
+ num_ctrl_qubits = getattr(op, "num_ctrl_qubits", 0)
412
+ if (
413
+ getattr(op, "_directive", False) and (not op.label or not self._plot_barriers)
414
+ ) or isinstance(op, Measure):
415
+ node_data[node].raw_gate_text = op.name
416
+ continue
417
+
418
+ base_type = getattr(op, "base_gate", None)
419
+ gate_text, ctrl_text, raw_gate_text = get_gate_ctrl_text(
420
+ op, "mpl", style=self._style, calibrations=self._calibrations
421
+ )
422
+ node_data[node].gate_text = gate_text
423
+ node_data[node].ctrl_text = ctrl_text
424
+ node_data[node].raw_gate_text = raw_gate_text
425
+ node_data[node].param_text = ""
426
+
427
+ # if single qubit, no params, and no labels, layer_width is 1
428
+ if (
429
+ (len(node.qargs) - num_ctrl_qubits) == 1
430
+ and len(gate_text) < 3
431
+ and len(getattr(op, "params", [])) == 0
432
+ and ctrl_text is None
433
+ ):
434
+ continue
435
+
436
+ if isinstance(op, SwapGate) or isinstance(base_type, SwapGate):
437
+ continue
438
+
439
+ # small increments at end of the 3 _get_text_width calls are for small
440
+ # spacing adjustments between gates
441
+ ctrl_width = (
442
+ self._get_text_width(ctrl_text, glob_data, fontsize=self._style["sfs"]) - 0.05
443
+ )
444
+ # get param_width, but 0 for gates with array params or circuits in params
445
+ if (
446
+ len(getattr(op, "params", [])) > 0
447
+ and not any(isinstance(param, np.ndarray) for param in op.params)
448
+ and not any(isinstance(param, QuantumCircuit) for param in op.params)
449
+ ):
450
+ param_text = get_param_str(op, "mpl", ndigits=3)
451
+ if isinstance(op, Initialize):
452
+ param_text = f"$[{param_text.replace('$', '')}]$"
453
+ node_data[node].param_text = param_text
454
+ raw_param_width = self._get_text_width(
455
+ param_text, glob_data, fontsize=self._style["sfs"], param=True
456
+ )
457
+ param_width = raw_param_width + 0.08
458
+ else:
459
+ param_width = raw_param_width = 0.0
460
+
461
+ # get gate_width for sidetext symmetric gates
462
+ if isinstance(op, RZZGate) or isinstance(base_type, (U1Gate, PhaseGate, RZZGate)):
463
+ if isinstance(base_type, PhaseGate):
464
+ gate_text = "P"
465
+ raw_gate_width = (
466
+ self._get_text_width(
467
+ gate_text + " ()", glob_data, fontsize=self._style["sfs"]
468
+ )
469
+ + raw_param_width
470
+ )
471
+ gate_width = (raw_gate_width + 0.08) * 1.58
472
+
473
+ # Check if a ControlFlowOp - node_data load for these gates is done here
474
+ elif isinstance(node.op, ControlFlowOp):
475
+ self._flow_drawers[node] = []
476
+ node_data[node].width = []
477
+ node_data[node].nest_depth = 0
478
+ gate_width = 0.0
479
+ expr_width = 0.0
480
+
481
+ if (isinstance(op, SwitchCaseOp) and isinstance(op.target, expr.Expr)) or (
482
+ getattr(op, "condition", None) and isinstance(op.condition, expr.Expr)
483
+ ):
484
+ condition = op.target if isinstance(op, SwitchCaseOp) else op.condition
485
+ if builder is None:
486
+ builder = QASM3Builder(
487
+ outer_circuit,
488
+ includeslist=("stdgates.inc",),
489
+ basis_gates=("U",),
490
+ disable_constants=False,
491
+ allow_aliasing=False,
492
+ )
493
+ builder.build_classical_declarations()
494
+ stream = StringIO()
495
+ BasicPrinter(stream, indent=" ").visit(builder.build_expression(condition))
496
+ expr_text = stream.getvalue()
497
+ # Truncate expr_text so that first gate is no more than about 3 x_index's over
498
+ if len(expr_text) > self._expr_len:
499
+ expr_text = expr_text[: self._expr_len] + "..."
500
+ node_data[node].expr_text = expr_text
501
+
502
+ expr_width = self._get_text_width(
503
+ node_data[node].expr_text, glob_data, fontsize=self._style["sfs"]
504
+ )
505
+ node_data[node].expr_width = int(expr_width)
506
+
507
+ # Get the list of circuits to iterate over from the blocks
508
+ circuit_list = list(node.op.blocks)
509
+
510
+ # params is [indexset, loop_param, circuit] for for_loop,
511
+ # op.cases_specifier() returns jump tuple and circuit for switch/case
512
+ if isinstance(op, ForLoopOp):
513
+ node_data[node].indexset = op.params[0]
514
+ elif isinstance(op, SwitchCaseOp):
515
+ node_data[node].jump_values = []
516
+ cases = list(op.cases_specifier())
517
+
518
+ # Create an empty circuit at the head of the circuit_list if a Switch box
519
+ circuit_list.insert(0, cases[0][1].copy_empty_like())
520
+ for jump_values, _ in cases:
521
+ node_data[node].jump_values.append(jump_values)
522
+
523
+ # Now process the circuits inside the ControlFlowOps
524
+ for circ_num, circuit in enumerate(circuit_list):
525
+ # Only add expr_width for if, while, and switch
526
+ raw_gate_width = expr_width if circ_num == 0 else 0.0
527
+
528
+ # Depth of nested ControlFlowOp used for color of box
529
+ if self._flow_parent is not None:
530
+ node_data[node].nest_depth = node_data[self._flow_parent].nest_depth + 1
531
+
532
+ # Build the wire_map to be used by this flow op
533
+ flow_wire_map = wire_map.copy()
534
+ flow_wire_map.update(
535
+ {
536
+ inner: wire_map[outer]
537
+ for outer, inner in zip(node.qargs, circuit.qubits)
538
+ }
539
+ )
540
+ for outer, inner in zip(node.cargs, circuit.clbits):
541
+ if self._cregbundle and (
542
+ (in_reg := get_bit_register(outer_circuit, inner)) is not None
543
+ ):
544
+ out_reg = get_bit_register(outer_circuit, outer)
545
+ flow_wire_map.update({in_reg: wire_map[out_reg]})
546
+ else:
547
+ flow_wire_map.update({inner: wire_map[outer]})
548
+
549
+ # Get the layered node lists and instantiate a new drawer class for
550
+ # the circuit inside the ControlFlowOp.
551
+ qubits, clbits, flow_nodes = _get_layered_instructions(
552
+ circuit, wire_map=flow_wire_map
553
+ )
554
+ flow_drawer = MatplotlibDrawer(
555
+ qubits,
556
+ clbits,
557
+ flow_nodes,
558
+ circuit,
559
+ style=self._style,
560
+ plot_barriers=self._plot_barriers,
561
+ fold=self._fold,
562
+ cregbundle=self._cregbundle,
563
+ )
564
+
565
+ # flow_parent is the parent of the new class instance
566
+ flow_drawer._flow_parent = node
567
+ flow_drawer._flow_wire_map = flow_wire_map
568
+ self._flow_drawers[node].append(flow_drawer)
569
+
570
+ # Recursively call _get_layer_widths for the circuit inside the ControlFlowOp
571
+ flow_widths = flow_drawer._get_layer_widths(
572
+ node_data, flow_wire_map, outer_circuit, glob_data, builder
573
+ )
574
+ layer_widths.update(flow_widths)
575
+
576
+ for flow_layer in flow_nodes:
577
+ for flow_node in flow_layer:
578
+ node_data[flow_node].circ_num = circ_num
579
+
580
+ # Add up the width values of the same flow_parent that are not -1
581
+ # to get the raw_gate_width
582
+ for width, layer_num, flow_parent in flow_widths.values():
583
+ if layer_num != -1 and flow_parent == flow_drawer._flow_parent:
584
+ raw_gate_width += width
585
+
586
+ # Need extra incr of 1.0 for else and case boxes
587
+ gate_width += raw_gate_width + (1.0 if circ_num > 0 else 0.0)
588
+
589
+ # Minor adjustment so else and case section gates align with indexes
590
+ if circ_num > 0:
591
+ raw_gate_width += 0.045
592
+
593
+ # If expr_width has a value, remove the decimal portion from raw_gate_widthl
594
+ if not isinstance(op, ForLoopOp) and circ_num == 0:
595
+ node_data[node].width.append(raw_gate_width - (expr_width % 1))
596
+ else:
597
+ node_data[node].width.append(raw_gate_width)
598
+
599
+ # Otherwise, standard gate or multiqubit gate
600
+ else:
601
+ raw_gate_width = self._get_text_width(
602
+ gate_text, glob_data, fontsize=self._style["fs"]
603
+ )
604
+ gate_width = raw_gate_width + 0.10
605
+ # add .21 for the qubit numbers on the left of the multibit gates
606
+ if len(node.qargs) - num_ctrl_qubits > 1:
607
+ gate_width += 0.21
608
+
609
+ box_width = max(gate_width, ctrl_width, param_width, WID)
610
+ if box_width > widest_box:
611
+ widest_box = box_width
612
+ if not isinstance(node.op, ControlFlowOp):
613
+ node_data[node].width = max(raw_gate_width, raw_param_width)
614
+ for node in layer:
615
+ layer_widths[node][0] = int(widest_box) + 1
616
+
617
+ return layer_widths
618
+
619
+ def _set_bit_reg_info(self, wire_map, qubits_dict, clbits_dict, glob_data):
620
+ """Get all the info for drawing bit/reg names and numbers"""
621
+
622
+ longest_wire_label_width = 0
623
+ glob_data["n_lines"] = 0
624
+ initial_qbit = " |0>" if self._initial_state else ""
625
+ initial_cbit = " 0" if self._initial_state else ""
626
+
627
+ idx = 0
628
+ pos = y_off = -len(self._qubits) + 1
629
+ for ii, wire in enumerate(wire_map):
630
+
631
+ # if it's a creg, register is the key and just load the index
632
+ if isinstance(wire, ClassicalRegister):
633
+ # If wire came from ControlFlowOp and not in clbits, don't draw it
634
+ if wire[0] not in self._clbits:
635
+ continue
636
+ register = wire
637
+ index = wire_map[wire]
638
+
639
+ # otherwise, get the register from find_bit and use bit_index if
640
+ # it's a bit, or the index of the bit in the register if it's a reg
641
+ else:
642
+ # If wire came from ControlFlowOp and not in qubits or clbits, don't draw it
643
+ if wire not in self._qubits + self._clbits:
644
+ continue
645
+ register, bit_index, reg_index = get_bit_reg_index(self._circuit, wire)
646
+ index = bit_index if register is None else reg_index
647
+
648
+ wire_label = get_wire_label(
649
+ "mpl", register, index, layout=self._layout, cregbundle=self._cregbundle
650
+ )
651
+ initial_bit = initial_qbit if isinstance(wire, Qubit) else initial_cbit
652
+
653
+ # for cregs with cregbundle on, don't use math formatting, which means
654
+ # no italics
655
+ if isinstance(wire, Qubit) or register is None or not self._cregbundle:
656
+ wire_label = "$" + wire_label + "$"
657
+ wire_label += initial_bit
658
+
659
+ reg_size = (
660
+ 0 if register is None or isinstance(wire, ClassicalRegister) else register.size
661
+ )
662
+ reg_remove_under = 0 if reg_size < 2 else 1
663
+ text_width = (
664
+ self._get_text_width(
665
+ wire_label, glob_data, self._style["fs"], reg_remove_under=reg_remove_under
666
+ )
667
+ * 1.15
668
+ )
669
+ if text_width > longest_wire_label_width:
670
+ longest_wire_label_width = text_width
671
+
672
+ if isinstance(wire, Qubit):
673
+ pos = -ii
674
+ qubits_dict[ii] = {
675
+ "y": pos,
676
+ "wire_label": wire_label,
677
+ }
678
+ glob_data["n_lines"] += 1
679
+ else:
680
+ if (
681
+ not self._cregbundle
682
+ or register is None
683
+ or (self._cregbundle and isinstance(wire, ClassicalRegister))
684
+ ):
685
+ glob_data["n_lines"] += 1
686
+ idx += 1
687
+
688
+ pos = y_off - idx
689
+ clbits_dict[ii] = {
690
+ "y": pos,
691
+ "wire_label": wire_label,
692
+ "register": register,
693
+ }
694
+ glob_data["x_offset"] = -1.2 + longest_wire_label_width
695
+
696
+ def _get_coords(
697
+ self,
698
+ node_data,
699
+ wire_map,
700
+ outer_circuit,
701
+ layer_widths,
702
+ qubits_dict,
703
+ clbits_dict,
704
+ glob_data,
705
+ flow_parent=None,
706
+ ):
707
+ """Load all the coordinate info needed to place the gates on the drawing."""
708
+
709
+ prev_x_index = -1
710
+ for layer in self._nodes:
711
+ curr_x_index = prev_x_index + 1
712
+ l_width = []
713
+ for node in layer:
714
+ # For gates inside a flow op set the x_index and if it's an else or case,
715
+ # increment by if/switch width. If more cases increment by width of previous cases.
716
+ if flow_parent is not None:
717
+ node_data[node].inside_flow = True
718
+ node_data[node].x_index = node_data[flow_parent].x_index + curr_x_index + 1
719
+ # If an else or case
720
+ if node_data[node].circ_num > 0:
721
+ for width in node_data[flow_parent].width[: node_data[node].circ_num]:
722
+ node_data[node].x_index += int(width) + 1
723
+ x_index = node_data[node].x_index
724
+ # Add expr_width to if, while, or switch if expr used
725
+ else:
726
+ x_index = node_data[node].x_index + node_data[flow_parent].expr_width
727
+ else:
728
+ node_data[node].inside_flow = False
729
+ x_index = curr_x_index
730
+
731
+ # get qubit indexes
732
+ q_indxs = []
733
+ for qarg in node.qargs:
734
+ if qarg in self._qubits:
735
+ q_indxs.append(wire_map[qarg])
736
+
737
+ # get clbit indexes
738
+ c_indxs = []
739
+ for carg in node.cargs:
740
+ if carg in self._clbits:
741
+ if self._cregbundle:
742
+ register = get_bit_register(outer_circuit, carg)
743
+ if register is not None:
744
+ c_indxs.append(wire_map[register])
745
+ else:
746
+ c_indxs.append(wire_map[carg])
747
+ else:
748
+ c_indxs.append(wire_map[carg])
749
+
750
+ flow_op = isinstance(node.op, ControlFlowOp)
751
+
752
+ # qubit coordinates
753
+ node_data[node].q_xy = [
754
+ self._plot_coord(
755
+ x_index,
756
+ qubits_dict[ii]["y"],
757
+ layer_widths[node][0],
758
+ glob_data,
759
+ flow_op,
760
+ )
761
+ for ii in q_indxs
762
+ ]
763
+ # clbit coordinates
764
+ node_data[node].c_xy = [
765
+ self._plot_coord(
766
+ x_index,
767
+ clbits_dict[ii]["y"],
768
+ layer_widths[node][0],
769
+ glob_data,
770
+ flow_op,
771
+ )
772
+ for ii in c_indxs
773
+ ]
774
+
775
+ # update index based on the value from plotting
776
+ if flow_parent is None:
777
+ curr_x_index = glob_data["next_x_index"]
778
+ l_width.append(layer_widths[node][0])
779
+ node_data[node].x_index = x_index
780
+
781
+ # adjust the column if there have been barriers encountered, but not plotted
782
+ barrier_offset = 0
783
+ if not self._plot_barriers:
784
+ # only adjust if everything in the layer wasn't plotted
785
+ barrier_offset = (
786
+ -1 if all(getattr(nd.op, "_directive", False) for nd in layer) else 0
787
+ )
788
+ prev_x_index = curr_x_index + max(l_width) + barrier_offset - 1
789
+
790
+ return prev_x_index + 1
791
+
792
+ def _get_text_width(self, text, glob_data, fontsize, param=False, reg_remove_under=None):
793
+ """Compute the width of a string in the default font"""
794
+
795
+ from pylatexenc.latex2text import LatexNodes2Text
796
+
797
+ if not text:
798
+ return 0.0
799
+
800
+ math_mode_match = self._mathmode_regex.search(text)
801
+ num_underscores = 0
802
+ num_carets = 0
803
+ if math_mode_match:
804
+ math_mode_text = math_mode_match.group(1)
805
+ num_underscores = math_mode_text.count("_")
806
+ num_carets = math_mode_text.count("^")
807
+ text = LatexNodes2Text().latex_to_text(text.replace("$$", ""))
808
+
809
+ # If there are subscripts or superscripts in mathtext string
810
+ # we need to account for that spacing by manually removing
811
+ # from text string for text length
812
+
813
+ # if it's a register and there's a subscript at the end,
814
+ # remove 1 underscore, otherwise don't remove any
815
+ if reg_remove_under is not None:
816
+ num_underscores = reg_remove_under
817
+ if num_underscores:
818
+ text = text.replace("_", "", num_underscores)
819
+ if num_carets:
820
+ text = text.replace("^", "", num_carets)
821
+
822
+ # This changes hyphen to + to match width of math mode minus sign.
823
+ if param:
824
+ text = text.replace("-", "+")
825
+
826
+ f = 0 if fontsize == self._style["fs"] else 1
827
+ sum_text = 0.0
828
+ for c in text:
829
+ try:
830
+ sum_text += self._char_list[c][f]
831
+ except KeyError:
832
+ # if non-ASCII char, use width of 'c', an average size
833
+ sum_text += self._char_list["c"][f]
834
+ if f == 1:
835
+ sum_text *= glob_data["subfont_factor"]
836
+ return sum_text
837
+
838
+ def _draw_regs_wires(self, num_folds, xmax, max_x_index, qubits_dict, clbits_dict, glob_data):
839
+ """Draw the register names and numbers, wires, and vertical lines at the ends"""
840
+
841
+ for fold_num in range(num_folds + 1):
842
+ # quantum registers
843
+ for qubit in qubits_dict.values():
844
+ qubit_label = qubit["wire_label"]
845
+ y = qubit["y"] - fold_num * (glob_data["n_lines"] + 1)
846
+ self._ax.text(
847
+ glob_data["x_offset"] - 0.2,
848
+ y,
849
+ qubit_label,
850
+ ha="right",
851
+ va="center",
852
+ fontsize=1.25 * self._style["fs"],
853
+ color=self._style["tc"],
854
+ clip_on=True,
855
+ zorder=PORDER_TEXT,
856
+ )
857
+ # draw the qubit wire
858
+ self._line([glob_data["x_offset"], y], [xmax, y], zorder=PORDER_REGLINE)
859
+
860
+ # classical registers
861
+ this_clbit_dict = {}
862
+ for clbit in clbits_dict.values():
863
+ y = clbit["y"] - fold_num * (glob_data["n_lines"] + 1)
864
+ if y not in this_clbit_dict.keys():
865
+ this_clbit_dict[y] = {
866
+ "val": 1,
867
+ "wire_label": clbit["wire_label"],
868
+ "register": clbit["register"],
869
+ }
870
+ else:
871
+ this_clbit_dict[y]["val"] += 1
872
+
873
+ for y, this_clbit in this_clbit_dict.items():
874
+ # cregbundle
875
+ if self._cregbundle and this_clbit["register"] is not None:
876
+ self._ax.plot(
877
+ [glob_data["x_offset"] + 0.2, glob_data["x_offset"] + 0.3],
878
+ [y - 0.1, y + 0.1],
879
+ color=self._style["cc"],
880
+ zorder=PORDER_REGLINE,
881
+ )
882
+ self._ax.text(
883
+ glob_data["x_offset"] + 0.1,
884
+ y + 0.1,
885
+ str(this_clbit["register"].size),
886
+ ha="left",
887
+ va="bottom",
888
+ fontsize=0.8 * self._style["fs"],
889
+ color=self._style["tc"],
890
+ clip_on=True,
891
+ zorder=PORDER_TEXT,
892
+ )
893
+ self._ax.text(
894
+ glob_data["x_offset"] - 0.2,
895
+ y,
896
+ this_clbit["wire_label"],
897
+ ha="right",
898
+ va="center",
899
+ fontsize=1.25 * self._style["fs"],
900
+ color=self._style["tc"],
901
+ clip_on=True,
902
+ zorder=PORDER_TEXT,
903
+ )
904
+ # draw the clbit wire
905
+ self._line(
906
+ [glob_data["x_offset"], y],
907
+ [xmax, y],
908
+ lc=self._style["cc"],
909
+ ls=self._style["cline"],
910
+ zorder=PORDER_REGLINE,
911
+ )
912
+
913
+ # lf vertical line at either end
914
+ feedline_r = num_folds > 0 and num_folds > fold_num
915
+ feedline_l = fold_num > 0
916
+ if feedline_l or feedline_r:
917
+ xpos_l = glob_data["x_offset"] - 0.01
918
+ xpos_r = self._fold + glob_data["x_offset"] + 0.1
919
+ ypos1 = -fold_num * (glob_data["n_lines"] + 1)
920
+ ypos2 = -(fold_num + 1) * (glob_data["n_lines"]) - fold_num + 1
921
+ if feedline_l:
922
+ self._ax.plot(
923
+ [xpos_l, xpos_l],
924
+ [ypos1, ypos2],
925
+ color=self._style["lc"],
926
+ linewidth=self._lwidth15,
927
+ zorder=PORDER_REGLINE,
928
+ )
929
+ if feedline_r:
930
+ self._ax.plot(
931
+ [xpos_r, xpos_r],
932
+ [ypos1, ypos2],
933
+ color=self._style["lc"],
934
+ linewidth=self._lwidth15,
935
+ zorder=PORDER_REGLINE,
936
+ )
937
+ # Mask off any lines or boxes in the bit label area to clean up
938
+ # from folding for ControlFlow and other wrapping gates
939
+ box = glob_data["patches_mod"].Rectangle(
940
+ xy=(glob_data["x_offset"] - 0.1, -fold_num * (glob_data["n_lines"] + 1) + 0.5),
941
+ width=-25.0,
942
+ height=-(fold_num + 1) * (glob_data["n_lines"] + 1),
943
+ fc=self._style["bg"],
944
+ ec=self._style["bg"],
945
+ linewidth=self._lwidth15,
946
+ zorder=PORDER_MASK,
947
+ )
948
+ self._ax.add_patch(box)
949
+
950
+ # draw index number
951
+ if self._style["index"]:
952
+ for layer_num in range(max_x_index):
953
+ if self._fold > 0:
954
+ x_coord = layer_num % self._fold + glob_data["x_offset"] + 0.53
955
+ y_coord = -(layer_num // self._fold) * (glob_data["n_lines"] + 1) + 0.65
956
+ else:
957
+ x_coord = layer_num + glob_data["x_offset"] + 0.53
958
+ y_coord = 0.65
959
+ self._ax.text(
960
+ x_coord,
961
+ y_coord,
962
+ str(layer_num + 1),
963
+ ha="center",
964
+ va="center",
965
+ fontsize=self._style["sfs"],
966
+ color=self._style["tc"],
967
+ clip_on=True,
968
+ zorder=PORDER_TEXT,
969
+ )
970
+
971
+ def _add_nodes_and_coords(
972
+ self,
973
+ nodes,
974
+ node_data,
975
+ wire_map,
976
+ outer_circuit,
977
+ layer_widths,
978
+ qubits_dict,
979
+ clbits_dict,
980
+ glob_data,
981
+ ):
982
+ """Add the nodes from ControlFlowOps and their coordinates to the main circuit"""
983
+ for flow_drawers in self._flow_drawers.values():
984
+ for flow_drawer in flow_drawers:
985
+ nodes += flow_drawer._nodes
986
+ flow_drawer._get_coords(
987
+ node_data,
988
+ flow_drawer._flow_wire_map,
989
+ outer_circuit,
990
+ layer_widths,
991
+ qubits_dict,
992
+ clbits_dict,
993
+ glob_data,
994
+ flow_parent=flow_drawer._flow_parent,
995
+ )
996
+ # Recurse for ControlFlowOps inside the flow_drawer
997
+ flow_drawer._add_nodes_and_coords(
998
+ nodes,
999
+ node_data,
1000
+ wire_map,
1001
+ outer_circuit,
1002
+ layer_widths,
1003
+ qubits_dict,
1004
+ clbits_dict,
1005
+ glob_data,
1006
+ )
1007
+
1008
+ def _draw_ops(
1009
+ self,
1010
+ nodes,
1011
+ node_data,
1012
+ wire_map,
1013
+ outer_circuit,
1014
+ layer_widths,
1015
+ qubits_dict,
1016
+ clbits_dict,
1017
+ glob_data,
1018
+ verbose=False,
1019
+ ):
1020
+ """Draw the gates in the circuit"""
1021
+
1022
+ # Add the nodes from all the ControlFlowOps and their coordinates to the main nodes
1023
+ self._add_nodes_and_coords(
1024
+ nodes,
1025
+ node_data,
1026
+ wire_map,
1027
+ outer_circuit,
1028
+ layer_widths,
1029
+ qubits_dict,
1030
+ clbits_dict,
1031
+ glob_data,
1032
+ )
1033
+ prev_x_index = -1
1034
+ for layer in nodes:
1035
+ l_width = []
1036
+ curr_x_index = prev_x_index + 1
1037
+
1038
+ # draw the gates in this layer
1039
+ for node in layer:
1040
+ op = node.op
1041
+
1042
+ self._get_colors(node, node_data)
1043
+
1044
+ if verbose:
1045
+ print(op)
1046
+
1047
+ # add conditional
1048
+ if getattr(op, "condition", None) or isinstance(op, SwitchCaseOp):
1049
+ cond_xy = [
1050
+ self._plot_coord(
1051
+ node_data[node].x_index,
1052
+ clbits_dict[ii]["y"],
1053
+ layer_widths[node][0],
1054
+ glob_data,
1055
+ isinstance(op, ControlFlowOp),
1056
+ )
1057
+ for ii in clbits_dict
1058
+ ]
1059
+ self._condition(node, node_data, wire_map, outer_circuit, cond_xy, glob_data)
1060
+
1061
+ # draw measure
1062
+ if isinstance(op, Measure):
1063
+ self._measure(node, node_data, outer_circuit, glob_data)
1064
+
1065
+ # draw barriers, snapshots, etc.
1066
+ elif getattr(op, "_directive", False):
1067
+ if self._plot_barriers:
1068
+ self._barrier(node, node_data, glob_data)
1069
+
1070
+ # draw the box for control flow circuits
1071
+ elif isinstance(op, ControlFlowOp):
1072
+ self._flow_op_gate(node, node_data, glob_data)
1073
+
1074
+ # draw single qubit gates
1075
+ elif len(node_data[node].q_xy) == 1 and not node.cargs:
1076
+ self._gate(node, node_data, glob_data)
1077
+
1078
+ # draw controlled gates
1079
+ elif isinstance(op, ControlledGate):
1080
+ self._control_gate(node, node_data, glob_data)
1081
+
1082
+ # draw multi-qubit gate as final default
1083
+ else:
1084
+ self._multiqubit_gate(node, node_data, glob_data)
1085
+
1086
+ # Determine the max width of the circuit only at the top level
1087
+ if not node_data[node].inside_flow:
1088
+ l_width.append(layer_widths[node][0])
1089
+
1090
+ # adjust the column if there have been barriers encountered, but not plotted
1091
+ barrier_offset = 0
1092
+ if not self._plot_barriers:
1093
+ # only adjust if everything in the layer wasn't plotted
1094
+ barrier_offset = (
1095
+ -1 if all(getattr(nd.op, "_directive", False) for nd in layer) else 0
1096
+ )
1097
+ prev_x_index = curr_x_index + (max(l_width) if l_width else 0) + barrier_offset - 1
1098
+
1099
+ def _get_colors(self, node, node_data):
1100
+ """Get all the colors needed for drawing the circuit"""
1101
+
1102
+ op = node.op
1103
+ base_name = getattr(getattr(op, "base_gate", None), "name", None)
1104
+ color = None
1105
+ if node_data[node].raw_gate_text in self._style["dispcol"]:
1106
+ color = self._style["dispcol"][node_data[node].raw_gate_text]
1107
+ elif op.name in self._style["dispcol"]:
1108
+ color = self._style["dispcol"][op.name]
1109
+ if color is not None:
1110
+ # Backward compatibility for style dict using 'displaycolor' with
1111
+ # gate color and no text color, so test for str first
1112
+ if isinstance(color, str):
1113
+ fc = color
1114
+ gt = self._style["gt"]
1115
+ else:
1116
+ fc = color[0]
1117
+ gt = color[1]
1118
+ # Treat special case of classical gates in iqx style by making all
1119
+ # controlled gates of x, dcx, and swap the classical gate color
1120
+ elif self._style["name"] in ["iqp", "iqx", "iqp-dark", "iqx-dark"] and base_name in [
1121
+ "x",
1122
+ "dcx",
1123
+ "swap",
1124
+ ]:
1125
+ color = self._style["dispcol"][base_name]
1126
+ if isinstance(color, str):
1127
+ fc = color
1128
+ gt = self._style["gt"]
1129
+ else:
1130
+ fc = color[0]
1131
+ gt = color[1]
1132
+ else:
1133
+ fc = self._style["gc"]
1134
+ gt = self._style["gt"]
1135
+
1136
+ if self._style["name"] == "bw":
1137
+ ec = self._style["ec"]
1138
+ lc = self._style["lc"]
1139
+ else:
1140
+ ec = fc
1141
+ lc = fc
1142
+ # Subtext needs to be same color as gate text
1143
+ sc = gt
1144
+ node_data[node].fc = fc
1145
+ node_data[node].ec = ec
1146
+ node_data[node].gt = gt
1147
+ node_data[node].tc = self._style["tc"]
1148
+ node_data[node].sc = sc
1149
+ node_data[node].lc = lc
1150
+
1151
+ def _condition(self, node, node_data, wire_map, outer_circuit, cond_xy, glob_data):
1152
+ """Add a conditional to a gate"""
1153
+
1154
+ # For SwitchCaseOp convert the target to a fully closed Clbit or register
1155
+ # in condition format
1156
+ if isinstance(node.op, SwitchCaseOp):
1157
+ if isinstance(node.op.target, expr.Expr):
1158
+ condition = node.op.target
1159
+ elif isinstance(node.op.target, Clbit):
1160
+ condition = (node.op.target, 1)
1161
+ else:
1162
+ condition = (node.op.target, 2 ** (node.op.target.size) - 1)
1163
+ else:
1164
+ condition = node.op.condition
1165
+
1166
+ override_fc = False
1167
+ first_clbit = len(self._qubits)
1168
+ cond_pos = []
1169
+
1170
+ if isinstance(condition, expr.Expr):
1171
+
1172
+ # If fixing this, please update the docstrings of `QuantumCircuit.draw` and
1173
+ # `visualization.circuit_drawer` to remove warnings.
1174
+
1175
+ condition_bits = condition_resources(condition).clbits
1176
+ label = "[expr]"
1177
+ override_fc = True
1178
+ registers = collections.defaultdict(list)
1179
+ for bit in condition_bits:
1180
+ registers[get_bit_register(outer_circuit, bit)].append(bit)
1181
+ # Registerless bits don't care whether cregbundle is set.
1182
+ cond_pos.extend(cond_xy[wire_map[bit] - first_clbit] for bit in registers.pop(None, ()))
1183
+ if self._cregbundle:
1184
+ cond_pos.extend(cond_xy[wire_map[register] - first_clbit] for register in registers)
1185
+ else:
1186
+ cond_pos.extend(
1187
+ cond_xy[wire_map[bit] - first_clbit]
1188
+ for bit in itertools.chain.from_iterable(registers.values())
1189
+ )
1190
+ val_bits = ["1"] * len(cond_pos)
1191
+ else:
1192
+ label, val_bits = get_condition_label_val(condition, self._circuit, self._cregbundle)
1193
+ cond_bit_reg = condition[0]
1194
+ cond_bit_val = int(condition[1])
1195
+ override_fc = (
1196
+ cond_bit_val != 0
1197
+ and self._cregbundle
1198
+ and isinstance(cond_bit_reg, ClassicalRegister)
1199
+ )
1200
+
1201
+ # In the first case, multiple bits are indicated on the drawing. In all
1202
+ # other cases, only one bit is shown.
1203
+ if not self._cregbundle and isinstance(cond_bit_reg, ClassicalRegister):
1204
+ for idx in range(cond_bit_reg.size):
1205
+ cond_pos.append(cond_xy[wire_map[cond_bit_reg[idx]] - first_clbit])
1206
+
1207
+ # If it's a register bit and cregbundle, need to use the register to find the location
1208
+ elif self._cregbundle and isinstance(cond_bit_reg, Clbit):
1209
+ register = get_bit_register(outer_circuit, cond_bit_reg)
1210
+ if register is not None:
1211
+ cond_pos.append(cond_xy[wire_map[register] - first_clbit])
1212
+ else:
1213
+ cond_pos.append(cond_xy[wire_map[cond_bit_reg] - first_clbit])
1214
+ else:
1215
+ cond_pos.append(cond_xy[wire_map[cond_bit_reg] - first_clbit])
1216
+
1217
+ xy_plot = []
1218
+ for val_bit, xy in zip(val_bits, cond_pos):
1219
+ fc = self._style["lc"] if override_fc or val_bit == "1" else self._style["bg"]
1220
+ box = glob_data["patches_mod"].Circle(
1221
+ xy=xy,
1222
+ radius=WID * 0.15,
1223
+ fc=fc,
1224
+ ec=self._style["lc"],
1225
+ linewidth=self._lwidth15,
1226
+ zorder=PORDER_GATE,
1227
+ )
1228
+ self._ax.add_patch(box)
1229
+ xy_plot.append(xy)
1230
+
1231
+ qubit_b = min(node_data[node].q_xy, key=lambda xy: xy[1])
1232
+ clbit_b = min(xy_plot, key=lambda xy: xy[1])
1233
+
1234
+ # For IfElseOp, WhileLoopOp or SwitchCaseOp, place the condition line
1235
+ # near the left edge of the box
1236
+ if isinstance(node.op, (IfElseOp, WhileLoopOp, SwitchCaseOp)):
1237
+ qubit_b = (qubit_b[0], qubit_b[1] - (0.5 * HIG + 0.14))
1238
+
1239
+ # display the label at the bottom of the lowest conditional and draw the double line
1240
+ xpos, ypos = clbit_b
1241
+ if isinstance(node.op, Measure):
1242
+ xpos += 0.3
1243
+ self._ax.text(
1244
+ xpos,
1245
+ ypos - 0.3 * HIG,
1246
+ label,
1247
+ ha="center",
1248
+ va="top",
1249
+ fontsize=self._style["sfs"],
1250
+ color=self._style["tc"],
1251
+ clip_on=True,
1252
+ zorder=PORDER_TEXT,
1253
+ )
1254
+ self._line(qubit_b, clbit_b, lc=self._style["cc"], ls=self._style["cline"])
1255
+
1256
+ def _measure(self, node, node_data, outer_circuit, glob_data):
1257
+ """Draw the measure symbol and the line to the clbit"""
1258
+ qx, qy = node_data[node].q_xy[0]
1259
+ cx, cy = node_data[node].c_xy[0]
1260
+ register, _, reg_index = get_bit_reg_index(outer_circuit, node.cargs[0])
1261
+
1262
+ # draw gate box
1263
+ self._gate(node, node_data, glob_data)
1264
+
1265
+ # add measure symbol
1266
+ arc = glob_data["patches_mod"].Arc(
1267
+ xy=(qx, qy - 0.15 * HIG),
1268
+ width=WID * 0.7,
1269
+ height=HIG * 0.7,
1270
+ theta1=0,
1271
+ theta2=180,
1272
+ fill=False,
1273
+ ec=node_data[node].gt,
1274
+ linewidth=self._lwidth2,
1275
+ zorder=PORDER_GATE,
1276
+ )
1277
+ self._ax.add_patch(arc)
1278
+ self._ax.plot(
1279
+ [qx, qx + 0.35 * WID],
1280
+ [qy - 0.15 * HIG, qy + 0.20 * HIG],
1281
+ color=node_data[node].gt,
1282
+ linewidth=self._lwidth2,
1283
+ zorder=PORDER_GATE,
1284
+ )
1285
+ # arrow
1286
+ self._line(
1287
+ node_data[node].q_xy[0],
1288
+ [cx, cy + 0.35 * WID],
1289
+ lc=self._style["cc"],
1290
+ ls=self._style["cline"],
1291
+ )
1292
+ arrowhead = glob_data["patches_mod"].Polygon(
1293
+ (
1294
+ (cx - 0.20 * WID, cy + 0.35 * WID),
1295
+ (cx + 0.20 * WID, cy + 0.35 * WID),
1296
+ (cx, cy + 0.04),
1297
+ ),
1298
+ fc=self._style["cc"],
1299
+ ec=None,
1300
+ )
1301
+ self._ax.add_artist(arrowhead)
1302
+ # target
1303
+ if self._cregbundle and register is not None:
1304
+ self._ax.text(
1305
+ cx + 0.25,
1306
+ cy + 0.1,
1307
+ str(reg_index),
1308
+ ha="left",
1309
+ va="bottom",
1310
+ fontsize=0.8 * self._style["fs"],
1311
+ color=self._style["tc"],
1312
+ clip_on=True,
1313
+ zorder=PORDER_TEXT,
1314
+ )
1315
+
1316
+ def _barrier(self, node, node_data, glob_data):
1317
+ """Draw a barrier"""
1318
+ for i, xy in enumerate(node_data[node].q_xy):
1319
+ xpos, ypos = xy
1320
+ # For the topmost barrier, reduce the rectangle if there's a label to allow for the text.
1321
+ if i == 0 and node.op.label is not None:
1322
+ ypos_adj = -0.35
1323
+ else:
1324
+ ypos_adj = 0.0
1325
+ self._ax.plot(
1326
+ [xpos, xpos],
1327
+ [ypos + 0.5 + ypos_adj, ypos - 0.5],
1328
+ linewidth=self._lwidth1,
1329
+ linestyle="dashed",
1330
+ color=self._style["lc"],
1331
+ zorder=PORDER_TEXT,
1332
+ )
1333
+ box = glob_data["patches_mod"].Rectangle(
1334
+ xy=(xpos - (0.3 * WID), ypos - 0.5),
1335
+ width=0.6 * WID,
1336
+ height=1.0 + ypos_adj,
1337
+ fc=self._style["bc"],
1338
+ ec=None,
1339
+ alpha=0.6,
1340
+ linewidth=self._lwidth15,
1341
+ zorder=PORDER_BARRIER,
1342
+ )
1343
+ self._ax.add_patch(box)
1344
+
1345
+ # display the barrier label at the top if there is one
1346
+ if i == 0 and node.op.label is not None:
1347
+ dir_ypos = ypos + 0.65 * HIG
1348
+ self._ax.text(
1349
+ xpos,
1350
+ dir_ypos,
1351
+ node.op.label,
1352
+ ha="center",
1353
+ va="top",
1354
+ fontsize=self._style["fs"],
1355
+ color=node_data[node].tc,
1356
+ clip_on=True,
1357
+ zorder=PORDER_TEXT,
1358
+ )
1359
+
1360
+ def _gate(self, node, node_data, glob_data, xy=None):
1361
+ """Draw a 1-qubit gate"""
1362
+ if xy is None:
1363
+ xy = node_data[node].q_xy[0]
1364
+ xpos, ypos = xy
1365
+ wid = max(node_data[node].width, WID)
1366
+
1367
+ box = glob_data["patches_mod"].Rectangle(
1368
+ xy=(xpos - 0.5 * wid, ypos - 0.5 * HIG),
1369
+ width=wid,
1370
+ height=HIG,
1371
+ fc=node_data[node].fc,
1372
+ ec=node_data[node].ec,
1373
+ linewidth=self._lwidth15,
1374
+ zorder=PORDER_GATE,
1375
+ )
1376
+ self._ax.add_patch(box)
1377
+
1378
+ if node_data[node].gate_text:
1379
+ gate_ypos = ypos
1380
+ if node_data[node].param_text:
1381
+ gate_ypos = ypos + 0.15 * HIG
1382
+ self._ax.text(
1383
+ xpos,
1384
+ ypos - 0.3 * HIG,
1385
+ node_data[node].param_text,
1386
+ ha="center",
1387
+ va="center",
1388
+ fontsize=self._style["sfs"],
1389
+ color=node_data[node].sc,
1390
+ clip_on=True,
1391
+ zorder=PORDER_TEXT,
1392
+ )
1393
+ self._ax.text(
1394
+ xpos,
1395
+ gate_ypos,
1396
+ node_data[node].gate_text,
1397
+ ha="center",
1398
+ va="center",
1399
+ fontsize=self._style["fs"],
1400
+ color=node_data[node].gt,
1401
+ clip_on=True,
1402
+ zorder=PORDER_TEXT,
1403
+ )
1404
+
1405
+ def _multiqubit_gate(self, node, node_data, glob_data, xy=None):
1406
+ """Draw a gate covering more than one qubit"""
1407
+ op = node.op
1408
+ if xy is None:
1409
+ xy = node_data[node].q_xy
1410
+
1411
+ # Swap gate
1412
+ if isinstance(op, SwapGate):
1413
+ self._swap(xy, node, node_data, node_data[node].lc)
1414
+ return
1415
+
1416
+ # RZZ Gate
1417
+ elif isinstance(op, RZZGate):
1418
+ self._symmetric_gate(node, node_data, RZZGate, glob_data)
1419
+ return
1420
+
1421
+ c_xy = node_data[node].c_xy
1422
+ xpos = min(x[0] for x in xy)
1423
+ ypos = min(y[1] for y in xy)
1424
+ ypos_max = max(y[1] for y in xy)
1425
+ if c_xy:
1426
+ cxpos = min(x[0] for x in c_xy)
1427
+ cypos = min(y[1] for y in c_xy)
1428
+ ypos = min(ypos, cypos)
1429
+
1430
+ wid = max(node_data[node].width + 0.21, WID)
1431
+ qubit_span = abs(ypos) - abs(ypos_max)
1432
+ height = HIG + qubit_span
1433
+
1434
+ box = glob_data["patches_mod"].Rectangle(
1435
+ xy=(xpos - 0.5 * wid, ypos - 0.5 * HIG),
1436
+ width=wid,
1437
+ height=height,
1438
+ fc=node_data[node].fc,
1439
+ ec=node_data[node].ec,
1440
+ linewidth=self._lwidth15,
1441
+ zorder=PORDER_GATE,
1442
+ )
1443
+ self._ax.add_patch(box)
1444
+
1445
+ # annotate inputs
1446
+ for bit, y in enumerate([x[1] for x in xy]):
1447
+ self._ax.text(
1448
+ xpos + 0.07 - 0.5 * wid,
1449
+ y,
1450
+ str(bit),
1451
+ ha="left",
1452
+ va="center",
1453
+ fontsize=self._style["fs"],
1454
+ color=node_data[node].gt,
1455
+ clip_on=True,
1456
+ zorder=PORDER_TEXT,
1457
+ )
1458
+ if c_xy:
1459
+ # annotate classical inputs
1460
+ for bit, y in enumerate([x[1] for x in c_xy]):
1461
+ self._ax.text(
1462
+ cxpos + 0.07 - 0.5 * wid,
1463
+ y,
1464
+ str(bit),
1465
+ ha="left",
1466
+ va="center",
1467
+ fontsize=self._style["fs"],
1468
+ color=node_data[node].gt,
1469
+ clip_on=True,
1470
+ zorder=PORDER_TEXT,
1471
+ )
1472
+ if node_data[node].gate_text:
1473
+ gate_ypos = ypos + 0.5 * qubit_span
1474
+ if node_data[node].param_text:
1475
+ gate_ypos = ypos + 0.4 * height
1476
+ self._ax.text(
1477
+ xpos + 0.11,
1478
+ ypos + 0.2 * height,
1479
+ node_data[node].param_text,
1480
+ ha="center",
1481
+ va="center",
1482
+ fontsize=self._style["sfs"],
1483
+ color=node_data[node].sc,
1484
+ clip_on=True,
1485
+ zorder=PORDER_TEXT,
1486
+ )
1487
+ self._ax.text(
1488
+ xpos + 0.11,
1489
+ gate_ypos,
1490
+ node_data[node].gate_text,
1491
+ ha="center",
1492
+ va="center",
1493
+ fontsize=self._style["fs"],
1494
+ color=node_data[node].gt,
1495
+ clip_on=True,
1496
+ zorder=PORDER_TEXT,
1497
+ )
1498
+
1499
+ def _flow_op_gate(self, node, node_data, glob_data):
1500
+ """Draw the box for a flow op circuit"""
1501
+ xy = node_data[node].q_xy
1502
+ xpos = min(x[0] for x in xy)
1503
+ ypos = min(y[1] for y in xy)
1504
+ ypos_max = max(y[1] for y in xy)
1505
+
1506
+ if_width = node_data[node].width[0] + WID
1507
+ box_width = if_width
1508
+
1509
+ # Add the else and case widths to the if_width
1510
+ for ewidth in node_data[node].width[1:]:
1511
+ if ewidth > 0.0:
1512
+ box_width += ewidth + WID + 0.3
1513
+
1514
+ qubit_span = abs(ypos) - abs(ypos_max)
1515
+ height = HIG + qubit_span
1516
+
1517
+ # Cycle through box colors based on depth.
1518
+ # Default - blue, purple, green, black
1519
+ colors = [
1520
+ self._style["dispcol"]["h"][0],
1521
+ self._style["dispcol"]["u"][0],
1522
+ self._style["dispcol"]["x"][0],
1523
+ self._style["cc"],
1524
+ ]
1525
+ # To fold box onto next lines, draw it repeatedly, shifting
1526
+ # it left by x_shift and down by y_shift
1527
+ fold_level = 0
1528
+ end_x = xpos + box_width
1529
+
1530
+ while end_x > 0.0:
1531
+ x_shift = fold_level * self._fold
1532
+ y_shift = fold_level * (glob_data["n_lines"] + 1)
1533
+ end_x = xpos + box_width - x_shift
1534
+
1535
+ # FancyBbox allows rounded corners
1536
+ box = glob_data["patches_mod"].FancyBboxPatch(
1537
+ xy=(xpos - x_shift, ypos - 0.5 * HIG - y_shift),
1538
+ width=box_width,
1539
+ height=height,
1540
+ boxstyle="round, pad=0.1",
1541
+ fc="none",
1542
+ ec=colors[node_data[node].nest_depth % 4],
1543
+ linewidth=self._lwidth3,
1544
+ zorder=PORDER_FLOW,
1545
+ )
1546
+ self._ax.add_patch(box)
1547
+
1548
+ if isinstance(node.op, IfElseOp):
1549
+ flow_text = " If"
1550
+ elif isinstance(node.op, WhileLoopOp):
1551
+ flow_text = " While"
1552
+ elif isinstance(node.op, ForLoopOp):
1553
+ flow_text = " For"
1554
+ elif isinstance(node.op, SwitchCaseOp):
1555
+ flow_text = "Switch"
1556
+
1557
+ if isinstance(node.op, SwitchCaseOp):
1558
+ op_spacer = 0.04
1559
+ expr_spacer = 0.0
1560
+ else:
1561
+ op_spacer = 0.08
1562
+ expr_spacer = 0.02
1563
+ # Indicate type of ControlFlowOp and if expression used, print below
1564
+ self._ax.text(
1565
+ xpos - x_shift - op_spacer,
1566
+ ypos_max + 0.2 - y_shift,
1567
+ flow_text,
1568
+ ha="left",
1569
+ va="center",
1570
+ fontsize=self._style["fs"],
1571
+ color=node_data[node].tc,
1572
+ clip_on=True,
1573
+ zorder=PORDER_FLOW,
1574
+ )
1575
+ self._ax.text(
1576
+ xpos - x_shift + expr_spacer,
1577
+ ypos_max + 0.2 - y_shift - 0.4,
1578
+ node_data[node].expr_text,
1579
+ ha="left",
1580
+ va="center",
1581
+ fontsize=self._style["sfs"],
1582
+ color=node_data[node].tc,
1583
+ clip_on=True,
1584
+ zorder=PORDER_FLOW,
1585
+ )
1586
+ if isinstance(node.op, ForLoopOp):
1587
+ idx_set = str(node_data[node].indexset)
1588
+ # If a range was used display 'range' and grab the range value
1589
+ # to be displayed below
1590
+ if "range" in idx_set:
1591
+ idx_set = "r(" + idx_set[6:-1] + ")"
1592
+ else:
1593
+ # If a tuple, show first 4 elements followed by '...'
1594
+ idx_set = str(node_data[node].indexset)[1:-1].split(",")[:5]
1595
+ if len(idx_set) > 4:
1596
+ idx_set[4] = "..."
1597
+ idx_set = f"{','.join(idx_set)}"
1598
+ y_spacer = 0.2 if len(node.qargs) == 1 else 0.5
1599
+ self._ax.text(
1600
+ xpos - x_shift - 0.04,
1601
+ ypos_max - y_spacer - y_shift,
1602
+ idx_set,
1603
+ ha="left",
1604
+ va="center",
1605
+ fontsize=self._style["sfs"],
1606
+ color=node_data[node].tc,
1607
+ clip_on=True,
1608
+ zorder=PORDER_FLOW,
1609
+ )
1610
+ # If there's an else or a case draw the vertical line and the name
1611
+ else_case_text = "Else" if isinstance(node.op, IfElseOp) else "Case"
1612
+ ewidth_incr = if_width
1613
+ for circ_num, ewidth in enumerate(node_data[node].width[1:]):
1614
+ if ewidth > 0.0:
1615
+ self._ax.plot(
1616
+ [xpos + ewidth_incr + 0.3 - x_shift, xpos + ewidth_incr + 0.3 - x_shift],
1617
+ [ypos - 0.5 * HIG - 0.08 - y_shift, ypos + height - 0.22 - y_shift],
1618
+ color=colors[node_data[node].nest_depth % 4],
1619
+ linewidth=3.0,
1620
+ linestyle="solid",
1621
+ zorder=PORDER_FLOW,
1622
+ )
1623
+ self._ax.text(
1624
+ xpos + ewidth_incr + 0.4 - x_shift,
1625
+ ypos_max + 0.2 - y_shift,
1626
+ else_case_text,
1627
+ ha="left",
1628
+ va="center",
1629
+ fontsize=self._style["fs"],
1630
+ color=node_data[node].tc,
1631
+ clip_on=True,
1632
+ zorder=PORDER_FLOW,
1633
+ )
1634
+ if isinstance(node.op, SwitchCaseOp):
1635
+ jump_val = node_data[node].jump_values[circ_num]
1636
+ # If only one value, e.g. (0,)
1637
+ if len(str(jump_val)) == 4:
1638
+ jump_text = str(jump_val)[1]
1639
+ elif "default" in str(jump_val):
1640
+ jump_text = "default"
1641
+ else:
1642
+ # If a tuple, show first 4 elements followed by '...'
1643
+ jump_text = str(jump_val)[1:-1].replace(" ", "").split(",")[:5]
1644
+ if len(jump_text) > 4:
1645
+ jump_text[4] = "..."
1646
+ jump_text = f"{', '.join(jump_text)}"
1647
+ y_spacer = 0.2 if len(node.qargs) == 1 else 0.5
1648
+ self._ax.text(
1649
+ xpos + ewidth_incr + 0.4 - x_shift,
1650
+ ypos_max - y_spacer - y_shift,
1651
+ jump_text,
1652
+ ha="left",
1653
+ va="center",
1654
+ fontsize=self._style["sfs"],
1655
+ color=node_data[node].tc,
1656
+ clip_on=True,
1657
+ zorder=PORDER_FLOW,
1658
+ )
1659
+ ewidth_incr += ewidth + 1
1660
+
1661
+ fold_level += 1
1662
+
1663
+ def _control_gate(self, node, node_data, glob_data):
1664
+ """Draw a controlled gate"""
1665
+ op = node.op
1666
+ xy = node_data[node].q_xy
1667
+ base_type = getattr(op, "base_gate", None)
1668
+ qubit_b = min(xy, key=lambda xy: xy[1])
1669
+ qubit_t = max(xy, key=lambda xy: xy[1])
1670
+ num_ctrl_qubits = op.num_ctrl_qubits
1671
+ num_qargs = len(xy) - num_ctrl_qubits
1672
+ self._set_ctrl_bits(
1673
+ op.ctrl_state,
1674
+ num_ctrl_qubits,
1675
+ xy,
1676
+ glob_data,
1677
+ ec=node_data[node].ec,
1678
+ tc=node_data[node].tc,
1679
+ text=node_data[node].ctrl_text,
1680
+ qargs=node.qargs,
1681
+ )
1682
+ self._line(qubit_b, qubit_t, lc=node_data[node].lc)
1683
+
1684
+ if isinstance(op, RZZGate) or isinstance(base_type, (U1Gate, PhaseGate, ZGate, RZZGate)):
1685
+ self._symmetric_gate(node, node_data, base_type, glob_data)
1686
+
1687
+ elif num_qargs == 1 and isinstance(base_type, XGate):
1688
+ tgt_color = self._style["dispcol"]["target"]
1689
+ tgt = tgt_color if isinstance(tgt_color, str) else tgt_color[0]
1690
+ self._x_tgt_qubit(xy[num_ctrl_qubits], glob_data, ec=node_data[node].ec, ac=tgt)
1691
+
1692
+ elif num_qargs == 1:
1693
+ self._gate(node, node_data, glob_data, xy[num_ctrl_qubits:][0])
1694
+
1695
+ elif isinstance(base_type, SwapGate):
1696
+ self._swap(xy[num_ctrl_qubits:], node, node_data, node_data[node].lc)
1697
+
1698
+ else:
1699
+ self._multiqubit_gate(node, node_data, glob_data, xy[num_ctrl_qubits:])
1700
+
1701
+ def _set_ctrl_bits(
1702
+ self, ctrl_state, num_ctrl_qubits, qbit, glob_data, ec=None, tc=None, text="", qargs=None
1703
+ ):
1704
+ """Determine which qubits are controls and whether they are open or closed"""
1705
+ # place the control label at the top or bottom of controls
1706
+ if text:
1707
+ qlist = [self._circuit.find_bit(qubit).index for qubit in qargs]
1708
+ ctbits = qlist[:num_ctrl_qubits]
1709
+ qubits = qlist[num_ctrl_qubits:]
1710
+ max_ctbit = max(ctbits)
1711
+ min_ctbit = min(ctbits)
1712
+ top = min(qubits) > min_ctbit
1713
+
1714
+ # display the control qubits as open or closed based on ctrl_state
1715
+ cstate = f"{ctrl_state:b}".rjust(num_ctrl_qubits, "0")[::-1]
1716
+ for i in range(num_ctrl_qubits):
1717
+ fc_open_close = ec if cstate[i] == "1" else self._style["bg"]
1718
+ text_top = None
1719
+ if text:
1720
+ if top and qlist[i] == min_ctbit:
1721
+ text_top = True
1722
+ elif not top and qlist[i] == max_ctbit:
1723
+ text_top = False
1724
+ self._ctrl_qubit(
1725
+ qbit[i], glob_data, fc=fc_open_close, ec=ec, tc=tc, text=text, text_top=text_top
1726
+ )
1727
+
1728
+ def _ctrl_qubit(self, xy, glob_data, fc=None, ec=None, tc=None, text="", text_top=None):
1729
+ """Draw a control circle and if top or bottom control, draw control label"""
1730
+ xpos, ypos = xy
1731
+ box = glob_data["patches_mod"].Circle(
1732
+ xy=(xpos, ypos),
1733
+ radius=WID * 0.15,
1734
+ fc=fc,
1735
+ ec=ec,
1736
+ linewidth=self._lwidth15,
1737
+ zorder=PORDER_GATE,
1738
+ )
1739
+ self._ax.add_patch(box)
1740
+
1741
+ # adjust label height according to number of lines of text
1742
+ label_padding = 0.7
1743
+ if text is not None:
1744
+ text_lines = text.count("\n")
1745
+ if not text.endswith("(cal)\n"):
1746
+ for _ in range(text_lines):
1747
+ label_padding += 0.3
1748
+
1749
+ if text_top is None:
1750
+ return
1751
+
1752
+ # display the control label at the top or bottom if there is one
1753
+ ctrl_ypos = ypos + label_padding * HIG if text_top else ypos - 0.3 * HIG
1754
+ self._ax.text(
1755
+ xpos,
1756
+ ctrl_ypos,
1757
+ text,
1758
+ ha="center",
1759
+ va="top",
1760
+ fontsize=self._style["sfs"],
1761
+ color=tc,
1762
+ clip_on=True,
1763
+ zorder=PORDER_TEXT,
1764
+ )
1765
+
1766
+ def _x_tgt_qubit(self, xy, glob_data, ec=None, ac=None):
1767
+ """Draw the cnot target symbol"""
1768
+ linewidth = self._lwidth2
1769
+ xpos, ypos = xy
1770
+ box = glob_data["patches_mod"].Circle(
1771
+ xy=(xpos, ypos),
1772
+ radius=HIG * 0.35,
1773
+ fc=ec,
1774
+ ec=ec,
1775
+ linewidth=linewidth,
1776
+ zorder=PORDER_GATE,
1777
+ )
1778
+ self._ax.add_patch(box)
1779
+
1780
+ # add '+' symbol
1781
+ self._ax.plot(
1782
+ [xpos, xpos],
1783
+ [ypos - 0.2 * HIG, ypos + 0.2 * HIG],
1784
+ color=ac,
1785
+ linewidth=linewidth,
1786
+ zorder=PORDER_GATE_PLUS,
1787
+ )
1788
+ self._ax.plot(
1789
+ [xpos - 0.2 * HIG, xpos + 0.2 * HIG],
1790
+ [ypos, ypos],
1791
+ color=ac,
1792
+ linewidth=linewidth,
1793
+ zorder=PORDER_GATE_PLUS,
1794
+ )
1795
+
1796
+ def _symmetric_gate(self, node, node_data, base_type, glob_data):
1797
+ """Draw symmetric gates for cz, cu1, cp, and rzz"""
1798
+ op = node.op
1799
+ xy = node_data[node].q_xy
1800
+ qubit_b = min(xy, key=lambda xy: xy[1])
1801
+ qubit_t = max(xy, key=lambda xy: xy[1])
1802
+ base_type = getattr(op, "base_gate", None)
1803
+ ec = node_data[node].ec
1804
+ tc = node_data[node].tc
1805
+ lc = node_data[node].lc
1806
+
1807
+ # cz and mcz gates
1808
+ if not isinstance(op, ZGate) and isinstance(base_type, ZGate):
1809
+ num_ctrl_qubits = op.num_ctrl_qubits
1810
+ self._ctrl_qubit(xy[-1], glob_data, fc=ec, ec=ec, tc=tc)
1811
+ self._line(qubit_b, qubit_t, lc=lc, zorder=PORDER_LINE_PLUS)
1812
+
1813
+ # cu1, cp, rzz, and controlled rzz gates (sidetext gates)
1814
+ elif isinstance(op, RZZGate) or isinstance(base_type, (U1Gate, PhaseGate, RZZGate)):
1815
+ num_ctrl_qubits = 0 if isinstance(op, RZZGate) else op.num_ctrl_qubits
1816
+ gate_text = "P" if isinstance(base_type, PhaseGate) else node_data[node].gate_text
1817
+
1818
+ self._ctrl_qubit(xy[num_ctrl_qubits], glob_data, fc=ec, ec=ec, tc=tc)
1819
+ if not isinstance(base_type, (U1Gate, PhaseGate)):
1820
+ self._ctrl_qubit(xy[num_ctrl_qubits + 1], glob_data, fc=ec, ec=ec, tc=tc)
1821
+
1822
+ self._sidetext(
1823
+ node,
1824
+ node_data,
1825
+ qubit_b,
1826
+ tc=tc,
1827
+ text=f"{gate_text} ({node_data[node].param_text})",
1828
+ )
1829
+ self._line(qubit_b, qubit_t, lc=lc)
1830
+
1831
+ def _swap(self, xy, node, node_data, color=None):
1832
+ """Draw a Swap gate"""
1833
+ self._swap_cross(xy[0], color=color)
1834
+ self._swap_cross(xy[1], color=color)
1835
+ self._line(xy[0], xy[1], lc=color)
1836
+
1837
+ # add calibration text
1838
+ gate_text = node_data[node].gate_text.split("\n")[-1]
1839
+ if node_data[node].raw_gate_text in self._calibrations:
1840
+ xpos, ypos = xy[0]
1841
+ self._ax.text(
1842
+ xpos,
1843
+ ypos + 0.7 * HIG,
1844
+ gate_text,
1845
+ ha="center",
1846
+ va="top",
1847
+ fontsize=self._style["sfs"],
1848
+ color=self._style["tc"],
1849
+ clip_on=True,
1850
+ zorder=PORDER_TEXT,
1851
+ )
1852
+
1853
+ def _swap_cross(self, xy, color=None):
1854
+ """Draw the Swap cross symbol"""
1855
+ xpos, ypos = xy
1856
+
1857
+ self._ax.plot(
1858
+ [xpos - 0.20 * WID, xpos + 0.20 * WID],
1859
+ [ypos - 0.20 * WID, ypos + 0.20 * WID],
1860
+ color=color,
1861
+ linewidth=self._lwidth2,
1862
+ zorder=PORDER_LINE_PLUS,
1863
+ )
1864
+ self._ax.plot(
1865
+ [xpos - 0.20 * WID, xpos + 0.20 * WID],
1866
+ [ypos + 0.20 * WID, ypos - 0.20 * WID],
1867
+ color=color,
1868
+ linewidth=self._lwidth2,
1869
+ zorder=PORDER_LINE_PLUS,
1870
+ )
1871
+
1872
+ def _sidetext(self, node, node_data, xy, tc=None, text=""):
1873
+ """Draw the sidetext for symmetric gates"""
1874
+ xpos, ypos = xy
1875
+
1876
+ # 0.11 = the initial gap, add 1/2 text width to place on the right
1877
+ xp = xpos + 0.11 + node_data[node].width / 2
1878
+ self._ax.text(
1879
+ xp,
1880
+ ypos + HIG,
1881
+ text,
1882
+ ha="center",
1883
+ va="top",
1884
+ fontsize=self._style["sfs"],
1885
+ color=tc,
1886
+ clip_on=True,
1887
+ zorder=PORDER_TEXT,
1888
+ )
1889
+
1890
+ def _line(self, xy0, xy1, lc=None, ls=None, zorder=PORDER_LINE):
1891
+ """Draw a line from xy0 to xy1"""
1892
+ x0, y0 = xy0
1893
+ x1, y1 = xy1
1894
+ linecolor = self._style["lc"] if lc is None else lc
1895
+ linestyle = "solid" if ls is None else ls
1896
+
1897
+ if linestyle == "doublet":
1898
+ theta = np.arctan2(np.abs(x1 - x0), np.abs(y1 - y0))
1899
+ dx = 0.05 * WID * np.cos(theta)
1900
+ dy = 0.05 * WID * np.sin(theta)
1901
+ self._ax.plot(
1902
+ [x0 + dx, x1 + dx],
1903
+ [y0 + dy, y1 + dy],
1904
+ color=linecolor,
1905
+ linewidth=self._lwidth2,
1906
+ linestyle="solid",
1907
+ zorder=zorder,
1908
+ )
1909
+ self._ax.plot(
1910
+ [x0 - dx, x1 - dx],
1911
+ [y0 - dy, y1 - dy],
1912
+ color=linecolor,
1913
+ linewidth=self._lwidth2,
1914
+ linestyle="solid",
1915
+ zorder=zorder,
1916
+ )
1917
+ else:
1918
+ self._ax.plot(
1919
+ [x0, x1],
1920
+ [y0, y1],
1921
+ color=linecolor,
1922
+ linewidth=self._lwidth2,
1923
+ linestyle=linestyle,
1924
+ zorder=zorder,
1925
+ )
1926
+
1927
+ def _plot_coord(self, x_index, y_index, gate_width, glob_data, flow_op=False):
1928
+ """Get the coord positions for an index"""
1929
+
1930
+ # Check folding
1931
+ fold = self._fold if self._fold > 0 else INFINITE_FOLD
1932
+ h_pos = x_index % fold + 1
1933
+
1934
+ # Don't fold flow_ops here, only gates inside the flow_op
1935
+ if not flow_op and h_pos + (gate_width - 1) > fold:
1936
+ x_index += fold - (h_pos - 1)
1937
+ x_pos = x_index % fold + glob_data["x_offset"] + 0.04
1938
+ if not flow_op:
1939
+ x_pos += 0.5 * gate_width
1940
+ else:
1941
+ x_pos += 0.25
1942
+ y_pos = y_index - (x_index // fold) * (glob_data["n_lines"] + 1)
1943
+
1944
+ # x_index could have been updated, so need to store
1945
+ glob_data["next_x_index"] = x_index
1946
+ return x_pos, y_pos
1947
+
1948
+
1949
+ class NodeData:
1950
+ """Class containing drawing data on a per node basis"""
1951
+
1952
+ def __init__(self):
1953
+ # Node data for positioning
1954
+ self.width = 0.0
1955
+ self.x_index = 0
1956
+ self.q_xy = []
1957
+ self.c_xy = []
1958
+
1959
+ # Node data for text
1960
+ self.gate_text = ""
1961
+ self.raw_gate_text = ""
1962
+ self.ctrl_text = ""
1963
+ self.param_text = ""
1964
+
1965
+ # Node data for color
1966
+ self.fc = self.ec = self.lc = self.sc = self.gt = self.tc = 0
1967
+
1968
+ # Special values stored for ControlFlowOps
1969
+ self.nest_depth = 0
1970
+ self.expr_width = 0.0
1971
+ self.expr_text = ""
1972
+ self.inside_flow = False
1973
+ self.indexset = () # List of indices used for ForLoopOp
1974
+ self.jump_values = [] # List of jump values used for SwitchCaseOp
1975
+ self.circ_num = 0 # Which block is it in op.blocks