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
@@ -21,6 +21,7 @@ from qiskit.transpiler.basepasses import TransformationPass
21
21
  from qiskit.transpiler.exceptions import TranspilerError
22
22
  from qiskit.transpiler.layout import Layout
23
23
  from qiskit.transpiler.passes.calibration.rzx_builder import _check_calibration_type, CRCalType
24
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
24
25
 
25
26
  from qiskit.dagcircuit import DAGCircuit
26
27
  from qiskit.converters import circuit_to_dag
@@ -34,6 +35,7 @@ class EchoRZXWeylDecomposition(TransformationPass):
34
35
  Each pair of RZXGates forms an echoed RZXGate.
35
36
  """
36
37
 
38
+ @deprecate_pulse_dependency
37
39
  def __init__(self, instruction_schedule_map=None, target=None):
38
40
  """EchoRZXWeylDecomposition pass.
39
41
 
@@ -62,7 +64,7 @@ class EchoRZXWeylDecomposition(TransformationPass):
62
64
  def _echo_rzx_dag(theta):
63
65
  """Return the following circuit
64
66
 
65
- .. parsed-literal::
67
+ .. code-block:: text
66
68
 
67
69
  ┌───────────────┐┌───┐┌────────────────┐┌───┐
68
70
  q_0: ┤0 ├┤ X ├┤0 ├┤ X ├
@@ -83,7 +85,7 @@ class EchoRZXWeylDecomposition(TransformationPass):
83
85
  def _reverse_echo_rzx_dag(theta):
84
86
  """Return the following circuit
85
87
 
86
- .. parsed-literal::
88
+ .. code-block:: text
87
89
 
88
90
  ┌───┐┌───────────────┐ ┌────────────────┐┌───┐
89
91
  q_0: ┤ H ├┤1 ├─────┤1 ├┤ H ├─────
@@ -15,10 +15,9 @@
15
15
 
16
16
  import logging
17
17
 
18
- from qiskit.circuit.library.standard_gates import SwapGate
19
- from qiskit.circuit.library.generalized_gates import PermutationGate
20
18
  from qiskit.transpiler.basepasses import TransformationPass
21
19
  from qiskit.transpiler.layout import Layout
20
+ from qiskit._accelerate import elide_permutations as elide_permutations_rs
22
21
 
23
22
  logger = logging.getLogger(__name__)
24
23
 
@@ -67,38 +66,16 @@ class ElidePermutations(TransformationPass):
67
66
  )
68
67
  return dag
69
68
 
70
- op_count = dag.count_ops(recurse=False)
71
- if op_count.get("swap", 0) == 0 and op_count.get("permutation", 0) == 0:
69
+ result = elide_permutations_rs.run(dag)
70
+
71
+ # If the pass did not do anything, the result is None
72
+ if result is None:
72
73
  return dag
73
74
 
74
- new_dag = dag.copy_empty_like()
75
- qubit_mapping = list(range(len(dag.qubits)))
76
-
77
- def _apply_mapping(qargs):
78
- return tuple(dag.qubits[qubit_mapping[dag.find_bit(qubit).index]] for qubit in qargs)
79
-
80
- for node in dag.topological_op_nodes():
81
- if not isinstance(node.op, (SwapGate, PermutationGate)):
82
- new_dag.apply_operation_back(
83
- node.op, _apply_mapping(node.qargs), node.cargs, check=False
84
- )
85
- elif getattr(node.op, "condition", None) is not None:
86
- new_dag.apply_operation_back(
87
- node.op, _apply_mapping(node.qargs), node.cargs, check=False
88
- )
89
- elif isinstance(node.op, SwapGate):
90
- index_0 = dag.find_bit(node.qargs[0]).index
91
- index_1 = dag.find_bit(node.qargs[1]).index
92
- qubit_mapping[index_1], qubit_mapping[index_0] = (
93
- qubit_mapping[index_0],
94
- qubit_mapping[index_1],
95
- )
96
- elif isinstance(node.op, PermutationGate):
97
- starting_indices = [qubit_mapping[dag.find_bit(qarg).index] for qarg in node.qargs]
98
- pattern = node.op.params[0]
99
- pattern_indices = [qubit_mapping[idx] for idx in pattern]
100
- for i, j in zip(starting_indices, pattern_indices):
101
- qubit_mapping[i] = j
75
+ # Otherwise, the result is a pair consisting of the rewritten DAGCircuit and the
76
+ # qubit mapping.
77
+ (new_dag, qubit_mapping) = result
78
+
102
79
  input_qubit_mapping = {qubit: index for index, qubit in enumerate(dag.qubits)}
