def METHOD_NAME(self, qubits: Sequence['cirq.Qid']) -> 'cirq.OP_TREE':
    part_lens = list(itertools.chain(*(self.part_lens[side] for side in ('left', 'right'))))
    n_qubits = 0
    parts = []
    for part_len in part_lens:
        parts.append(list(qubits[n_qubits : n_qubits + part_len]))
        n_qubits += part_len
    n_parts = len(part_lens)
    n_left_parts = len(self.part_lens['left'])
    n_right_parts = n_parts - n_left_parts
    mins = itertools.chain(range(n_left_parts - 1, 0, -1), range(n_right_parts))
    maxs = itertools.chain(range(n_left_parts, n_parts), range(n_parts - 1, n_right_parts, -1))
    SHIFT = functools.partial(CircularShiftGate, swap_gate=self.swap_gate)
    for i, j in zip(mins, maxs):
        for k in range(i, j, 2):
            left_part, right_part = parts[k : k + 2]
            parts_qubits = left_part + right_part
            yield acquaint(*parts_qubits)
            yield SHIFT(len(parts_qubits), len(left_part))(*parts_qubits)
            parts[k] = parts_qubits[: len(right_part)]
            parts[k + 1] = parts_qubits[len(right_part) :]