qiskit 1.1.2__cp38-abi3-macosx_10_9_universal2.whl → 1.2.0rc1__cp38-abi3-macosx_10_9_universal2.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 (341) hide show
  1. qiskit/VERSION.txt +1 -1
  2. qiskit/__init__.py +27 -24
  3. qiskit/_accelerate.abi3.so +0 -0
  4. qiskit/_numpy_compat.py +1 -1
  5. qiskit/assembler/assemble_circuits.py +107 -64
  6. qiskit/assembler/assemble_schedules.py +5 -12
  7. qiskit/assembler/disassemble.py +10 -1
  8. qiskit/circuit/__init__.py +1 -1
  9. qiskit/circuit/_classical_resource_map.py +5 -5
  10. qiskit/circuit/_utils.py +0 -13
  11. qiskit/circuit/add_control.py +1 -1
  12. qiskit/circuit/annotated_operation.py +23 -1
  13. qiskit/circuit/classical/expr/expr.py +4 -4
  14. qiskit/circuit/classical/expr/visitors.py +1 -1
  15. qiskit/circuit/classical/types/__init__.py +1 -1
  16. qiskit/circuit/classical/types/types.py +2 -2
  17. qiskit/circuit/classicalfunction/boolean_expression.py +1 -1
  18. qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
  19. qiskit/circuit/classicalfunction/utils.py +1 -1
  20. qiskit/circuit/classicalregister.py +1 -1
  21. qiskit/circuit/commutation_checker.py +83 -35
  22. qiskit/circuit/controlflow/_builder_utils.py +1 -1
  23. qiskit/circuit/controlflow/builder.py +10 -6
  24. qiskit/circuit/controlflow/if_else.py +2 -2
  25. qiskit/circuit/controlflow/switch_case.py +1 -1
  26. qiskit/circuit/delay.py +1 -1
  27. qiskit/circuit/duration.py +2 -2
  28. qiskit/circuit/equivalence.py +5 -7
  29. qiskit/circuit/gate.py +11 -8
  30. qiskit/circuit/instruction.py +31 -13
  31. qiskit/circuit/instructionset.py +2 -5
  32. qiskit/circuit/library/__init__.py +2 -1
  33. qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
  34. qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
  35. qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
  36. qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
  37. qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
  38. qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
  39. qiskit/circuit/library/basis_change/__init__.py +1 -1
  40. qiskit/circuit/library/basis_change/qft.py +40 -6
  41. qiskit/circuit/library/blueprintcircuit.py +3 -5
  42. qiskit/circuit/library/data_preparation/__init__.py +9 -2
  43. qiskit/circuit/library/data_preparation/initializer.py +8 -0
  44. qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
  45. qiskit/circuit/library/generalized_gates/isometry.py +8 -8
  46. qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
  47. qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
  48. qiskit/circuit/library/generalized_gates/permutation.py +8 -9
  49. qiskit/circuit/library/generalized_gates/uc.py +3 -3
  50. qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
  51. qiskit/circuit/library/generalized_gates/unitary.py +13 -11
  52. qiskit/circuit/library/graph_state.py +1 -1
  53. qiskit/circuit/library/hamiltonian_gate.py +1 -2
  54. qiskit/circuit/library/hidden_linear_function.py +1 -1
  55. qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
  56. qiskit/circuit/library/n_local/n_local.py +4 -5
  57. qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
  58. qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
  59. qiskit/circuit/library/n_local/two_local.py +1 -1
  60. qiskit/circuit/library/overlap.py +11 -5
  61. qiskit/circuit/library/pauli_evolution.py +7 -3
  62. qiskit/circuit/library/standard_gates/dcx.py +3 -0
  63. qiskit/circuit/library/standard_gates/ecr.py +3 -0
  64. qiskit/circuit/library/standard_gates/global_phase.py +3 -0
  65. qiskit/circuit/library/standard_gates/h.py +13 -5
  66. qiskit/circuit/library/standard_gates/i.py +3 -0
  67. qiskit/circuit/library/standard_gates/iswap.py +3 -0
  68. qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
  69. qiskit/circuit/library/standard_gates/p.py +14 -9
  70. qiskit/circuit/library/standard_gates/r.py +3 -0
  71. qiskit/circuit/library/standard_gates/rx.py +21 -6
  72. qiskit/circuit/library/standard_gates/rxx.py +40 -1
  73. qiskit/circuit/library/standard_gates/ry.py +21 -6
  74. qiskit/circuit/library/standard_gates/ryy.py +40 -1
  75. qiskit/circuit/library/standard_gates/rz.py +22 -6
  76. qiskit/circuit/library/standard_gates/rzx.py +40 -1
  77. qiskit/circuit/library/standard_gates/rzz.py +41 -2
  78. qiskit/circuit/library/standard_gates/s.py +77 -0
  79. qiskit/circuit/library/standard_gates/swap.py +12 -5
  80. qiskit/circuit/library/standard_gates/sx.py +14 -5
  81. qiskit/circuit/library/standard_gates/t.py +5 -0
  82. qiskit/circuit/library/standard_gates/u.py +22 -7
  83. qiskit/circuit/library/standard_gates/u1.py +8 -3
  84. qiskit/circuit/library/standard_gates/u2.py +3 -0
  85. qiskit/circuit/library/standard_gates/u3.py +22 -7
  86. qiskit/circuit/library/standard_gates/x.py +156 -92
  87. qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
  88. qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
  89. qiskit/circuit/library/standard_gates/y.py +6 -1
  90. qiskit/circuit/library/standard_gates/z.py +8 -1
  91. qiskit/circuit/operation.py +1 -1
  92. qiskit/circuit/parameter.py +9 -10
  93. qiskit/circuit/parameterexpression.py +16 -13
  94. qiskit/circuit/parametertable.py +1 -190
  95. qiskit/circuit/parametervector.py +1 -1
  96. qiskit/circuit/quantumcircuit.py +392 -384
  97. qiskit/circuit/quantumcircuitdata.py +3 -5
  98. qiskit/circuit/quantumregister.py +1 -1
  99. qiskit/circuit/random/__init__.py +1 -1
  100. qiskit/circuit/random/utils.py +175 -26
  101. qiskit/circuit/register.py +5 -7
  102. qiskit/circuit/singleton.py +3 -3
  103. qiskit/circuit/tools/pi_check.py +4 -4
  104. qiskit/compiler/assembler.py +95 -24
  105. qiskit/compiler/scheduler.py +2 -2
  106. qiskit/compiler/transpiler.py +41 -127
  107. qiskit/converters/circuit_to_dag.py +4 -6
  108. qiskit/converters/circuit_to_gate.py +4 -8
  109. qiskit/converters/circuit_to_instruction.py +5 -17
  110. qiskit/converters/dag_to_circuit.py +2 -6
  111. qiskit/dagcircuit/collect_blocks.py +2 -2
  112. qiskit/dagcircuit/dagcircuit.py +190 -187
  113. qiskit/dagcircuit/dagdependency.py +4 -4
  114. qiskit/dagcircuit/dagdependency_v2.py +4 -4
  115. qiskit/dagcircuit/dagdepnode.py +1 -1
  116. qiskit/dagcircuit/dagnode.py +66 -157
  117. qiskit/passmanager/flow_controllers.py +1 -1
  118. qiskit/passmanager/passmanager.py +3 -3
  119. qiskit/primitives/__init__.py +1 -5
  120. qiskit/primitives/backend_estimator.py +25 -15
  121. qiskit/primitives/backend_estimator_v2.py +31 -7
  122. qiskit/primitives/backend_sampler.py +21 -12
  123. qiskit/primitives/backend_sampler_v2.py +12 -3
  124. qiskit/primitives/base/base_estimator.py +31 -4
  125. qiskit/primitives/base/base_primitive.py +2 -2
  126. qiskit/primitives/base/base_result.py +2 -2
  127. qiskit/primitives/base/base_sampler.py +26 -2
  128. qiskit/primitives/base/estimator_result.py +2 -2
  129. qiskit/primitives/base/sampler_result.py +2 -2
  130. qiskit/primitives/containers/__init__.py +0 -1
  131. qiskit/primitives/containers/bindings_array.py +2 -2
  132. qiskit/primitives/containers/bit_array.py +108 -10
  133. qiskit/primitives/containers/shape.py +3 -3
  134. qiskit/primitives/estimator.py +9 -2
  135. qiskit/primitives/primitive_job.py +1 -1
  136. qiskit/primitives/sampler.py +10 -3
  137. qiskit/primitives/statevector_estimator.py +5 -3
  138. qiskit/primitives/statevector_sampler.py +11 -5
  139. qiskit/primitives/utils.py +16 -0
  140. qiskit/providers/backend.py +15 -6
  141. qiskit/providers/backend_compat.py +7 -4
  142. qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
  143. qiskit/providers/basic_provider/basic_simulator.py +32 -24
  144. qiskit/providers/fake_provider/fake_backend.py +10 -3
  145. qiskit/providers/fake_provider/fake_openpulse_2q.py +154 -146
  146. qiskit/providers/fake_provider/fake_openpulse_3q.py +226 -217
  147. qiskit/providers/fake_provider/fake_qasm_backend.py +5 -1
  148. qiskit/providers/fake_provider/generic_backend_v2.py +80 -50
  149. qiskit/providers/models/__init__.py +11 -0
  150. qiskit/providers/models/backendconfiguration.py +50 -4
  151. qiskit/providers/models/backendproperties.py +13 -2
  152. qiskit/providers/models/pulsedefaults.py +10 -11
  153. qiskit/providers/options.py +13 -13
  154. qiskit/providers/providerutils.py +3 -1
  155. qiskit/pulse/configuration.py +8 -12
  156. qiskit/pulse/instruction_schedule_map.py +3 -5
  157. qiskit/pulse/instructions/acquire.py +7 -8
  158. qiskit/pulse/instructions/instruction.py +2 -3
  159. qiskit/pulse/library/samplers/decorators.py +5 -9
  160. qiskit/pulse/library/symbolic_pulses.py +4 -7
  161. qiskit/pulse/library/waveform.py +2 -5
  162. qiskit/pulse/macros.py +11 -6
  163. qiskit/pulse/parser.py +8 -10
  164. qiskit/pulse/schedule.py +9 -17
  165. qiskit/pulse/transforms/alignments.py +1 -3
  166. qiskit/pulse/utils.py +1 -2
  167. qiskit/qasm/libs/stdgates.inc +35 -28
  168. qiskit/qasm2/__init__.py +7 -7
  169. qiskit/qasm2/export.py +5 -9
  170. qiskit/qasm2/parse.py +1 -1
  171. qiskit/qasm3/ast.py +9 -25
  172. qiskit/qasm3/exporter.py +578 -481
  173. qiskit/qasm3/printer.py +7 -16
  174. qiskit/qobj/common.py +10 -0
  175. qiskit/qobj/converters/lo_config.py +9 -0
  176. qiskit/qobj/converters/pulse_instruction.py +13 -6
  177. qiskit/qobj/pulse_qobj.py +69 -15
  178. qiskit/qobj/qasm_qobj.py +72 -20
  179. qiskit/qobj/utils.py +9 -0
  180. qiskit/qpy/binary_io/circuits.py +8 -5
  181. qiskit/qpy/binary_io/schedules.py +1 -1
  182. qiskit/qpy/binary_io/value.py +3 -3
  183. qiskit/qpy/interface.py +3 -2
  184. qiskit/qpy/type_keys.py +2 -2
  185. qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
  186. qiskit/quantum_info/operators/channel/superop.py +2 -2
  187. qiskit/quantum_info/operators/channel/transformations.py +1 -1
  188. qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
  189. qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
  190. qiskit/quantum_info/operators/dihedral/random.py +6 -3
  191. qiskit/quantum_info/operators/measures.py +2 -2
  192. qiskit/quantum_info/operators/op_shape.py +12 -20
  193. qiskit/quantum_info/operators/operator.py +14 -21
  194. qiskit/quantum_info/operators/predicates.py +1 -0
  195. qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
  196. qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
  197. qiskit/quantum_info/operators/symplectic/pauli.py +3 -3
  198. qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
  199. qiskit/quantum_info/operators/symplectic/random.py +1 -1
  200. qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +14 -16
  201. qiskit/quantum_info/quaternion.py +1 -1
  202. qiskit/quantum_info/states/densitymatrix.py +5 -8
  203. qiskit/quantum_info/states/stabilizerstate.py +128 -37
  204. qiskit/quantum_info/states/statevector.py +4 -8
  205. qiskit/result/counts.py +2 -2
  206. qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
  207. qiskit/result/mitigation/local_readout_mitigator.py +2 -2
  208. qiskit/result/mitigation/utils.py +1 -3
  209. qiskit/result/models.py +17 -16
  210. qiskit/result/result.py +15 -20
  211. qiskit/scheduler/lowering.py +2 -2
  212. qiskit/synthesis/__init__.py +2 -1
  213. qiskit/synthesis/clifford/__init__.py +1 -1
  214. qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
  215. qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
  216. qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
  217. qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
  218. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
  219. qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
  220. qiskit/synthesis/discrete_basis/generate_basis_approximations.py +1 -1
  221. qiskit/synthesis/discrete_basis/solovay_kitaev.py +2 -2
  222. qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
  223. qiskit/synthesis/evolution/lie_trotter.py +46 -19
  224. qiskit/synthesis/evolution/product_formula.py +111 -55
  225. qiskit/synthesis/evolution/qdrift.py +40 -10
  226. qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
  227. qiskit/synthesis/linear/__init__.py +1 -0
  228. qiskit/synthesis/linear/cnot_synth.py +22 -96
  229. qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
  230. qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
  231. qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
  232. qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
  233. qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
  234. qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
  235. qiskit/synthesis/permutation/permutation_full.py +5 -29
  236. qiskit/synthesis/permutation/permutation_lnn.py +2 -24
  237. qiskit/synthesis/permutation/permutation_utils.py +2 -59
  238. qiskit/synthesis/qft/__init__.py +1 -0
  239. qiskit/synthesis/qft/qft_decompose_full.py +79 -0
  240. qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
  241. qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
  242. qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
  243. qiskit/synthesis/two_qubit/local_invariance.py +8 -38
  244. qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
  245. qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
  246. qiskit/synthesis/unitary/qsd.py +5 -3
  247. qiskit/transpiler/__init__.py +1 -0
  248. qiskit/transpiler/basepasses.py +1 -1
  249. qiskit/transpiler/coupling.py +3 -3
  250. qiskit/transpiler/instruction_durations.py +1 -2
  251. qiskit/transpiler/layout.py +3 -3
  252. qiskit/transpiler/passes/__init__.py +2 -0
  253. qiskit/transpiler/passes/basis/basis_translator.py +82 -63
  254. qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
  255. qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
  256. qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
  257. qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
  258. qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
  259. qiskit/transpiler/passes/layout/apply_layout.py +13 -3
  260. qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
  261. qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
  262. qiskit/transpiler/passes/layout/set_layout.py +2 -2
  263. qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
  264. qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
  265. qiskit/transpiler/passes/optimization/__init__.py +1 -0
  266. qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
  267. qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
  268. qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
  269. qiskit/transpiler/passes/optimization/consolidate_blocks.py +11 -8
  270. qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
  271. qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
  272. qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
  273. qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
  274. qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
  275. qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
  276. qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
  277. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
  278. qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
  279. qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
  280. qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
  281. qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
  282. qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
  283. qiskit/transpiler/passes/scheduling/alap.py +1 -2
  284. qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
  285. qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
  286. qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +1 -1
  287. qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
  288. qiskit/transpiler/passes/scheduling/asap.py +1 -2
  289. qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
  290. qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
  291. qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
  292. qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +11 -11
  293. qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
  294. qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
  295. qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
  296. qiskit/transpiler/passes/synthesis/plugin.py +2 -2
  297. qiskit/transpiler/passes/synthesis/unitary_synthesis.py +80 -40
  298. qiskit/transpiler/passes/utils/__init__.py +0 -1
  299. qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
  300. qiskit/transpiler/passes/utils/check_map.py +3 -6
  301. qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
  302. qiskit/transpiler/passes/utils/error.py +2 -2
  303. qiskit/transpiler/passes/utils/fixed_point.py +3 -3
  304. qiskit/transpiler/passes/utils/gate_direction.py +1 -1
  305. qiskit/transpiler/passes/utils/gates_basis.py +1 -2
  306. qiskit/transpiler/passmanager.py +7 -6
  307. qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
  308. qiskit/transpiler/preset_passmanagers/builtin_plugins.py +117 -18
  309. qiskit/transpiler/preset_passmanagers/common.py +3 -6
  310. qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
  311. qiskit/transpiler/preset_passmanagers/level0.py +1 -1
  312. qiskit/transpiler/target.py +27 -8
  313. qiskit/user_config.py +29 -6
  314. qiskit/utils/classtools.py +3 -3
  315. qiskit/utils/deprecation.py +3 -2
  316. qiskit/utils/lazy_tester.py +2 -2
  317. qiskit/utils/optionals.py +8 -8
  318. qiskit/visualization/bloch.py +19 -67
  319. qiskit/visualization/circuit/_utils.py +34 -10
  320. qiskit/visualization/circuit/circuit_visualization.py +23 -16
  321. qiskit/visualization/circuit/latex.py +29 -27
  322. qiskit/visualization/circuit/matplotlib.py +4 -2
  323. qiskit/visualization/circuit/qcstyle.py +2 -2
  324. qiskit/visualization/circuit/text.py +9 -15
  325. qiskit/visualization/dag_visualization.py +5 -12
  326. qiskit/visualization/pulse_v2/core.py +1 -1
  327. qiskit/visualization/pulse_v2/events.py +1 -1
  328. qiskit/visualization/pulse_v2/generators/frame.py +3 -4
  329. qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
  330. qiskit/visualization/pulse_v2/layouts.py +1 -5
  331. qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
  332. qiskit/visualization/state_visualization.py +5 -6
  333. qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
  334. qiskit/visualization/transition_visualization.py +7 -2
  335. {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/METADATA +26 -26
  336. {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/RECORD +340 -338
  337. {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/WHEEL +1 -1
  338. {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/entry_points.txt +3 -0
  339. qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
  340. {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/LICENSE.txt +0 -0
  341. {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/top_level.txt +0 -0
@@ -15,15 +15,13 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  from qiskit.circuit import Instruction, ParameterExpression, Qubit, Clbit
18
+ from qiskit.circuit.equivalence_library import EquivalenceLibrary
18
19
  from qiskit.converters import circuit_to_dag
19
20
  from qiskit.dagcircuit import DAGCircuit, DAGOpNode
20
- from qiskit.circuit.equivalence_library import EquivalenceLibrary
21
21
  from qiskit.exceptions import QiskitError
22
- from qiskit.transpiler import Target
23
-
24
22
  from qiskit.transpiler.basepasses import TransformationPass
25
-
26
- from .basis_translator import BasisTranslator
23
+ from qiskit.transpiler.passes.basis.basis_translator import BasisTranslator
24
+ from qiskit.transpiler.target import Target
27
25
 
28
26
 
29
27
  class TranslateParameterizedGates(TransformationPass):
@@ -78,7 +78,7 @@ class Unroll3qOrMore(TransformationPass):
78
78
  continue
79
79
  raise QiskitError(
80
80
  "Cannot unroll all 3q or more gates. "
81
- "No rule to expand instruction %s." % node.op.name
81
+ f"No rule to expand instruction {node.op.name}."
82
82
  )
83
83
  decomposition = circuit_to_dag(node.op.definition, copy_operations=False)
84
84
  decomposition = self.run(decomposition) # recursively unroll
@@ -60,9 +60,9 @@ class UnrollCustomDefinitions(TransformationPass):
60
60
  if self._basis_gates is None and self._target is None:
61
61
  return dag
62
62
 
63
+ device_insts = {"measure", "reset", "barrier", "snapshot", "delay", "store"}
63
64
  if self._target is None:
64
- basic_insts = {"measure", "reset", "barrier", "snapshot", "delay", "store"}
65
- device_insts = basic_insts | set(self._basis_gates)
65
+ device_insts |= set(self._basis_gates)
66
66
 
67
67
  for node in dag.op_nodes():
68
68
  if isinstance(node.op, ControlFlowOp):
@@ -77,14 +77,14 @@ class UnrollCustomDefinitions(TransformationPass):
77
77
 
78
78
  controlled_gate_open_ctrl = isinstance(node.op, ControlledGate) and node.op._open_ctrl
79
79
  if not controlled_gate_open_ctrl:
80
- inst_supported = (
81
- self._target.instruction_supported(
80
+ if self._target is not None:
81
+ inst_supported = self._target.instruction_supported(
82
82
  operation_name=node.op.name,
83
83
  qargs=tuple(dag.find_bit(x).index for x in node.qargs),
84
84
  )
85
- if self._target is not None
86
- else node.name in device_insts
87
- )
85
+ else:
86
+ inst_supported = node.name in device_insts
87
+
88
88
  if inst_supported or self._equiv_lib.has_entry(node.op):
89
89
  continue
90
90
  try:
@@ -95,9 +95,9 @@ class UnrollCustomDefinitions(TransformationPass):
95
95
  if unrolled is None:
96
96
  # opaque node
97
97
  raise QiskitError(
98
- "Cannot unroll the circuit to the given basis, %s. "
99
- "Instruction %s not found in equivalence library "
100
- "and no rule found to expand." % (str(self._basis_gates), node.op.name)
98
+ f"Cannot unroll the circuit to the given basis, {str(self._basis_gates)}. "
99
+ f"Instruction {node.op.name} not found in equivalence library "
100
+ "and no rule found to expand."
101
101
  )
102
102
 
103
103
  decomposition = circuit_to_dag(unrolled, copy_operations=False)
@@ -17,13 +17,13 @@ from functools import lru_cache
17
17
  import numpy as np
18
18
 
19
19
  from qiskit.circuit import Instruction
20
+ from qiskit.circuit.library.standard_gates import RXGate
21
+ from qiskit.exceptions import QiskitError
20
22
  from qiskit.pulse import Schedule, ScheduleBlock, builder, ScalableSymbolicPulse
21
23
  from qiskit.pulse.channels import Channel
22
24
  from qiskit.pulse.library.symbolic_pulses import Drag
23
25
  from qiskit.transpiler.passes.calibration.base_builder import CalibrationBuilder
24
- from qiskit.transpiler import Target
25
- from qiskit.circuit.library.standard_gates import RXGate
26
- from qiskit.exceptions import QiskitError
26
+ from qiskit.transpiler.target import Target
27
27
 
28
28
 
29
29
  class RXCalibrationBuilder(CalibrationBuilder):
@@ -204,7 +204,7 @@ class RZXCalibrationBuilder(CalibrationBuilder):
204
204
  if cal_type in [CRCalType.ECR_CX_FORWARD, CRCalType.ECR_FORWARD]:
205
205
  xgate = self._inst_map.get("x", qubits[0])
206
206
  with builder.build(
207
- default_alignment="sequential", name="rzx(%.3f)" % theta
207
+ default_alignment="sequential", name=f"rzx({theta:.3f})"
208
208
  ) as rzx_theta_native:
209
209
  for cr_tone, comp_tone in zip(cr_tones, comp_tones):
210
210
  with builder.align_left():
@@ -230,7 +230,7 @@ class RZXCalibrationBuilder(CalibrationBuilder):
230
230
  builder.call(szt, name="szt")
231
231
 
232
232
  with builder.build(
233
- default_alignment="sequential", name="rzx(%.3f)" % theta
233
+ default_alignment="sequential", name=f"rzx({theta:.3f})"
234
234
  ) as rzx_theta_flip:
235
235
  builder.call(hadamard, name="hadamard")
236
236
  for cr_tone, comp_tone in zip(cr_tones, comp_tones):
@@ -297,7 +297,7 @@ class RZXCalibrationBuilderNoEcho(RZXCalibrationBuilder):
297
297
 
298
298
  # RZXCalibrationNoEcho only good for forward CR direction
299
299
  if cal_type in [CRCalType.ECR_CX_FORWARD, CRCalType.ECR_FORWARD]:
300
- with builder.build(default_alignment="left", name="rzx(%.3f)" % theta) as rzx_theta:
300
+ with builder.build(default_alignment="left", name=f"rzx({theta:.3f})") as rzx_theta:
301
301
  stretched_dur = self.rescale_cr_inst(cr_tones[0], 2 * theta)
302
302
  self.rescale_cr_inst(comp_tones[0], 2 * theta)
303
303
  # Placeholder to make pulse gate work
@@ -13,7 +13,7 @@
13
13
  """Transform a circuit with virtual qubits into a circuit with physical qubits."""
14
14
 
15
15
  from qiskit.circuit import QuantumRegister
16
- from qiskit.dagcircuit import DAGCircuit
16
+ from qiskit.dagcircuit import DAGCircuit, DAGOpNode
17
17
  from qiskit.transpiler.basepasses import TransformationPass
18
18
  from qiskit.transpiler.exceptions import TranspilerError
19
19
  from qiskit.transpiler.layout import Layout
@@ -79,7 +79,12 @@ class ApplyLayout(TransformationPass):
79
79
  virtual_physical_map = layout.get_virtual_bits()
80
80
  for node in dag.topological_op_nodes():
81
81
  qargs = [q[virtual_physical_map[qarg]] for qarg in node.qargs]
82
- new_dag.apply_operation_back(node.op, qargs, node.cargs, check=False)
82
+ new_dag._apply_op_node_back(
83
+ DAGOpNode.from_instruction(
84
+ node._to_circuit_instruction().replace(qubits=qargs)
85
+ ),
86
+ check=False,
87
+ )
83
88
  else:
84
89
  # First build a new layout object going from:
85
90
  # old virtual -> old physical -> new virtual -> new physical
@@ -99,7 +104,12 @@ class ApplyLayout(TransformationPass):
99
104
  # Apply new layout to the circuit
100
105
  for node in dag.topological_op_nodes():
101
106
  qargs = [q[new_virtual_to_physical[qarg]] for qarg in node.qargs]
102
- new_dag.apply_operation_back(node.op, qargs, node.cargs, check=False)
107
+ new_dag._apply_op_node_back(
108
+ DAGOpNode.from_instruction(
109
+ node._to_circuit_instruction().replace(qubits=qargs)
110
+ ),
111
+ check=False,
112
+ )
103
113
  self.property_set["layout"] = full_layout
104
114
  if (final_layout := self.property_set["final_layout"]) is not None:
105
115
  final_layout_mapping = {
@@ -35,11 +35,7 @@ from qiskit.transpiler.layout import Layout
35
35
  from qiskit.transpiler.basepasses import TransformationPass
36
36
  from qiskit.transpiler.exceptions import TranspilerError
37
37
  from qiskit._accelerate.nlayout import NLayout
38
- from qiskit._accelerate.sabre import (
39
- sabre_layout_and_routing,
40
- Heuristic,
41
- NeighborTable,
42
- )
38
+ from qiskit._accelerate.sabre import sabre_layout_and_routing, Heuristic, NeighborTable, SetScaling
43
39
  from qiskit.transpiler.passes.routing.sabre_swap import _build_sabre_dag, _apply_sabre_result
44
40
  from qiskit.transpiler.target import Target
45
41
  from qiskit.transpiler.coupling import CouplingMap
@@ -144,7 +140,7 @@ class SabreLayout(TransformationPass):
144
140
  with the ``routing_pass`` argument and an error will be raised
145
141
  if both are used.
146
142
  layout_trials (int): The number of random seed trials to run
147
- layout with. When > 1 the trial that resuls in the output with
143
+ layout with. When > 1 the trial that results in the output with
148
144
  the fewest swap gates will be selected. If this is not specified
149
145
  (and ``routing_pass`` is not set) then the number of local
150
146
  physical CPUs will be used as the default value. This option is
@@ -393,12 +389,18 @@ class SabreLayout(TransformationPass):
393
389
  coupling_map.size(),
394
390
  original_qubit_indices,
395
391
  )
392
+ heuristic = (
393
+ Heuristic(attempt_limit=10 * coupling_map.size())
394
+ .with_basic(1.0, SetScaling.Size)
395
+ .with_lookahead(0.5, 20, SetScaling.Size)
396
+ .with_decay(0.001, 5)
397
+ )
396
398
  sabre_start = time.perf_counter()
397
399
  (initial_layout, final_permutation, sabre_result) = sabre_layout_and_routing(
398
400
  sabre_dag,
399
401
  neighbor_table,
400
402
  dist_matrix,
401
- Heuristic.Decay,
403
+ heuristic,
402
404
  self.max_iterations,
403
405
  self.swap_trials,
404
406
  self.layout_trials,
@@ -420,7 +422,7 @@ class SabreLayout(TransformationPass):
420
422
  )
421
423
 
422
424
  def _ancilla_allocation_no_pass_manager(self, dag):
423
- """Run the ancilla-allocation and -enlargment passes on the DAG chained onto our
425
+ """Run the ancilla-allocation and -enlargement passes on the DAG chained onto our
424
426
  ``property_set``, skipping the DAG-to-circuit conversion cost of using a ``PassManager``."""
425
427
  ancilla_pass = FullAncillaAllocation(self.coupling_map)
426
428
  ancilla_pass.property_set = self.property_set
@@ -14,8 +14,11 @@
14
14
 
15
15
  import itertools
16
16
 
17
- from qiskit.transpiler import CouplingMap, Target, AnalysisPass, TranspilerError
17
+ from qiskit.transpiler.basepasses import AnalysisPass
18
+ from qiskit.transpiler.coupling import CouplingMap
19
+ from qiskit.transpiler.exceptions import TranspilerError
18
20
  from qiskit.transpiler.passes.layout.vf2_layout import VF2Layout
21
+ from qiskit.transpiler.target import Target
19
22
  from qiskit._accelerate.error_map import ErrorMap
20
23
 
21
24
 
@@ -11,9 +11,9 @@
11
11
  # that they have been altered from the originals.
12
12
 
13
13
  """Set the ``layout`` property to the given layout."""
14
- from qiskit.transpiler import Layout
15
- from qiskit.transpiler.exceptions import InvalidLayoutError
16
14
  from qiskit.transpiler.basepasses import AnalysisPass
15
+ from qiskit.transpiler.exceptions import InvalidLayoutError
16
+ from qiskit.transpiler.layout import Layout
17
17
 
18
18
 
19
19
  class SetLayout(AnalysisPass):
@@ -195,7 +195,7 @@ class VF2Layout(AnalysisPass):
195
195
  if len(cm_graph) == len(im_graph):
196
196
  chosen_layout = mapping_to_layout(layout_mapping)
197
197
  break
198
- # If there is no error map avilable we can just skip the scoring stage as there
198
+ # If there is no error map available we can just skip the scoring stage as there
199
199
  # is nothing to score with, so any match is the best we can find.
200
200
  if self.avg_error_map is None:
201
201
  chosen_layout = mapping_to_layout(layout_mapping)
@@ -19,7 +19,7 @@ import random
19
19
  import numpy as np
20
20
  from rustworkx import PyDiGraph, PyGraph, connected_components
21
21
 
22
- from qiskit.circuit import ControlFlowOp, ForLoopOp
22
+ from qiskit.circuit import ForLoopOp
23
23
  from qiskit.converters import circuit_to_dag
24
24
  from qiskit._accelerate import vf2_layout
25
25
  from qiskit._accelerate.nlayout import NLayout
@@ -37,7 +37,7 @@ def build_interaction_graph(dag, strict_direction=True):
37
37
 
38
38
  def _visit(dag, weight, wire_map):
39
39
  for node in dag.op_nodes(include_directives=False):
40
- if isinstance(node.op, ControlFlowOp):
40
+ if node.is_control_flow():
41
41
  if isinstance(node.op, ForLoopOp):
42
42
  inner_weight = len(node.op.params[0]) * weight
43
43
  else:
@@ -57,7 +57,7 @@ def build_interaction_graph(dag, strict_direction=True):
57
57
  im_graph_node_map[qargs[0]] = im_graph.add_node(weights)
58
58
  reverse_im_graph_node_map[im_graph_node_map[qargs[0]]] = qargs[0]
59
59
  else:
60
- im_graph[im_graph_node_map[qargs[0]]][node.op.name] += weight
60
+ im_graph[im_graph_node_map[qargs[0]]][node.name] += weight
61
61
  if len_args == 2:
62
62
  if qargs[0] not in im_graph_node_map:
63
63
  im_graph_node_map[qargs[0]] = im_graph.add_node(defaultdict(int))
@@ -38,3 +38,4 @@ from .collect_cliffords import CollectCliffords
38
38
  from .elide_permutations import ElidePermutations
39
39
  from .normalize_rx_angle import NormalizeRXAngle
40
40
  from .optimize_annotated import OptimizeAnnotated
41
+ from .split_2q_unitaries import Split2QUnitaries
@@ -218,8 +218,8 @@ class CollectMultiQBlocks(AnalysisPass):
218
218
  prev = bit
219
219
  self.gate_groups[self.find_set(prev)].append(nd)
220
220
  # need to turn all groups that still exist into their own blocks
221
- for index in self.parent:
222
- if self.parent[index] == index and len(self.gate_groups[index]) != 0:
221
+ for index, item in self.parent.items():
222
+ if item == index and len(self.gate_groups[index]) != 0:
223
223
  block_list.append(self.gate_groups[index][:])
224
224
 
225
225
  self.property_set["block_list"] = block_list
@@ -27,9 +27,13 @@ class CommutationAnalysis(AnalysisPass):
27
27
  are grouped into a set of gates that commute.
28
28
  """
29
29
 
30
- def __init__(self):
30
+ def __init__(self, *, _commutation_checker=None):
31
31
  super().__init__()
32
- self.comm_checker = scc
32
+ # allow setting a private commutation checker, this allows better performance if we
33
+ # do not care about commutations of all gates, but just a subset
34
+ if _commutation_checker is None:
35
+ _commutation_checker = scc
36
+ self.comm_checker = _commutation_checker
33
37
 
34
38
  def run(self, dag):
35
39
  """Run the CommutationAnalysis pass on `dag`.
@@ -72,14 +76,7 @@ class CommutationAnalysis(AnalysisPass):
72
76
  does_commute = (
73
77
  isinstance(current_gate, DAGOpNode)
74
78
  and isinstance(prev_gate, DAGOpNode)
75
- and self.comm_checker.commute(
76
- current_gate.op,
77
- current_gate.qargs,
78
- current_gate.cargs,
79
- prev_gate.op,
80
- prev_gate.qargs,
81
- prev_gate.cargs,
82
- )
79
+ and self.comm_checker.commute_nodes(current_gate, prev_gate)
83
80
  )
84
81
  if not does_commute:
85
82
  break
@@ -16,16 +16,17 @@ from collections import defaultdict
16
16
  import numpy as np
17
17
 
18
18
  from qiskit.circuit.quantumregister import QuantumRegister
19
- from qiskit.transpiler.exceptions import TranspilerError
19
+ from qiskit.circuit.parameterexpression import ParameterExpression
20
20
  from qiskit.transpiler.basepasses import TransformationPass
21
21
  from qiskit.transpiler.passmanager import PassManager
22
22
  from qiskit.transpiler.passes.optimization.commutation_analysis import CommutationAnalysis
23
23
  from qiskit.dagcircuit import DAGCircuit, DAGInNode, DAGOutNode
24
+ from qiskit.circuit.commutation_library import CommutationChecker, StandardGateCommutations
24
25
  from qiskit.circuit.library.standard_gates.u1 import U1Gate
25
26
  from qiskit.circuit.library.standard_gates.rx import RXGate
26
27
  from qiskit.circuit.library.standard_gates.p import PhaseGate
27
28
  from qiskit.circuit.library.standard_gates.rz import RZGate
28
- from qiskit.circuit import ControlFlowOp
29
+ from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES
29
30
 
30
31
 
31
32
  _CUTOFF_PRECISION = 1e-5
@@ -62,7 +63,18 @@ class CommutativeCancellation(TransformationPass):
62
63
  self.basis = set(target.operation_names)
63
64
 
64
65
  self._var_z_map = {"rz": RZGate, "p": PhaseGate, "u1": U1Gate}
65
- self.requires.append(CommutationAnalysis())
66
+
67
+ self._z_rotations = {"p", "z", "u1", "rz", "t", "s"}
68
+ self._x_rotations = {"x", "rx"}
69
+ self._gates = {"cx", "cy", "cz", "h", "y"} # Now the gates supported are hard-coded
70
+
71
+ # build a commutation checker restricted to the gates we cancel -- the others we
72
+ # do not have to investigate, which allows to save time
73
+ commutation_checker = CommutationChecker(
74
+ StandardGateCommutations, gates=self._gates | self._z_rotations | self._x_rotations
75
+ )
76
+
77
+ self.requires.append(CommutationAnalysis(_commutation_checker=commutation_checker))
66
78
 
67
79
  def run(self, dag):
68
80
  """Run the CommutativeCancellation pass on `dag`.
@@ -72,23 +84,17 @@ class CommutativeCancellation(TransformationPass):
72
84
 
73
85
  Returns:
74
86
  DAGCircuit: the optimized DAG.
75
-
76
- Raises:
77
- TranspilerError: when the 1-qubit rotation gates are not found
78
87
  """
79
88
  var_z_gate = None
80
89
  z_var_gates = [gate for gate in dag.count_ops().keys() if gate in self._var_z_map]
81
90
  if z_var_gates:
82
- # priortize z gates in circuit
91
+ # prioritize z gates in circuit
83
92
  var_z_gate = self._var_z_map[next(iter(z_var_gates))]
84
93
  else:
85
94
  z_var_gates = [gate for gate in self.basis if gate in self._var_z_map]
86
95
  if z_var_gates:
87
96
  var_z_gate = self._var_z_map[next(iter(z_var_gates))]
88
97
 
89
- # Now the gates supported are hard-coded
90
- q_gate_list = ["cx", "cy", "cz", "h", "y"]
91
-
92
98
  # Gate sets to be cancelled
93
99
  cancellation_sets = defaultdict(lambda: [])
94
100
 
@@ -107,9 +113,11 @@ class CommutativeCancellation(TransformationPass):
107
113
  continue
108
114
  for node in com_set:
109
115
  num_qargs = len(node.qargs)
110
- if num_qargs == 1 and node.name in q_gate_list:
116
+ if any(isinstance(p, ParameterExpression) for p in node.params):
117
+ continue # no support for cancellation of parameterized gates
118
+ if num_qargs == 1 and node.name in self._gates:
111
119
  cancellation_sets[(node.name, wire, com_set_idx)].append(node)
112
- if num_qargs == 1 and node.name in ["p", "z", "u1", "rz", "t", "s"]:
120
+ if num_qargs == 1 and node.name in self._z_rotations:
113
121
  cancellation_sets[("z_rotation", wire, com_set_idx)].append(node)
114
122
  if num_qargs == 1 and node.name in ["rx", "x"]:
115
123
  cancellation_sets[("x_rotation", wire, com_set_idx)].append(node)
@@ -130,7 +138,7 @@ class CommutativeCancellation(TransformationPass):
130
138
  if cancel_set_key[0] == "z_rotation" and var_z_gate is None:
131
139
  continue
132
140
  set_len = len(cancellation_sets[cancel_set_key])
133
- if set_len > 1 and cancel_set_key[0] in q_gate_list:
141
+ if set_len > 1 and cancel_set_key[0] in self._gates:
134
142
  gates_to_cancel = cancellation_sets[cancel_set_key]
135
143
  for c_node in gates_to_cancel[: (set_len // 2) * 2]:
136
144
  dag.remove_op_node(c_node)
@@ -142,31 +150,37 @@ class CommutativeCancellation(TransformationPass):
142
150
  total_phase = 0.0
143
151
  for current_node in run:
144
152
  if (
145
- getattr(current_node.op, "condition", None) is not None
153
+ current_node.condition is not None
146
154
  or len(current_node.qargs) != 1
147
155
  or current_node.qargs[0] != run_qarg
148
156
  ):
149
- raise TranspilerError("internal error")
157
+ raise RuntimeError("internal error")
150
158
 
151
159
  if current_node.name in ["p", "u1", "rz", "rx"]:
152
- current_angle = float(current_node.op.params[0])
160
+ current_angle = float(current_node.params[0])
153
161
  elif current_node.name in ["z", "x"]:
154
162
  current_angle = np.pi
155
163
  elif current_node.name == "t":
156
164
  current_angle = np.pi / 4
157
165
  elif current_node.name == "s":
158
166
  current_angle = np.pi / 2
167
+ else:
168
+ raise RuntimeError(
169
+ f"Angle for operation {current_node.name } is not defined"
170
+ )
159
171
 
160
172
  # Compose gates
161
173
  total_angle = current_angle + total_angle
162
- if current_node.op.definition:
163
- total_phase += current_node.op.definition.global_phase
174
+ if current_node.definition:
175
+ total_phase += current_node.definition.global_phase
164
176
 
165
177
  # Replace the data of the first node in the run
166
178
  if cancel_set_key[0] == "z_rotation":
167
179
  new_op = var_z_gate(total_angle)
168
180
  elif cancel_set_key[0] == "x_rotation":
169
181
  new_op = RXGate(total_angle)
182
+ else:
183
+ raise RuntimeError("impossible case")
170
184
 
171
185
  new_op_phase = 0
172
186
  if np.mod(total_angle, (2 * np.pi)) > _CUTOFF_PRECISION:
@@ -198,7 +212,9 @@ class CommutativeCancellation(TransformationPass):
198
212
  """
199
213
 
200
214
  pass_manager = PassManager([CommutationAnalysis(), self])
201
- for node in dag.op_nodes(ControlFlowOp):
215
+ for node in dag.op_nodes():
216
+ if node.name not in CONTROL_FLOW_OP_NAMES:
217
+ continue
202
218
  mapped_blocks = []
203
219
  for block in node.op.blocks:
204
220
  new_circ = pass_manager.run(block)
@@ -24,10 +24,11 @@ from qiskit.synthesis.two_qubit import TwoQubitBasisDecomposer
24
24
  from qiskit.circuit.library.generalized_gates.unitary import UnitaryGate
25
25
  from qiskit.circuit.library.standard_gates import CXGate
26
26
  from qiskit.transpiler.basepasses import TransformationPass
27
- from qiskit.circuit.controlflow import ControlFlowOp
28
27
  from qiskit.transpiler.passmanager import PassManager
29
28
  from qiskit.transpiler.passes.synthesis import unitary_synthesis
30
- from qiskit.transpiler.passes.utils import _block_to_matrix
29
+ from qiskit.circuit.controlflow import CONTROL_FLOW_OP_NAMES
30
+ from qiskit._accelerate.convert_2q_block_matrix import blocks_to_matrix
31
+
31
32
  from .collect_1q_runs import Collect1qRuns
32
33
  from .collect_2q_blocks import Collect2qBlocks
33
34
 
@@ -105,14 +106,14 @@ class ConsolidateBlocks(TransformationPass):
105
106
  block_cargs = set()
106
107
  for nd in block:
107
108
  block_qargs |= set(nd.qargs)
108
- if isinstance(nd, DAGOpNode) and getattr(nd.op, "condition", None):
109
- block_cargs |= set(getattr(nd.op, "condition", None)[0])
109
+ if isinstance(nd, DAGOpNode) and getattr(nd, "condition", None):
110
+ block_cargs |= set(getattr(nd, "condition", None)[0])
110
111
  all_block_gates.add(nd)
111
112
  block_index_map = self._block_qargs_to_indices(dag, block_qargs)
112
113
  for nd in block:
113
- if nd.op.name == basis_gate_name:
114
+ if nd.name == basis_gate_name:
114
115
  basis_count += 1
115
- if self._check_not_in_basis(dag, nd.op.name, nd.qargs):
116
+ if self._check_not_in_basis(dag, nd.name, nd.qargs):
116
117
  outside_basis = True
117
118
  if len(block_qargs) > 2:
118
119
  q = QuantumRegister(len(block_qargs))
@@ -124,7 +125,7 @@ class ConsolidateBlocks(TransformationPass):
124
125
  qc.append(nd.op, [q[block_index_map[i]] for i in nd.qargs])
125
126
  unitary = UnitaryGate(Operator(qc), check_input=False)
126
127
  else:
127
- matrix = _block_to_matrix(block, block_index_map)
128
+ matrix = blocks_to_matrix(block, block_index_map)
128
129
  unitary = UnitaryGate(matrix, check_input=False)
129
130
 
130
131
  max_2q_depth = 20 # If depth > 20, there will be 1q gates to consolidate.
@@ -192,7 +193,9 @@ class ConsolidateBlocks(TransformationPass):
192
193
  pass_manager.append(Collect2qBlocks())
193
194
 
194
195
  pass_manager.append(self)
195
- for node in dag.op_nodes(ControlFlowOp):
196
+ for node in dag.op_nodes():
197
+ if node.name not in CONTROL_FLOW_OP_NAMES:
198
+ continue
196
199
  node.op = node.op.replace_blocks(pass_manager.run(block) for block in node.op.blocks)
197
200
  return dag
198
201
 
@@ -53,8 +53,8 @@ class InverseCancellation(TransformationPass):
53
53
  )
54
54
  else:
55
55
  raise TranspilerError(
56
- "InverseCancellation pass does not take input type {}. Input must be"
57
- " a Gate.".format(type(gates))
56
+ f"InverseCancellation pass does not take input type {type(gates)}. Input must be"
57
+ " a Gate."
58
58
  )
59
59
 
60
60
  self.self_inverse_gates = []
@@ -112,15 +112,15 @@ class InverseCancellation(TransformationPass):
112
112
  partitions = []
113
113
  chunk = []
114
114
  max_index = len(gate_cancel_run) - 1
115
- for i in range(len(gate_cancel_run)):
116
- if gate_cancel_run[i].op == gate:
117
- chunk.append(gate_cancel_run[i])
115
+ for i, cancel_gate in enumerate(gate_cancel_run):
116
+ if cancel_gate.op == gate:
117
+ chunk.append(cancel_gate)
118
118
  else:
119
119
  if chunk:
120
120
  partitions.append(chunk)
121
121
  chunk = []
122
122
  continue
123
- if i == max_index or gate_cancel_run[i].qargs != gate_cancel_run[i + 1].qargs:
123
+ if i == max_index or cancel_gate.qargs != gate_cancel_run[i + 1].qargs:
124
124
  partitions.append(chunk)
125
125
  chunk = []
126
126
  # Remove an even number of gates from each chunk