103
80
  self.property_set["original_layout"] = Layout(input_qubit_mapping)
104
81
  if self.property_set["original_qubit_indices"] is None:
@@ -170,13 +170,13 @@ class Optimize1qGatesDecomposition(TransformationPass):
170
170
  return False
171
171
 
172
172
  # do we even have calibrations?
173
- has_cals_p = dag.calibrations is not None and len(dag.calibrations) > 0
173
+ has_cals_p = dag._calibrations_prop is not None and len(dag._calibrations_prop) > 0
174
174
  # does this run have uncalibrated gates?
175
- uncalibrated_p = not has_cals_p or any(not dag.has_calibration_for(g) for g in old_run)
175
+ uncalibrated_p = not has_cals_p or any(not dag._has_calibration_for(g) for g in old_run)
176
176
  # does this run have gates not in the image of ._decomposers _and_ uncalibrated?
177
177
  if basis is not None:
178
178
  uncalibrated_and_not_basis_p = any(
179
- g.name not in basis and (not has_cals_p or not dag.has_calibration_for(g))
179
+ g.name not in basis and (not has_cals_p or not dag._has_calibration_for(g))
180
180
  for g in old_run
181
181
  )
182
182
  else:
@@ -222,18 +222,12 @@ class Optimize1qGatesDecomposition(TransformationPass):
222
222
  def _error(self, circuit, qubit):
223
223
  """
224
224
  Calculate a rough error for a `circuit` that runs on a specific
225
- `qubit` of `target` (`circuit` can either be an OneQubitGateSequence
226
- from Rust or a list of DAGOPNodes).
225
+ `qubit` of `target` (`circuit` is a list of DAGOPNodes).
227
226
 
228
227
  Use basis errors from target if available, otherwise use length
229
228
  of circuit as a weak proxy for error.
230
229
  """
231
- if isinstance(circuit, euler_one_qubit_decomposer.OneQubitGateSequence):
232
- return euler_one_qubit_decomposer.compute_error_one_qubit_sequence(
233
- circuit, qubit, self.error_map
234
- )
235
- else:
236
- return euler_one_qubit_decomposer.compute_error_list(circuit, qubit, self.error_map)
230
+ return euler_one_qubit_decomposer.compute_error_list(circuit, qubit, self.error_map)
237
231
 
238
232
 
239
233
  def _possible_decomposers(basis_set):
@@ -86,7 +86,7 @@ class Optimize1qGates(TransformationPass):
86
86
  for current_node in run:
87
87
  left_name = current_node.name
88
88
  if (
89
- getattr(current_node.op, "condition", None) is not None
89
+ getattr(current_node, "condition", None) is not None
90
90
  or len(current_node.qargs) != 1
91
91
  or left_name not in ["p", "u1", "u2", "u3", "u", "id"]
92
92
  ):
@@ -40,7 +40,7 @@ class OptimizeSwapBeforeMeasure(TransformationPass):
40
40
 
41
41
  swaps = dag.op_nodes(SwapGate)
42
42
  for swap in swaps[::-1]:
43
- if getattr(swap.op, "condition", None) is not None:
43
+ if getattr(swap.op, "_condition", None) is not None:
44
44
  continue
45
45
  final_successor = []
