qiskit 1.4.2__cp39-abi3-macosx_11_0_arm64.whl → 2.0.0__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 (459) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +3 -9
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/circuit/__init__.py +35 -10
  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 +236 -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 +2 -141
  32. qiskit/circuit/instructionset.py +7 -54
  33. qiskit/circuit/library/__init__.py +469 -154
  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/graph_state.py +1 -0
  60. qiskit/circuit/library/hamiltonian_gate.py +1 -1
  61. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +1 -1
  62. qiskit/circuit/library/n_local/n_local.py +1 -1
  63. qiskit/circuit/library/n_local/qaoa_ansatz.py +1 -1
  64. qiskit/circuit/library/overlap.py +2 -2
  65. qiskit/circuit/library/pauli_evolution.py +39 -24
  66. qiskit/circuit/library/phase_oracle.py +130 -51
  67. qiskit/circuit/library/standard_gates/__init__.py +0 -1
  68. qiskit/circuit/library/standard_gates/dcx.py +3 -4
  69. qiskit/circuit/library/standard_gates/ecr.py +3 -4
  70. qiskit/circuit/library/standard_gates/global_phase.py +5 -6
  71. qiskit/circuit/library/standard_gates/h.py +4 -9
  72. qiskit/circuit/library/standard_gates/i.py +2 -2
  73. qiskit/circuit/library/standard_gates/iswap.py +3 -4
  74. qiskit/circuit/library/standard_gates/p.py +15 -34
  75. qiskit/circuit/library/standard_gates/r.py +7 -10
  76. qiskit/circuit/library/standard_gates/rx.py +5 -15
  77. qiskit/circuit/library/standard_gates/rxx.py +3 -6
  78. qiskit/circuit/library/standard_gates/ry.py +5 -17
  79. qiskit/circuit/library/standard_gates/ryy.py +3 -6
  80. qiskit/circuit/library/standard_gates/rz.py +5 -17
  81. qiskit/circuit/library/standard_gates/rzx.py +3 -6
  82. qiskit/circuit/library/standard_gates/rzz.py +3 -6
  83. qiskit/circuit/library/standard_gates/s.py +6 -15
  84. qiskit/circuit/library/standard_gates/swap.py +4 -11
  85. qiskit/circuit/library/standard_gates/sx.py +7 -12
  86. qiskit/circuit/library/standard_gates/t.py +6 -7
  87. qiskit/circuit/library/standard_gates/u.py +2 -10
  88. qiskit/circuit/library/standard_gates/u1.py +5 -16
  89. qiskit/circuit/library/standard_gates/u2.py +2 -6
  90. qiskit/circuit/library/standard_gates/u3.py +3 -11
  91. qiskit/circuit/library/standard_gates/x.py +14 -62
  92. qiskit/circuit/library/standard_gates/xx_minus_yy.py +2 -5
  93. qiskit/circuit/library/standard_gates/xx_plus_yy.py +2 -5
  94. qiskit/circuit/library/standard_gates/y.py +4 -9
  95. qiskit/circuit/library/standard_gates/z.py +5 -15
  96. qiskit/circuit/measure.py +11 -2
  97. qiskit/circuit/parameterexpression.py +7 -1
  98. qiskit/circuit/quantumcircuit.py +890 -564
  99. qiskit/circuit/random/utils.py +12 -6
  100. qiskit/circuit/reset.py +5 -2
  101. qiskit/circuit/singleton.py +5 -11
  102. qiskit/circuit/store.py +0 -8
  103. qiskit/compiler/__init__.py +1 -7
  104. qiskit/compiler/transpiler.py +38 -196
  105. qiskit/converters/circuit_to_dag.py +6 -4
  106. qiskit/converters/circuit_to_dagdependency.py +0 -2
  107. qiskit/converters/circuit_to_dagdependency_v2.py +0 -1
  108. qiskit/converters/circuit_to_gate.py +1 -1
  109. qiskit/converters/circuit_to_instruction.py +16 -29
  110. qiskit/converters/dag_to_circuit.py +7 -8
  111. qiskit/converters/dag_to_dagdependency.py +0 -1
  112. qiskit/converters/dag_to_dagdependency_v2.py +0 -1
  113. qiskit/converters/dagdependency_to_circuit.py +0 -6
  114. qiskit/converters/dagdependency_to_dag.py +0 -6
  115. qiskit/dagcircuit/collect_blocks.py +32 -20
  116. qiskit/dagcircuit/dagdependency.py +3 -37
  117. qiskit/dagcircuit/dagdependency_v2.py +5 -82
  118. qiskit/dagcircuit/dagnode.py +14 -2
  119. qiskit/passmanager/__init__.py +24 -6
  120. qiskit/passmanager/passmanager.py +26 -24
  121. qiskit/primitives/__init__.py +44 -35
  122. qiskit/primitives/backend_estimator_v2.py +102 -23
  123. qiskit/primitives/backend_sampler_v2.py +5 -20
  124. qiskit/primitives/base/__init__.py +4 -4
  125. qiskit/primitives/base/base_estimator.py +77 -82
  126. qiskit/primitives/base/base_primitive_job.py +2 -2
  127. qiskit/primitives/base/{base_primitive.py → base_primitive_v1.py} +1 -1
  128. qiskit/primitives/base/{base_result.py → base_result_v1.py} +1 -1
  129. qiskit/primitives/base/base_sampler.py +52 -60
  130. qiskit/primitives/base/{estimator_result.py → estimator_result_v1.py} +2 -2
  131. qiskit/primitives/base/{sampler_result.py → sampler_result_v1.py} +2 -2
  132. qiskit/primitives/base/{validation.py → validation_v1.py} +34 -15
  133. qiskit/primitives/containers/bindings_array.py +3 -1
  134. qiskit/primitives/containers/bit_array.py +23 -0
  135. qiskit/primitives/containers/data_bin.py +3 -1
  136. qiskit/primitives/containers/observables_array.py +19 -2
  137. qiskit/primitives/statevector_sampler.py +6 -8
  138. qiskit/primitives/utils.py +14 -189
  139. qiskit/providers/__init__.py +4 -130
  140. qiskit/providers/backend.py +11 -314
  141. qiskit/providers/basic_provider/__init__.py +3 -1
  142. qiskit/providers/basic_provider/basic_provider.py +29 -9
  143. qiskit/providers/basic_provider/basic_simulator.py +158 -298
  144. qiskit/providers/exceptions.py +0 -33
  145. qiskit/providers/fake_provider/__init__.py +0 -37
  146. qiskit/providers/fake_provider/generic_backend_v2.py +32 -693
  147. qiskit/qasm2/__init__.py +21 -6
  148. qiskit/qasm2/export.py +2 -10
  149. qiskit/qasm2/parse.py +11 -25
  150. qiskit/qasm3/__init__.py +5 -1
  151. qiskit/qasm3/ast.py +44 -0
  152. qiskit/qasm3/exporter.py +65 -27
  153. qiskit/qasm3/printer.py +35 -4
  154. qiskit/qpy/__init__.py +162 -19
  155. qiskit/qpy/binary_io/__init__.py +0 -1
  156. qiskit/qpy/binary_io/circuits.py +98 -130
  157. qiskit/qpy/binary_io/schedules.py +69 -439
  158. qiskit/qpy/binary_io/value.py +154 -31
  159. qiskit/qpy/common.py +10 -7
  160. qiskit/qpy/formats.py +41 -0
  161. qiskit/qpy/interface.py +34 -81
  162. qiskit/qpy/type_keys.py +58 -221
  163. qiskit/quantum_info/analysis/distance.py +3 -1
  164. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -1
  165. qiskit/quantum_info/operators/operator.py +6 -2
  166. qiskit/quantum_info/operators/symplectic/clifford.py +3 -1
  167. qiskit/quantum_info/operators/symplectic/pauli.py +4 -2
  168. qiskit/quantum_info/operators/symplectic/pauli_list.py +17 -5
  169. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +40 -6
  170. qiskit/quantum_info/states/densitymatrix.py +16 -6
  171. qiskit/quantum_info/states/stabilizerstate.py +35 -4
  172. qiskit/quantum_info/states/statevector.py +16 -6
  173. qiskit/result/__init__.py +5 -17
  174. qiskit/result/models.py +18 -11
  175. qiskit/result/result.py +38 -134
  176. qiskit/result/sampled_expval.py +1 -2
  177. qiskit/result/utils.py +3 -4
  178. qiskit/synthesis/__init__.py +21 -1
  179. qiskit/synthesis/arithmetic/__init__.py +3 -1
  180. qiskit/synthesis/arithmetic/adders/cdkm_ripple_carry_adder.py +1 -1
  181. qiskit/synthesis/arithmetic/adders/draper_qft_adder.py +1 -1
  182. qiskit/synthesis/arithmetic/adders/vbe_ripple_carry_adder.py +2 -2
  183. qiskit/{providers/fake_provider/backends_v1/fake_20q → synthesis/arithmetic/comparators}/__init__.py +4 -6
  184. qiskit/synthesis/arithmetic/comparators/compare_2s.py +112 -0
  185. qiskit/synthesis/arithmetic/comparators/compare_greedy.py +66 -0
  186. qiskit/synthesis/arithmetic/multipliers/hrs_cumulative_multiplier.py +1 -1
  187. qiskit/synthesis/arithmetic/multipliers/rg_qft_multiplier.py +1 -1
  188. qiskit/synthesis/arithmetic/weighted_sum.py +155 -0
  189. qiskit/{result/mitigation → synthesis/boolean}/__init__.py +2 -2
  190. qiskit/synthesis/boolean/boolean_expression.py +231 -0
  191. qiskit/synthesis/boolean/boolean_expression_synth.py +124 -0
  192. qiskit/synthesis/boolean/boolean_expression_visitor.py +96 -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 +4 -40
  209. qiskit/transpiler/passes/basis/basis_translator.py +5 -4
  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 +4 -0
  214. qiskit/transpiler/passes/layout/dense_layout.py +2 -39
  215. qiskit/transpiler/passes/layout/full_ancilla_allocation.py +3 -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 +2 -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 +32 -4
  245. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +25 -63
  246. qiskit/transpiler/passes/scheduling/padding/pad_delay.py +12 -4
  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 +134 -62
  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 +107 -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 +78 -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/counts_visualization.py +4 -0
  287. qiskit/visualization/dag_visualization.py +2 -1
  288. qiskit/visualization/gate_map.py +39 -154
  289. qiskit/visualization/library.py +4 -1
  290. qiskit/visualization/pass_manager_visualization.py +6 -2
  291. qiskit/visualization/state_visualization.py +19 -2
  292. qiskit/visualization/timeline/core.py +19 -13
  293. qiskit/visualization/timeline/interface.py +19 -18
  294. qiskit/visualization/timeline/plotters/matplotlib.py +4 -1
  295. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/METADATA +4 -3
  296. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/RECORD +300 -447
  297. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/WHEEL +2 -1
  298. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/entry_points.txt +8 -2
  299. qiskit/assembler/__init__.py +0 -42
  300. qiskit/assembler/assemble_circuits.py +0 -451
  301. qiskit/assembler/assemble_schedules.py +0 -367
  302. qiskit/assembler/disassemble.py +0 -310
  303. qiskit/assembler/run_config.py +0 -77
  304. qiskit/circuit/bit.py +0 -106
  305. qiskit/circuit/classicalfunction/__init__.py +0 -152
  306. qiskit/circuit/classicalfunction/boolean_expression.py +0 -138
  307. qiskit/circuit/classicalfunction/classical_element.py +0 -54
  308. qiskit/circuit/classicalfunction/classical_function_visitor.py +0 -155
  309. qiskit/circuit/classicalfunction/classicalfunction.py +0 -182
  310. qiskit/circuit/classicalfunction/exceptions.py +0 -41
  311. qiskit/circuit/classicalfunction/types.py +0 -18
  312. qiskit/circuit/classicalfunction/utils.py +0 -91
  313. qiskit/circuit/classicalregister.py +0 -57
  314. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +0 -405
  315. qiskit/circuit/quantumregister.py +0 -75
  316. qiskit/circuit/register.py +0 -246
  317. qiskit/compiler/assembler.py +0 -689
  318. qiskit/compiler/scheduler.py +0 -109
  319. qiskit/compiler/sequencer.py +0 -71
  320. qiskit/primitives/backend_estimator.py +0 -486
  321. qiskit/primitives/backend_sampler.py +0 -222
  322. qiskit/primitives/estimator.py +0 -172
  323. qiskit/primitives/sampler.py +0 -162
  324. qiskit/providers/backend_compat.py +0 -507
  325. qiskit/providers/fake_provider/backends_v1/__init__.py +0 -22
  326. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/__init__.py +0 -18
  327. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/conf_washington.json +0 -1
  328. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/defs_washington.json +0 -1
  329. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/fake_127q_pulse_v1.py +0 -37
  330. qiskit/providers/fake_provider/backends_v1/fake_127q_pulse/props_washington.json +0 -1
  331. qiskit/providers/fake_provider/backends_v1/fake_20q/conf_singapore.json +0 -1
  332. qiskit/providers/fake_provider/backends_v1/fake_20q/fake_20q.py +0 -43
  333. qiskit/providers/fake_provider/backends_v1/fake_20q/props_singapore.json +0 -1
  334. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/__init__.py +0 -18
  335. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/conf_hanoi.json +0 -1
  336. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/defs_hanoi.json +0 -1
  337. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/fake_27q_pulse_v1.py +0 -50
  338. qiskit/providers/fake_provider/backends_v1/fake_27q_pulse/props_hanoi.json +0 -1
  339. qiskit/providers/fake_provider/backends_v1/fake_5q/__init__.py +0 -18
  340. qiskit/providers/fake_provider/backends_v1/fake_5q/conf_yorktown.json +0 -1
  341. qiskit/providers/fake_provider/backends_v1/fake_5q/fake_5q_v1.py +0 -41
  342. qiskit/providers/fake_provider/backends_v1/fake_5q/props_yorktown.json +0 -1
  343. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/__init__.py +0 -18
  344. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/conf_nairobi.json +0 -1
  345. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/defs_nairobi.json +0 -1
  346. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/fake_7q_pulse_v1.py +0 -44
  347. qiskit/providers/fake_provider/backends_v1/fake_7q_pulse/props_nairobi.json +0 -1
  348. qiskit/providers/fake_provider/fake_1q.py +0 -91
  349. qiskit/providers/fake_provider/fake_backend.py +0 -165
  350. qiskit/providers/fake_provider/fake_openpulse_2q.py +0 -391
  351. qiskit/providers/fake_provider/fake_openpulse_3q.py +0 -340
  352. qiskit/providers/fake_provider/fake_pulse_backend.py +0 -49
  353. qiskit/providers/fake_provider/fake_qasm_backend.py +0 -77
  354. qiskit/providers/fake_provider/utils/backend_converter.py +0 -150
  355. qiskit/providers/fake_provider/utils/json_decoder.py +0 -109
  356. qiskit/providers/models/__init__.py +0 -89
  357. qiskit/providers/models/backendconfiguration.py +0 -1040
  358. qiskit/providers/models/backendproperties.py +0 -535
  359. qiskit/providers/models/backendstatus.py +0 -104
  360. qiskit/providers/models/jobstatus.py +0 -77
  361. qiskit/providers/models/pulsedefaults.py +0 -305
  362. qiskit/providers/provider.py +0 -95
  363. qiskit/pulse/__init__.py +0 -158
  364. qiskit/pulse/builder.py +0 -2262
  365. qiskit/pulse/calibration_entries.py +0 -381
  366. qiskit/pulse/channels.py +0 -227
  367. qiskit/pulse/configuration.py +0 -245
  368. qiskit/pulse/exceptions.py +0 -45
  369. qiskit/pulse/filters.py +0 -309
  370. qiskit/pulse/instruction_schedule_map.py +0 -424
  371. qiskit/pulse/instructions/__init__.py +0 -67
  372. qiskit/pulse/instructions/acquire.py +0 -150
  373. qiskit/pulse/instructions/delay.py +0 -71
  374. qiskit/pulse/instructions/directives.py +0 -154
  375. qiskit/pulse/instructions/frequency.py +0 -135
  376. qiskit/pulse/instructions/instruction.py +0 -270
  377. qiskit/pulse/instructions/phase.py +0 -152
  378. qiskit/pulse/instructions/play.py +0 -99
  379. qiskit/pulse/instructions/reference.py +0 -100
  380. qiskit/pulse/instructions/snapshot.py +0 -82
  381. qiskit/pulse/library/__init__.py +0 -97
  382. qiskit/pulse/library/continuous.py +0 -430
  383. qiskit/pulse/library/pulse.py +0 -148
  384. qiskit/pulse/library/samplers/__init__.py +0 -15
  385. qiskit/pulse/library/samplers/decorators.py +0 -295
  386. qiskit/pulse/library/samplers/strategies.py +0 -71
  387. qiskit/pulse/library/symbolic_pulses.py +0 -1989
  388. qiskit/pulse/library/waveform.py +0 -136
  389. qiskit/pulse/macros.py +0 -262
  390. qiskit/pulse/parameter_manager.py +0 -445
  391. qiskit/pulse/parser.py +0 -314
  392. qiskit/pulse/reference_manager.py +0 -58
  393. qiskit/pulse/schedule.py +0 -1854
  394. qiskit/pulse/transforms/__init__.py +0 -106
  395. qiskit/pulse/transforms/alignments.py +0 -406
  396. qiskit/pulse/transforms/base_transforms.py +0 -71
  397. qiskit/pulse/transforms/canonicalization.py +0 -498
  398. qiskit/pulse/transforms/dag.py +0 -122
  399. qiskit/pulse/utils.py +0 -149
  400. qiskit/qobj/__init__.py +0 -75
  401. qiskit/qobj/common.py +0 -81
  402. qiskit/qobj/converters/__init__.py +0 -18
  403. qiskit/qobj/converters/lo_config.py +0 -177
  404. qiskit/qobj/converters/pulse_instruction.py +0 -897
  405. qiskit/qobj/pulse_qobj.py +0 -709
  406. qiskit/qobj/qasm_qobj.py +0 -708
  407. qiskit/qobj/utils.py +0 -46
  408. qiskit/result/mitigation/base_readout_mitigator.py +0 -79
  409. qiskit/result/mitigation/correlated_readout_mitigator.py +0 -277
  410. qiskit/result/mitigation/local_readout_mitigator.py +0 -328
  411. qiskit/result/mitigation/utils.py +0 -217
  412. qiskit/scheduler/__init__.py +0 -40
  413. qiskit/scheduler/config.py +0 -37
  414. qiskit/scheduler/lowering.py +0 -187
  415. qiskit/scheduler/methods/__init__.py +0 -15
  416. qiskit/scheduler/methods/basic.py +0 -140
  417. qiskit/scheduler/schedule_circuit.py +0 -69
  418. qiskit/scheduler/sequence.py +0 -104
  419. qiskit/transpiler/passes/calibration/__init__.py +0 -17
  420. qiskit/transpiler/passes/calibration/base_builder.py +0 -79
  421. qiskit/transpiler/passes/calibration/builders.py +0 -20
  422. qiskit/transpiler/passes/calibration/exceptions.py +0 -22
  423. qiskit/transpiler/passes/calibration/pulse_gate.py +0 -100
  424. qiskit/transpiler/passes/calibration/rx_builder.py +0 -164
  425. qiskit/transpiler/passes/calibration/rzx_builder.py +0 -411
  426. qiskit/transpiler/passes/calibration/rzx_templates.py +0 -58
  427. qiskit/transpiler/passes/optimization/cx_cancellation.py +0 -65
  428. qiskit/transpiler/passes/optimization/echo_rzx_weyl_decomposition.py +0 -162
  429. qiskit/transpiler/passes/optimization/normalize_rx_angle.py +0 -157
  430. qiskit/transpiler/passes/routing/stochastic_swap.py +0 -532
  431. qiskit/transpiler/passes/scheduling/alap.py +0 -153
  432. qiskit/transpiler/passes/scheduling/alignments/align_measures.py +0 -255
  433. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +0 -107
  434. qiskit/transpiler/passes/scheduling/asap.py +0 -175
  435. qiskit/transpiler/passes/scheduling/base_scheduler.py +0 -310
  436. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +0 -313
  437. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +0 -93
  438. qiskit/utils/deprecate_pulse.py +0 -119
  439. qiskit/utils/multiprocessing.py +0 -56
  440. qiskit/visualization/pulse_v2/__init__.py +0 -21
  441. qiskit/visualization/pulse_v2/core.py +0 -901
  442. qiskit/visualization/pulse_v2/device_info.py +0 -173
  443. qiskit/visualization/pulse_v2/drawings.py +0 -253
  444. qiskit/visualization/pulse_v2/events.py +0 -254
  445. qiskit/visualization/pulse_v2/generators/__init__.py +0 -40
  446. qiskit/visualization/pulse_v2/generators/barrier.py +0 -76
  447. qiskit/visualization/pulse_v2/generators/chart.py +0 -208
  448. qiskit/visualization/pulse_v2/generators/frame.py +0 -436
  449. qiskit/visualization/pulse_v2/generators/snapshot.py +0 -133
  450. qiskit/visualization/pulse_v2/generators/waveform.py +0 -645
  451. qiskit/visualization/pulse_v2/interface.py +0 -459
  452. qiskit/visualization/pulse_v2/layouts.py +0 -387
  453. qiskit/visualization/pulse_v2/plotters/__init__.py +0 -17
  454. qiskit/visualization/pulse_v2/plotters/base_plotter.py +0 -53
  455. qiskit/visualization/pulse_v2/plotters/matplotlib.py +0 -201
  456. qiskit/visualization/pulse_v2/stylesheet.py +0 -312
  457. qiskit/visualization/pulse_v2/types.py +0 -242
  458. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info/licenses}/LICENSE.txt +0 -0
  459. {qiskit-1.4.2.dist-info → qiskit-2.0.0.dist-info}/top_level.txt +0 -0
