def __or__(self, other: AbstractControlValues) -> AbstractControlValues:
        """Returns a union of all control values predicates in `self` + `other`.

        Both `self` and `other` must represent control values for the same set of qubits and
        hence their `or` would also be a control value object acting on the same set of qubits.
        For example:

        >>> cv1 = cirq.ProductOfSums([(0, 1), 2])
        >>> cv2 = cirq.SumOfProducts([[0, 0], [1, 1]])
        >>> assert cirq.num_qubits(cv1 | cv2) == cirq.num_qubits(cv1) == cirq.num_qubits(cv2)

        Args:
          other: An instance of `AbstractControlValues`.

        Returns:
          An instance of `AbstractControlValues` that represents the union of control values
          represented by `self` and `other`.

        Raises:
            ValueError: If `cirq.num_qubits(self) != cirq.num_qubits(other)`.
        """
        if protocols.num_qubits(self) != protocols.num_qubits(other):
            raise ValueError(
                f"Control values {self} and {other} must act on equal number of qubits"
            )
        return SumOfProducts((*self.expand(), *other.expand()))
Returns a union of all control values predicates in `self` + `other`.

        Both `self` and `other` must represent control values for the same set of qubits and
        hence their `or` would also be a control value object acting on the same set of qubits.
        For example:

        >>> cv1 = cirq.ProductOfSums([(0, 1), 2])
        >>> cv2 = cirq.SumOfProducts([[0, 0], [1, 1]])
        >>> assert cirq.num_qubits(cv1 | cv2) == cirq.num_qubits(cv1) == cirq.num_qubits(cv2)

        Args:
          other: An instance of `AbstractControlValues`.

        Returns:
          An instance of `AbstractControlValues` that represents the union of control values
          represented by `self` and `other`.

        Raises:
            ValueError: If `cirq.num_qubits(self) != cirq.num_qubits(other)`.
        
cirq-core/cirq/ops/control_values.py