qiskit 1.4.0__cp39-abi3-macosx_11_0_arm64.whl → 2.0.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 (456) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +2 -5
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +24 -5
  5. qiskit/circuit/{add_control.py → _add_control.py} +32 -12
  6. qiskit/circuit/_classical_resource_map.py +5 -3
  7. qiskit/circuit/barrier.py +3 -7
  8. qiskit/circuit/classical/expr/__init__.py +31 -3
  9. qiskit/circuit/classical/expr/constructors.py +248 -28
  10. qiskit/circuit/classical/expr/expr.py +104 -3
  11. qiskit/circuit/classical/expr/visitors.py +75 -0
  12. qiskit/circuit/classical/types/__init__.py +12 -8
  13. qiskit/circuit/classical/types/ordering.py +14 -7
  14. qiskit/circuit/classical/types/types.py +36 -0
  15. qiskit/circuit/commutation_checker.py +34 -7
  16. qiskit/circuit/controlflow/__init__.py +32 -1
  17. qiskit/circuit/controlflow/_builder_utils.py +9 -5
  18. qiskit/circuit/controlflow/box.py +163 -0
  19. qiskit/circuit/controlflow/break_loop.py +1 -1
  20. qiskit/circuit/controlflow/builder.py +139 -39
  21. qiskit/circuit/controlflow/continue_loop.py +1 -3
  22. qiskit/circuit/controlflow/control_flow.py +10 -0
  23. qiskit/circuit/controlflow/for_loop.py +2 -1
  24. qiskit/circuit/controlflow/if_else.py +3 -16
  25. qiskit/circuit/controlflow/switch_case.py +2 -8
  26. qiskit/circuit/controlflow/while_loop.py +2 -7
  27. qiskit/circuit/controlledgate.py +2 -4
  28. qiskit/circuit/delay.py +40 -11
  29. qiskit/circuit/duration.py +0 -15
  30. qiskit/circuit/gate.py +2 -4
  31. qiskit/circuit/instruction.py +7 -140
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +34 -5
  34. qiskit/circuit/library/arithmetic/__init__.py +16 -10
  35. qiskit/circuit/library/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  36. qiskit/circuit/library/arithmetic/adders/draper_qft_adder.py +2 -2
  37. qiskit/circuit/library/arithmetic/adders/vbe_ripple_carry_adder.py +1 -1
  38. qiskit/circuit/library/arithmetic/exact_reciprocal.py +64 -21
  39. qiskit/circuit/library/arithmetic/integer_comparator.py +37 -80
  40. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +169 -2
  41. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +59 -5
  42. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +154 -6
  43. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +114 -4
  44. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +191 -15
  45. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +93 -39
  46. qiskit/circuit/library/arithmetic/quadratic_form.py +168 -2
  47. qiskit/circuit/library/arithmetic/weighted_adder.py +73 -1
  48. qiskit/circuit/library/bit_flip_oracle.py +130 -0
  49. qiskit/circuit/library/blueprintcircuit.py +52 -16
  50. qiskit/circuit/library/data_preparation/initializer.py +1 -1
  51. qiskit/circuit/library/data_preparation/pauli_feature_map.py +4 -4
  52. qiskit/circuit/library/data_preparation/state_preparation.py +1 -1
  53. qiskit/circuit/library/generalized_gates/gms.py +1 -1
  54. qiskit/circuit/library/generalized_gates/isometry.py +1 -1
  55. qiskit/circuit/library/generalized_gates/pauli.py +1 -2
  56. qiskit/circuit/library/generalized_gates/uc.py +97 -7
  57. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +1 -1
  58. qiskit/circuit/library/generalized_gates/unitary.py +4 -2
  59. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  60. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  61. qiskit/circuit/library/n_local/n_local.py +1 -1
  62. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  63. qiskit/circuit/library/overlap.py +2 -2
  64. qiskit/circuit/library/pauli_evolution.py +39 -24
  65. qiskit/circuit/library/phase_oracle.py +130 -51
  66. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  67. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  68. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  69. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  70. qiskit/circuit/library/standard_gates/h.py +4 -9
  71. qiskit/circuit/library/standard_gates/i.py +2 -2
  72. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  73. qiskit/circuit/library/standard_gates/p.py +15 -34
  74. qiskit/circuit/library/standard_gates/r.py +2 -6
  75. qiskit/circuit/library/standard_gates/rx.py +5 -15
  76. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  77. qiskit/circuit/library/standard_gates/ry.py +5 -17
  78. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  79. qiskit/circuit/library/standard_gates/rz.py +5 -17
  80. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  81. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  82. qiskit/circuit/library/standard_gates/s.py +6 -15
  83. qiskit/circuit/library/standard_gates/swap.py +4 -11
  84. qiskit/circuit/library/standard_gates/sx.py +7 -12
  85. qiskit/circuit/library/standard_gates/t.py +6 -7
  86. qiskit/circuit/library/standard_gates/u.py +2 -10
  87. qiskit/circuit/library/standard_gates/u1.py +5 -16
  88. qiskit/circuit/library/standard_gates/u2.py +2 -6
  89. qiskit/circuit/library/standard_gates/u3.py +3 -11
  90. qiskit/circuit/library/standard_gates/x.py +13 -60
  91. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  92. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/y.py +4 -9
  94. qiskit/circuit/library/standard_gates/z.py +5 -15
  95. qiskit/circuit/measure.py +11 -2
  96. qiskit/circuit/parameterexpression.py +4 -0
  97. qiskit/circuit/quantumcircuit.py +881 -555
  98. qiskit/circuit/random/utils.py +12 -6
  99. qiskit/circuit/reset.py +5 -2
  100. qiskit/circuit/singleton.py +5 -11
  101. qiskit/circuit/store.py +0 -8
  102. qiskit/compiler/__init__.py +1 -7
  103. qiskit/compiler/transpiler.py +38 -196
  104. qiskit/converters/circuit_to_dag.py +4 -2
  105. qiskit/converters/circuit_to_dagdependency.py +0 -2
  106. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  107. qiskit/converters/circuit_to_gate.py +1 -1
  108. qiskit/converters/circuit_to_instruction.py +16 -29
  109. qiskit/converters/dag_to_circuit.py +5 -5
  110. qiskit/converters/dag_to_dagdependency.py +0 -1
  111. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  112. qiskit/converters/dagdependency_to_circuit.py +0 -6
  113. qiskit/converters/dagdependency_to_dag.py +0 -6
  114. qiskit/dagcircuit/collect_blocks.py +32 -20
  115. qiskit/dagcircuit/dagdependency.py +3 -37
  116. qiskit/dagcircuit/dagdependency_v2.py +2 -80
  117. qiskit/dagcircuit/dagnode.py +14 -2
  118. qiskit/passmanager/__init__.py +24 -6
  119. qiskit/passmanager/passmanager.py +26 -24
  120. qiskit/primitives/__init__.py +44 -35
  121. qiskit/primitives/backend_estimator_v2.py +102 -23
  122. qiskit/primitives/backend_sampler_v2.py +5 -20
  123. qiskit/primitives/base/__init__.py +4 -4
  124. qiskit/primitives/base/base_estimator.py +77 -82
  125. qiskit/primitives/base/base_primitive_job.py +2 -2
  126. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  127. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  128. qiskit/primitives/base/base_sampler.py +52 -60
  129. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  130. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  131. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  132. qiskit/primitives/containers/bindings_array.py +3 -1
  133. qiskit/primitives/containers/bit_array.py +23 -0
  134. qiskit/primitives/containers/data_bin.py +3 -1
  135. qiskit/primitives/containers/observables_array.py +19 -2
  136. qiskit/primitives/statevector_sampler.py +6 -8
  137. qiskit/primitives/utils.py +14 -189
  138. qiskit/providers/__init__.py +4 -130
  139. qiskit/providers/backend.py +11 -314
  140. qiskit/providers/basic_provider/__init__.py +3 -1
  141. qiskit/providers/basic_provider/basic_provider.py +29 -9
  142. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  143. qiskit/providers/exceptions.py +0 -33
  144. qiskit/providers/fake_provider/__init__.py +0 -37
  145. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  146. qiskit/qasm2/__init__.py +21 -6
  147. qiskit/qasm2/export.py +2 -10
  148. qiskit/qasm2/parse.py +11 -25
  149. qiskit/qasm3/__init__.py +5 -1
  150. qiskit/qasm3/ast.py +44 -0
  151. qiskit/qasm3/exporter.py +65 -27
  152. qiskit/qasm3/printer.py +35 -4
  153. qiskit/qpy/__init__.py +141 -19
  154. qiskit/qpy/binary_io/__init__.py +0 -1
  155. qiskit/qpy/binary_io/circuits.py +91 -116
  156. qiskit/qpy/binary_io/schedules.py +61 -388
  157. qiskit/qpy/binary_io/value.py +168 -28
  158. qiskit/qpy/common.py +10 -7
  159. qiskit/qpy/formats.py +41 -0
  160. qiskit/qpy/interface.py +29 -62
  161. qiskit/qpy/type_keys.py +58 -221
  162. qiskit/quantum_info/analysis/distance.py +3 -1
  163. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  164. qiskit/quantum_info/operators/operator.py +6 -2
  165. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  166. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  167. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  168. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  169. qiskit/quantum_info/states/densitymatrix.py +16 -6
  170. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  171. qiskit/quantum_info/states/statevector.py +16 -6
  172. qiskit/result/__init__.py +5 -17
  173. qiskit/result/models.py +18 -10
  174. qiskit/result/result.py +28 -126
  175. qiskit/result/sampled_expval.py +1 -2
  176. qiskit/result/utils.py +3 -4
  177. qiskit/synthesis/__init__.py +21 -1
  178. qiskit/synthesis/arithmetic/__init__.py +3 -1
  179. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  180. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  182. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  183. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  184. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  185. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  186. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  188. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  189. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  190. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  191. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -0
  192. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +2 -0
  193. qiskit/synthesis/evolution/lie_trotter.py +10 -7
  194. qiskit/synthesis/evolution/product_formula.py +44 -35
  195. qiskit/synthesis/evolution/qdrift.py +17 -24
  196. qiskit/synthesis/evolution/suzuki_trotter.py +20 -27
  197. qiskit/synthesis/linear/linear_depth_lnn.py +6 -221
  198. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +4 -205
  199. qiskit/synthesis/multi_controlled/__init__.py +1 -0
  200. qiskit/synthesis/multi_controlled/mcx_synthesis.py +5 -2
  201. qiskit/synthesis/multi_controlled/multi_control_rotation_gates.py +206 -0
  202. qiskit/synthesis/one_qubit/one_qubit_decompose.py +1 -1
  203. qiskit/synthesis/two_qubit/__init__.py +1 -0
  204. qiskit/synthesis/two_qubit/two_qubit_decompose.py +28 -145
  205. qiskit/transpiler/__init__.py +32 -232
  206. qiskit/transpiler/basepasses.py +20 -51
  207. qiskit/transpiler/layout.py +1 -1
  208. qiskit/transpiler/passes/__init__.py +2 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +4 -3
  210. qiskit/transpiler/passes/basis/decompose.py +1 -15
  211. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -5
  212. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +3 -2
  213. qiskit/transpiler/passes/layout/apply_layout.py +5 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +4 -4
  216. qiskit/transpiler/passes/layout/sabre_layout.py +7 -3
  217. qiskit/transpiler/passes/layout/vf2_layout.py +2 -20
  218. qiskit/transpiler/passes/layout/vf2_post_layout.py +60 -125
  219. qiskit/transpiler/passes/layout/vf2_utils.py +2 -26
  220. qiskit/transpiler/passes/optimization/__init__.py +1 -3
  221. qiskit/transpiler/passes/optimization/collect_and_collapse.py +2 -0
  222. qiskit/transpiler/passes/optimization/collect_cliffords.py +5 -0
  223. qiskit/transpiler/passes/optimization/collect_linear_functions.py +5 -0
  224. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +16 -1
  225. qiskit/transpiler/passes/optimization/commutation_analysis.py +3 -3
  226. qiskit/transpiler/passes/optimization/consolidate_blocks.py +41 -19
  227. qiskit/transpiler/passes/optimization/contract_idle_wires_in_control_flow.py +104 -0
  228. qiskit/transpiler/passes/optimization/light_cone.py +135 -0
  229. qiskit/transpiler/passes/optimization/optimize_1q_commutation.py +0 -1
  230. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +18 -22
  231. qiskit/transpiler/passes/optimization/optimize_annotated.py +3 -2
  232. qiskit/transpiler/passes/optimization/remove_identity_equiv.py +6 -4
  233. qiskit/transpiler/passes/optimization/reset_after_measure_simplification.py +5 -2
  234. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +26 -3
  235. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -0
  236. qiskit/transpiler/passes/routing/__init__.py +0 -1
  237. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -1
  238. qiskit/transpiler/passes/routing/sabre_swap.py +14 -6
  239. qiskit/transpiler/passes/routing/star_prerouting.py +1 -1
  240. qiskit/transpiler/passes/scheduling/__init__.py +1 -7
  241. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -4
  242. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -9
  243. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +17 -16
  244. qiskit/transpiler/passes/scheduling/padding/base_padding.py +30 -2
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +20 -58
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +11 -3
  247. qiskit/transpiler/passes/scheduling/scheduling/alap.py +5 -39
  248. qiskit/transpiler/passes/scheduling/scheduling/asap.py +4 -35
  249. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +10 -16
  250. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +127 -59
  251. qiskit/transpiler/passes/synthesis/default_unitary_synth_plugin.py +653 -0
  252. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +176 -601
  253. qiskit/transpiler/passes/synthesis/hls_plugins.py +294 -1
  254. qiskit/transpiler/passes/synthesis/plugin.py +4 -0
  255. qiskit/transpiler/passes/synthesis/solovay_kitaev_synthesis.py +16 -10
  256. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +34 -697
  257. qiskit/transpiler/passes/utils/__init__.py +0 -1
  258. qiskit/transpiler/passes/utils/check_gate_direction.py +13 -5
  259. qiskit/transpiler/passes/utils/control_flow.py +2 -6
  260. qiskit/transpiler/passes/utils/gate_direction.py +7 -0
  261. qiskit/transpiler/passes/utils/remove_final_measurements.py +40 -33
  262. qiskit/transpiler/passmanager.py +13 -0
  263. qiskit/transpiler/passmanager_config.py +5 -81
  264. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +225 -344
  265. qiskit/transpiler/preset_passmanagers/common.py +140 -167
  266. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +101 -322
  267. qiskit/transpiler/preset_passmanagers/level0.py +2 -11
  268. qiskit/transpiler/preset_passmanagers/level1.py +2 -14
  269. qiskit/transpiler/preset_passmanagers/level2.py +2 -12
  270. qiskit/transpiler/preset_passmanagers/level3.py +2 -11
  271. qiskit/transpiler/preset_passmanagers/plugin.py +5 -3
  272. qiskit/transpiler/target.py +67 -524
  273. qiskit/user_config.py +8 -4
  274. qiskit/utils/__init__.py +13 -12
  275. qiskit/utils/deprecation.py +4 -112
  276. qiskit/utils/optionals.py +11 -4
  277. qiskit/utils/parallel.py +214 -87
  278. qiskit/utils/units.py +4 -1
  279. qiskit/visualization/__init__.py +3 -7
  280. qiskit/visualization/array.py +4 -1
  281. qiskit/visualization/bloch.py +1 -1
  282. qiskit/visualization/circuit/_utils.py +19 -19
  283. qiskit/visualization/circuit/circuit_visualization.py +11 -4
  284. qiskit/visualization/circuit/matplotlib.py +13 -23
  285. qiskit/visualization/circuit/text.py +7 -3
  286. qiskit/visualization/dag_visualization.py +2 -1
  287. qiskit/visualization/gate_map.py +39 -154
  288. qiskit/visualization/pass_manager_visualization.py +6 -2
  289. qiskit/visualization/state_visualization.py +6 -0
  290. qiskit/visualization/timeline/core.py +27 -12
  291. qiskit/visualization/timeline/interface.py +23 -18
  292. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/METADATA +2 -2
  293. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/RECORD +297 -444
  294. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/WHEEL +2 -1
  295. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/entry_points.txt +8 -2
  296. qiskit/assembler/__init__.py +0 -42
  297. qiskit/assembler/assemble_circuits.py +0 -451
  298. qiskit/assembler/assemble_schedules.py +0 -367
  299. qiskit/assembler/disassemble.py +0 -310
  300. qiskit/assembler/run_config.py +0 -77
  301. qiskit/circuit/bit.py +0 -106
  302. qiskit/circuit/classicalfunction/__init__.py +0 -152
  303. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  304. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  305. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  306. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  307. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  308. qiskit/circuit/classicalfunction/types.py +0 -18
  309. qiskit/circuit/classicalfunction/utils.py +0 -91
  310. qiskit/circuit/classicalregister.py +0 -57
  311. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  312. qiskit/circuit/quantumregister.py +0 -75
  313. qiskit/circuit/register.py +0 -246
  314. qiskit/compiler/assembler.py +0 -689
  315. qiskit/compiler/scheduler.py +0 -109
  316. qiskit/compiler/sequencer.py +0 -71
  317. qiskit/primitives/backend_estimator.py +0 -486
  318. qiskit/primitives/backend_sampler.py +0 -222
  319. qiskit/primitives/estimator.py +0 -172
  320. qiskit/primitives/sampler.py +0 -162
  321. qiskit/providers/backend_compat.py +0 -507
  322. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  323. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  324. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  325. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  330. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  332. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  333. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  337. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  338. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  340. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  341. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  342. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/fake_1q.py +0 -91
  346. qiskit/providers/fake_provider/fake_backend.py +0 -165
  347. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  348. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  349. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  350. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  351. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  352. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  353. qiskit/providers/models/__init__.py +0 -89
  354. qiskit/providers/models/backendconfiguration.py +0 -1040
  355. qiskit/providers/models/backendproperties.py +0 -535
  356. qiskit/providers/models/backendstatus.py +0 -104
  357. qiskit/providers/models/jobstatus.py +0 -77
  358. qiskit/providers/models/pulsedefaults.py +0 -305
  359. qiskit/providers/provider.py +0 -95
  360. qiskit/pulse/__init__.py +0 -158
  361. qiskit/pulse/builder.py +0 -2262
  362. qiskit/pulse/calibration_entries.py +0 -381
  363. qiskit/pulse/channels.py +0 -227
  364. qiskit/pulse/configuration.py +0 -245
  365. qiskit/pulse/exceptions.py +0 -45
  366. qiskit/pulse/filters.py +0 -309
  367. qiskit/pulse/instruction_schedule_map.py +0 -424
  368. qiskit/pulse/instructions/__init__.py +0 -67
  369. qiskit/pulse/instructions/acquire.py +0 -150
  370. qiskit/pulse/instructions/delay.py +0 -71
  371. qiskit/pulse/instructions/directives.py +0 -154
  372. qiskit/pulse/instructions/frequency.py +0 -135
  373. qiskit/pulse/instructions/instruction.py +0 -270
  374. qiskit/pulse/instructions/phase.py +0 -152
  375. qiskit/pulse/instructions/play.py +0 -99
  376. qiskit/pulse/instructions/reference.py +0 -100
  377. qiskit/pulse/instructions/snapshot.py +0 -82
  378. qiskit/pulse/library/__init__.py +0 -97
  379. qiskit/pulse/library/continuous.py +0 -430
  380. qiskit/pulse/library/pulse.py +0 -148
  381. qiskit/pulse/library/samplers/__init__.py +0 -15
  382. qiskit/pulse/library/samplers/decorators.py +0 -295
  383. qiskit/pulse/library/samplers/strategies.py +0 -71
  384. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  385. qiskit/pulse/library/waveform.py +0 -136
  386. qiskit/pulse/macros.py +0 -262
  387. qiskit/pulse/parameter_manager.py +0 -445
  388. qiskit/pulse/parser.py +0 -314
  389. qiskit/pulse/reference_manager.py +0 -58
  390. qiskit/pulse/schedule.py +0 -1854
  391. qiskit/pulse/transforms/__init__.py +0 -106
  392. qiskit/pulse/transforms/alignments.py +0 -406
  393. qiskit/pulse/transforms/base_transforms.py +0 -71
  394. qiskit/pulse/transforms/canonicalization.py +0 -498
  395. qiskit/pulse/transforms/dag.py +0 -122
  396. qiskit/pulse/utils.py +0 -149
  397. qiskit/qobj/__init__.py +0 -75
  398. qiskit/qobj/common.py +0 -81
  399. qiskit/qobj/converters/__init__.py +0 -18
  400. qiskit/qobj/converters/lo_config.py +0 -177
  401. qiskit/qobj/converters/pulse_instruction.py +0 -897
  402. qiskit/qobj/pulse_qobj.py +0 -709
  403. qiskit/qobj/qasm_qobj.py +0 -708
  404. qiskit/qobj/utils.py +0 -46
  405. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  406. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  407. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  408. qiskit/result/mitigation/utils.py +0 -217
  409. qiskit/scheduler/__init__.py +0 -40
  410. qiskit/scheduler/config.py +0 -37
  411. qiskit/scheduler/lowering.py +0 -187
  412. qiskit/scheduler/methods/__init__.py +0 -15
  413. qiskit/scheduler/methods/basic.py +0 -140
  414. qiskit/scheduler/schedule_circuit.py +0 -69
  415. qiskit/scheduler/sequence.py +0 -104
  416. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  417. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  418. qiskit/transpiler/passes/calibration/builders.py +0 -20
  419. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  420. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  421. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  422. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  423. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  424. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  425. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  426. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  427. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  428. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  429. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  430. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  431. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  432. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  433. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  434. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  435. qiskit/utils/deprecate_pulse.py +0 -119
  436. qiskit/utils/multiprocessing.py +0 -56
  437. qiskit/visualization/pulse_v2/__init__.py +0 -21
  438. qiskit/visualization/pulse_v2/core.py +0 -901
  439. qiskit/visualization/pulse_v2/device_info.py +0 -173
  440. qiskit/visualization/pulse_v2/drawings.py +0 -253
  441. qiskit/visualization/pulse_v2/events.py +0 -254
  442. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  443. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  444. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  445. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  446. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  447. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  448. qiskit/visualization/pulse_v2/interface.py +0 -459
  449. qiskit/visualization/pulse_v2/layouts.py +0 -387
  450. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  451. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  452. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  453. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  454. qiskit/visualization/pulse_v2/types.py +0 -242
  455. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/LICENSE.txt +0 -0
  456. {qiskit-1.4.0.dist-info → qiskit-2.0.0rc1.dist-info}/top_level.txt +0 -0