@@ -22,6 +22,7 @@ from qiskit.dagcircuit import DAGCircuit, DAGNode
22
22
  from qiskit.transpiler.basepasses import TransformationPass
23
23
  from qiskit.transpiler.exceptions import TranspilerError
24
24
  from qiskit.transpiler.target import Target
25
+ from qiskit.transpiler.instruction_durations import InstructionDurations
25
26
 
26
27
  logger = logging.getLogger(__name__)
27
28
 
@@ -57,6 +58,7 @@ class BasePadding(TransformationPass):
57
58
  def __init__(
58
59
  self,
59
60
  target: Target = None,
61
+ durations: InstructionDurations = None,
60
62
  ):
61
63
  """BasePadding initializer.
62
64
 
@@ -67,6 +69,30 @@ class BasePadding(TransformationPass):
67
69
  """
68
70
  super().__init__()
69
71
  self.target = target
72
+ self.durations = durations
73
+
74
+ def get_duration(self, node, dag): # pylint: disable=too-many-return-statements
75
+ """Get duration of a given node in the circuit."""
76
+ if node.name == "delay":
77
+ return node.op.duration
78
+ if node.name == "barrier":
79
+ return 0
80
+ if not self.target and not self.durations:
81
+ return None
82
+ indices = [dag.find_bit(qarg).index for qarg in node.qargs]
83
+
84
+ if self.target:
85
+ props_dict = self.target.get(node.name)
86
+ if not props_dict:
87
+ return None
88
+ props = props_dict.get(tuple(indices))
89
+ if not props:
90
+ return None
91
+ if self.target.dt is None:
92
+ return props.duration
93
+ else:
94
+ return self.target.seconds_to_dt(props.duration)
95
+ return self.durations.get(node.name, indices)
70
96
 
