qiskit 1.3.0b1__cp39-abi3-win32.whl → 1.3.0rc2__cp39-abi3-win32.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 (360) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +20 -1
  3. qiskit/_accelerate.pyd +0 -0
  4. qiskit/assembler/assemble_schedules.py +2 -0
  5. qiskit/circuit/__init__.py +44 -1
  6. qiskit/circuit/_standard_gates_commutations.py +585 -0
  7. qiskit/circuit/barrier.py +2 -0
  8. qiskit/circuit/controlflow/builder.py +3 -3
  9. qiskit/circuit/controlflow/if_else.py +13 -5
  10. qiskit/circuit/controlflow/while_loop.py +10 -2
  11. qiskit/circuit/delay.py +20 -3
  12. qiskit/circuit/equivalence.py +13 -214
  13. qiskit/circuit/gate.py +3 -1
  14. qiskit/circuit/instruction.py +32 -11
  15. qiskit/circuit/instructionset.py +2 -0
  16. qiskit/circuit/library/__init__.py +110 -14
  17. qiskit/circuit/library/arithmetic/__init__.py +9 -2
  18. qiskit/circuit/library/arithmetic/adders/__init__.py +1 -0
  19. qiskit/circuit/library/arithmetic/adders/adder.py +154 -2
  20. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +20 -56
  21. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +14 -1
  22. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +21 -91
  23. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  24. qiskit/circuit/library/arithmetic/multipliers/__init__.py +1 -0
  25. qiskit/circuit/library/arithmetic/multipliers/hrs_cumulative_multiplier.py +8 -1
  26. qiskit/circuit/library/arithmetic/multipliers/multiplier.py +94 -3
  27. qiskit/circuit/library/arithmetic/multipliers/rg_qft_multiplier.py +8 -1
  28. qiskit/circuit/library/arithmetic/weighted_adder.py +1 -1
  29. qiskit/circuit/library/basis_change/qft.py +20 -38
  30. qiskit/circuit/library/blueprintcircuit.py +64 -0
  31. qiskit/circuit/library/boolean_logic/__init__.py +4 -4
  32. qiskit/circuit/library/boolean_logic/inner_product.py +81 -4
  33. qiskit/circuit/library/boolean_logic/quantum_and.py +107 -4
  34. qiskit/circuit/library/boolean_logic/quantum_or.py +107 -3
  35. qiskit/circuit/library/boolean_logic/quantum_xor.py +97 -3
  36. qiskit/circuit/library/data_preparation/__init__.py +6 -3
  37. qiskit/circuit/library/data_preparation/{z_feature_map.py → _z_feature_map.py} +45 -34
  38. qiskit/circuit/library/data_preparation/_zz_feature_map.py +150 -0
  39. qiskit/circuit/library/data_preparation/pauli_feature_map.py +342 -29
  40. qiskit/circuit/library/fourier_checking.py +72 -11
  41. qiskit/circuit/library/generalized_gates/__init__.py +1 -1
  42. qiskit/circuit/library/generalized_gates/diagonal.py +45 -51
  43. qiskit/circuit/library/generalized_gates/gms.py +67 -14
  44. qiskit/circuit/library/generalized_gates/gr.py +4 -4
  45. qiskit/circuit/library/generalized_gates/isometry.py +2 -2
  46. qiskit/circuit/library/generalized_gates/linear_function.py +12 -6
  47. qiskit/circuit/library/generalized_gates/mcmt.py +167 -107
  48. qiskit/circuit/library/generalized_gates/permutation.py +8 -6
  49. qiskit/circuit/library/generalized_gates/rv.py +8 -9
  50. qiskit/circuit/library/graph_state.py +93 -10
  51. qiskit/circuit/library/grover_operator.py +270 -2
  52. qiskit/circuit/library/hidden_linear_function.py +83 -20
  53. qiskit/circuit/library/iqp.py +99 -20
  54. qiskit/circuit/library/n_local/__init__.py +19 -7
  55. qiskit/circuit/library/n_local/efficient_su2.py +118 -5
  56. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +259 -0
  57. qiskit/circuit/library/n_local/excitation_preserving.py +130 -6
  58. qiskit/circuit/library/n_local/n_local.py +406 -5
  59. qiskit/circuit/library/n_local/pauli_two_design.py +106 -4
  60. qiskit/circuit/library/n_local/qaoa_ansatz.py +80 -1
  61. qiskit/circuit/library/n_local/real_amplitudes.py +127 -7
  62. qiskit/circuit/library/n_local/two_local.py +14 -7
  63. qiskit/circuit/library/overlap.py +91 -26
  64. qiskit/circuit/library/pauli_evolution.py +17 -15
  65. qiskit/circuit/library/phase_estimation.py +80 -4
  66. qiskit/circuit/library/quantum_volume.py +72 -20
  67. qiskit/circuit/library/standard_gates/__init__.py +20 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +2 -1
  69. qiskit/circuit/library/standard_gates/ecr.py +2 -2
  70. qiskit/circuit/library/standard_gates/h.py +4 -3
  71. qiskit/circuit/library/standard_gates/i.py +2 -1
  72. qiskit/circuit/library/standard_gates/iswap.py +2 -2
  73. qiskit/circuit/library/standard_gates/p.py +20 -12
  74. qiskit/circuit/library/standard_gates/r.py +1 -1
  75. qiskit/circuit/library/standard_gates/rx.py +4 -3
  76. qiskit/circuit/library/standard_gates/rxx.py +2 -2
  77. qiskit/circuit/library/standard_gates/ry.py +4 -3
  78. qiskit/circuit/library/standard_gates/ryy.py +2 -2
  79. qiskit/circuit/library/standard_gates/rz.py +13 -12
  80. qiskit/circuit/library/standard_gates/rzx.py +6 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +1 -1
  82. qiskit/circuit/library/standard_gates/s.py +4 -4
  83. qiskit/circuit/library/standard_gates/swap.py +3 -3
  84. qiskit/circuit/library/standard_gates/sx.py +4 -3
  85. qiskit/circuit/library/standard_gates/t.py +2 -2
  86. qiskit/circuit/library/standard_gates/u.py +11 -3
  87. qiskit/circuit/library/standard_gates/u1.py +65 -15
  88. qiskit/circuit/library/standard_gates/u2.py +4 -1
  89. qiskit/circuit/library/standard_gates/u3.py +31 -3
  90. qiskit/circuit/library/standard_gates/x.py +7 -5
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -2
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -2
  93. qiskit/circuit/library/standard_gates/y.py +4 -3
  94. qiskit/circuit/library/standard_gates/z.py +3 -3
  95. qiskit/circuit/library/templates/clifford/clifford_2_1.py +9 -8
  96. qiskit/circuit/library/templates/clifford/clifford_2_2.py +10 -9
  97. qiskit/circuit/library/templates/clifford/clifford_2_3.py +9 -7
  98. qiskit/circuit/library/templates/clifford/clifford_2_4.py +9 -8
  99. qiskit/circuit/library/templates/clifford/clifford_3_1.py +9 -8
  100. qiskit/circuit/library/templates/clifford/clifford_4_1.py +10 -9
  101. qiskit/circuit/library/templates/clifford/clifford_4_2.py +10 -9
  102. qiskit/circuit/library/templates/clifford/clifford_4_3.py +10 -9
  103. qiskit/circuit/library/templates/clifford/clifford_4_4.py +10 -9
  104. qiskit/circuit/library/templates/clifford/clifford_5_1.py +10 -9
  105. qiskit/circuit/library/templates/clifford/clifford_6_1.py +10 -9
  106. qiskit/circuit/library/templates/clifford/clifford_6_2.py +10 -9
  107. qiskit/circuit/library/templates/clifford/clifford_6_3.py +10 -9
  108. qiskit/circuit/library/templates/clifford/clifford_6_4.py +9 -8
  109. qiskit/circuit/library/templates/clifford/clifford_6_5.py +10 -9
  110. qiskit/circuit/library/templates/clifford/clifford_8_1.py +10 -9
  111. qiskit/circuit/library/templates/clifford/clifford_8_2.py +10 -9
  112. qiskit/circuit/library/templates/clifford/clifford_8_3.py +10 -9
  113. qiskit/circuit/library/templates/nct/template_nct_2a_1.py +9 -7
  114. qiskit/circuit/library/templates/nct/template_nct_2a_2.py +10 -8
  115. qiskit/circuit/library/templates/nct/template_nct_2a_3.py +12 -10
  116. qiskit/circuit/library/templates/nct/template_nct_4a_1.py +16 -14
  117. qiskit/circuit/library/templates/nct/template_nct_4a_2.py +14 -12
  118. qiskit/circuit/library/templates/nct/template_nct_4a_3.py +12 -10
  119. qiskit/circuit/library/templates/nct/template_nct_4b_1.py +14 -12
  120. qiskit/circuit/library/templates/nct/template_nct_4b_2.py +12 -10
  121. qiskit/circuit/library/templates/nct/template_nct_5a_1.py +12 -10
  122. qiskit/circuit/library/templates/nct/template_nct_5a_2.py +12 -10
  123. qiskit/circuit/library/templates/nct/template_nct_5a_3.py +12 -10
  124. qiskit/circuit/library/templates/nct/template_nct_5a_4.py +11 -9
  125. qiskit/circuit/library/templates/nct/template_nct_6a_1.py +11 -9
  126. qiskit/circuit/library/templates/nct/template_nct_6a_2.py +12 -10
  127. qiskit/circuit/library/templates/nct/template_nct_6a_3.py +12 -10
  128. qiskit/circuit/library/templates/nct/template_nct_6a_4.py +12 -10
  129. qiskit/circuit/library/templates/nct/template_nct_6b_1.py +12 -10
  130. qiskit/circuit/library/templates/nct/template_nct_6b_2.py +12 -10
  131. qiskit/circuit/library/templates/nct/template_nct_6c_1.py +12 -10
  132. qiskit/circuit/library/templates/nct/template_nct_7a_1.py +13 -11
  133. qiskit/circuit/library/templates/nct/template_nct_7b_1.py +13 -11
  134. qiskit/circuit/library/templates/nct/template_nct_7c_1.py +13 -11
  135. qiskit/circuit/library/templates/nct/template_nct_7d_1.py +13 -11
  136. qiskit/circuit/library/templates/nct/template_nct_7e_1.py +13 -11
  137. qiskit/circuit/library/templates/nct/template_nct_9a_1.py +13 -11
  138. qiskit/circuit/library/templates/nct/template_nct_9c_1.py +11 -9
  139. qiskit/circuit/library/templates/nct/template_nct_9c_10.py +12 -10
  140. qiskit/circuit/library/templates/nct/template_nct_9c_11.py +12 -10
  141. qiskit/circuit/library/templates/nct/template_nct_9c_12.py +12 -10
  142. qiskit/circuit/library/templates/nct/template_nct_9c_2.py +12 -10
  143. qiskit/circuit/library/templates/nct/template_nct_9c_3.py +12 -10
  144. qiskit/circuit/library/templates/nct/template_nct_9c_4.py +12 -10
  145. qiskit/circuit/library/templates/nct/template_nct_9c_5.py +12 -10
  146. qiskit/circuit/library/templates/nct/template_nct_9c_6.py +12 -10
  147. qiskit/circuit/library/templates/nct/template_nct_9c_7.py +12 -10
  148. qiskit/circuit/library/templates/nct/template_nct_9c_8.py +12 -10
  149. qiskit/circuit/library/templates/nct/template_nct_9c_9.py +12 -10
  150. qiskit/circuit/library/templates/nct/template_nct_9d_1.py +11 -9
  151. qiskit/circuit/library/templates/nct/template_nct_9d_10.py +12 -10
  152. qiskit/circuit/library/templates/nct/template_nct_9d_2.py +12 -10
  153. qiskit/circuit/library/templates/nct/template_nct_9d_3.py +12 -10
  154. qiskit/circuit/library/templates/nct/template_nct_9d_4.py +12 -10
  155. qiskit/circuit/library/templates/nct/template_nct_9d_5.py +12 -10
  156. qiskit/circuit/library/templates/nct/template_nct_9d_6.py +12 -10
  157. qiskit/circuit/library/templates/nct/template_nct_9d_7.py +12 -10
  158. qiskit/circuit/library/templates/nct/template_nct_9d_8.py +12 -10
  159. qiskit/circuit/library/templates/nct/template_nct_9d_9.py +12 -10
  160. qiskit/circuit/library/templates/rzx/rzx_cy.py +11 -10
  161. qiskit/circuit/library/templates/rzx/rzx_xz.py +16 -15
  162. qiskit/circuit/library/templates/rzx/rzx_yz.py +12 -10
  163. qiskit/circuit/library/templates/rzx/rzx_zz1.py +22 -20
  164. qiskit/circuit/library/templates/rzx/rzx_zz2.py +16 -15
  165. qiskit/circuit/library/templates/rzx/rzx_zz3.py +17 -15
  166. qiskit/circuit/parameter.py +4 -0
  167. qiskit/circuit/parameterexpression.py +167 -34
  168. qiskit/circuit/quantumcircuit.py +162 -126
  169. qiskit/circuit/singleton.py +2 -0
  170. qiskit/circuit/store.py +2 -0
  171. qiskit/circuit/twirling.py +145 -0
  172. qiskit/compiler/assembler.py +17 -4
  173. qiskit/compiler/scheduler.py +2 -0
  174. qiskit/compiler/sequencer.py +2 -0
  175. qiskit/compiler/transpiler.py +81 -26
  176. qiskit/converters/circuit_to_dag.py +2 -2
  177. qiskit/converters/circuit_to_dagdependency.py +1 -1
  178. qiskit/converters/circuit_to_dagdependency_v2.py +1 -1
  179. qiskit/converters/circuit_to_instruction.py +1 -1
  180. qiskit/converters/dag_to_circuit.py +7 -5
  181. qiskit/converters/dag_to_dagdependency.py +1 -1
  182. qiskit/converters/dag_to_dagdependency_v2.py +1 -1
  183. qiskit/converters/dagdependency_to_circuit.py +5 -1
  184. qiskit/converters/dagdependency_to_dag.py +6 -1
  185. qiskit/dagcircuit/collect_blocks.py +3 -3
  186. qiskit/dagcircuit/dagdependency.py +18 -5
  187. qiskit/dagcircuit/dagdependency_v2.py +1 -1
  188. qiskit/dagcircuit/dagnode.py +2 -2
  189. qiskit/passmanager/__init__.py +2 -2
  190. qiskit/primitives/backend_estimator.py +5 -2
  191. qiskit/primitives/backend_sampler_v2.py +61 -18
  192. qiskit/primitives/base/base_estimator.py +2 -2
  193. qiskit/primitives/containers/data_bin.py +9 -1
  194. qiskit/primitives/statevector_sampler.py +1 -1
  195. qiskit/primitives/utils.py +1 -1
  196. qiskit/providers/__init__.py +3 -3
  197. qiskit/providers/backend.py +12 -1
  198. qiskit/providers/backend_compat.py +23 -3
  199. qiskit/providers/basic_provider/basic_simulator.py +12 -2
  200. qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
  201. qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
  202. qiskit/providers/models/pulsedefaults.py +2 -0
  203. qiskit/pulse/builder.py +59 -18
  204. qiskit/pulse/calibration_entries.py +4 -1
  205. qiskit/pulse/channels.py +2 -0
  206. qiskit/pulse/exceptions.py +2 -0
  207. qiskit/pulse/instruction_schedule_map.py +21 -6
  208. qiskit/pulse/instructions/acquire.py +2 -0
  209. qiskit/pulse/instructions/delay.py +2 -0
  210. qiskit/pulse/instructions/directives.py +8 -0
  211. qiskit/pulse/instructions/frequency.py +3 -0
  212. qiskit/pulse/instructions/instruction.py +2 -0
  213. qiskit/pulse/instructions/phase.py +3 -0
  214. qiskit/pulse/instructions/play.py +2 -0
  215. qiskit/pulse/instructions/reference.py +2 -0
  216. qiskit/pulse/instructions/snapshot.py +2 -0
  217. qiskit/pulse/library/pulse.py +2 -0
  218. qiskit/pulse/library/symbolic_pulses.py +28 -0
  219. qiskit/pulse/library/waveform.py +2 -0
  220. qiskit/pulse/macros.py +1 -1
  221. qiskit/pulse/schedule.py +12 -13
  222. qiskit/pulse/transforms/alignments.py +5 -3
  223. qiskit/pulse/transforms/dag.py +7 -0
  224. qiskit/qasm2/export.py +5 -3
  225. qiskit/qasm2/parse.py +46 -2
  226. qiskit/qasm3/__init__.py +1 -0
  227. qiskit/qasm3/ast.py +123 -15
  228. qiskit/qasm3/exporter.py +103 -77
  229. qiskit/qobj/converters/pulse_instruction.py +6 -4
  230. qiskit/qpy/__init__.py +181 -0
  231. qiskit/qpy/binary_io/circuits.py +20 -5
  232. qiskit/qpy/binary_io/schedules.py +3 -4
  233. qiskit/qpy/binary_io/value.py +310 -13
  234. qiskit/qpy/common.py +46 -2
  235. qiskit/qpy/formats.py +7 -0
  236. qiskit/qpy/interface.py +40 -4
  237. qiskit/quantum_info/__init__.py +4 -0
  238. qiskit/quantum_info/operators/channel/transformations.py +28 -21
  239. qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
  240. qiskit/quantum_info/operators/operator.py +54 -8
  241. qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
  242. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  243. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
  244. qiskit/quantum_info/operators/symplectic/pauli.py +2 -0
  245. qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
  246. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
  247. qiskit/quantum_info/states/densitymatrix.py +5 -5
  248. qiskit/quantum_info/states/stabilizerstate.py +1 -1
  249. qiskit/quantum_info/states/statevector.py +6 -6
  250. qiskit/result/mitigation/base_readout_mitigator.py +1 -1
  251. qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
  252. qiskit/result/mitigation/local_readout_mitigator.py +9 -1
  253. qiskit/result/mitigation/utils.py +57 -0
  254. qiskit/scheduler/config.py +2 -0
  255. qiskit/scheduler/methods/basic.py +3 -0
  256. qiskit/scheduler/schedule_circuit.py +2 -0
  257. qiskit/scheduler/sequence.py +2 -0
  258. qiskit/synthesis/__init__.py +25 -0
  259. qiskit/synthesis/arithmetic/__init__.py +16 -0
  260. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  261. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  262. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  263. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  264. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  265. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  266. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  267. qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
  268. qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
  269. qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
  270. qiskit/synthesis/evolution/__init__.py +1 -0
  271. qiskit/synthesis/evolution/lie_trotter.py +16 -42
  272. qiskit/synthesis/evolution/pauli_network.py +80 -0
  273. qiskit/synthesis/evolution/product_formula.py +165 -238
  274. qiskit/synthesis/evolution/qdrift.py +36 -29
  275. qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
  276. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  277. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  278. qiskit/synthesis/qft/qft_decompose_full.py +19 -1
  279. qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
  280. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
  281. qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
  282. qiskit/synthesis/unitary/qsd.py +5 -5
  283. qiskit/transpiler/__init__.py +21 -14
  284. qiskit/transpiler/basepasses.py +1 -1
  285. qiskit/transpiler/passes/__init__.py +2 -0
  286. qiskit/transpiler/passes/basis/basis_translator.py +9 -565
  287. qiskit/transpiler/passes/basis/decompose.py +45 -12
  288. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  289. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  290. qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
  291. qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
  292. qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
  293. qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
  294. qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
  295. qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
  296. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  297. qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
  298. qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
  299. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  300. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
  301. qiskit/transpiler/passes/optimization/consolidate_blocks.py +48 -131
  302. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
  303. qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
  304. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
  305. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  306. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
  307. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  308. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
  309. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
  310. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
  311. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
  312. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  313. qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
  314. qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
  315. qiskit/transpiler/passes/scheduling/alap.py +1 -1
  316. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
  317. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  318. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
  319. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
  320. qiskit/transpiler/passes/scheduling/asap.py +1 -1
  321. qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
  322. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
  323. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  324. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
  325. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
  326. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
  327. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
  328. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +262 -99
  329. qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
  330. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
  331. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
  332. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
  333. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
  334. qiskit/transpiler/passes/utils/gate_direction.py +12 -275
  335. qiskit/transpiler/passes/utils/gates_basis.py +7 -30
  336. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
  337. qiskit/transpiler/passmanager_config.py +22 -4
  338. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
  339. qiskit/transpiler/preset_passmanagers/common.py +5 -3
  340. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +125 -42
  341. qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
  342. qiskit/transpiler/target.py +74 -16
  343. qiskit/utils/deprecate_pulse.py +119 -0
  344. qiskit/visualization/circuit/_utils.py +2 -2
  345. qiskit/visualization/circuit/circuit_visualization.py +3 -2
  346. qiskit/visualization/circuit/matplotlib.py +1 -1
  347. qiskit/visualization/dag_visualization.py +1 -1
  348. qiskit/visualization/pass_manager_visualization.py +3 -14
  349. qiskit/visualization/pulse_v2/interface.py +3 -1
  350. qiskit/visualization/timeline/core.py +25 -2
  351. qiskit/visualization/timeline/interface.py +12 -0
  352. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/METADATA +9 -8
  353. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/RECORD +357 -346
  354. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/WHEEL +1 -1
  355. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/entry_points.txt +19 -0
  356. qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
  357. qiskit/synthesis/two_qubit/weyl.py +0 -97
  358. qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
  359. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/LICENSE.txt +0 -0
  360. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc2.dist-info}/top_level.txt +0 -0
