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
@@ -17,6 +17,7 @@ from qiskit.circuit.parameterexpression import ParameterExpression
17
17
  from qiskit.pulse.channels import Channel
18
18
  from qiskit.pulse.exceptions import PulseError, UnassignedReferenceError
19
19
  from qiskit.pulse.instructions import instruction
20
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_func
20
21
 
21
22
 
22
23
  class Reference(instruction.Instruction):
@@ -40,6 +41,7 @@ class Reference(instruction.Instruction):
40
41
  # Delimiter for tuple keys.
41
42
  key_delimiter = ","
42
43
 
44
+ @deprecate_pulse_func
43
45
  def __init__(self, name: str, *extra_keys: str):
44
46
  """Create new reference.
45
47
 
@@ -18,11 +18,13 @@ from typing import Optional, Tuple
18
18
  from qiskit.pulse.channels import SnapshotChannel
19
19
  from qiskit.pulse.exceptions import PulseError
20
20
  from qiskit.pulse.instructions.instruction import Instruction
21
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_func
21
22
 
22
23
 
23
24
  class Snapshot(Instruction):
24
25
  """An instruction targeted for simulators, to capture a moment in the simulation."""
25
26
 
27
+ @deprecate_pulse_func
26
28
  def __init__(self, label: str, snapshot_type: str = "statevector", name: Optional[str] = None):
27
29
  """Create new snapshot.
28
30
 
@@ -18,6 +18,7 @@ from __future__ import annotations
18
18
  import typing
19
19
  from abc import ABC, abstractmethod
20
20
  from typing import Any
21
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_func
21
22
 
22
23
  from qiskit.circuit.parameterexpression import ParameterExpression
23
24
 
@@ -36,6 +37,7 @@ class Pulse(ABC):
36
37
  limit_amplitude = True
37
38
 
38
39
  @abstractmethod