71
97
  def run(self, dag: DAGCircuit):
72
98
  """Run the padding pass on ``dag``.
@@ -98,8 +124,7 @@ class BasePadding(TransformationPass):
98
124
 
99
125
  new_dag.name = dag.name
100
126
  new_dag.metadata = dag.metadata
101
- new_dag.unit = self.property_set["time_unit"]
102
- new_dag._calibrations_prop = dag._calibrations_prop
127
+ new_dag._unit = self.property_set["time_unit"]
103
128
  new_dag.global_phase = dag.global_phase
104
129
 
105
130
  idle_after = {bit: 0 for bit in dag.qubits}
@@ -112,7 +137,7 @@ class BasePadding(TransformationPass):
112
137
  for node in dag.topological_op_nodes():
113
138
  if node in node_start_time:
114
139
  t0 = node_start_time[node]
115
- t1 = t0 + node.op.duration
140
+ t1 = t0 + self.get_duration(node, dag)
116
141
  circuit_duration = max(circuit_duration, t1)
117
142
 
118
143
  if isinstance(node.op, Delay):
@@ -161,7 +186,7 @@ class BasePadding(TransformationPass):
161
186
  prev_node=prev_node,
162
187
  )
163
188
 
164
- new_dag.duration = circuit_duration
189
+ new_dag._duration = circuit_duration
165
190
 
166
191
  return new_dag
167
192
 
@@ -185,6 +210,9 @@ class BasePadding(TransformationPass):
185
210
  f"The input circuit {dag.name} is not scheduled. Call one of scheduling passes "
186
211
  f"before running the {self.__class__.__name__} pass."
187
212
  )
213
+ if self.property_set["time_unit"] == "stretch":
214
+ # This should have already been raised during scheduling, but just in case.
215
+ raise TranspilerError("Scheduling cannot run on circuits with stretch durations.")
188
216
  for qarg, _ in enumerate(dag.qubits):
189
217
  if not self.__delay_supported(qarg):
190
218
  logger.debug(
@@ -14,7 +14,6 @@
14
14
  from __future__ import annotations
15
15
 
16
16
  import logging
17
- import warnings
18
17
  import numpy as np
19
18
 
20
19
  from qiskit.circuit import Gate, ParameterExpression, Qubit
@@ -59,9 +58,10 @@ class PadDynamicalDecoupling(BasePadding):
59
58
  import numpy as np
60
59
  from qiskit.circuit import QuantumCircuit
61
60
  from qiskit.circuit.library import XGate
62
- from qiskit.transpiler import PassManager, InstructionDurations
61
+ from qiskit.transpiler import PassManager, InstructionDurations, Target, CouplingMap
63
62
  from qiskit.transpiler.passes import ALAPScheduleAnalysis, PadDynamicalDecoupling
64
63
  from qiskit.visualization import timeline_drawer
64
+
65
65
  circ = QuantumCircuit(4)
66
66
  circ.h(0)
67
67
  circ.cx(0, 1)
@@ -71,7 +71,15 @@ class PadDynamicalDecoupling(BasePadding):
71
71
  durations = InstructionDurations(
72
72
  [("h", 0, 50), ("cx", [0, 1], 700), ("reset", None, 10),
73
73
  ("cx", [1, 2], 200), ("cx", [2, 3], 300),
74
- ("x", None, 50), ("measure", None, 1000)]
74
+ ("x", None, 50), ("measure", None, 1000)],
75
+ dt=1e-7
76
+ )
77
+ target = Target.from_configuration(
78
+ ["h", "cx", "reset", "x", "measure"],
79
+ num_qubits=4,
80
+ coupling_map=CouplingMap.from_line(4, bidirectional=False),
81
+ instruction_durations=durations,
82
+ dt=1e-7,
75
83
  )
76
84
 
77
85
  # balanced X-X sequence on all qubits
@@ -79,7 +87,7 @@ class PadDynamicalDecoupling(BasePadding):
79
87
  pm = PassManager([ALAPScheduleAnalysis(durations),
80
88
  PadDynamicalDecoupling(durations, dd_sequence)])
81
89
  circ_dd = pm.run(circ)
82
- timeline_drawer(circ_dd)
90
+ timeline_drawer(circ_dd, target=target)
83
91
 
84
92
  # Uhrig sequence on qubit 0
85
93
  n = 8
@@ -97,7 +105,7 @@ class PadDynamicalDecoupling(BasePadding):
97
105
  ]
98
106
  )
99
107
  circ_dd = pm.run(circ)
100
- timeline_drawer(circ_dd)
108
+ timeline_drawer(circ_dd, target=target)
101
109
 
102
110
  .. note::
103
111
 
@@ -158,7 +166,7 @@ class PadDynamicalDecoupling(BasePadding):
158
166
  non-multiple of the alignment constraint value is found.
159
167
  TypeError: If ``dd_sequence`` is not specified
160
168
  """