@@ -36,7 +36,11 @@ For example, to append a multi-controlled CNOT:
36
36
  circuit.append(gate, [0, 1, 4, 2, 3])
37
37
  circuit.draw('mpl')
38
38
 
39
- The library is organized in several sections.
39
+ The library is organized in several sections. The function
40
+ :func:`.get_standard_gate_name_mapping` allows you to see the available standard gates and operations.
41
+
42
+ .. autofunction:: get_standard_gate_name_mapping
43
+
40
44
 
41
45
  Standard gates
42
46
  ==============
@@ -56,7 +60,7 @@ For example:
56
60
  print(gate.power(1/2).to_matrix()) # √X gate
57
61
  print(gate.control(1).to_matrix()) # CX (controlled X) gate
58
62
 
59
- .. parsed-literal::
63
+ .. code-block:: text
60
64
 
61
65
  [[0.+0.j 1.+0.j]
62
66
  [1.+0.j 0.+0.j]]
@@ -126,6 +130,7 @@ For example:
126
130
  ZGate
127
131
  GlobalPhaseGate
128
132
 
133
+
129
134
  Standard Directives
130
135
  ===================
131
136
 
@@ -152,15 +157,15 @@ set the amount of qubits involved at instantiation time.
152
157
 
153
158
  .. code-block::
