def _decompose_(self, qubits) -> Iterator[cirq.OP_TREE]:
        """Decomposes self into Z rotations and FSimGate.

        Note that Z rotations returned by this method have unusual global phase
        in that one of their eigenvalues is 1. This ensures the decomposition
        agrees with the matrix specified in class docstring. In particular, it
        makes the top left element of the matrix equal to 1.
        """

        def to_exponent(angle_rads: cirq.TParamVal) -> cirq.TParamVal:
            """Divides angle_rads by symbolic or numerical pi."""
            pi = sympy.pi if protocols.is_parameterized(angle_rads) else np.pi
            return angle_rads / pi

        q0, q1 = qubits
        before = self.rz_angles_before
        after = self.rz_angles_after
        yield cirq.Z(q0) ** to_exponent(before[0])
        yield cirq.Z(q1) ** to_exponent(before[1])
        yield FSimGate(self.theta, self.phi).on(q0, q1)
        yield cirq.Z(q0) ** to_exponent(after[0])
        yield cirq.Z(q1) ** to_exponent(after[1])
Decomposes self into Z rotations and FSimGate.

        Note that Z rotations returned by this method have unusual global phase
        in that one of their eigenvalues is 1. This ensures the decomposition
        agrees with the matrix specified in class docstring. In particular, it
        makes the top left element of the matrix equal to 1.
        
cirq-core/cirq/ops/fsim_gate.py