diff --git a/cirq-core/cirq/transformers/dynamical_decoupling.py b/cirq-core/cirq/transformers/dynamical_decoupling.py index 85235bcedc2..6e59ce95b78 100644 --- a/cirq-core/cirq/transformers/dynamical_decoupling.py +++ b/cirq-core/cirq/transformers/dynamical_decoupling.py @@ -27,6 +27,7 @@ from cirq import ops, protocols from cirq.circuits import Circuit, FrozenCircuit, Moment from cirq.protocols import unitary_protocol +from cirq.protocols.control_key_protocol import control_keys from cirq.protocols.has_stabilizer_effect_protocol import has_stabilizer_effect from cirq.protocols.has_unitary_protocol import has_unitary from cirq.transformers import transformer_api @@ -121,7 +122,7 @@ def _is_single_qubit_gate_moment(moment: Moment) -> bool: def _is_clifford_op(op: ops.Operation) -> bool: - return has_unitary(op) and has_stabilizer_effect(op) + return has_unitary(op) and has_stabilizer_effect(op) and not control_keys(op) def _calc_busy_moment_range_of_each_qubit(circuit: FrozenCircuit) -> dict[ops.Qid, list[int]]: diff --git a/cirq-core/cirq/transformers/dynamical_decoupling_test.py b/cirq-core/cirq/transformers/dynamical_decoupling_test.py index 899d3375a82..7cd3e2aa17d 100644 --- a/cirq-core/cirq/transformers/dynamical_decoupling_test.py +++ b/cirq-core/cirq/transformers/dynamical_decoupling_test.py @@ -21,7 +21,7 @@ import pytest import cirq -from cirq import add_dynamical_decoupling, CNOT, CZ, CZPowGate, H, X, Y, Z +from cirq import add_dynamical_decoupling, CNOT, CZ, CZPowGate, H, I, measure, X, Y, Z from cirq.transformers.dynamical_decoupling import _CellType, _Grid @@ -55,6 +55,22 @@ def assert_dd( assert_sim_eq(input_circuit, transformed_circuit) +def test_classically_controlled_no_update_succeeds(): + """Test case diagrams. + Input: + a: ───M───I─── + ║ ║ + a: ═══@═══^═══ + """ + a = cirq.NamedQubit('a') + + input_circuit = cirq.Circuit( + cirq.Moment(measure(a, key="a")), cirq.Moment(I(a).with_classical_controls("a")) + ) + output_circuit = add_dynamical_decoupling(input_circuit) + cirq.testing.assert_same_circuits(input_circuit, output_circuit) + + def test_no_insertion() -> None: """Test case diagrams. Input: