def METHOD_NAME(self, node, options=None):
    '''
    Validates that the given Loop node can have a LoopTiling2DTrans
    applied.
    :param node: the loop to validate.
    :type node: :py:class:`psyclone.psyir.nodes.Loop`
    :param options: a dict with options for transformation.
    :type options: Optional[Dict[str, Any]]
    :param int options["tilesize"]: The size of the resulting tile, \
        currently square tiles are always used. If not specified, the \
        value 32 is used.
    :raises TransformationError: if an unsupported option has been \
        provided.
    :raises TransformationError: if the provided tilesize is not a \
        integer.
    '''
    if options is None:
        options = {}
    super(LoopTiling2DTrans, self).METHOD_NAME(node, options=options)
    # Validate options map
    # TODO #613: Hardcoding the valid_options does not allow for
    # subclassing this transformation and adding new options, this
    # should be fixed.
    valid_options = ['tilesize']
    for key, value in options.items():
        if key in valid_options:
            if key == "tilesize" and not isinstance(value, int):
                raise TransformationError(
                    f"The LoopTiling2DTrans tilesize option must be a "
                    f"positive integer but found a "
                    f"'{type(value).__name__}'.")
            if key == "tilesize" and value <= 0:
                raise TransformationError(
                    f"The LoopTiling2DTrans tilesize option must be a "
                    f"positive integer but found '{value}'.")
        else:
            raise TransformationError(
                f"The LoopTiling2DTrans does not support the "
                f"transformation option '{key}', the supported options "
                f"are: {valid_options}.")
    tilesize = options.get("tilesize", 32)
    # Even though the loops that ultimately will be swapped are the ones
    # resulting from the ChunkLoopTrans, these have the same validation
    # constrains as swapping the two original loops. This already
    # guarantees that we have a 2 loop construct with only one loop
    # statement inside the outer loop.
    LoopSwapTrans().METHOD_NAME(node)
    # Check that we can chunk both loops
    outer_loop = node
    inner_loop = node.loop_body.children[0]
    ChunkLoopTrans().METHOD_NAME(outer_loop, options={'chunksize': tilesize})
    ChunkLoopTrans().METHOD_NAME(inner_loop, options={'chunksize': tilesize})