diff --git a/cirq-core/cirq/transformers/align.py b/cirq-core/cirq/transformers/align.py index 6f3f12f49d95..2ebbc5f76524 100644 --- a/cirq-core/cirq/transformers/align.py +++ b/cirq-core/cirq/transformers/align.py @@ -15,6 +15,7 @@ """Transformer passes which align operations to the left or right of the circuit.""" import dataclasses +from locale import currency from typing import Optional, TYPE_CHECKING from cirq import circuits, ops from cirq.transformers import transformer_api @@ -73,4 +74,11 @@ def align_right( """ if context is not None and context.deep is True: context = dataclasses.replace(context, deep=False) - return align_left(circuit[::-1], context=context)[::-1] + backwards = [] + for moment in circuit[::-1]: + backwards.append(circuits.Moment(reversed(moment.operations))) + aligned_backwards = align_left(circuits.Circuit(backwards), context=context) + forwards = [] + for moment in aligned_backwards[::-1]: + forwards.append(circuits.Moment(reversed(moment.operations))) + return circuits.Circuit(forwards) diff --git a/cirq-core/cirq/transformers/align_test.py b/cirq-core/cirq/transformers/align_test.py index 76525abeb856..e4aacb8fcde0 100644 --- a/cirq-core/cirq/transformers/align_test.py +++ b/cirq-core/cirq/transformers/align_test.py @@ -208,3 +208,16 @@ def test_classical_control(): ) cirq.testing.assert_same_circuits(cirq.align_left(circuit), circuit) cirq.testing.assert_same_circuits(cirq.align_right(circuit), circuit) + + +def test_measurement_and_classical_control_same_moment_preserve_order(): + q0, q1 = cirq.LineQubit.range(2) + circuit = cirq.Circuit() + op_measure = cirq.measure(q0, key='m') + op_controlled = cirq.X(q1).with_classical_controls('m') + circuit.append(op_measure) + circuit.append(op_controlled, cirq.InsertStrategy.INLINE) + circuit = cirq.align_right(circuit) + ops_in_order = list(circuit.all_operations()) + assert ops_in_order[0] == op_measure + assert ops_in_order[1] == op_controlled