docs: 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