For a reducible circuit, get a sequence of subblocks that when
        concatenated again yield the original circuit.  The block structure
        given has to be compatible with the circuits actual block structure,
        i.e. it can only be more coarse-grained.

        Args:
            block_structure (tuple): The block structure according to which the
                subblocks are generated (default = ``None``, corresponds to the
                circuit's own block structure)

        Returns:
            A tuple of subblocks that the circuit consists of.

        Raises:
            .IncompatibleBlockStructures

def get_blocks(self, block_structure=None):
        """For a reducible circuit, get a sequence of subblocks that when
        concatenated again yield the original circuit.  The block structure
        given has to be compatible with the circuits actual block structure,
        i.e. it can only be more coarse-grained.

        Args:
            block_structure (tuple): The block structure according to which the
                subblocks are generated (default = ``None``, corresponds to the
                circuit's own block structure)

        Returns:
            A tuple of subblocks that the circuit consists of.

        Raises:
            .IncompatibleBlockStructures
        """
        if block_structure is None:
            block_structure = self.block_structure
        try:
            return self._get_blocks(block_structure)
        except IncompatibleBlockStructures as e:
            raise e