154
159
 
155
- from qiskit.circuit.library import Diagonal
160
+ from qiskit.circuit.library import DiagonalGate
156
161
 
157
- diagonal = Diagonal([1, 1])
162
+ diagonal = DiagonalGate([1, 1j])
158
163
  print(diagonal.num_qubits)
159
164
 
160
- diagonal = Diagonal([1, 1, 1, 1])
165
+ diagonal = DiagonalGate([1, 1, 1, -1])
161
166
  print(diagonal.num_qubits)
162
167
 
163
- .. parsed-literal::
168
+ .. code-block:: text
164
169
 
165
170
  1
166
171
  2
@@ -181,6 +186,7 @@ set the amount of qubits involved at instantiation time.
181
186
  GRX
182
187
  GRY
183
188
  GRZ
189
+ MCMTGate
184
190
  MCPhaseGate
185
191
  MCXGate
186
192
  MCXGrayCode
@@ -210,9 +216,15 @@ or of a set of qubit states.
210
216
  :template: autosummary/class_no_inherited_members.rst
211
217
 
212
218
  AND
219
+ AndGate
213
220
  OR
221
+ OrGate
214
222
  XOR
223
+ BitwiseXorGate
224
+ random_bitwise_xor
215
225
  InnerProduct
226
+ InnerProductGate
227
+
216
228
 