40
+ @deprecate_pulse_func
39
41
  def __init__(
40
42
  self,
41
43
  duration: int | ParameterExpression,
@@ -31,6 +31,7 @@ from qiskit.circuit.parameterexpression import ParameterExpression, ParameterVal
31
31
  from qiskit.pulse.exceptions import PulseError
32
32
  from qiskit.pulse.library.pulse import Pulse
33
33
  from qiskit.pulse.library.waveform import Waveform
34
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_func
34
35
 
35
36
 
36
37
  def _lifted_gaussian(
@@ -403,6 +404,7 @@ class SymbolicPulse(Pulse):
403
404
  _constraints_lam = LambdifiedExpression("_constraints")
404
405
  _valid_amp_conditions_lam = LambdifiedExpression("_valid_amp_conditions")
405
406
 
407
+ @deprecate_pulse_func
406
408
  def __init__(
407
409
  self,
408
410
  pulse_type: str,
@@ -780,6 +782,10 @@ class Gaussian(metaclass=_PulseType):
780
782
  valid_amp_conditions=valid_amp_conditions_expr,
781
783
  )
782
784
 
785
+ @deprecate_pulse_func
786
+ def __init__(self):
787
+ pass
788
+
783
789
 
784
790
  class GaussianSquare(metaclass=_PulseType):
785
791
  """A square pulse with a Gaussian shaped risefall on both sides lifted such that
@@ -908,7 +914,12 @@ class GaussianSquare(metaclass=_PulseType):
908
914
  valid_amp_conditions=valid_amp_conditions_expr,
909
915
  )
910
916
 
917
+ @deprecate_pulse_func
918
+ def __init__(self):
919
+ pass
920
+
911
921
 
922
+ @deprecate_pulse_func
912
923
  def GaussianSquareDrag(
913
924
  duration: int | ParameterExpression,
914
925
  amp: float | ParameterExpression,
@@ -1061,6 +1072,7 @@ def GaussianSquareDrag(
1061
1072
  )
1062
1073
 
1063
1074
 
1075
+ @deprecate_pulse_func
1064
1076
  def gaussian_square_echo(
1065
1077
  duration: int | ParameterValueType,
1066
1078
  amp: float | ParameterExpression,
@@ -1264,6 +1276,7 @@ def gaussian_square_echo(
1264
1276
  )
1265
1277
 
1266
1278
 
1279
+ @deprecate_pulse_func
1267
1280
  def GaussianDeriv(
1268
1281
  duration: int | ParameterValueType,
1269
1282
  amp: float | ParameterExpression,
@@ -1424,6 +1437,10 @@ class Drag(metaclass=_PulseType):
1424
1437
  valid_amp_conditions=valid_amp_conditions_expr,
1425
1438
  )
1426
1439
 
1440
+ @deprecate_pulse_func
1441
+ def __init__(self):
1442
+ pass
1443
+
1427
1444
 
1428
1445
  class Constant(metaclass=_PulseType):
1429
1446
  """A simple constant pulse, with an amplitude value and a duration:
@@ -1485,7 +1502,12 @@ class Constant(metaclass=_PulseType):
1485
1502
  valid_amp_conditions=valid_amp_conditions_expr,
1486
1503
  )
1487
1504
 
1505
+ @deprecate_pulse_func
1506
+ def __init__(self):
1507
+ pass
1508
+
1488
1509
 
1510
+ @deprecate_pulse_func
1489
1511
  def Sin(
1490
1512
  duration: int | ParameterExpression,
1491
1513
  amp: float | ParameterExpression,
@@ -1550,6 +1572,7 @@ def Sin(
1550
1572
  )
1551
1573
 
1552
1574
 
1575
+ @deprecate_pulse_func
1553
1576
  def Cos(
1554
1577
  duration: int | ParameterExpression,
1555
1578
  amp: float | ParameterExpression,
@@ -1614,6 +1637,7 @@ def Cos(
1614
1637
  )
1615
1638
 
1616
1639
 
1640
+ @deprecate_pulse_func
1617
1641
  def Sawtooth(
1618
1642
  duration: int | ParameterExpression,
1619
1643
  amp: float | ParameterExpression,
@@ -1682,6 +1706,7 @@ def Sawtooth(
1682
1706
  )
1683
1707
 
1684
1708
 
1709
+ @deprecate_pulse_func
1685
1710
  def Triangle(
1686
1711
  duration: int | ParameterExpression,
1687
1712
  amp: float | ParameterExpression,
@@ -1750,6 +1775,7 @@ def Triangle(
1750
1775
  )
1751
1776
 
1752
1777
 
1778
+ @deprecate_pulse_func
1753
1779
  def Square(
1754
1780
  duration: int | ParameterValueType,
1755
1781
  amp: float | ParameterExpression,
@@ -1821,6 +1847,7 @@ def Square(
1821
1847
  )
1822
1848
 
1823
1849
 
1850
+ @deprecate_pulse_func
1824
1851
  def Sech(
1825
1852
  duration: int | ParameterValueType,
1826
1853
  amp: float | ParameterExpression,
@@ -1897,6 +1924,7 @@ def Sech(
1897
1924
  )
1898
1925
 
1899
1926
 
1927
+ @deprecate_pulse_func
1900
1928
  def SechDeriv(
1901
1929
  duration: int | ParameterValueType,
1902
1930
  amp: float | ParameterExpression,
@@ -18,6 +18,7 @@ import numpy as np
18
18
 
19
19
  from qiskit.pulse.exceptions import PulseError
20
20
  from qiskit.pulse.library.pulse import Pulse
21
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_func
21
22
 
22
23
 
23
24
  class Waveform(Pulse):
@@ -25,6 +26,7 @@ class Waveform(Pulse):
25
26
  duration of the backend cycle-time, dt.
26
27
  """
27
28
 
29
+ @deprecate_pulse_func
28
30
  def __init__(
29
31
  self,
30
32
  samples: np.ndarray | list[complex],
qiskit/pulse/macros.py CHANGED
@@ -194,7 +194,7 @@ def _measure_v2(
194
194
  for measure_qubit in meas_group:
195
195
  try:
196
196
  if measure_qubit in qubits:
197
- default_sched = target.get_calibration(measure_name, (measure_qubit,)).filter(
197
+ default_sched = target._get_calibration(measure_name, (measure_qubit,)).filter(
198
198
  channels=[
199
199
  channels.MeasureChannel(measure_qubit),
200
200
  channels.AcquireChannel(measure_qubit),
qiskit/pulse/schedule.py CHANGED
@@ -54,6 +54,7 @@ from qiskit.pulse.utils import instruction_duration_validation
54
54
  from qiskit.pulse.reference_manager import ReferenceManager
55
55
  from qiskit.utils.multiprocessing import is_main_process
56
56
  from qiskit.utils import deprecate_arg
57
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_func
57
58
 
58
59
 
59
60
  Interval = Tuple[int, int]
@@ -81,6 +82,7 @@ class Schedule:
81
82
 
82
83
  .. code-block:: python
83
84
 
85
+ from qiskit.pulse import Schedule, Gaussian, DriveChannel, Play
84
86
  sched = Schedule()
85
87
  sched += Play(Gaussian(160, 0.1, 40), DriveChannel(0))
86
88
 
@@ -120,6 +122,7 @@ class Schedule:
120
122
  # Counter to count instance number.
121
123
  instances_counter = itertools.count()
122
124
 
125
+ @deprecate_pulse_func
123
126
  def __init__(
124
127
  self,
125
128
  *schedules: "ScheduleComponent" | tuple[int, "ScheduleComponent"],
@@ -653,8 +656,6 @@ class Schedule:
653
656
 
654
657
  sched += pulse.Schedule(old)
655
658
 
656
- sched = sched.flatten()
657
-
658
659
  sched = sched.replace(old, new)
659
660
 
660
661
  assert sched == pulse.Schedule(new)
@@ -899,14 +900,11 @@ class ScheduleBlock:
899
900
  pulse.reference("grand_child")
900
901
  pulse.play(pulse.Constant(200, amp2), pulse.DriveChannel(0))
901
902
 
902
- Now you assign the inner pulse program to this reference.
903
-
904
- .. code-block::
905
-
906
- sched_outer.assign_references({("grand_child", ): sched_inner})
903
+ # Now assign the inner pulse program to this reference
904
+ sched_outer.assign_references({("grand_child",): sched_inner})
907
905
  print(sched_outer.parameters)
908
906
 
909
- .. parsed-literal::
907
+ .. code-block:: text
910
908
 
911
909
  {Parameter(amp1), Parameter(amp2)}
912
910
 
@@ -920,7 +918,7 @@ class ScheduleBlock:
920
918
 
921
919
  print(sched_outer.references)
922
920
 
923
- .. parsed-literal::
921
+ .. code-block:: text
924
922
 
925
923
  ReferenceManager:
926
924
  - ('grand_child',): ScheduleBlock(Play(Constant(duration=100, amp=amp1,...
@@ -939,7 +937,7 @@ class ScheduleBlock:
939
937
 
940
938
  print(main.parameters)
941
939
 
942
- .. parsed-literal::
940
+ .. code-block:: text
943
941
 
944
942
  {Parameter(amp1), Parameter(amp2), Parameter(amp3}
945
943
 
@@ -952,7 +950,7 @@ class ScheduleBlock:
952
950
 
953
951
  print(main.references)
954
952
 
955
- .. parsed-literal::
953
+ .. code-block:: text
956
954
 
957
955
  ReferenceManager:
958
956
  - ('child',): ScheduleBlock(ScheduleBlock(ScheduleBlock(Play(Con...
@@ -986,6 +984,7 @@ class ScheduleBlock:
986
984
  # Counter to count instance number.
987
985
  instances_counter = itertools.count()
988
986
 
987
+ @deprecate_pulse_func
989
988
  def __init__(
990
989
  self, name: str | None = None, metadata: dict | None = None, alignment_context=None
991
990
  ):
@@ -1459,7 +1458,7 @@ class ScheduleBlock:
1459
1458
 
1460
1459
  from qiskit import pulse
1461
1460
 
1462
- with pulse.build() as subroutine:
1461
+ with pulse.build() as nested_prog:
1463
1462
  pulse.delay(10, pulse.DriveChannel(0))
1464
1463
 
1465
1464
  with pulse.build() as sub_prog:
@@ -1490,7 +1489,7 @@ class ScheduleBlock:
1490
1489
  .. code-block:: python
1491
1490
 
1492
1491
  main_prog.assign_references({("B", ): sub_prog}, inplace=True)
1493
- main_prog.references[("B", )].assign_references({"A": nested_prog}, inplace=True)
1492
+ main_prog.references[("B", )].assign_references({("A", ): nested_prog}, inplace=True)
1494
1493
 
1495
1494
  Here :attr:`.references` returns a dict-like object, and you can
1496
1495
  mutably update the nested reference of the particular subroutine.
@@ -53,7 +53,7 @@ class AlignmentKind(abc.ABC):
53
53
  When the context has two pulses in different channels,
54
54
  a sequential context subtype intends to return following scheduling outcome.
55
55
 
56
- .. parsed-literal::
56
+ .. code-block:: text
57
57
 
58
58
  ┌────────┐
59
59
  D0: ┤ pulse1 ├────────────
@@ -63,7 +63,7 @@ class AlignmentKind(abc.ABC):
63
63
 
64
64
  On the other hand, parallel context with ``is_sequential=False`` returns
65
65
 
66
- .. parsed-literal::
66
+ .. code-block:: text
67
67
 
68
68
  ┌────────┐
69
69
  D0: ┤ pulse1 ├
@@ -338,8 +338,10 @@ class AlignFunc(AlignmentKind):
338
338
 
339
339
  .. code-block:: python
340
340
 
341
+ import numpy as np
342
+
341
343
  def udd10_pos(j):
342
- return np.sin(np.pi*j/(2*10 + 2))**2
344
+ return np.sin(np.pi*j/(2*10 + 2))**2
343
345
 
344
346
  .. note::
345
347
 
@@ -32,6 +32,11 @@ def block_to_dag(block: ScheduleBlock) -> rx.PyDAG:
32
32
 
33
33
  .. code-block:: python
34
34
 
35
+ from qiskit import pulse
36
+
37
+ my_gaussian0 = pulse.Gaussian(100, 0.5, 20)
38
+ my_gaussian1 = pulse.Gaussian(100, 0.3, 10)
39
+
35
40
  with pulse.build() as sched1:
36
41
  with pulse.align_left():
37
42
  pulse.play(my_gaussian0, pulse.DriveChannel(0))
@@ -51,6 +56,8 @@ def block_to_dag(block: ScheduleBlock) -> rx.PyDAG:
51
56
 
52
57
  .. code-block:: python
53
58
 
59
+ from qiskit import pulse
60
+
54
61
  with pulse.build() as sched:
55
62
  with pulse.align_left():
56
63
  pulse.shift_phase(1.57, pulse.DriveChannel(1))
qiskit/qasm2/export.py CHANGED
@@ -246,12 +246,14 @@ def _instruction_call_site(operation):
246
246
  if operation.params:
247
247
  params = ",".join([pi_check(i, output="qasm", eps=1e-12) for i in operation.params])
248
248
  qasm2_call = f"{qasm2_call}({params})"
249
- if operation.condition is not None:
250
- if not isinstance(operation.condition[0], ClassicalRegister):
249
+ if operation._condition is not None:
250
+ if not isinstance(operation._condition[0], ClassicalRegister):
251
251
  raise QASM2ExportError(
252
252
  "OpenQASM 2 can only condition on registers, but got '{operation.condition[0]}'"
253
253
  )
254
- qasm2_call = f"if({operation.condition[0].name}=={operation.condition[1]:d}) " + qasm2_call
254
+ qasm2_call = (
255
+ f"if({operation._condition[0].name}=={operation._condition[1]:d}) " + qasm2_call
256
+ )
255
257
  return qasm2_call
256
258
 
257
259
 
qiskit/qasm2/parse.py CHANGED
@@ -11,7 +11,7 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
  """Python-space bytecode interpreter for the output of the main Rust parser logic."""
14
-
14
+ import warnings
15
15
  import dataclasses
16
16
  import math
17
17
  from typing import Iterable, Callable
@@ -89,6 +89,35 @@ class CustomInstruction:
89
89
  There is a final ``builtin`` field. This is optional, and if set true will cause the
90
90
  instruction to be defined and available within the parsing, even if there is no definition in
91
91
  any included OpenQASM 2 file.
92
+
93
+ Examples:
94
+
95
+ Instruct the importer to use Qiskit's :class:`.ECRGate` and :class:`.RZXGate` objects to
96
+ interpret ``gate`` statements that are known to have been created from those same objects
97
+ during OpenQASM 2 export::
98
+
99
+ from qiskit import qasm2
100
+ from qiskit.circuit import QuantumCircuit, library
101
+
102
+ qc = QuantumCircuit(2)
103
+ qc.ecr(0, 1)
104
+ qc.rzx(0.3, 0, 1)
105
+ qc.rzx(0.7, 1, 0)
106
+ qc.rzx(1.5, 0, 1)
107
+ qc.ecr(1, 0)
108
+
109
+ # This output string includes `gate ecr q0, q1 { ... }` and `gate rzx(p) q0, q1 { ... }`
110
+ # statements, since `ecr` and `rzx` are neither built-in gates nor in ``qelib1.inc``.
111
+ dumped = qasm2.dumps(qc)
112
+
113
+ # Tell the importer how to interpret the `gate` statements, which we know are safe
114
+ # because we controlled the input OpenQASM 2 source.
115
+ custom = [
116
+ qasm2.CustomInstruction("ecr", 0, 2, library.ECRGate),
117
+ qasm2.CustomInstruction("rzx", 1, 2, library.RZXGate),
118
+ ]
119
+
120
+ loaded = qasm2.loads(dumped, custom_instructions=custom)
92
121
  """
93
122
 
94
123
  name: str
@@ -226,6 +255,11 @@ def from_bytecode(bytecode, custom_instructions: Iterable[CustomInstruction]):
226
255
  CircuitInstruction(gates[gate_id](*parameters), [qubits[q] for q in op_qubits])
227
256
  )
228
257
  elif opcode == OpCode.ConditionedGate:
258
+ warnings.warn(
259
+ "Conditioned gates in qasm2 will be loaded as an IfElseOp starting in Qiskit 2.0",
260
+ FutureWarning,
261
+ stacklevel=3,
262
+ )
229
263
  gate_id, parameters, op_qubits, creg, value = op.operands
230
264
  gate = gates[gate_id](*parameters).c_if(qc.cregs[creg], value)
231
265
  qc._append(CircuitInstruction(gate, [qubits[q] for q in op_qubits]))
@@ -233,12 +267,22 @@ def from_bytecode(bytecode, custom_instructions: Iterable[CustomInstruction]):
233
267
  qubit, clbit = op.operands
234
268
  qc._append(CircuitInstruction(Measure(), (qubits[qubit],), (clbits[clbit],)))
235
269
  elif opcode == OpCode.ConditionedMeasure:
270
+ warnings.warn(
271
+ "Conditioned measurements in qasm2 will be loaded as an IfElseOp starting in Qiskit 2.0",
272
+ FutureWarning,
273
+ stacklevel=3,
274
+ )
236
275
  qubit, clbit, creg, value = op.operands
237
276
  measure = Measure().c_if(qc.cregs[creg], value)
238
277
  qc._append(CircuitInstruction(measure, (qubits[qubit],), (clbits[clbit],)))
239
278
  elif opcode == OpCode.Reset:
240
279
  qc._append(CircuitInstruction(Reset(), (qubits[op.operands[0]],)))
241
280
  elif opcode == OpCode.ConditionedReset:
281
+ warnings.warn(
282
+ "Conditioned resets in qasm2 will be loaded as an IfElseOp starting in Qiskit 2.0",
283
+ FutureWarning,
284
+ stacklevel=3,
285
+ )
242
286
  qubit, creg, value = op.operands
243
287
  reset = Reset().c_if(qc.cregs[creg], value)
244
288
  qc._append(CircuitInstruction(reset, (qubits[qubit],)))
@@ -327,7 +371,7 @@ class _DefinedGate(Gate):
327
371
  # to pickle ourselves, we just eagerly create the definition and pickle that.
328
372
 
329
373
  def __getstate__(self):
330
- return (self.name, self.num_qubits, self.params, self.definition, self.condition)
374
+ return (self.name, self.num_qubits, self.params, self.definition, self._condition)
331
375
 
332
376
  def __setstate__(self, state):
333
377
  name, num_qubits, params, definition, condition = state
qiskit/qasm3/__init__.py CHANGED
@@ -209,6 +209,7 @@ custom Python constructors to use for particular gates. These custom constructo
209
209
  using the :class:`CustomGate` object:
210
210
 
211
211
  .. autoclass:: CustomGate
212
+ :members:
212
213
 
213
214
  In ``custom_gates`` is not given, Qiskit will attempt to use its standard-library gate objects for
214
215
  the gates defined in OpenQASM 3 standard library file ``stdgates.inc``. This sequence of gates is