46
46
  for successor in dag.descendants(swap):
@@ -0,0 +1,69 @@
1
+ # This code is part of Qiskit.
2
+ #
3
+ # (C) Copyright IBM 2024.
4
+ #
5
+ # This code is licensed under the Apache License, Version 2.0. You may
6
+ # obtain a copy of this license in the LICENSE.txt file in the root directory
7
+ # of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
8
+ #
9
+ # Any modifications or derivative works of this code must retain this
10
+ # copyright notice, and modified files need to carry a notice indicating
11
+ # that they have been altered from the originals.
12
+
13
+ """Transpiler pass to drop gates with negligible effects."""
14
+
15
+ from __future__ import annotations
16
+
17
+ from qiskit.dagcircuit import DAGCircuit
18
+ from qiskit.transpiler.target import Target
19
+ from qiskit.transpiler.basepasses import TransformationPass
20
+ from qiskit._accelerate.remove_identity_equiv import remove_identity_equiv
21
+
22
+
23
+ class RemoveIdentityEquivalent(TransformationPass):
24
+ r"""Remove gates with negligible effects.
25
+
26
+ Removes gates whose effect is close to an identity operation, up to the specified
27
+ tolerance. Zero qubit gates such as :class:`.GlobalPhaseGate` are not considered
28
+ by this pass.
29
+
30
+ For a cutoff fidelity :math:`f`, this pass removes gates whose average
31
+ gate fidelity with respect to the identity is below :math:`f`. Concretely,
32
+ a gate :math:`G` is removed if :math:`\bar F < f` where
33
+
34
+ .. math::
35
+
36
+ \bar{F} = \frac{1 + F_{\text{process}}}{1 + d},\
37
+
38
+ F_{\text{process}} = \frac{|\mathrm{Tr}(G)|^2}{d^2}
39
+
40
+ where :math:`d = 2^n` is the dimension of the gate for :math:`n` qubits.
41
+ """
42
+
43
+ def __init__(
44
+ self, *, approximation_degree: float | None = 1.0, target: None | Target = None
45
+ ) -> None:
46
+ """Initialize the transpiler pass.
47
+
48
+ Args:
49
+ approximation_degree: The degree to approximate for the equivalence check. This can be a
50
+ floating point value between 0 and 1, or ``None``. If the value is 1 this does not
51
+ approximate above floating point precision. For a value < 1 this is used as a scaling
52
+ factor for the cutoff fidelity. If the value is ``None`` this approximates up to the
53
+ fidelity for the gate specified in ``target``.
54
+
55
+ target: If ``approximation_degree`` is set to ``None`` and a :class:`.Target` is provided
56
+ for this field the tolerance for determining whether an operation is equivalent to
57
+ identity will be set to the reported error rate in the target. If
58
+ ``approximation_degree`` (the default) this has no effect, if
59
+ ``approximation_degree=None`` it uses the error rate specified in the ``Target`` for
60
+ the gate being evaluated, and a numeric value other than 1 with ``target`` set is
61
+ used as a scaling factor of the target's error rate.
62
+ """
63
+ super().__init__()
64
+ self._approximation_degree = approximation_degree
65
+ self._target = target
66
+
67
+ def run(self, dag: DAGCircuit) -> DAGCircuit:
68
+ remove_identity_equiv(dag, self._approximation_degree, self._target)
69
+ return dag
@@ -242,7 +242,7 @@ class BackwardMatch:
242
242
  Returns:
243
243
  bool: True if the same, False otherwise.
244
244
  """
245
- return node_circuit.op == node_template.op
245
+ return node_circuit.op.soft_compare(node_template.op)
246
246
 
247
247
  def _is_same_q_conf(self, node_circuit, node_template, qarg_circuit):
248
248
  """