161
- super().__init__(target=target)
169
+ super().__init__(target=target, durations=durations)
162
170
  self._durations = durations
163
171
  if dd_sequence is None:
164
172
  raise TypeError("required argument 'dd_sequence' is not specified")
@@ -173,6 +181,7 @@ class PadDynamicalDecoupling(BasePadding):
173
181
  self._dd_sequence_lengths: dict[Qubit, list[int]] = {}
174
182
  self._sequence_phase = 0
175
183
  if target is not None:
184
+ # The priority order for instruction durations is: target > standalone.
176
185
  self._durations = target.durations()
177
186
  self._alignment = target.pulse_alignment
178
187
  for gate in dd_sequence:
@@ -181,35 +190,12 @@ class PadDynamicalDecoupling(BasePadding):
181
190
  f"{gate.name} in dd_sequence is not supported in the target"
182
191
  )
183
192
 
184
- def _update_inst_durations(self, dag):
185
- """Update instruction durations with circuit information. If the dag contains gate
186
- calibrations and no instruction durations were provided through the target or as a
187
- standalone input, the circuit calibration durations will be used.
188
- The priority order for instruction durations is: target > standalone > circuit.
189
- """
190
- circ_durations = InstructionDurations()
191
-
192
- if dag._calibrations_prop:
193
- cal_durations = []
194
- with warnings.catch_warnings():
195
- warnings.simplefilter(action="ignore", category=DeprecationWarning)
196
- # `schedule.duration` emits pulse deprecation warnings which we don't want
197
- # to see here
198
- for gate, gate_cals in dag._calibrations_prop.items():
199
- for (qubits, parameters), schedule in gate_cals.items():
200
- cal_durations.append((gate, qubits, parameters, schedule.duration))
201
- circ_durations.update(cal_durations, circ_durations.dt)
202
-
203
- if self._durations is not None:
204
- circ_durations.update(self._durations, getattr(self._durations, "dt", None))
205
-
206
- return circ_durations
207
-
208
193
  def _pre_runhook(self, dag: DAGCircuit):