@@ -250,6 +250,58 @@ MCMT Synthesis
250
250
  MCMTSynthesisNoAux
251
251
  MCMTSynthesisDefault
252
252
 
253
+
254
+ Integer comparators
255
+ '''''''''''''''''''
256
+
257
+ .. list-table:: Plugins for :class:`.IntegerComparatorGate` (key = ``"IntComp"``)
258
+ :header-rows: 1
259
+
260
+ * - Plugin name
261
+ - Plugin class
262
+ - Description
263
+ - Auxiliary qubits
264
+ * - ``"twos"``
265
+ - :class:`~.IntComparatorSynthesis2s`
266
+ - use addition with two's complement
267
+ - ``n - 1`` clean
268
+ * - ``"noaux"``
269
+ - :class:`~.IntComparatorSynthesisNoAux`
270
+ - flip the target controlled on all :math:`O(2^l)` allowed integer values
271
+ - none
272
+ * - ``"default"``
273
+ - :class:`~.IntComparatorSynthesisDefault`
274
+ - use the best algorithm depending on the available auxiliary qubits
275
+ - any
276
+
277
+ .. autosummary::
278
+ :toctree: ../stubs/
279
+
280
+ IntComparatorSynthesis2s
281
+ IntComparatorSynthesisNoAux
282
+ IntComparatorSynthesisDefault
283
+
284
+
285
+ Sums
286
+ ''''
287
+
288
+ .. list-table:: Plugins for :class:`.WeightedSumGate` (key = ``"WeightedSum"``)
289
+ :header-rows: 1
290
+
291
+ * - Plugin name
292
+ - Plugin class
293
+ - Description
294
+ - Auxiliary qubits
295
+ * - ``"default"``
296
+ - :class:`.WeightedSumSynthesisDefault`
297
+ - use a V-chain based synthesis
298
+ - given ``s`` sum qubits, used ``s - 1 + int(s > 2)`` clean auxiliary qubits
299
+
300
+ .. autosummary::
301
+ :toctree: ../stubs/
302
+
303
+ WeightedSumSynthesisDefault
304
+
253
305
 
254
306
  Pauli Evolution Synthesis
255
307
  '''''''''''''''''''''''''
@@ -391,7 +443,7 @@ Multiplier Synthesis
391
443
  - Description
392
444
  * - ``"cumulative"``
393
445
  - :class:`.MultiplierSynthesisH18`
394
- - depending on the :class:`.HalfAdderGate` used
446
+ - depending on the :class:`.AdderGate` used
395
447
  - a cumulative adder based on controlled adders
396
448
  * - ``"qft"``
397
449
  - :class:`.MultiplierSynthesisR17`
@@ -413,6 +465,7 @@ import numpy as np
413
465
  import rustworkx as rx
414
466
 
415
467
  from qiskit.circuit.quantumcircuit import QuantumCircuit
468
+ from qiskit.circuit.operation import Operation
416
469
  from qiskit.circuit.library import (
417
470
  LinearFunction,
418
471
  QFTGate,
@@ -426,9 +479,23 @@ from qiskit.circuit.library import (
426
479
  HalfAdderGate,
427
480
  FullAdderGate,
428
481
  MultiplierGate,
482
+ WeightedSumGate,
483
+ GlobalPhaseGate,
484
+ )
485
+ from qiskit.circuit.annotated_operation import (
486
+ AnnotatedOperation,
487
+ Modifier,
488
+ ControlModifier,
489
+ InverseModifier,
490
+ PowerModifier,
429
491
  )
430
492
  from qiskit.transpiler.coupling import CouplingMap
431
493
 
494
+ from qiskit.synthesis.arithmetic import (
495
+ synth_integer_comparator_2s,
496
+ synth_integer_comparator_greedy,
497
+ synth_weighted_sum_carry,
498
+ )
432
499
  from qiskit.synthesis.clifford import (
433
500
  synth_clifford_full,
434
501
  synth_clifford_layers,
@@ -470,6 +537,9 @@ from qiskit.synthesis.arithmetic import (
470
537
  )
471
538
  from qiskit.quantum_info.operators import Clifford
472
539
  from qiskit.transpiler.passes.routing.algorithms import ApproximateTokenSwapper
540
+ from qiskit.transpiler.exceptions import TranspilerError
541
+
542
+ from qiskit._accelerate.high_level_synthesis import synthesize_operation
473
543
  from .plugin import HighLevelSynthesisPlugin
474
544
 
475
545
 
@@ -1247,6 +1317,47 @@ class MCMTSynthesisVChain(HighLevelSynthesisPlugin):
1247
1317
  )
1248
1318
 
1249
1319
 
1320
+ class IntComparatorSynthesisDefault(HighLevelSynthesisPlugin):
1321
+ """The default synthesis for ``IntegerComparatorGate``.
1322
+
1323
+ Currently this is only supporting an ancilla-based decomposition.
1324
+ """
1325
+
1326
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
1327
+ num_state_qubits = high_level_object.num_qubits - 1
1328
+ num_aux = num_state_qubits - 1
1329
+ if options.get("num_clean_ancillas", 0) < num_aux:
1330
+ return synth_integer_comparator_greedy(
1331
+ num_state_qubits, high_level_object.value, high_level_object.geq
1332
+ )
1333
+
1334
+ return synth_integer_comparator_2s(
1335
+ num_state_qubits, high_level_object.value, high_level_object.geq
1336
+ )
1337
+
1338
+
1339
+ class IntComparatorSynthesisNoAux(HighLevelSynthesisPlugin):
1340
+ """A potentially exponentially expensive comparison w/o auxiliary qubits."""
1341
+
1342
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
1343
+ return synth_integer_comparator_greedy(
1344
+ high_level_object.num_state_qubits, high_level_object.value, high_level_object.geq
1345
+ )
1346
+
1347
+
1348
+ class IntComparatorSynthesis2s(HighLevelSynthesisPlugin):
1349
+ """An integer comparison based on 2s complement."""
1350
+
1351
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
1352
+ num_aux = high_level_object.num_state_qubits - 1
1353
+ if options.get("num_clean_ancillas", 0) < num_aux:
1354
+ return None
1355
+
1356
+ return synth_integer_comparator_2s(
1357
+ high_level_object.num_state_qubits, high_level_object.value, high_level_object.geq
1358
+ )
1359
+
1360
+
1250
1361
  class ModularAdderSynthesisDefault(HighLevelSynthesisPlugin):
1251
1362
  """The default modular adder (no carry in, no carry out qubit) synthesis.
1252
1363
 
@@ -1663,3 +1774,185 @@ class PauliEvolutionSynthesisRustiq(HighLevelSynthesisPlugin):
1663
1774
  upto_phase=upto_phase,
1664
1775
  resynth_clifford_method=resynth_clifford_method,
1665
1776
  )
1777
+
1778
+
1779
+ class AnnotatedSynthesisDefault(HighLevelSynthesisPlugin):
1780
+ """Synthesize an :class:`.AnnotatedOperation` using the default synthesis algorithm.
1781
+
1782
+ This plugin name is:``annotated.default`` which can be used as the key on
1783
+ an :class:`~.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
1784
+ """
1785
+
1786
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
1787
+ if not isinstance(high_level_object, AnnotatedOperation):
1788
+ return None
1789
+
1790
+ operation = high_level_object
1791
+ modifiers = high_level_object.modifiers
1792
+
1793
+ # The plugin needs additional information that is not yet passed via the run's method
1794
+ # arguments: namely high-level-synthesis data and options, the global qubits over which
1795
+ # the operation is defined, and the initial state of each global qubit.
1796
+ tracker = options.get("qubit_tracker", None)
1797
+ data = options.get("hls_data", None)
1798
+ input_qubits = options.get("input_qubits", None)
1799
+
1800
+ if data is None or input_qubits is None:
1801
+ raise TranspilerError(
1802
+ "The AnnotatedSynthesisDefault plugin should receive data and input_qubits via options."
1803
+ )
1804
+
1805
+ if len(modifiers) > 0:
1806
+ num_ctrl = sum(
1807
+ mod.num_ctrl_qubits for mod in modifiers if isinstance(mod, ControlModifier)
1808
+ )
1809
+ power = sum(mod.power for mod in modifiers if isinstance(mod, PowerModifier))
1810
+ is_inverted = sum(1 for mod in modifiers if isinstance(mod, InverseModifier)) % 2
1811
+
1812
+ # First, synthesize the base operation of this annotated operation.
1813
+ # As this step cannot use any control qubits as auxiliary qubits, we use a dedicated
1814
+ # tracker (annotated_tracker).
1815
+ # The logic is as follows:
1816
+ # - annotated_tracker.disable control qubits
1817
+ # - if have power or inverse modifiers, annotated_tracker.set_dirty(base_qubits)
1818
+ # - synthesize the base operation using annotated tracker
1819
+ # - main_tracker.set_dirty(base_qubits)
1820
+ #
1821
+ # Note that we need to set the base_qubits to dirty if we have power or inverse
1822
+ # modifiers. For power: even if the power is a positive integer (that is, we need
1823
+ # to repeat the same circuit multiple times), even if the target is initially at |0>,
1824
+ # it will generally not be at |0> after one iteration. For inverse: as we
1825
+ # flip the order of operations, we cannot exploit which qubits are at |0> as "viewed from
1826
+ # the back of the circuit". If we just have control modifiers, we can use the state
1827
+ # of base qubits when synthesizing the controlled operation.
1828
+ #
1829
+ # In addition, all of the other global qubits that are not a part of the annotated
1830
+ # operation can be used as they are in all cases, since we are assuming that all of
1831
+ # the synthesis methods preserve the states of ancilla qubits.
1832
+ annotated_tracker = tracker.copy()
1833
+ control_qubits = input_qubits[:num_ctrl]
1834
+ base_qubits = input_qubits[num_ctrl:]
1835
+ annotated_tracker.disable(control_qubits) # do not access control qubits
1836
+ if power != 0 or is_inverted:
1837
+ annotated_tracker.set_dirty(base_qubits)
1838
+
1839
+ # Note that synthesize_operation also returns the output qubits on which the
1840
+ # operation is defined, however currently the plugin mechanism has no way
1841
+ # to return these (and instead the upstream code greedily grabs some ancilla
1842
+ # qubits from the circuit). We should refactor the plugin "run" iterface to
1843
+ # return the actual ancilla qubits used.
1844
+ synthesized_base_op_result = synthesize_operation(
1845
+ operation.base_op, input_qubits[num_ctrl:], data, annotated_tracker
1846
+ )
1847
+
1848
+ # The base operation does not need to be synthesized.
1849
+ # For simplicity, we wrap the instruction into a circuit. Note that
1850
+ # this should not deteriorate the quality of the result.
1851
+ if synthesized_base_op_result is None:
1852
+ synthesized_base_op = self._instruction_to_circuit(operation.base_op)
1853
+ else:
1854
+ synthesized_base_op = QuantumCircuit._from_circuit_data(
1855
+ synthesized_base_op_result[0]
1856
+ )
1857
+ tracker.set_dirty(base_qubits)
1858
+
1859
+ # This step currently does not introduce ancilla qubits. However it makes
1860
+ # a lot of sense to allow this in the future.
1861
+ synthesized = self._apply_annotations(synthesized_base_op, operation.modifiers)
1862
+
1863
+ return synthesized
1864
+
1865
+ return None
1866
+
1867
+ @staticmethod
1868
+ def _apply_annotations(circuit: QuantumCircuit, modifiers: list[Modifier]) -> QuantumCircuit:
1869
+ """
1870
+ Applies modifiers to a quantum circuit.
1871
+ """
1872
+ for modifier in modifiers:
1873
+ if isinstance(modifier, InverseModifier):
1874
+ circuit = circuit.inverse()
1875
+
1876
+ elif isinstance(modifier, ControlModifier):
1877
+ if circuit.num_clbits > 0:
1878
+ raise TranspilerError(
1879
+ "AnnotatedSynthesisDefault: cannot control a circuit with classical bits."
1880
+ )
1881
+
1882
+ # Apply the control modifier to each gate in the circuit.
1883
+ controlled_circuit = QuantumCircuit(modifier.num_ctrl_qubits + circuit.num_qubits)
1884
+ if circuit.global_phase != 0:
1885
+ controlled_op = GlobalPhaseGate(circuit.global_phase).control(
1886
+ num_ctrl_qubits=modifier.num_ctrl_qubits,
1887
+ label=None,
1888
+ ctrl_state=modifier.ctrl_state,
1889
+ annotated=False,
1890
+ )
1891
+ controlled_qubits = list(range(0, modifier.num_ctrl_qubits))
1892
+ controlled_circuit.append(controlled_op, controlled_qubits)
1893
+ for inst in circuit:
1894
+ inst_op = inst.operation
1895
+ inst_qubits = inst.qubits
1896
+ controlled_op = inst_op.control(
1897
+ num_ctrl_qubits=modifier.num_ctrl_qubits,
1898
+ label=None,
1899
+ ctrl_state=modifier.ctrl_state,
1900
+ annotated=False,
1901
+ )
1902
+ controlled_qubits = list(range(0, modifier.num_ctrl_qubits)) + [
1903
+ modifier.num_ctrl_qubits + circuit.find_bit(q).index for q in inst_qubits
1904
+ ]
1905
+ controlled_circuit.append(controlled_op, controlled_qubits)
1906
+
1907
+ circuit = controlled_circuit
1908
+
1909
+ if isinstance(circuit, AnnotatedOperation):
1910
+ raise TranspilerError(
1911
+ "AnnotatedSynthesisDefault: failed to synthesize the control modifier."
1912
+ )
1913
+
1914
+ elif isinstance(modifier, PowerModifier):
1915
+ circuit = circuit.power(modifier.power)
1916
+
1917
+ else:
1918
+ raise TranspilerError(f"AnnotatedSynthesisDefault: Unknown modifier {modifier}.")
1919
+
1920
+ return circuit
1921
+
1922
+ @staticmethod
1923
+ def _instruction_to_circuit(op: Operation) -> QuantumCircuit:
1924
+ """Wraps a single operation into a quantum circuit."""
1925
+ circuit = QuantumCircuit(op.num_qubits, op.num_clbits)
1926
+ circuit.append(op, circuit.qubits, circuit.clbits)
1927
+ return circuit
1928
+
1929
+
1930
+ class WeightedSumSynthesisDefault(HighLevelSynthesisPlugin):
1931
+ """Synthesize a :class:`.WeightedSumGate` using the default synthesis algorithm.
1932
+
1933
+ This plugin name is:``WeightedSum.default`` which can be used as the key on
1934
+ an :class:`.HLSConfig` object to use this method with :class:`~.HighLevelSynthesis`.
1935
+
1936
+ .. note::
1937
+
1938
+ This default plugin requires auxiliary qubits. There is currently no implementation
1939
+ available without auxiliary qubits.
1940
+
1941
+ """
1942
+
1943
+ def run(self, high_level_object, coupling_map=None, target=None, qubits=None, **options):
1944
+ if not isinstance(high_level_object, WeightedSumGate):
1945
+ return None
1946
+
1947
+ required_auxiliaries = (
1948
+ high_level_object.num_sum_qubits - 1 + int(high_level_object.num_sum_qubits > 2)
1949
+ )
1950
+ if (num_clean := options.get("num_clean_ancillas", 0)) < required_auxiliaries:
1951
+ warnings.warn(
1952
+ f"Cannot synthesize a WeightedSumGate on {high_level_object.num_state_qubits} state "
1953
+ f"qubits with less than {required_auxiliaries} clean auxiliary qubits. Only "
1954
+ f"{num_clean} are available. This will likely lead to a error in HighLevelSynthesis."
1955
+ )
1956
+ return None
1957
+
1958
+ return synth_weighted_sum_carry(high_level_object)
@@ -714,6 +714,10 @@ class HighLevelSynthesisPluginManager:
714
714
  plugin_name = op_name + "." + method_name
715
715
  return self.plugins[plugin_name].obj
716
716
 
717
+ def op_names(self):
718
+ """Returns the names of high-level-objects with available synthesis methods."""
719
+ return list(self.plugins_by_op.keys())
720
+
717
721
 
718
722
  def high_level_synthesis_plugin_names(op_name: str) -> List[str]:
719
723
  """Return a list of plugin names installed for a given high level object name
@@ -33,7 +33,7 @@ from qiskit.synthesis.discrete_basis.generate_basis_approximations import (
33
33
  generate_basic_approximations,
34
34
  )
35
35
  from qiskit.transpiler.basepasses import TransformationPass
36
- from qiskit.transpiler.exceptions import TranspilerError
36
+ from qiskit.transpiler.passes.utils.control_flow import trivial_recurse
37
37
 
38
38
  from .plugin import UnitarySynthesisPlugin
39
39
 
@@ -73,7 +73,9 @@ class SolovayKitaev(TransformationPass):
73
73
 
74
74
  Per default, the basis gate set is ``["t", "tdg", "h"]``:
75
75
 
76
- .. code-block::
76
+ .. plot::
77
+ :include-source:
78
+ :nofigs:
77
79
 
78
80
  import numpy as np
79
81
  from qiskit.circuit import QuantumCircuit
@@ -110,7 +112,9 @@ class SolovayKitaev(TransformationPass):
110
112
 
111
113
  For individual basis gate sets, the ``generate_basic_approximations`` function can be used:
112
114
 
113
- .. code-block::
115
+ .. plot::
116
+ :include-source:
117
+ :nofigs:
114
118
 
115
119
  from qiskit.synthesis import generate_basic_approximations
116
120
  from qiskit.transpiler.passes import SolovayKitaev
@@ -151,6 +155,7 @@ class SolovayKitaev(TransformationPass):
151
155
  self.recursion_degree = recursion_degree
152
156
  self._sk = SolovayKitaevDecomposition(basic_approximations)
153
157
 
158
+ @trivial_recurse
154
159
  def run(self, dag: DAGCircuit) -> DAGCircuit:
155
160
  """Run the ``SolovayKitaev`` pass on `dag`.
156
161
 
@@ -164,18 +169,19 @@ class SolovayKitaev(TransformationPass):
164
169
  TranspilerError: if a gates does not have to_matrix
165
170
  """
166
171
  for node in dag.op_nodes():
167
- if not node.op.num_qubits == 1:
168
- continue # ignore all non-single qubit gates
172
+
173
+ # ignore operations on which the algorithm cannot run
174
+ if (
175
+ (node.op.num_qubits != 1)
176
+ or node.is_parameterized()
177
+ or (not hasattr(node.op, "to_matrix"))
178
+ ):
179
+ continue
169
180
 
170
181
  # we do not check the input matrix as we know it comes from a Qiskit gate, as this
171
182
  # we know it will generate a valid SU(2) matrix
172
183
  check_input = not isinstance(node.op, Gate)
173
184
 
174
- if not hasattr(node.op, "to_matrix"):
175
- raise TranspilerError(
176
- f"SolovayKitaev does not support gate without to_matrix method: {node.op.name}"
177
- )
178
-
179
185
  matrix = node.op.to_matrix()
180
186
 
181
187
  # call solovay kitaev