qiskit 1.1.2__cp38-abi3-win32.whl → 1.2.0rc1__cp38-abi3-win32.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- qiskit/VERSION.txt +1 -1
- qiskit/__init__.py +27 -24
- qiskit/_accelerate.pyd +0 -0
- qiskit/_numpy_compat.py +1 -1
- qiskit/assembler/assemble_circuits.py +107 -64
- qiskit/assembler/assemble_schedules.py +5 -12
- qiskit/assembler/disassemble.py +10 -1
- qiskit/circuit/__init__.py +1 -1
- qiskit/circuit/_classical_resource_map.py +5 -5
- qiskit/circuit/_utils.py +0 -13
- qiskit/circuit/add_control.py +1 -1
- qiskit/circuit/annotated_operation.py +23 -1
- qiskit/circuit/classical/expr/expr.py +4 -4
- qiskit/circuit/classical/expr/visitors.py +1 -1
- qiskit/circuit/classical/types/__init__.py +1 -1
- qiskit/circuit/classical/types/types.py +2 -2
- qiskit/circuit/classicalfunction/boolean_expression.py +1 -1
- qiskit/circuit/classicalfunction/classical_function_visitor.py +5 -5
- qiskit/circuit/classicalfunction/utils.py +1 -1
- qiskit/circuit/classicalregister.py +1 -1
- qiskit/circuit/commutation_checker.py +83 -35
- qiskit/circuit/controlflow/_builder_utils.py +1 -1
- qiskit/circuit/controlflow/builder.py +10 -6
- qiskit/circuit/controlflow/if_else.py +2 -2
- qiskit/circuit/controlflow/switch_case.py +1 -1
- qiskit/circuit/delay.py +1 -1
- qiskit/circuit/duration.py +2 -2
- qiskit/circuit/equivalence.py +5 -7
- qiskit/circuit/gate.py +11 -8
- qiskit/circuit/instruction.py +31 -13
- qiskit/circuit/instructionset.py +2 -5
- qiskit/circuit/library/__init__.py +2 -1
- qiskit/circuit/library/arithmetic/linear_amplitude_function.py +1 -1
- qiskit/circuit/library/arithmetic/linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_chebyshev.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_linear_pauli_rotations.py +1 -1
- qiskit/circuit/library/arithmetic/piecewise_polynomial_pauli_rotations.py +3 -3
- qiskit/circuit/library/arithmetic/polynomial_pauli_rotations.py +1 -1
- qiskit/circuit/library/basis_change/__init__.py +1 -1
- qiskit/circuit/library/basis_change/qft.py +40 -6
- qiskit/circuit/library/blueprintcircuit.py +3 -5
- qiskit/circuit/library/data_preparation/__init__.py +9 -2
- qiskit/circuit/library/data_preparation/initializer.py +8 -0
- qiskit/circuit/library/data_preparation/state_preparation.py +98 -178
- qiskit/circuit/library/generalized_gates/isometry.py +8 -8
- qiskit/circuit/library/generalized_gates/linear_function.py +3 -2
- qiskit/circuit/library/generalized_gates/mcg_up_to_diagonal.py +4 -4
- qiskit/circuit/library/generalized_gates/permutation.py +8 -9
- qiskit/circuit/library/generalized_gates/uc.py +3 -3
- qiskit/circuit/library/generalized_gates/uc_pauli_rot.py +2 -2
- qiskit/circuit/library/generalized_gates/unitary.py +13 -11
- qiskit/circuit/library/graph_state.py +1 -1
- qiskit/circuit/library/hamiltonian_gate.py +1 -2
- qiskit/circuit/library/hidden_linear_function.py +1 -1
- qiskit/circuit/library/n_local/evolved_operator_ansatz.py +3 -2
- qiskit/circuit/library/n_local/n_local.py +4 -5
- qiskit/circuit/library/n_local/pauli_two_design.py +1 -1
- qiskit/circuit/library/n_local/qaoa_ansatz.py +6 -8
- qiskit/circuit/library/n_local/two_local.py +1 -1
- qiskit/circuit/library/overlap.py +11 -5
- qiskit/circuit/library/pauli_evolution.py +7 -3
- qiskit/circuit/library/standard_gates/dcx.py +3 -0
- qiskit/circuit/library/standard_gates/ecr.py +3 -0
- qiskit/circuit/library/standard_gates/global_phase.py +3 -0
- qiskit/circuit/library/standard_gates/h.py +13 -5
- qiskit/circuit/library/standard_gates/i.py +3 -0
- qiskit/circuit/library/standard_gates/iswap.py +3 -0
- qiskit/circuit/library/standard_gates/multi_control_rotation_gates.py +19 -10
- qiskit/circuit/library/standard_gates/p.py +14 -9
- qiskit/circuit/library/standard_gates/r.py +3 -0
- qiskit/circuit/library/standard_gates/rx.py +21 -6
- qiskit/circuit/library/standard_gates/rxx.py +40 -1
- qiskit/circuit/library/standard_gates/ry.py +21 -6
- qiskit/circuit/library/standard_gates/ryy.py +40 -1
- qiskit/circuit/library/standard_gates/rz.py +22 -6
- qiskit/circuit/library/standard_gates/rzx.py +40 -1
- qiskit/circuit/library/standard_gates/rzz.py +41 -2
- qiskit/circuit/library/standard_gates/s.py +77 -0
- qiskit/circuit/library/standard_gates/swap.py +12 -5
- qiskit/circuit/library/standard_gates/sx.py +14 -5
- qiskit/circuit/library/standard_gates/t.py +5 -0
- qiskit/circuit/library/standard_gates/u.py +22 -7
- qiskit/circuit/library/standard_gates/u1.py +8 -3
- qiskit/circuit/library/standard_gates/u2.py +3 -0
- qiskit/circuit/library/standard_gates/u3.py +22 -7
- qiskit/circuit/library/standard_gates/x.py +156 -92
- qiskit/circuit/library/standard_gates/xx_minus_yy.py +40 -1
- qiskit/circuit/library/standard_gates/xx_plus_yy.py +52 -11
- qiskit/circuit/library/standard_gates/y.py +6 -1
- qiskit/circuit/library/standard_gates/z.py +8 -1
- qiskit/circuit/operation.py +1 -1
- qiskit/circuit/parameter.py +9 -10
- qiskit/circuit/parameterexpression.py +16 -13
- qiskit/circuit/parametertable.py +1 -190
- qiskit/circuit/parametervector.py +1 -1
- qiskit/circuit/quantumcircuit.py +392 -384
- qiskit/circuit/quantumcircuitdata.py +3 -5
- qiskit/circuit/quantumregister.py +1 -1
- qiskit/circuit/random/__init__.py +1 -1
- qiskit/circuit/random/utils.py +175 -26
- qiskit/circuit/register.py +5 -7
- qiskit/circuit/singleton.py +3 -3
- qiskit/circuit/tools/pi_check.py +4 -4
- qiskit/compiler/assembler.py +95 -24
- qiskit/compiler/scheduler.py +2 -2
- qiskit/compiler/transpiler.py +41 -127
- qiskit/converters/circuit_to_dag.py +4 -6
- qiskit/converters/circuit_to_gate.py +4 -8
- qiskit/converters/circuit_to_instruction.py +5 -17
- qiskit/converters/dag_to_circuit.py +2 -6
- qiskit/dagcircuit/collect_blocks.py +2 -2
- qiskit/dagcircuit/dagcircuit.py +190 -187
- qiskit/dagcircuit/dagdependency.py +4 -4
- qiskit/dagcircuit/dagdependency_v2.py +4 -4
- qiskit/dagcircuit/dagdepnode.py +1 -1
- qiskit/dagcircuit/dagnode.py +66 -157
- qiskit/passmanager/flow_controllers.py +1 -1
- qiskit/passmanager/passmanager.py +3 -3
- qiskit/primitives/__init__.py +1 -5
- qiskit/primitives/backend_estimator.py +25 -15
- qiskit/primitives/backend_estimator_v2.py +31 -7
- qiskit/primitives/backend_sampler.py +21 -12
- qiskit/primitives/backend_sampler_v2.py +12 -3
- qiskit/primitives/base/base_estimator.py +31 -4
- qiskit/primitives/base/base_primitive.py +2 -2
- qiskit/primitives/base/base_result.py +2 -2
- qiskit/primitives/base/base_sampler.py +26 -2
- qiskit/primitives/base/estimator_result.py +2 -2
- qiskit/primitives/base/sampler_result.py +2 -2
- qiskit/primitives/containers/__init__.py +0 -1
- qiskit/primitives/containers/bindings_array.py +2 -2
- qiskit/primitives/containers/bit_array.py +108 -10
- qiskit/primitives/containers/shape.py +3 -3
- qiskit/primitives/estimator.py +9 -2
- qiskit/primitives/primitive_job.py +1 -1
- qiskit/primitives/sampler.py +10 -3
- qiskit/primitives/statevector_estimator.py +5 -3
- qiskit/primitives/statevector_sampler.py +11 -5
- qiskit/primitives/utils.py +16 -0
- qiskit/providers/backend.py +15 -6
- qiskit/providers/backend_compat.py +7 -4
- qiskit/providers/basic_provider/basic_provider_tools.py +1 -1
- qiskit/providers/basic_provider/basic_simulator.py +32 -24
- qiskit/providers/fake_provider/fake_backend.py +10 -3
- qiskit/providers/fake_provider/fake_openpulse_2q.py +154 -146
- qiskit/providers/fake_provider/fake_openpulse_3q.py +226 -217
- qiskit/providers/fake_provider/fake_qasm_backend.py +5 -1
- qiskit/providers/fake_provider/generic_backend_v2.py +80 -50
- qiskit/providers/models/__init__.py +11 -0
- qiskit/providers/models/backendconfiguration.py +50 -4
- qiskit/providers/models/backendproperties.py +13 -2
- qiskit/providers/models/pulsedefaults.py +10 -11
- qiskit/providers/options.py +13 -13
- qiskit/providers/providerutils.py +3 -1
- qiskit/pulse/configuration.py +8 -12
- qiskit/pulse/instruction_schedule_map.py +3 -5
- qiskit/pulse/instructions/acquire.py +7 -8
- qiskit/pulse/instructions/instruction.py +2 -3
- qiskit/pulse/library/samplers/decorators.py +5 -9
- qiskit/pulse/library/symbolic_pulses.py +4 -7
- qiskit/pulse/library/waveform.py +2 -5
- qiskit/pulse/macros.py +11 -6
- qiskit/pulse/parser.py +8 -10
- qiskit/pulse/schedule.py +9 -17
- qiskit/pulse/transforms/alignments.py +1 -3
- qiskit/pulse/utils.py +1 -2
- qiskit/qasm/libs/stdgates.inc +35 -28
- qiskit/qasm2/__init__.py +7 -7
- qiskit/qasm2/export.py +5 -9
- qiskit/qasm2/parse.py +1 -1
- qiskit/qasm3/ast.py +9 -25
- qiskit/qasm3/exporter.py +578 -481
- qiskit/qasm3/printer.py +7 -16
- qiskit/qobj/common.py +10 -0
- qiskit/qobj/converters/lo_config.py +9 -0
- qiskit/qobj/converters/pulse_instruction.py +13 -6
- qiskit/qobj/pulse_qobj.py +69 -15
- qiskit/qobj/qasm_qobj.py +72 -20
- qiskit/qobj/utils.py +9 -0
- qiskit/qpy/binary_io/circuits.py +8 -5
- qiskit/qpy/binary_io/schedules.py +1 -1
- qiskit/qpy/binary_io/value.py +3 -3
- qiskit/qpy/interface.py +3 -2
- qiskit/qpy/type_keys.py +2 -2
- qiskit/quantum_info/operators/channel/quantum_channel.py +3 -6
- qiskit/quantum_info/operators/channel/superop.py +2 -2
- qiskit/quantum_info/operators/channel/transformations.py +1 -1
- qiskit/quantum_info/operators/dihedral/dihedral.py +3 -4
- qiskit/quantum_info/operators/dihedral/dihedral_circuits.py +1 -3
- qiskit/quantum_info/operators/dihedral/random.py +6 -3
- qiskit/quantum_info/operators/measures.py +2 -2
- qiskit/quantum_info/operators/op_shape.py +12 -20
- qiskit/quantum_info/operators/operator.py +14 -21
- qiskit/quantum_info/operators/predicates.py +1 -0
- qiskit/quantum_info/operators/symplectic/base_pauli.py +7 -11
- qiskit/quantum_info/operators/symplectic/clifford.py +1 -1
- qiskit/quantum_info/operators/symplectic/pauli.py +3 -3
- qiskit/quantum_info/operators/symplectic/pauli_list.py +9 -10
- qiskit/quantum_info/operators/symplectic/random.py +1 -1
- qiskit/quantum_info/operators/symplectic/sparse_pauli_op.py +14 -16
- qiskit/quantum_info/quaternion.py +1 -1
- qiskit/quantum_info/states/densitymatrix.py +5 -8
- qiskit/quantum_info/states/stabilizerstate.py +128 -37
- qiskit/quantum_info/states/statevector.py +4 -8
- qiskit/result/counts.py +2 -2
- qiskit/result/mitigation/correlated_readout_mitigator.py +2 -2
- qiskit/result/mitigation/local_readout_mitigator.py +2 -2
- qiskit/result/mitigation/utils.py +1 -3
- qiskit/result/models.py +17 -16
- qiskit/result/result.py +15 -20
- qiskit/scheduler/lowering.py +2 -2
- qiskit/synthesis/__init__.py +2 -1
- qiskit/synthesis/clifford/__init__.py +1 -1
- qiskit/synthesis/clifford/clifford_decompose_ag.py +2 -2
- qiskit/synthesis/clifford/clifford_decompose_bm.py +10 -240
- qiskit/synthesis/clifford/clifford_decompose_greedy.py +9 -303
- qiskit/synthesis/clifford/clifford_decompose_layers.py +25 -23
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_full.py +1 -1
- qiskit/synthesis/cnotdihedral/cnotdihedral_decompose_general.py +1 -1
- qiskit/synthesis/discrete_basis/generate_basis_approximations.py +1 -1
- qiskit/synthesis/discrete_basis/solovay_kitaev.py +2 -2
- qiskit/synthesis/evolution/evolution_synthesis.py +4 -2
- qiskit/synthesis/evolution/lie_trotter.py +46 -19
- qiskit/synthesis/evolution/product_formula.py +111 -55
- qiskit/synthesis/evolution/qdrift.py +40 -10
- qiskit/synthesis/evolution/suzuki_trotter.py +43 -33
- qiskit/synthesis/linear/__init__.py +1 -0
- qiskit/synthesis/linear/cnot_synth.py +22 -96
- qiskit/synthesis/linear/linear_depth_lnn.py +8 -8
- qiskit/synthesis/linear/linear_matrix_utils.py +13 -161
- qiskit/synthesis/linear_phase/cnot_phase_synth.py +1 -1
- qiskit/synthesis/linear_phase/cx_cz_depth_lnn.py +3 -3
- qiskit/synthesis/linear_phase/cz_depth_lnn.py +1 -1
- qiskit/synthesis/one_qubit/one_qubit_decompose.py +29 -29
- qiskit/synthesis/permutation/permutation_full.py +5 -29
- qiskit/synthesis/permutation/permutation_lnn.py +2 -24
- qiskit/synthesis/permutation/permutation_utils.py +2 -59
- qiskit/synthesis/qft/__init__.py +1 -0
- qiskit/synthesis/qft/qft_decompose_full.py +79 -0
- qiskit/synthesis/qft/qft_decompose_lnn.py +17 -9
- qiskit/synthesis/stabilizer/stabilizer_circuit.py +6 -6
- qiskit/synthesis/stabilizer/stabilizer_decompose.py +2 -2
- qiskit/synthesis/two_qubit/local_invariance.py +8 -38
- qiskit/synthesis/two_qubit/two_qubit_decompose.py +48 -129
- qiskit/synthesis/unitary/aqc/cnot_structures.py +1 -1
- qiskit/synthesis/unitary/qsd.py +5 -3
- qiskit/transpiler/__init__.py +1 -0
- qiskit/transpiler/basepasses.py +1 -1
- qiskit/transpiler/coupling.py +3 -3
- qiskit/transpiler/instruction_durations.py +1 -2
- qiskit/transpiler/layout.py +3 -3
- qiskit/transpiler/passes/__init__.py +2 -0
- qiskit/transpiler/passes/basis/basis_translator.py +82 -63
- qiskit/transpiler/passes/basis/translate_parameterized.py +3 -5
- qiskit/transpiler/passes/basis/unroll_3q_or_more.py +1 -1
- qiskit/transpiler/passes/basis/unroll_custom_definitions.py +10 -10
- qiskit/transpiler/passes/calibration/rx_builder.py +3 -3
- qiskit/transpiler/passes/calibration/rzx_builder.py +3 -3
- qiskit/transpiler/passes/layout/apply_layout.py +13 -3
- qiskit/transpiler/passes/layout/sabre_layout.py +10 -8
- qiskit/transpiler/passes/layout/sabre_pre_layout.py +4 -1
- qiskit/transpiler/passes/layout/set_layout.py +2 -2
- qiskit/transpiler/passes/layout/vf2_layout.py +1 -1
- qiskit/transpiler/passes/layout/vf2_utils.py +3 -3
- qiskit/transpiler/passes/optimization/__init__.py +1 -0
- qiskit/transpiler/passes/optimization/collect_multiqubit_blocks.py +2 -2
- qiskit/transpiler/passes/optimization/commutation_analysis.py +7 -10
- qiskit/transpiler/passes/optimization/commutative_cancellation.py +35 -19
- qiskit/transpiler/passes/optimization/consolidate_blocks.py +11 -8
- qiskit/transpiler/passes/optimization/inverse_cancellation.py +6 -6
- qiskit/transpiler/passes/optimization/optimize_1q_decomposition.py +64 -41
- qiskit/transpiler/passes/optimization/optimize_1q_gates.py +1 -1
- qiskit/transpiler/passes/optimization/split_2q_unitaries.py +83 -0
- qiskit/transpiler/passes/optimization/template_matching/backward_match.py +1 -1
- qiskit/transpiler/passes/optimization/template_matching/forward_match.py +2 -2
- qiskit/transpiler/passes/optimization/template_matching/template_substitution.py +1 -1
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/commuting_2q_gate_router.py +3 -2
- qiskit/transpiler/passes/routing/commuting_2q_gate_routing/swap_strategy.py +1 -1
- qiskit/transpiler/passes/routing/layout_transformation.py +2 -1
- qiskit/transpiler/passes/routing/sabre_swap.py +35 -26
- qiskit/transpiler/passes/routing/star_prerouting.py +80 -105
- qiskit/transpiler/passes/routing/stochastic_swap.py +1 -3
- qiskit/transpiler/passes/scheduling/alap.py +1 -2
- qiskit/transpiler/passes/scheduling/alignments/__init__.py +2 -2
- qiskit/transpiler/passes/scheduling/alignments/check_durations.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/pulse_gate_validation.py +1 -1
- qiskit/transpiler/passes/scheduling/alignments/reschedule.py +1 -1
- qiskit/transpiler/passes/scheduling/asap.py +1 -2
- qiskit/transpiler/passes/scheduling/base_scheduler.py +5 -5
- qiskit/transpiler/passes/scheduling/dynamical_decoupling.py +3 -3
- qiskit/transpiler/passes/scheduling/padding/base_padding.py +1 -1
- qiskit/transpiler/passes/scheduling/padding/dynamical_decoupling.py +11 -11
- qiskit/transpiler/passes/scheduling/scheduling/base_scheduler.py +7 -6
- qiskit/transpiler/passes/scheduling/time_unit_conversion.py +4 -3
- qiskit/transpiler/passes/synthesis/high_level_synthesis.py +211 -36
- qiskit/transpiler/passes/synthesis/plugin.py +2 -2
- qiskit/transpiler/passes/synthesis/unitary_synthesis.py +80 -40
- qiskit/transpiler/passes/utils/__init__.py +0 -1
- qiskit/transpiler/passes/utils/check_gate_direction.py +4 -4
- qiskit/transpiler/passes/utils/check_map.py +3 -6
- qiskit/transpiler/passes/utils/convert_conditions_to_if_ops.py +3 -4
- qiskit/transpiler/passes/utils/error.py +2 -2
- qiskit/transpiler/passes/utils/fixed_point.py +3 -3
- qiskit/transpiler/passes/utils/gate_direction.py +1 -1
- qiskit/transpiler/passes/utils/gates_basis.py +1 -2
- qiskit/transpiler/passmanager.py +7 -6
- qiskit/transpiler/preset_passmanagers/__init__.py +4 -228
- qiskit/transpiler/preset_passmanagers/builtin_plugins.py +117 -18
- qiskit/transpiler/preset_passmanagers/common.py +3 -6
- qiskit/transpiler/preset_passmanagers/generate_preset_pass_manager.py +518 -0
- qiskit/transpiler/preset_passmanagers/level0.py +1 -1
- qiskit/transpiler/target.py +27 -8
- qiskit/user_config.py +29 -6
- qiskit/utils/classtools.py +3 -3
- qiskit/utils/deprecation.py +3 -2
- qiskit/utils/lazy_tester.py +2 -2
- qiskit/utils/optionals.py +8 -8
- qiskit/visualization/bloch.py +19 -67
- qiskit/visualization/circuit/_utils.py +34 -10
- qiskit/visualization/circuit/circuit_visualization.py +23 -16
- qiskit/visualization/circuit/latex.py +29 -27
- qiskit/visualization/circuit/matplotlib.py +4 -2
- qiskit/visualization/circuit/qcstyle.py +2 -2
- qiskit/visualization/circuit/text.py +9 -15
- qiskit/visualization/dag_visualization.py +5 -12
- qiskit/visualization/pulse_v2/core.py +1 -1
- qiskit/visualization/pulse_v2/events.py +1 -1
- qiskit/visualization/pulse_v2/generators/frame.py +3 -4
- qiskit/visualization/pulse_v2/generators/waveform.py +5 -9
- qiskit/visualization/pulse_v2/layouts.py +1 -5
- qiskit/visualization/pulse_v2/plotters/matplotlib.py +1 -2
- qiskit/visualization/state_visualization.py +5 -6
- qiskit/visualization/timeline/plotters/matplotlib.py +1 -2
- qiskit/visualization/transition_visualization.py +7 -2
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/METADATA +26 -26
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/RECORD +340 -338
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/WHEEL +1 -1
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/entry_points.txt +3 -0
- qiskit/transpiler/passes/utils/block_to_matrix.py +0 -47
- {qiskit-1.1.2.dist-info → qiskit-1.2.0rc1.dist-info}/LICENSE.txt +0 -0
- {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 .
|
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
|
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
|
-
|
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
|
-
|
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
|
-
|
86
|
-
|
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,
|
99
|
-
"Instruction
|
100
|
-
"and no rule found to expand."
|
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(
|
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(
|
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(
|
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.
|
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.
|
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
|
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
|
-
|
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 -
|
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
|
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
|
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
|
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
|
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.
|
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))
|
@@ -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
|
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
|
-
|
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.
|
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.
|
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
|
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
|
-
|
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
|
-
#
|
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
|
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
|
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
|
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
|
-
|
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
|
157
|
+
raise RuntimeError("internal error")
|
150
158
|
|
151
159
|
if current_node.name in ["p", "u1", "rz", "rx"]:
|
152
|
-
current_angle = float(current_node.
|
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.
|
163
|
-
total_phase += current_node.
|
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(
|
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.
|
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
|
109
|
-
block_cargs |= set(getattr(nd
|
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.
|
114
|
+
if nd.name == basis_gate_name:
|
114
115
|
basis_count += 1
|
115
|
-
if self._check_not_in_basis(dag, nd.
|
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 =
|
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(
|
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."
|
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
|
116
|
-
if
|
117
|
-
chunk.append(
|
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
|
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
|