209
194
  super()._pre_runhook(dag)
210
195
 
211
- durations = self._update_inst_durations(dag)
212
-
196
+ durations = InstructionDurations()
197
+ if self._durations is not None:
198
+ durations.update(self._durations, getattr(self._durations, "dt", None))
213
199
  num_pulses = len(self._dd_sequence)
214
200
 
215
201
  # Check if physical circuit is given
@@ -255,31 +241,7 @@ class PadDynamicalDecoupling(BasePadding):
255
241
 
256
242
  sequence_lengths = []
257
243
  for index, gate in enumerate(self._dd_sequence):
258
- try:
259
- # Check calibration.
260
- params = self._resolve_params(gate)
261
- with warnings.catch_warnings():
262
- warnings.simplefilter(action="ignore", category=DeprecationWarning)
263
- # `schedule.duration` emits pulse deprecation warnings which we don't want
264
- # to see here
265
- gate_length = dag._calibrations_prop[gate.name][
266
- ((physical_index,), params)
267
- ].duration
268
- if gate_length % self._alignment != 0:
269
- # This is necessary to implement lightweight scheduling logic for this pass.
270
- # Usually the pulse alignment constraint and pulse data chunk size take
271
- # the same value, however, we can intentionally violate this pattern
272
- # at the gate level. For example, we can create a schedule consisting of
273
- # a pi-pulse of 32 dt followed by a post buffer, i.e. delay, of 4 dt
274
- # on the device with 16 dt constraint. Note that the pi-pulse length
275
- # is multiple of 16 dt but the gate length of 36 is not multiple of it.
276
- # Such pulse gate should be excluded.
277
- raise TranspilerError(
278
- f"Pulse gate {gate.name} with length non-multiple of {self._alignment} "
279
- f"is not acceptable in {self.__class__.__name__} pass."
280
- )
281
- except KeyError:
282
- gate_length = durations.get(gate, physical_index)
244
+ gate_length = durations.get(gate, physical_index)
283
245
  sequence_lengths.append(gate_length)