217
229
  Basis Change Circuits
218
230
  =====================
@@ -268,6 +280,9 @@ Adders
268
280
  CDKMRippleCarryAdder
269
281
  VBERippleCarryAdder
270
282
  WeightedAdder
283
+ ModularAdderGate
284
+ HalfAdderGate
285
+ FullAdderGate
271
286
 
272
287
  Multipliers
273
288
  -----------
@@ -278,6 +293,7 @@ Multipliers
278
293
 
279
294
  HRSCumulativeMultiplier
280
295
  RGQFTMultiplier
296
+ MultiplierGate
281
297
 
282
298
  Comparators
283
299
  -----------
@@ -309,12 +325,16 @@ Other arithmetic functions
309
325
  Particular Quantum Circuits
310
326
  ===========================
311
327
 
328
+ The following gates and quantum circuits define specific
329
+ quantum circuits of interest:
330
+
312
331
  .. autosummary::
313
332
  :toctree: ../stubs/
314
333
  :template: autosummary/class_no_inherited_members.rst
315
334
 
316
335
  FourierChecking
317
336
  GraphState
337
+ GraphStateGate
318
338
  HiddenLinearFunction
319
339
  IQP
320
340
  QuantumVolume
@@ -325,10 +345,42 @@ Particular Quantum Circuits
325
345
  HamiltonianGate