@@ -304,15 +304,15 @@ class BackwardMatch:
304
304
  """
305
305
  if (
306
306
  node_circuit.type == "op"
307
- and getattr(node_circuit.op, "condition", None)
307
+ and getattr(node_circuit.op, "_condition", None)
308
308
  and node_template.type == "op"
309
- and getattr(node_template.op, "condition", None)
309
+ and getattr(node_template.op, "_condition", None)
310
310
  ):
311
311
  if set(carg_circuit) != set(node_template.cindices):
312
312
  return False
313
313
  if (
314
- getattr(node_circuit.op, "condition", None)[1]
315
- != getattr(node_template.op, "condition", None)[1]
314
+ getattr(node_circuit.op, "_condition", None)[1]
315
+ != getattr(node_template.op, "_condition", None)[1]
316
316
  ):
317
317
  return False
318
318
  return True
@@ -311,15 +311,15 @@ class ForwardMatch:
311
311
  """
312
312
  if (
313
313
  node_circuit.type == "op"
314
- and getattr(node_circuit.op, "condition", None)
314
+ and getattr(node_circuit.op, "_condition", None)
315
315
  and node_template.type == "op"
316
- and getattr(node_template.op, "condition", None)
316
+ and getattr(node_template.op, "_condition", None)
317
317
  ):
318
318
  if set(self.carg_indices) != set(node_template.cindices):
319
319
  return False
320
320
  if (
321
- getattr(node_circuit.op, "condition", None)[1]
322
- != getattr(node_template.op, "condition", None)[1]
321
+ getattr(node_circuit.op, "_condition", None)[1]
322
+ != getattr(node_template.op, "_condition", None)[1]
323
323
  ):
324
324
  return False
325
325
  return True
@@ -450,7 +450,7 @@ class TemplateSubstitution:
450
450
  template_sublist and circuit_sublist match up to the
451
451
  assignment of the parameters. For example the template
452
452
 
453
- .. parsed-literal::
453
+ .. code-block:: text
454
454
 
455
455
  ┌───────────┐ ┌────────┐
456
456
  q_0: ┤ P(-1.0*β) ├──■────────────■──┤0 ├
@@ -460,7 +460,7 @@ class TemplateSubstitution:
460
460
 
461
461
  should only maximally match once in the circuit
462
462
 
463
- .. parsed-literal::
463
+ .. code-block:: text
464
464
 
465
465
  ┌───────┐
466
466
  q_0: ┤ P(-2) ├──■────────────■────────────────────────────
@@ -41,7 +41,7 @@ class Commuting2qGateRouter(TransformationPass):
41
41
  qubit :class:`.PauliEvolutionGate` to qubits 0, 1, 3, and 4 of the five qubit device with
42
42
  the coupling map
43
43
 
44
- .. parsed-literal::
44
+ .. code-block:: text
45
45
 
46
46
  0 -- 1 -- 2
47
47
  |
@@ -30,7 +30,7 @@ class SwapStrategy:
30
30
  parallel. This means that a qubit can only be present once in a swap layer. For example, the
31
31
  following swap layers represent the optimal swap strategy for a line with five qubits
32
32
 
33
- .. parsed-literal::
33
+ .. code-block:: text
34
34
 