284
246
  # Update gate duration. This is necessary for current timeline drawer, i.e. scheduled.
285
247
  gate = gate.to_mutable()
@@ -348,14 +310,14 @@ class PadDynamicalDecoupling(BasePadding):
348
310
 
349
311
  if not self.__is_dd_qubit(dag.qubits.index(qubit)):
350
312
  # Target physical qubit is not the target of this DD sequence.
351
- self._apply_scheduled_op(dag, t_start, Delay(time_interval, dag.unit), qubit)
313
+ self._apply_scheduled_op(dag, t_start, Delay(time_interval, dag._unit), qubit)
352
314
  return
353
315
 
354
316
  if self._skip_reset_qubits and (
355
317
  isinstance(prev_node, DAGInNode) or isinstance(prev_node.op, Reset)
356
318
  ):
357
319
  # Previous node is the start edge or reset, i.e. qubit is ground state.
358
- self._apply_scheduled_op(dag, t_start, Delay(time_interval, dag.unit), qubit)
320
+ self._apply_scheduled_op(dag, t_start, Delay(time_interval, dag._unit), qubit)
359
321
  return
360
322
 
361
323
  slack = time_interval - np.sum(self._dd_sequence_lengths[qubit])
@@ -363,7 +325,7 @@ class PadDynamicalDecoupling(BasePadding):
363
325
 
364
326
  if slack <= 0:
365
327
  # Interval too short.
366
- self._apply_scheduled_op(dag, t_start, Delay(time_interval, dag.unit), qubit)
328
+ self._apply_scheduled_op(dag, t_start, Delay(time_interval, dag._unit), qubit)
367
329
  return
368
330
 
369
331
  if len(self._dd_sequence) == 1:
@@ -382,14 +344,14 @@ class PadDynamicalDecoupling(BasePadding):
382
344
  op = prev_node.op
383
345
  theta_l, phi_l, lam_l = op.params