326
346
  UnitaryOverlap
327
347
 
348
+ For circuits that have a well-defined structure it is preferrable
349
+ to use the following functions to construct them:
350
+
351
+ .. autosummary::
352
+ :toctree: ../stubs/
353
+ :template: autosummary/class_no_inherited_members.rst
354
+
355
+ fourier_checking
356
+ hidden_linear_function
357
+ iqp
358
+ random_iqp
359
+ quantum_volume
360
+ phase_estimation
361
+ grover_operator
362
+ unitary_overlap
363
+
328
364
 
329
365
  N-local circuits
330
366
  ================
331
367
 
368
+ The following functions return a parameterized :class:`.QuantumCircuit` to use as ansatz in
369
+ a broad set of variational quantum algorithms:
370
+
371
+ .. autosummary::
372
+ :toctree: ../stubs/
373
+ :template: autosummary/class_no_inherited_members.rst
374
+
375
+ n_local
376
+ efficient_su2
377
+ real_amplitudes
378
+ pauli_two_design
379
+ excitation_preserving
380
+ qaoa_ansatz
381
+ hamiltonian_variational_ansatz
382
+ evolved_operator_ansatz
383
+
332
384
  These :class:`~qiskit.circuit.library.BlueprintCircuit` subclasses are used
333
385
  as parameterized models (a.k.a. ansatzes or variational forms) in variational algorithms.
334
386
  They are heavily used in near-term algorithms in e.g. Chemistry, Physics or Optimization.
@@ -350,6 +402,17 @@ They are heavily used in near-term algorithms in e.g. Chemistry, Physics or Opti
350
402
  Data encoding circuits
351
403
  ======================
352
404
 
405
+ The following functions return a parameterized :class:`.QuantumCircuit` to use as data
406
+ encoding circuits in a series of variational quantum algorithms:
407
+
408
+ .. autosummary::
409
+ :toctree: ../stubs/
410
+ :template: autosummary/class_no_inherited_members.rst
411
+
412
+ pauli_feature_map
413
+ z_feature_map
414
+ zz_feature_map
415
+
353
416
  These :class:`~qiskit.circuit.library.BlueprintCircuit` encode classical
354
417
  data in quantum states and are used as feature maps for classification.
355
418
 
@@ -360,6 +423,17 @@ data in quantum states and are used as feature maps for classification.
360
423
  PauliFeatureMap
361
424
  ZFeatureMap
362
425
  ZZFeatureMap
426
+
427
+
428
+ Data preparation circuits
429
+ =========================
430
+
431
+ The following operations are used for state preparation:
432
+
433
+ .. autosummary::
434
+ :toctree: ../stubs/
435
+ :template: autosummary/class_no_inherited_members.rst
436
+
363
437
  StatePreparation
364
438
  Initialize
365
439
 