35
35
  (
36
36
  ((0, 1), (2, 3)), # Swap layer no. 1
@@ -41,8 +41,9 @@ class SabreSwap(TransformationPass):
41
41
  r"""Map input circuit onto a backend topology via insertion of SWAPs.
42
42
 
43
43
  Implementation of the SWAP-based heuristic search from the SABRE qubit
44
- mapping paper [1] (Algorithm 1). The heuristic aims to minimize the number
45
- of lossy SWAPs inserted and the depth of the circuit.
44
+ mapping paper [2] (Algorithm 1) with the modifications from the LightSABRE
45
+ paper [1]. The heuristic aims to minimize the number of lossy SWAPs inserted
46
+ and the depth of the circuit.
46
47
 
47
48
  This algorithm starts from an initial layout of virtual qubits onto physical
48
49
  qubits, and iterates over the circuit DAG until all gates are exhausted,
@@ -69,7 +70,10 @@ class SabreSwap(TransformationPass):
69
70
 
70
71
  **References:**
71
72
 
72
- [1] Li, Gushu, Yufei Ding, and Yuan Xie. "Tackling the qubit mapping problem
73
+ [1] Henry Zou and Matthew Treinish and Kevin Hartman and Alexander Ivrii and Jake Lishman.
74
+ "LightSABRE: A Lightweight and Enhanced SABRE Algorithm"
75
+ `arXiv:2409.08368 <https://doi.org/10.48550/arXiv.2409.08368>`__
76
+ [2] Li, Gushu, Yufei Ding, and Yuan Xie. "Tackling the qubit mapping problem
73
77
  for NISQ-era quantum devices." ASPLOS 2019.
74
78
  `arXiv:1809.02573 <https://arxiv.org/pdf/1809.02573.pdf>`_
75
79
  """
@@ -223,7 +223,7 @@ class StarPreRouting(TransformationPass):
223
223
  return (
224
224
  len(node.qargs) <= 2
225
225
  and len(node.cargs) == 0
226
- and getattr(node.op, "condition", None) is None
226
+ and getattr(node, "condition", None) is None
227
227
  and not isinstance(node.op, Barrier)
228
228
  )
229
229
 
@@ -372,7 +372,7 @@ def _extract_nodes(nodes, dag):
372
372
  qubit_indices = [dag.find_bit(qubit).index for qubit in node.qargs]
373
373
  classical_bit_indices = set()
374
374
 
375
- if node.op.condition is not None:
375
+ if node.condition is not None:
376
376
  classical_bit_indices.update(condition_resources(node.op.condition).clbits)
377
377
 
378
378
  if isinstance(node.op, SwitchCaseOp):
@@ -144,7 +144,7 @@ class ALAPSchedule(BaseSchedulerTransform):
144
144
 
145
145
  new_dag.name = dag.name
146
146
  new_dag.metadata = dag.metadata
147
- new_dag.calibrations = dag.calibrations
147
+ new_dag._calibrations_prop = dag._calibrations_prop
148
148
 
149
149
  # set circuit duration and unit to indicate it is scheduled
150
150
  new_dag.duration = circuit_duration
@@ -63,7 +63,7 @@ class AlignMeasures(TransformationPass):
63
63
  Examples:
64
64
  We assume executing the following circuit on a backend with ``alignment=16``.
65
65
 
66
- .. parsed-literal::
66
+ .. code-block:: text
67
67
 
68
68
  ┌───┐┌────────────────┐┌─┐
69
69
  q_0: ┤ X ├┤ Delay(100[dt]) ├┤M├
@@ -74,7 +74,7 @@ class AlignMeasures(TransformationPass):
74
74
  Note that delay of 100 dt induces a misalignment of 4 dt at the measurement.
75
75
  This pass appends an extra 12 dt time shift to the input circuit.
76
76
 
77
- .. parsed-literal::
77
+ .. code-block:: text
78
78
 
79
79
  ┌───┐┌────────────────┐┌─┐
80
80
  q_0: ┤ X ├┤ Delay(112[dt]) ├┤M├
@@ -70,7 +70,7 @@ class InstructionDurationCheck(AnalysisPass):
70
70
  return
71
71
 
72
72
  # Check custom gate durations
73
- for inst_defs in dag.calibrations.values():
73
+ for inst_defs in dag._calibrations_prop.values():
74
74
  for caldef in inst_defs.values():
75
75
  dur = caldef.duration
76
76
  if not (dur % self.acquire_align == 0 and dur % self.pulse_align == 0):
@@ -17,6 +17,7 @@ from qiskit.pulse import Play
17
17
  from qiskit.transpiler.basepasses import AnalysisPass
18
18
  from qiskit.transpiler.exceptions import TranspilerError
19
19
  from qiskit.transpiler.target import Target
20
+ from qiskit.utils.deprecate_pulse import deprecate_pulse_dependency
20
21
 
21
22
 
22
23
  class ValidatePulseGates(AnalysisPass):
@@ -40,6 +41,7 @@ class ValidatePulseGates(AnalysisPass):
40
41
  the backend control electronics.
41
42
  """
42
43
 
44
+ @deprecate_pulse_dependency
43
45
  def __init__(
44
46
  self,
45
47
  granularity: int = 1,
@@ -35,7 +35,7 @@ class ConstrainedReschedule(AnalysisPass):
35
35
 
36
36
  We assume executing the following circuit on a backend with 16 dt of acquire alignment.
37
37
 
38
- .. parsed-literal::
38
+ .. code-block:: text
39
39
 
40
40
  ┌───┐┌────────────────┐┌─┐
41
41
  q_0: ┤ X ├┤ Delay(100[dt]) ├┤M├
@@ -46,7 +46,7 @@ class ConstrainedReschedule(AnalysisPass):
46
46
  Note that delay of 100 dt induces a misalignment of 4 dt at the measurement.
47
47
  This pass appends an extra 12 dt time shift to the input circuit.
48
48
 
49
- .. parsed-literal::
49
+ .. code-block:: text
50
50
 
51
51
  ┌───┐┌────────────────┐┌─┐
52
52
  q_0: ┤ X ├┤ Delay(112[dt]) ├┤M├
@@ -167,7 +167,7 @@ class ASAPSchedule(BaseSchedulerTransform):
167
167
 
168
168
  new_dag.name = dag.name
169
169
  new_dag.metadata = dag.metadata
170
- new_dag.calibrations = dag.calibrations
170
+ new_dag._calibrations_prop = dag._calibrations_prop
171
171
 
172
172
  # set circuit duration and unit to indicate it is scheduled
173
173
  new_dag.duration = circuit_duration
@@ -42,7 +42,7 @@ class BaseSchedulerTransform(TransformationPass):
42
42
  conditioned on the same register are commute, i.e. read-access to the
43
43
  classical register doesn't change its state.
44
44
 
45
- .. parsed-literal::
45
+ .. code-block:: text
46
46
 
47
47
  qc = QuantumCircuit(2, 1)
48
48
  qc.delay(100, 0)
@@ -52,7 +52,7 @@ class BaseSchedulerTransform(TransformationPass):
52
52
  The scheduler SHOULD comply with above topological ordering policy of the DAG circuit.
53
53
  Accordingly, the `asap`-scheduled circuit will become
54
54
 
55
- .. parsed-literal::
55
+ .. code-block:: text
56
56
 
57
57
  ┌────────────────┐ ┌───┐
58
58
  q_0: ┤ Delay(100[dt]) ├───┤ X ├──────────────
@@ -76,7 +76,7 @@ class BaseSchedulerTransform(TransformationPass):
76
76
  is moved to the classical register (C).
77
77
  The sequence from t0 to t1 of the measure instruction interval might be modeled as follows:
78
78
 
79
- .. parsed-literal::
79
+ .. code-block:: text
80
80
 
81
81
  Q ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░
82
82
  B ░░▒▒▒▒▒▒▒▒░░░░░░░░░
@@ -90,7 +90,7 @@ class BaseSchedulerTransform(TransformationPass):
90
90
 
91
91
  This precise model may induce weird edge case.
92
92
 
93
- .. parsed-literal::
93
+ .. code-block:: text
94
94
 
95
95
  ┌───┐
96
96
  q_0: ───┤ X ├──────
@@ -107,7 +107,7 @@ class BaseSchedulerTransform(TransformationPass):
107
107
  is unchanged during the stimulus, thus two nodes are simultaneously operated.
108
108
  If one `alap`-schedule this circuit, it may return following circuit.
109
109
 
110
- .. parsed-literal::
110
+ .. code-block:: text
111
111
 
112
112
  ┌────────────────┐ ┌───┐
113
113
  q_0: ┤ Delay(500[dt]) ├───┤ X ├──────
@@ -122,7 +122,7 @@ class BaseSchedulerTransform(TransformationPass):
122
122
  It looks like the topological ordering between the nodes are flipped in the scheduled view.
123
123
  This behavior can be understood by considering the control flow model described above,
124
124
 
125
- .. parsed-literal::
125
+ .. code-block:: text
126
126
 
127
127
  : Quantum Circuit, first-measure
128
128
  0 ░░░░░░░░░░░░▒▒▒▒▒▒░
@@ -154,7 +154,7 @@ class BaseSchedulerTransform(TransformationPass):
154
154
  In this case, ``Measure`` instruction immediately locks the register C.
155
155
  Under this configuration, the `alap`-scheduled circuit of above example may become
156
156
 
157
- .. parsed-literal::
157
+ .. code-block:: text
158
158
 
159
159
  ┌───┐
160
160
  q_0: ───┤ X ├──────
@@ -168,7 +168,8 @@ class BaseSchedulerTransform(TransformationPass):
168
168
  it may separately schedule qubit and classical register,
169
169
  insertion of the delay yields unnecessary longer total execution time.
170
170
 
171
- .. parsed-literal::
171
+ .. code-block:: text
172
+
172
173
  : Quantum Circuit, first-xgate
173
174
  0 ░▒▒▒░░░░░░░░░░░░░░░
174
175
  1 ░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░
@@ -185,7 +186,7 @@ class BaseSchedulerTransform(TransformationPass):
185
186
  If finite conditional latency is provided, for example, 30 dt, the circuit
186
187
  is scheduled as follows.
187
188
 
188
- .. parsed-literal::
189
+ .. code-block:: text
189
190
 
190
191
  ┌───────────────┐ ┌───┐
191
192
  q_0: ┤ Delay(30[dt]) ├───┤ X ├──────
@@ -197,7 +198,8 @@ class BaseSchedulerTransform(TransformationPass):
197
198
 
198
199
  with the timing model:
199
200
 
200
- .. parsed-literal::
201
+ .. code-block:: text
202
+
201
203
  : Quantum Circuit, first-xgate
202
204
  0 ░░▒▒▒░░░░░░░░░░░░░░░
203
205
  1 ░░▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒░
@@ -264,10 +266,10 @@ class BaseSchedulerTransform(TransformationPass):
264
266
  """A helper method to get duration from node or calibration."""
265
267
  indices = [dag.find_bit(qarg).index for qarg in node.qargs]
266
268
 
267
- if dag.has_calibration_for(node):
269
+ if dag._has_calibration_for(node):
268
270
  # If node has calibration, this value should be the highest priority
269
271
  cal_key = tuple(indices), tuple(float(p) for p in node.op.params)
270
- duration = dag.calibrations[node.op.name][cal_key].duration
272
+ duration = dag._calibrations_prop[node.op.name][cal_key].duration
271
273
  else:
272
274
  duration = node.op.duration
273
275
 
@@ -13,6 +13,7 @@
13
13
  """Dynamical Decoupling insertion pass."""
14
14
 
15
15
  import itertools
16
+ import warnings
16
17
 
17
18
  import numpy as np
18
19
  from qiskit.circuit import Gate, Delay, Reset
@@ -288,11 +289,15 @@ class DynamicalDecoupling(TransformationPass):
288
289
  """
289
290
  circ_durations = InstructionDurations()
290
291
 
291
- if dag.calibrations:
292
+ if dag._calibrations_prop:
292
293
  cal_durations = []
293
- for gate, gate_cals in dag.calibrations.items():
294
- for (qubits, parameters), schedule in gate_cals.items():
295
- cal_durations.append((gate, qubits, parameters, schedule.duration))
294
+ with warnings.catch_warnings():
295
+ warnings.simplefilter(action="ignore", category=DeprecationWarning)
296
+ # `schedule.duration` emits pulse deprecation warnings which we don't want
297
+ # to see here
298
+ for gate, gate_cals in dag._calibrations_prop.items():
299
+ for (qubits, parameters), schedule in gate_cals.items():
300
+ cal_durations.append((gate, qubits, parameters, schedule.duration))
296
301
  circ_durations.update(cal_durations, circ_durations.dt)
297
302
 
298
303
  if self._durations is not None:
@@ -99,7 +99,7 @@ class BasePadding(TransformationPass):
99
99
  new_dag.name = dag.name
100
100
  new_dag.metadata = dag.metadata
101
101
  new_dag.unit = self.property_set["time_unit"]
102
- new_dag.calibrations = dag.calibrations
102
+ new_dag._calibrations_prop = dag._calibrations_prop
103
103
  new_dag.global_phase = dag.global_phase
104
104
 
105
105
  idle_after = {bit: 0 for bit in dag.qubits}
@@ -14,6 +14,7 @@
14
14
  from __future__ import annotations
15
15
 
16
16
  import logging
17
+ import warnings
17
18
  import numpy as np
18
19
 
19
20
  from qiskit.circuit import Gate, ParameterExpression, Qubit
@@ -187,11 +188,15 @@ class PadDynamicalDecoupling(BasePadding):
187
188
  """
188
189
  circ_durations = InstructionDurations()
189
190
 
190
- if dag.calibrations:
191
+ if dag._calibrations_prop:
191
192
  cal_durations = []
192
- for gate, gate_cals in dag.calibrations.items():
193
- for (qubits, parameters), schedule in gate_cals.items():
194
- cal_durations.append((gate, qubits, parameters, schedule.duration))
193
+ with warnings.catch_warnings():
194
+ warnings.simplefilter(action="ignore", category=DeprecationWarning)
195
+ # `schedule.duration` emits pulse deprecation warnings which we don't want
196
+ # to see here
197
+ for gate, gate_cals in dag._calibrations_prop.items():
198
+ for (qubits, parameters), schedule in gate_cals.items():
199
+ cal_durations.append((gate, qubits, parameters, schedule.duration))
195
200
  circ_durations.update(cal_durations, circ_durations.dt)
196
201
 
197
202
  if self._durations is not None:
@@ -252,7 +257,13 @@ class PadDynamicalDecoupling(BasePadding):
252
257
  try:
253
258
  # Check calibration.
254
259
  params = self._resolve_params(gate)
255
- gate_length = dag.calibrations[gate.name][((physical_index,), params)].duration
260
+ with warnings.catch_warnings():
261
+ warnings.simplefilter(action="ignore", category=DeprecationWarning)
262
+ # `schedule.duration` emits pulse deprecation warnings which we don't want
263
+ # to see here
264
+ gate_length = dag._calibrations_prop[gate.name][
265
+ ((physical_index,), params)
266
+ ].duration
256
267
  if gate_length % self._alignment != 0:
257
268
  # This is necessary to implement lightweight scheduling logic for this pass.
258
269
  # Usually the pulse alignment constraint and pulse data chunk size take
@@ -27,6 +27,9 @@ class PadDelay(BasePadding):
27
27
 
28
28
  .. code-block:: python
29
29
 
30
+ from qiskit import QuantumCircuit
31
+ from qiskit.transpiler import InstructionDurations
32
+
30
33
  durations = InstructionDurations([("x", None, 160), ("cx", None, 800)])
31
34
 
32
35
  qc = QuantumCircuit(2)
@@ -36,7 +39,7 @@ class PadDelay(BasePadding):
36
39
 
37
40
  The ASAP-scheduled circuit output may become
38
41
 
39
- .. parsed-literal::
42
+ .. code-block:: text
40
43
 
41
44
  ┌────────────────┐
42
45
  q_0: ┤ Delay(160[dt]) ├──■──