384
346
  op.params = Optimize1qGates.compose_u3(theta, phi, lam, theta_l, phi_l, lam_l)
385
- new_prev_node = dag.substitute_node(prev_node, op, propagate_condition=False)
347
+ new_prev_node = dag.substitute_node(prev_node, op)
386
348
  start_time = self.property_set["node_start_time"].pop(prev_node)
387
349
  if start_time is not None:
388
350
  self.property_set["node_start_time"][new_prev_node] = start_time
389
351
  sequence_gphase += phase
390
352
  else:
391
353
  # Don't do anything if there's no single-qubit gate to absorb the inverse
392
- self._apply_scheduled_op(dag, t_start, Delay(time_interval, dag.unit), qubit)
354
+ self._apply_scheduled_op(dag, t_start, Delay(time_interval, dag._unit), qubit)
393
355
  return
394
356
 
395
357
  def _constrained_length(values):
@@ -425,7 +387,7 @@ class PadDynamicalDecoupling(BasePadding):
425
387
  if dd_ind < len(taus):
426
388
  tau = taus[dd_ind]
427
389
  if tau > 0:
428
- self._apply_scheduled_op(dag, idle_after, Delay(tau, dag.unit), qubit)
390
+ self._apply_scheduled_op(dag, idle_after, Delay(tau, dag._unit), qubit)
429
391
  idle_after += tau
430
392
  if dd_ind < len(self._dd_sequence):
431
393
  gate = self._dd_sequence[dd_ind]
@@ -16,6 +16,7 @@ from qiskit.circuit import Qubit
16
16
  from qiskit.circuit.delay import Delay
17
17
  from qiskit.dagcircuit import DAGCircuit, DAGNode, DAGOutNode
18
18
  from qiskit.transpiler.target import Target
19
+ from qiskit.transpiler.instruction_durations import InstructionDurations
19
20
 
20
21
  from .base_padding import BasePadding
21
22
 
@@ -25,7 +26,9 @@ class PadDelay(BasePadding):
25
26
 
26
27
  Consecutive delays will be merged in the output of this pass.
27
28
 
28
- .. code-block:: python
29
+ .. plot::
30
+ :include-source:
31
+ :nofigs:
29
32
 
30
33
  from qiskit import QuantumCircuit
31
34
  from qiskit.transpiler import InstructionDurations
@@ -54,7 +57,12 @@ class PadDelay(BasePadding):
54
57
  See :class:`BasePadding` pass for details.
55
58
  """
56
59
 
57
- def __init__(self, fill_very_end: bool = True, target: Target = None):
60
+ def __init__(
61
+ self,
62
+ fill_very_end: bool = True,
63
+ target: Target = None,
64
+ durations: InstructionDurations = None,
65
+ ):
58
66
  """Create new padding delay pass.
59
67
 
60
68
  Args:
@@ -63,7 +71,7 @@ class PadDelay(BasePadding):
63
71
  If it is supplied and does not support delay instruction on a qubit,
64
72
  padding passes do not pad any idle time of the qubit.
65
73
  """
66
- super().__init__(target=target)
74
+ super().__init__(target=target, durations=durations)
67
75
  self.fill_very_end = fill_very_end
68
76
 
69
77
  def _pad(
@@ -79,4 +87,4 @@ class PadDelay(BasePadding):
79
87
  return
80
88
 
81
89
  time_interval = t_end - t_start
82
- self._apply_scheduled_op(dag, t_start, Delay(time_interval, dag.unit), qubit)
90
+ self._apply_scheduled_op(dag, t_start, Delay(time_interval, dag._unit), qubit)
@@ -21,8 +21,7 @@ class ALAPScheduleAnalysis(BaseScheduler):
21
21
  """ALAP Scheduling pass, which schedules the **stop** time of instructions as late as possible.
22
22
 
23
23
  See the :ref:`transpiler-scheduling-description` section in the :mod:`qiskit.transpiler`
24
- module documentation for the detailed behavior of the control flow
25
- operation, i.e. ``c_if``.
24
+ module documentation for a more detailed explanation.
26
25
  """
27
26
 
28
27
  def run(self, dag):
@@ -40,8 +39,9 @@ class ALAPScheduleAnalysis(BaseScheduler):
40
39
  """
41
40
  if len(dag.qregs) != 1 or dag.qregs.get("q", None) is None:
42
41
  raise TranspilerError("ALAP schedule runs on physical circuits only")
42
+ if self.property_set["time_unit"] == "stretch":
43
+ raise TranspilerError("Scheduling cannot run on circuits with stretch durations.")
43
44
 
44
- conditional_latency = self.property_set.get("conditional_latency", 0)
45
45
  clbit_write_latency = self.property_set.get("clbit_write_latency", 0)
46
46
 
47
47
  node_start_time = {}
@@ -58,43 +58,9 @@ class ALAPScheduleAnalysis(BaseScheduler):
58
58
  # the physical meaning of t0 and t1 is flipped here.
59
59
  if isinstance(node.op, self.CONDITIONAL_SUPPORTED):
60
60
  t0q = max(idle_before[q] for q in node.qargs)