@@ -500,6 +574,7 @@ from .generalized_gates import (
500
574
  Permutation,
501
575
  PermutationGate,
502
576
  GMS,
577
+ MCMTGate,
503
578
  MSGate,
504
579
  GR,
505
580
  GRX,
@@ -520,12 +595,21 @@ from .pauli_evolution import PauliEvolutionGate
520
595
  from .hamiltonian_gate import HamiltonianGate
521
596
  from .boolean_logic import (
522
597
  AND,
598
+ AndGate,
523
599
  OR,
600
+ OrGate,
524
601
  XOR,
602
+ BitwiseXorGate,
603
+ random_bitwise_xor,
525
604
  InnerProduct,
605
+ InnerProductGate,
526
606
  )
527
607
  from .basis_change import QFT, QFTGate
528
608
  from .arithmetic import (
609
+ ModularAdderGate,
610
+ HalfAdderGate,
611
+ FullAdderGate,
612
+ MultiplierGate,
529
613
  FunctionalPauliRotations,
530
614
  LinearPauliRotations,
531
615
  PiecewiseLinearPauliRotations,
@@ -545,28 +629,40 @@ from .arithmetic import (
545
629
  )
546
630
 
547
631
  from .n_local import (
632
+ n_local,
548
633
  NLocal,
549
634
  TwoLocal,
635
+ pauli_two_design,
550
636
  PauliTwoDesign,
637
+ real_amplitudes,
551
638
  RealAmplitudes,
639
+ efficient_su2,
552
640
  EfficientSU2,
641
+ hamiltonian_variational_ansatz,
642
+ evolved_operator_ansatz,
553
643
  EvolvedOperatorAnsatz,
644
+ excitation_preserving,
554
645
  ExcitationPreserving,
646
+ qaoa_ansatz,
555
647
  QAOAAnsatz,
556
648
  )
557
649
  from .data_preparation import (
650
+ z_feature_map,
651
+ zz_feature_map,
652
+ pauli_feature_map,
558
653
  PauliFeatureMap,
559
654
  ZFeatureMap,
560
655
  ZZFeatureMap,
561
656
  StatePreparation,
562
657
  Initialize,
563
658
  )
564
- from .quantum_volume import QuantumVolume
565
- from .fourier_checking import FourierChecking
566
- from .graph_state import GraphState
567
- from .hidden_linear_function import HiddenLinearFunction
568
- from .iqp import IQP
569
- from .phase_estimation import PhaseEstimation
570
- from .grover_operator import GroverOperator
659
+ from .quantum_volume import QuantumVolume, quantum_volume
660
+ from .fourier_checking import FourierChecking, fourier_checking
661
+ from .graph_state import GraphState, GraphStateGate
662
+ from .hidden_linear_function import HiddenLinearFunction, hidden_linear_function
663
+ from .iqp import IQP, iqp, random_iqp
664
+ from .phase_estimation import PhaseEstimation, phase_estimation
665
+ from .grover_operator import GroverOperator, grover_operator
571
666
  from .phase_oracle import PhaseOracle
572
- from .overlap import UnitaryOverlap
667
+ from .overlap import UnitaryOverlap, unitary_overlap
668
+ from .standard_gates import get_standard_gate_name_mapping
@@ -21,7 +21,14 @@ from .polynomial_pauli_rotations import PolynomialPauliRotations
21
21
  from .weighted_adder import WeightedAdder
22
22
  from .quadratic_form import QuadraticForm
23
23
  from .linear_amplitude_function import LinearAmplitudeFunction
24
- from .adders import VBERippleCarryAdder, CDKMRippleCarryAdder, DraperQFTAdder
24
+ from .adders import (
25
+ VBERippleCarryAdder,
26
+ CDKMRippleCarryAdder,
27
+ DraperQFTAdder,
28
+ ModularAdderGate,
29
+ HalfAdderGate,
30
+ FullAdderGate,
31
+ )
25
32
  from .piecewise_chebyshev import PiecewiseChebyshev
26
- from .multipliers import HRSCumulativeMultiplier, RGQFTMultiplier
33
+ from .multipliers import HRSCumulativeMultiplier, RGQFTMultiplier, MultiplierGate
27
34
  from .exact_reciprocal import ExactReciprocal
@@ -15,3 +15,4 @@
15
15
  from .cdkm_ripple_carry_adder import CDKMRippleCarryAdder
16
16
  from .draper_qft_adder import DraperQFTAdder
17
17
  from .vbe_ripple_carry_adder import VBERippleCarryAdder
18
+ from .adder import ModularAdderGate, HalfAdderGate, FullAdderGate
@@ -12,13 +12,16 @@
12
12
 
13
13
  """Compute the sum of two equally sized qubit registers."""
14
14
 
15
- from qiskit.circuit import QuantumCircuit
15
+ from __future__ import annotations
16
+
17
+ from qiskit.circuit import QuantumCircuit, Gate
18
+ from qiskit.utils.deprecation import deprecate_func
16
19
 
17
20
 
18
21
  class Adder(QuantumCircuit):
19
22
  r"""Compute the sum of two equally sized qubit registers.
20
23
 
21
- For two registers :math:`|a\rangle_n` and :math:|b\rangle_n` with :math:`n` qubits each, an
24
+ For two registers :math:`|a\rangle_n` and :math:`|b\rangle_n` with :math:`n` qubits each, an
22
25
  adder performs the following operation
23
26
 
24
27
  .. math::
@@ -39,6 +42,16 @@ class Adder(QuantumCircuit):
39
42
 
40
43
  """
41
44
 
45
+ @deprecate_func(
46
+ since="1.3",
47
+ additional_msg=(
48
+ "Use the adder gates provided in qiskit.circuit.library.arithmetic instead. "
49
+ "The gate type depends on the adder kind: fixed, half, full are represented by "
50
+ "ModularAdderGate, HalfAdderGate, FullAdderGate, respectively. For different adder "
51
+ "implementations, see https://docs.quantum.ibm.com/api/qiskit/synthesis.",
52
+ ),
53
+ pending=True,
54
+ )
42
55
  def __init__(self, num_state_qubits: int, name: str = "Adder") -> None:
43
56
  """
44
57
  Args:
@@ -56,3 +69,142 @@ class Adder(QuantumCircuit):
56
69
  The number of state qubits.
57
70
  """
58
71
  return self._num_state_qubits
72
+
73
+
74
+ class HalfAdderGate(Gate):
75
+ r"""Compute the sum of two equally-sized qubit registers, including a carry-out bit.
76
+
77
+ For two registers :math:`|a\rangle_n` and :math:`|b\rangle_n` with :math:`n` qubits each, an
78
+ adder performs the following operation
79
+
80
+ .. math::
81
+
82
+ |a\rangle_n |b\rangle_n \mapsto |a\rangle_n |a + b\rangle_{n + 1}.
83
+
84
+ The quantum register :math:`|a\rangle_n` (and analogously :math:`|b\rangle_n`)
85
+
86
+ .. math::
87
+
88
+ |a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
89
+
90
+ for :math:`a_i \in \{0, 1\}`, is associated with the integer value
91
+
92
+ .. math::
93
+
94
+ a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
95
+
96
+ """
97
+
98
+ def __init__(self, num_state_qubits: int, label: str | None = None) -> None:
99
+ """
100
+ Args:
101
+ num_state_qubits: The number of qubits in each of the registers.
102
+ name: The name of the circuit.
103
+ """
104
+ if num_state_qubits < 1:
105
+ raise ValueError("Need at least 1 state qubit.")
106
+
107
+ super().__init__("HalfAdder", 2 * num_state_qubits + 1, [], label=label)
108
+ self._num_state_qubits = num_state_qubits
109
+
110
+ @property
111
+ def num_state_qubits(self) -> int:
112
+ """The number of state qubits, i.e. the number of bits in each input register.
113
+
114
+ Returns:
115
+ The number of state qubits.
116
+ """
117
+ return self._num_state_qubits
118
+
119
+
120
+ class ModularAdderGate(Gate):
121
+ r"""Compute the sum modulo :math:`2^n` of two :math:`n`-sized qubit registers.
122
+
123
+ For two registers :math:`|a\rangle_n` and :math:`|b\rangle_n` with :math:`n` qubits each, an
124
+ adder performs the following operation
125
+
126
+ .. math::
127
+
128
+ |a\rangle_n |b\rangle_n \mapsto |a\rangle_n |a + b \text{ mod } 2^n\rangle_n.
129
+
130
+ The quantum register :math:`|a\rangle_n` (and analogously :math:`|b\rangle_n`)
131
+
132
+ .. math::
133
+
134
+ |a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
135
+
136
+ for :math:`a_i \in \{0, 1\}`, is associated with the integer value
137
+
138
+ .. math::
139
+
140
+ a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
141
+
142
+ """
143
+
144
+ def __init__(self, num_state_qubits: int, label: str | None = None) -> None:
145
+ """
146
+ Args:
147
+ num_state_qubits: The number of qubits in each of the registers.
148
+ name: The name of the circuit.
149
+ """
150
+ if num_state_qubits < 1:
151
+ raise ValueError("Need at least 1 state qubit.")
152
+
153
+ super().__init__("ModularAdder", 2 * num_state_qubits, [], label=label)
154
+ self._num_state_qubits = num_state_qubits
155
+
156
+ @property
157
+ def num_state_qubits(self) -> int:
158
+ """The number of state qubits, i.e. the number of bits in each input register.
159
+
160
+ Returns:
161
+ The number of state qubits.
162
+ """
163
+ return self._num_state_qubits
164
+
165
+
166
+ class FullAdderGate(Gate):
167
+ r"""Compute the sum of two :math:`n`-sized qubit registers, including carry-in and -out bits.
168
+
169
+ For two registers :math:`|a\rangle_n` and :math:`|b\rangle_n` with :math:`n` qubits each, an
170
+ adder performs the following operation
171
+
172
+ .. math::
173
+
174
+ |c_{\text{in}}\rangle_1 |a\rangle_n |b\rangle_n
175
+ \mapsto |a\rangle_n |c_{\text{in}} + a + b \rangle_{n + 1}.
176
+
177
+ The quantum register :math:`|a\rangle_n` (and analogously :math:`|b\rangle_n`)
178
+
179
+ .. math::
180
+
181
+ |a\rangle_n = |a_0\rangle \otimes \cdots \otimes |a_{n - 1}\rangle,
182
+
183
+ for :math:`a_i \in \{0, 1\}`, is associated with the integer value
184
+
185
+ .. math::
186
+
187
+ a = 2^{0}a_{0} + 2^{1}a_{1} + \cdots + 2^{n - 1}a_{n - 1}.
188
+
189
+ """
190
+
191
+ def __init__(self, num_state_qubits: int, label: str | None = None) -> None:
192
+ """
193
+ Args:
194
+ num_state_qubits: The number of qubits in each of the registers.
195
+ name: The name of the circuit.
196
+ """
197
+ if num_state_qubits < 1:
198
+ raise ValueError("Need at least 1 state qubit.")
199
+
200
+ super().__init__("FullAdder", 2 * num_state_qubits + 2, [], label=label)
201
+ self._num_state_qubits = num_state_qubits
202
+
203
+ @property
204
+ def num_state_qubits(self) -> int:
205
+ """The number of state qubits, i.e. the number of bits in each input register.
206
+
207
+ Returns:
208
+ The number of state qubits.
209
+ """
210
+ return self._num_state_qubits
@@ -12,8 +12,7 @@
12
12
 
13
13
  """Compute the sum of two qubit registers using ripple-carry approach."""
14
14
 
15
- from qiskit.circuit import QuantumCircuit, QuantumRegister, AncillaRegister
16
-
15
+ from qiskit.synthesis.arithmetic import adder_ripple_c04
17
16
  from .adder import Adder
18
17
 
19
18
 
@@ -23,7 +22,7 @@ class CDKMRippleCarryAdder(Adder):
23
22
  As an example, a ripple-carry adder circuit that performs addition on two 3-qubit sized
24
23
  registers with a carry-in bit (``kind="full"``) is as follows:
25
24
 
26
- .. parsed-literal::
25
+ .. code-block:: text
27
26
 
28
27
  ┌──────┐ ┌──────┐
29
28
  cin_0: ┤2 ├─────────────────────────────────────┤2 ├
@@ -54,7 +53,7 @@ class CDKMRippleCarryAdder(Adder):
54
53
 
55
54
  The circuit diagram for the fixed-point adder (``kind="fixed"``) on 3-qubit sized inputs is
56
55
 
57
- .. parsed-literal::
56
+ .. code-block:: text
58
57
 
59
58
  ┌──────┐┌──────┐ ┌──────┐┌──────┐
60
59
  a_0: ┤0 ├┤2 ├────────────────┤2 ├┤0 ├
@@ -75,6 +74,21 @@ class CDKMRippleCarryAdder(Adder):
75
74
  It has one less qubit than the full-adder since it doesn't have the carry-out, but uses
76
75
  a helper qubit instead of the carry-in, so it only has one less qubit, not two.
77
76
 
77
+ .. seealso::
78
+
79
+ The following generic gate objects perform additions, like this circuit class,
80
+ but allow the compiler to select the optimal decomposition based on the context.
81
+ Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
82
+ can be chosen via ``Adder=["ripple_c04"]``.
83
+
84
+ :class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
85
+ is functionally equivalent to ``kind="fixed"``.
86
+
87
+ :class:`.AdderGate`: A generic inplace adder. This
88
+ is functionally equivalent to ``kind="half"``.
89
+
90
+ :class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
91
+ is functionally equivalent to ``kind="full"``.
78
92
 
79
93
  **References:**
80
94
 
@@ -102,58 +116,8 @@ class CDKMRippleCarryAdder(Adder):
102
116
  Raises:
103
117
  ValueError: If ``num_state_qubits`` is lower than 1.
104
118
  """
105
- if num_state_qubits < 1:
106
- raise ValueError("The number of qubits must be at least 1.")
107
-
108
119
  super().__init__(num_state_qubits, name=name)
120
+ circuit = adder_ripple_c04(num_state_qubits, kind)
109
121
 
110
- if kind == "full":
111
- qr_c = QuantumRegister(1, name="cin")
112
- self.add_register(qr_c)
113
- else:
114
- qr_c = AncillaRegister(1, name="help")
115
-
116
- qr_a = QuantumRegister(num_state_qubits, name="a")
117
- qr_b = QuantumRegister(num_state_qubits, name="b")
118
- self.add_register(qr_a, qr_b)
119
-
120
- if kind in ["full", "half"]:
121
- qr_z = QuantumRegister(1, name="cout")
122
- self.add_register(qr_z)
123
-
124
- if kind != "full":
125
- self.add_register(qr_c)
126
-
127
- # build carry circuit for majority of 3 bits in-place
128
- # corresponds to MAJ gate in [1]
129
- qc_maj = QuantumCircuit(3, name="MAJ")
130
- qc_maj.cx(0, 1)
131
- qc_maj.cx(0, 2)
132
- qc_maj.ccx(2, 1, 0)
133
- maj_gate = qc_maj.to_gate()
134
-
135
- # build circuit for reversing carry operation
136
- # corresponds to UMA gate in [1]
137
- qc_uma = QuantumCircuit(3, name="UMA")
138
- qc_uma.ccx(2, 1, 0)
139
- qc_uma.cx(0, 2)
140
- qc_uma.cx(2, 1)
141
- uma_gate = qc_uma.to_gate()
142
-
143
- circuit = QuantumCircuit(*self.qregs, name=name)
144
-
145
- # build ripple-carry adder circuit
146
- circuit.append(maj_gate, [qr_a[0], qr_b[0], qr_c[0]])
147
-
148
- for i in range(num_state_qubits - 1):
149
- circuit.append(maj_gate, [qr_a[i + 1], qr_b[i + 1], qr_a[i]])
150
-
151
- if kind in ["full", "half"]:
152
- circuit.cx(qr_a[-1], qr_z[0])
153
-
154
- for i in reversed(range(num_state_qubits - 1)):
155
- circuit.append(uma_gate, [qr_a[i + 1], qr_b[i + 1], qr_a[i]])
156
-
157
- circuit.append(uma_gate, [qr_a[0], qr_b[0], qr_c[0]])
158
-
122
+ self.add_register(*circuit.qregs)
159
123
  self.append(circuit.to_gate(), self.qubits)
@@ -31,7 +31,7 @@ class DraperQFTAdder(Adder):
31
31
  As an example, a non-fixed_point QFT adder circuit that performs addition on two 2-qubit sized
32
32
  registers is as follows:
33
33
 
34
- .. parsed-literal::
34
+ .. code-block:: text
35
35
 
36
36
  a_0: ─────────■──────■────────────────────────■────────────────
37
37
  │ │ │
@@ -44,6 +44,19 @@ class DraperQFTAdder(Adder):
44
44
  cout_0: ┤2 ├────────────────────────■────────■───────┤2 ├
45
45
  └──────┘ └───────┘
46
46
 
47
+ .. seealso::
48
+
49
+ The following generic gate objects perform additions, like this circuit class,
50
+ but allow the compiler to select the optimal decomposition based on the context.
51
+ Specific implementations can be set via the :class:`.HLSConfig`, e.g. this
52
+ circuit can be chosen via ``Adder=["qft_d00"]``.
53
+
54
+ :class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
55
+ is functionally equivalent to ``kind="fixed"``.
56
+
57
+ :class:`.AdderGate`: A generic inplace adder. This
58
+ is functionally equivalent to ``kind="half"``.
59
+
47
60
  **References:**
48
61
 
49
62
  [1] T. G. Draper, Addition on a Quantum Computer, 2000.