qiskit 1.3.0b1__cp39-abi3-macosx_11_0_arm64.whl → 1.3.0rc1__cp39-abi3-macosx_11_0_arm64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (359) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +20 -1
  3. qiskit/_accelerate.abi3.so +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 +83 -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 +153 -1
  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/providers/__init__.py +1 -1
  196. qiskit/providers/backend.py +12 -1
  197. qiskit/providers/backend_compat.py +23 -3
  198. qiskit/providers/basic_provider/basic_simulator.py +12 -2
  199. qiskit/providers/fake_provider/fake_pulse_backend.py +6 -1
  200. qiskit/providers/fake_provider/generic_backend_v2.py +46 -30
  201. qiskit/providers/models/pulsedefaults.py +2 -0
  202. qiskit/pulse/builder.py +59 -18
  203. qiskit/pulse/calibration_entries.py +4 -1
  204. qiskit/pulse/channels.py +2 -0
  205. qiskit/pulse/exceptions.py +2 -0
  206. qiskit/pulse/instruction_schedule_map.py +21 -6
  207. qiskit/pulse/instructions/acquire.py +2 -0
  208. qiskit/pulse/instructions/delay.py +2 -0
  209. qiskit/pulse/instructions/directives.py +8 -0
  210. qiskit/pulse/instructions/frequency.py +3 -0
  211. qiskit/pulse/instructions/instruction.py +2 -0
  212. qiskit/pulse/instructions/phase.py +3 -0
  213. qiskit/pulse/instructions/play.py +2 -0
  214. qiskit/pulse/instructions/reference.py +2 -0
  215. qiskit/pulse/instructions/snapshot.py +2 -0
  216. qiskit/pulse/library/pulse.py +2 -0
  217. qiskit/pulse/library/symbolic_pulses.py +28 -0
  218. qiskit/pulse/library/waveform.py +2 -0
  219. qiskit/pulse/macros.py +1 -1
  220. qiskit/pulse/schedule.py +12 -13
  221. qiskit/pulse/transforms/alignments.py +5 -3
  222. qiskit/pulse/transforms/dag.py +7 -0
  223. qiskit/qasm2/export.py +5 -3
  224. qiskit/qasm2/parse.py +46 -2
  225. qiskit/qasm3/__init__.py +1 -0
  226. qiskit/qasm3/ast.py +123 -15
  227. qiskit/qasm3/exporter.py +103 -77
  228. qiskit/qobj/converters/pulse_instruction.py +6 -4
  229. qiskit/qpy/__init__.py +181 -0
  230. qiskit/qpy/binary_io/circuits.py +20 -5
  231. qiskit/qpy/binary_io/schedules.py +3 -4
  232. qiskit/qpy/binary_io/value.py +310 -13
  233. qiskit/qpy/common.py +46 -2
  234. qiskit/qpy/formats.py +7 -0
  235. qiskit/qpy/interface.py +40 -4
  236. qiskit/quantum_info/__init__.py +4 -0
  237. qiskit/quantum_info/operators/channel/transformations.py +28 -21
  238. qiskit/quantum_info/operators/dihedral/dihedral.py +1 -1
  239. qiskit/quantum_info/operators/operator.py +54 -8
  240. qiskit/quantum_info/operators/symplectic/base_pauli.py +11 -19
  241. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  242. qiskit/quantum_info/operators/symplectic/clifford_circuits.py +1 -1
  243. qiskit/quantum_info/operators/symplectic/pauli.py +2 -0
  244. qiskit/quantum_info/operators/symplectic/pauli_list.py +4 -4
  245. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +23 -2
  246. qiskit/quantum_info/states/densitymatrix.py +5 -5
  247. qiskit/quantum_info/states/stabilizerstate.py +1 -1
  248. qiskit/quantum_info/states/statevector.py +5 -5
  249. qiskit/result/mitigation/base_readout_mitigator.py +1 -1
  250. qiskit/result/mitigation/correlated_readout_mitigator.py +9 -1
  251. qiskit/result/mitigation/local_readout_mitigator.py +9 -1
  252. qiskit/result/mitigation/utils.py +57 -0
  253. qiskit/scheduler/config.py +2 -0
  254. qiskit/scheduler/methods/basic.py +3 -0
  255. qiskit/scheduler/schedule_circuit.py +2 -0
  256. qiskit/scheduler/sequence.py +2 -0
  257. qiskit/synthesis/__init__.py +25 -0
  258. qiskit/synthesis/arithmetic/__init__.py +16 -0
  259. qiskit/synthesis/arithmetic/adders/__init__.py +17 -0
  260. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +154 -0
  261. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +103 -0
  262. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +161 -0
  263. qiskit/synthesis/arithmetic/multipliers/__init__.py +16 -0
  264. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +102 -0
  265. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +99 -0
  266. qiskit/synthesis/clifford/clifford_decompose_bm.py +1 -2
  267. qiskit/synthesis/clifford/clifford_decompose_greedy.py +3 -2
  268. qiskit/synthesis/clifford/clifford_decompose_layers.py +2 -1
  269. qiskit/synthesis/evolution/__init__.py +1 -0
  270. qiskit/synthesis/evolution/lie_trotter.py +16 -42
  271. qiskit/synthesis/evolution/pauli_network.py +80 -0
  272. qiskit/synthesis/evolution/product_formula.py +165 -238
  273. qiskit/synthesis/evolution/qdrift.py +36 -29
  274. qiskit/synthesis/evolution/suzuki_trotter.py +87 -27
  275. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  276. qiskit/synthesis/multi_controlled/mcmt_vchain.py +52 -0
  277. qiskit/synthesis/qft/qft_decompose_full.py +19 -1
  278. qiskit/synthesis/qft/qft_decompose_lnn.py +2 -1
  279. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -1
  280. qiskit/synthesis/two_qubit/two_qubit_decompose.py +4 -63
  281. qiskit/synthesis/unitary/qsd.py +5 -5
  282. qiskit/transpiler/__init__.py +21 -14
  283. qiskit/transpiler/basepasses.py +1 -1
  284. qiskit/transpiler/passes/__init__.py +2 -0
  285. qiskit/transpiler/passes/basis/basis_translator.py +9 -565
  286. qiskit/transpiler/passes/basis/decompose.py +45 -12
  287. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  288. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +1 -1
  289. qiskit/transpiler/passes/calibration/pulse_gate.py +4 -2
  290. qiskit/transpiler/passes/calibration/rx_builder.py +11 -7
  291. qiskit/transpiler/passes/calibration/rzx_builder.py +46 -30
  292. qiskit/transpiler/passes/layout/disjoint_utils.py +15 -13
  293. qiskit/transpiler/passes/layout/sabre_layout.py +7 -2
  294. qiskit/transpiler/passes/layout/sabre_pre_layout.py +5 -0
  295. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  296. qiskit/transpiler/passes/optimization/collect_cliffords.py +19 -3
  297. qiskit/transpiler/passes/optimization/collect_linear_functions.py +1 -1
  298. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  299. qiskit/transpiler/passes/optimization/commutative_inverse_cancellation.py +1 -1
  300. qiskit/transpiler/passes/optimization/consolidate_blocks.py +40 -130
  301. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +4 -2
  302. qiskit/transpiler/passes/optimization/elide_permutations.py +9 -32
  303. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +5 -11
  304. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  305. qiskit/transpiler/passes/optimization/optimize_swap_before_measure.py +1 -1
  306. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +69 -0
  307. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +5 -5
  308. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +4 -4
  309. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +2 -2
  310. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +1 -1
  311. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  312. qiskit/transpiler/passes/routing/sabre_swap.py +7 -3
  313. qiskit/transpiler/passes/routing/star_prerouting.py +2 -2
  314. qiskit/transpiler/passes/scheduling/alap.py +1 -1
  315. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +2 -2
  316. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  317. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +2 -0
  318. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +2 -2
  319. qiskit/transpiler/passes/scheduling/asap.py +1 -1
  320. qiskit/transpiler/passes/scheduling/base_scheduler.py +14 -12
  321. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +9 -4
  322. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  323. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +16 -5
  324. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +4 -1
  325. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +6 -2
  326. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +9 -4
  327. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +257 -93
  328. qiskit/transpiler/passes/synthesis/hls_plugins.py +637 -7
  329. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +3 -3
  330. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +55 -34
  331. qiskit/transpiler/passes/utils/barrier_before_final_measurements.py +2 -56
  332. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +5 -0
  333. qiskit/transpiler/passes/utils/gate_direction.py +12 -275
  334. qiskit/transpiler/passes/utils/gates_basis.py +7 -30
  335. qiskit/transpiler/passes/utils/merge_adjacent_barriers.py +2 -1
  336. qiskit/transpiler/passmanager_config.py +22 -4
  337. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +40 -14
  338. qiskit/transpiler/preset_passmanagers/common.py +5 -3
  339. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +124 -42
  340. qiskit/transpiler/preset_passmanagers/plugin.py +1 -1
  341. qiskit/transpiler/target.py +74 -16
  342. qiskit/utils/deprecate_pulse.py +119 -0
  343. qiskit/visualization/circuit/_utils.py +2 -2
  344. qiskit/visualization/circuit/circuit_visualization.py +3 -2
  345. qiskit/visualization/circuit/matplotlib.py +1 -1
  346. qiskit/visualization/dag_visualization.py +1 -1
  347. qiskit/visualization/pass_manager_visualization.py +3 -14
  348. qiskit/visualization/pulse_v2/interface.py +3 -1
  349. qiskit/visualization/timeline/core.py +25 -2
  350. qiskit/visualization/timeline/interface.py +12 -0
  351. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/METADATA +3 -2
  352. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/RECORD +356 -345
  353. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/WHEEL +1 -1
  354. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/entry_points.txt +19 -0
  355. qiskit/circuit/library/data_preparation/zz_feature_map.py +0 -118
  356. qiskit/synthesis/two_qubit/weyl.py +0 -97
  357. qiskit/transpiler/passes/synthesis/qubit_tracker.py +0 -132
  358. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.dist-info}/LICENSE.txt +0 -0
  359. {qiskit-1.3.0b1.dist-info → qiskit-1.3.0rc1.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
215
224
  InnerProduct
225
+ InnerProductGate
226
+
227
+ .. autofunction:: random_bitwise_xor
216
228
 
217
229
  Basis Change Circuits
218
230
  =====================
@@ -314,21 +326,45 @@ Particular Quantum Circuits
314
326
  :template: autosummary/class_no_inherited_members.rst
315
327
 
316
328
  FourierChecking
329
+ fourier_checking
317
330
  GraphState
331
+ GraphStateGate
318
332
  HiddenLinearFunction
333
+ hidden_linear_function
319
334
  IQP
335
+ iqp
336
+ random_iqp
320
337
  QuantumVolume
338
+ quantum_volume
321
339
  PhaseEstimation
340
+ phase_estimation
322
341
  GroverOperator
342
+ grover_operator
323
343
  PhaseOracle
324
344
  PauliEvolutionGate
325
345
  HamiltonianGate
326
346
  UnitaryOverlap
347
+ unitary_overlap
327
348
 
328
349
 
329
350
  N-local circuits
330
351
  ================
331
352
 
353
+ The following functions return a parameterized :class:`.QuantumCircuit` to use as ansatz in
354
+ a broad set of variational quantum algorithms:
355
+
356
+ .. autosummary::
357
+ :toctree: ../stubs/
358
+ :template: autosummary/class_no_inherited_members.rst
359
+
360
+ n_local
361
+ efficient_su2
362
+ real_amplitudes
363
+ pauli_two_design
364
+ excitation_preserving
365
+ hamiltonian_variational_ansatz
366
+ evolved_operator_ansatz
367
+
332
368
  These :class:`~qiskit.circuit.library.BlueprintCircuit` subclasses are used
333
369
  as parameterized models (a.k.a. ansatzes or variational forms) in variational algorithms.
334
370
  They are heavily used in near-term algorithms in e.g. Chemistry, Physics or Optimization.
@@ -350,6 +386,17 @@ They are heavily used in near-term algorithms in e.g. Chemistry, Physics or Opti
350
386
  Data encoding circuits
351
387
  ======================
352
388
 
389
+ The following functions return a parameterized :class:`.QuantumCircuit` to use as data
390
+ encoding circuits in a series of variational quantum algorithms:
391
+
392
+ .. autosummary::
393
+ :toctree: ../stubs/
394
+ :template: autosummary/class_no_inherited_members.rst
395
+
396
+ pauli_feature_map
397
+ z_feature_map
398
+ zz_feature_map
399
+
353
400
  These :class:`~qiskit.circuit.library.BlueprintCircuit` encode classical
354
401
  data in quantum states and are used as feature maps for classification.
355
402
 
@@ -500,6 +547,7 @@ from .generalized_gates import (
500
547
  Permutation,
501
548
  PermutationGate,
502
549
  GMS,
550
+ MCMTGate,
503
551
  MSGate,
504
552
  GR,
505
553
  GRX,
@@ -520,12 +568,21 @@ from .pauli_evolution import PauliEvolutionGate
520
568
  from .hamiltonian_gate import HamiltonianGate
521
569
  from .boolean_logic import (
522
570
  AND,
571
+ AndGate,
523
572
  OR,
573
+ OrGate,
524
574
  XOR,
575
+ BitwiseXorGate,
576
+ random_bitwise_xor,
525
577
  InnerProduct,
578
+ InnerProductGate,
526
579
  )
527
580
  from .basis_change import QFT, QFTGate
528
581
  from .arithmetic import (
582
+ ModularAdderGate,
583
+ HalfAdderGate,
584
+ FullAdderGate,
585
+ MultiplierGate,
529
586
  FunctionalPauliRotations,
530
587
  LinearPauliRotations,
531
588
  PiecewiseLinearPauliRotations,
@@ -545,28 +602,40 @@ from .arithmetic import (
545
602
  )
546
603
 
547
604
  from .n_local import (
605
+ n_local,
548
606
  NLocal,
549
607
  TwoLocal,
608
+ pauli_two_design,
550
609
  PauliTwoDesign,
610
+ real_amplitudes,
551
611
  RealAmplitudes,
612
+ efficient_su2,
552
613
  EfficientSU2,
614
+ hamiltonian_variational_ansatz,
615
+ evolved_operator_ansatz,
553
616
  EvolvedOperatorAnsatz,
617
+ excitation_preserving,
554
618
  ExcitationPreserving,
619
+ qaoa_ansatz,
555
620
  QAOAAnsatz,
556
621
  )
557
622
  from .data_preparation import (
623
+ z_feature_map,
624
+ zz_feature_map,
625
+ pauli_feature_map,
558
626
  PauliFeatureMap,
559
627
  ZFeatureMap,
560
628
  ZZFeatureMap,
561
629
  StatePreparation,
562
630
  Initialize,
563
631
  )
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
632
+ from .quantum_volume import QuantumVolume, quantum_volume
633
+ from .fourier_checking import FourierChecking, fourier_checking
634
+ from .graph_state import GraphState, GraphStateGate
635
+ from .hidden_linear_function import HiddenLinearFunction, hidden_linear_function
636
+ from .iqp import IQP, iqp, random_iqp
637
+ from .phase_estimation import PhaseEstimation, phase_estimation
638
+ from .grover_operator import GroverOperator, grover_operator
571
639
  from .phase_oracle import PhaseOracle
572
- from .overlap import UnitaryOverlap
640
+ from .overlap import UnitaryOverlap, unitary_overlap
641
+ 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,7 +12,10 @@
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):
@@ -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.
@@ -11,11 +11,9 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
  """Compute the sum of two qubit registers using Classical Addition."""
14
- from __future__ import annotations
15
- from qiskit.circuit.bit import Bit
16
-
17
- from qiskit.circuit import QuantumCircuit, QuantumRegister, AncillaRegister
18
14
 
15
+ from __future__ import annotations
16
+ from qiskit.synthesis.arithmetic import adder_ripple_v95
19
17
  from .adder import Adder
20
18
 
21
19
 
@@ -26,7 +24,7 @@ class VBERippleCarryAdder(Adder):
26
24
  As an example, a classical adder circuit that performs full addition (i.e. including
27
25
  a carry-in bit) on two 2-qubit sized registers is as follows:
28
26
 
29
- .. parsed-literal::
27
+ .. code-block:: text
30
28
 
31
29
  ┌────────┐ ┌───────────┐┌──────┐
32
30
  cin_0: ┤0 ├───────────────────────┤0 ├┤0 ├
@@ -52,6 +50,22 @@ class VBERippleCarryAdder(Adder):
52
50
  This is different ordering as compared to Figure 2 in [1], which leads to a different
53
51
  drawing of the circuit.
54
52
 
53
+ .. seealso::
54
+
55
+ The following generic gate objects perform additions, like this circuit class,
56
+ but allow the compiler to select the optimal decomposition based on the context.
57
+ Specific implementations can be set via the :class:`.HLSConfig`, e.g. this circuit
58
+ can be chosen via ``Adder=["ripple_v95"]``.
59
+
60
+ :class:`.ModularAdderGate`: A generic inplace adder, modulo :math:`2^n`. This
61
+ is functionally equivalent to ``kind="fixed"``.
62
+
63
+ :class:`.AdderGate`: A generic inplace adder. This
64
+ is functionally equivalent to ``kind="half"``.
65
+
66
+ :class:`.FullAdderGate`: A generic inplace adder, with a carry-in bit. This
67
+ is functionally equivalent to ``kind="full"``.
68
+
55
69
  **References:**
56
70
 
57
71
  [1] Vedral et al., Quantum Networks for Elementary Arithmetic Operations, 1995.
@@ -74,92 +88,8 @@ class VBERippleCarryAdder(Adder):
74
88
  Raises:
75
89
  ValueError: If ``num_state_qubits`` is lower than 1.
76
90
  """
77
- if num_state_qubits < 1:
78
- raise ValueError("The number of qubits must be at least 1.")
79
-
80
91
  super().__init__(num_state_qubits, name=name)
92
+ circuit = adder_ripple_v95(num_state_qubits, kind)
81
93
 
82
- # define the input registers
83
- registers: list[QuantumRegister | list[Bit]] = []
84
- if kind == "full":
85
- qr_cin = QuantumRegister(1, name="cin")
86
- registers.append(qr_cin)
87
- else:
88
- qr_cin = QuantumRegister(0)
89
-
90
- qr_a = QuantumRegister(num_state_qubits, name="a")
91
- qr_b = QuantumRegister(num_state_qubits, name="b")
92
-
93
- registers += [qr_a, qr_b]
94
-
95
- if kind in ["half", "full"]:
96
- qr_cout = QuantumRegister(1, name="cout")
97
- registers.append(qr_cout)
98
- else:
99
- qr_cout = QuantumRegister(0)
100
-
101
- self.add_register(*registers)
102
-
103
- if num_state_qubits > 1:
104
- qr_help = AncillaRegister(num_state_qubits - 1, name="helper")
105
- self.add_register(qr_help)
106
- else:
107
- qr_help = AncillaRegister(0)
108
-
109
- # the code is simplified a lot if we create a list of all carries and helpers
110
- carries = qr_cin[:] + qr_help[:] + qr_cout[:]
111
-
112
- # corresponds to Carry gate in [1]
113
- qc_carry = QuantumCircuit(4, name="Carry")
114
- qc_carry.ccx(1, 2, 3)
115
- qc_carry.cx(1, 2)
116
- qc_carry.ccx(0, 2, 3)
117
- carry_gate = qc_carry.to_gate()
118
- carry_gate_dg = carry_gate.inverse()
119
-
120
- # corresponds to Sum gate in [1]
121
- qc_sum = QuantumCircuit(3, name="Sum")
122
- qc_sum.cx(1, 2)
123
- qc_sum.cx(0, 2)
124
- sum_gate = qc_sum.to_gate()
125
-
126
- circuit = QuantumCircuit(*self.qregs, name=name)
127
-
128
- # handle all cases for the first qubits, depending on whether cin is available
129
- i = 0
130
- if kind == "half":
131
- i += 1
132
- circuit.ccx(qr_a[0], qr_b[0], carries[0])
133
- elif kind == "fixed":
134
- i += 1
135
- if num_state_qubits == 1:
136
- circuit.cx(qr_a[0], qr_b[0])
137
- else:
138
- circuit.ccx(qr_a[0], qr_b[0], carries[0])
139
-
140
- for inp, out in zip(carries[:-1], carries[1:]):
141
- circuit.append(carry_gate, [inp, qr_a[i], qr_b[i], out])
142
- i += 1
143
-
144
- if kind in ["full", "half"]: # final CX (cancels for the 'fixed' case)
145
- circuit.cx(qr_a[-1], qr_b[-1])
146
-
147
- if len(carries) > 1:
148
- circuit.append(sum_gate, [carries[-2], qr_a[-1], qr_b[-1]])
149
-
150
- i -= 2
151
- for j, (inp, out) in enumerate(zip(reversed(carries[:-1]), reversed(carries[1:]))):
152
- if j == 0:
153
- if kind == "fixed":
154
- i += 1
155
- else:
156
- continue
157
- circuit.append(carry_gate_dg, [inp, qr_a[i], qr_b[i], out])
158
- circuit.append(sum_gate, [inp, qr_a[i], qr_b[i]])
159
- i -= 1
160
-
161
- if kind in ["half", "fixed"] and num_state_qubits > 1:
162
- circuit.ccx(qr_a[0], qr_b[0], carries[0])
163
- circuit.cx(qr_a[0], qr_b[0])
164
-
94
+ self.add_register(*circuit.qregs)
165
95
  self.append(circuit.to_gate(), self.qubits)
@@ -27,7 +27,7 @@ class LinearPauliRotations(FunctionalPauliRotations):
27
27
  For a register of state qubits :math:`|x\rangle`, a target qubit :math:`|0\rangle` and the
28
28
  basis ``'Y'`` this circuit acts as:
29
29
 
30
- .. parsed-literal::
30
+ .. code-block:: text
31
31
 
32
32
  q_0: ─────────────────────────■───────── ... ──────────────────────
33
33