61
- if node.op.condition_bits:
62
- # conditional is bit tricky due to conditional_latency
63
- t0c = max(idle_before[c] for c in node.op.condition_bits)
64
- # Assume following case (t0c > t0q):
65
- #
66
- # |t0q
67
- # Q ░░░░░░░░░░░░░▒▒▒
68
- # C ░░░░░░░░▒▒▒▒▒▒▒▒
69
- # |t0c
70
- #
71
- # In this case, there is no actual clbit read before gate.
72
- #
73
- # |t0q' = t0c - conditional_latency
74
- # Q ░░░░░░░░▒▒▒░░▒▒▒
75
- # C ░░░░░░▒▒▒▒▒▒▒▒▒▒
76
- # |t1c' = t0c + conditional_latency
77
- #
78
- # rather than naively doing
79
- #
80
- # |t1q' = t0c + duration
81
- # Q ░░░░░▒▒▒░░░░░▒▒▒
82
- # C ░░▒▒░░░░▒▒▒▒▒▒▒▒
83
- # |t1c' = t0c + duration + conditional_latency
84
- #
85
- t0 = max(t0q, t0c - op_duration)
86
- t1 = t0 + op_duration
87
- for clbit in node.op.condition_bits:
88
- idle_before[clbit] = t1 + conditional_latency
89
- else:
90
- t0 = t0q
91
- t1 = t0 + op_duration
61
+ t0 = t0q
62
+ t1 = t0 + op_duration
92
63
  else:
93
- if node.op.condition_bits:
94
- raise TranspilerError(
95
- f"Conditional instruction {node.op.name} is not supported in ALAP scheduler."
96
- )
97
-
98
64
  if isinstance(node.op, Measure):
99
65
  # clbit time is always right (alap) justified
100
66
  t0 = max(idle_before[bit] for bit in node.qargs + node.cargs)
@@ -21,8 +21,7 @@ class ASAPScheduleAnalysis(BaseScheduler):
21
21
  """ASAP Scheduling pass, which schedules the start time of instructions as early as possible.
22
22
 
23
23
  See the :ref:`transpiler-scheduling-description` section in the :mod:`qiskit.transpiler`
24
- module documentation for the detailed behavior of the control flow
25
- operation, i.e. ``c_if``.
24
+ module documentation for a more detailed description.
26
25
  """
27
26
 
28
27
  def run(self, dag):
@@ -40,8 +39,9 @@ class ASAPScheduleAnalysis(BaseScheduler):
40
39
  """
41
40
  if len(dag.qregs) != 1 or dag.qregs.get("q", None) is None:
42
41
  raise TranspilerError("ASAP schedule runs on physical circuits only")
42
+ if self.property_set["time_unit"] == "stretch":
43
+ raise TranspilerError("Scheduling cannot run on circuits with stretch durations.")
43
44
 
44
- conditional_latency = self.property_set.get("conditional_latency", 0)
45
45
  clbit_write_latency = self.property_set.get("clbit_write_latency", 0)
46
46
 
47
47
  node_start_time = {}
@@ -54,40 +54,9 @@ class ASAPScheduleAnalysis(BaseScheduler):
54
54
  # t1: end time of instruction
55
55
  if isinstance(node.op, self.CONDITIONAL_SUPPORTED):
56
56
  t0q = max(idle_after[q] for q in node.qargs)
57
- if node.op.condition_bits:
58
- # conditional is bit tricky due to conditional_latency
59
- t0c = max(idle_after[bit] for bit in node.op.condition_bits)
60
- if t0q > t0c:
61
- # This is situation something like below
62
- #
63
- # |t0q
64
- # Q ▒▒▒▒▒▒▒▒▒░░
65
- # C ▒▒▒░░░░░░░░
66
- # |t0c
67
- #
68
- # In this case, you can insert readout access before tq0
69
- #
70
- # |t0q
71
- # Q ▒▒▒▒▒▒▒▒▒▒▒
72
- # C ▒▒▒░░░▒▒░░░
73
- # |t0q - conditional_latency
74
- #
75
- t0c = max(t0q - conditional_latency, t0c)
76
- t1c = t0c + conditional_latency
77
- for bit in node.op.condition_bits:
78
- # Lock clbit until state is read
79
- idle_after[bit] = t1c
80
- # It starts after register read access
81
- t0 = max(t0q, t1c)
82
- else:
83
- t0 = t0q
57
+ t0 = t0q
84
58
  t1 = t0 + op_duration
85
59
  else:
86
- if node.op.condition_bits:
87
- raise TranspilerError(
88
- f"Conditional instruction {node.op.name} is not supported in ASAP scheduler."
89
- )
90
-
91
60
  if isinstance(node.op, Measure):
92
61
  # measure instruction handling is bit tricky due to clbit_write_latency
93
62
  t0q = max(idle_after[q] for q in node.qargs)
@@ -56,29 +56,23 @@ class BaseScheduler(AnalysisPass):
56
56
  )
57
57
  self.property_set["node_start_time"] = {}
58
58
 
59
- @staticmethod
60
59
  def _get_node_duration(
60
+ self,
61
61
  node: DAGOpNode,
62
62
  dag: DAGCircuit,
63
63
  ) -> int:
64
- """A helper method to get duration from node or calibration."""
64
+ """A helper method to get duration from node"""
65
65
  indices = [dag.find_bit(qarg).index for qarg in node.qargs]
66
66
 
67
- if dag._has_calibration_for(node):
68
- # If node has calibration, this value should be the highest priority
69
- cal_key = tuple(indices), tuple(float(p) for p in node.op.params)
70
- with warnings.catch_warnings():
71
- warnings.simplefilter(action="ignore", category=DeprecationWarning)
72
- # `schedule.duration` emits pulse deprecation warnings which we don't want
73
- # to see here
74
- duration = dag._calibrations_prop[node.op.name][cal_key].duration
75
-
76
- # Note that node duration is updated (but this is analysis pass)
77
- op = node.op.to_mutable()
78
- op.duration = duration
79
- dag.substitute_node(node, op, propagate_condition=False)
67
+ if node.name == "delay":
68
+ # `TimeUnitConversion` already handled the unit conversions.
69
+ duration = node.op.duration
80
70
  else:
81
- duration = node.duration
71
+ unit = "s" if self.durations.dt is None else "dt"
72
+ try:
73
+ duration = self.durations.get(node.name, indices, unit=unit)
74
+ except TranspilerError:
75
+ duration = None
82
76
 
83
77
  if isinstance(duration, ParameterExpression):
84
78
  raise TranspilerError(