def METHOD_NAME(tiles_fn):
    '''
    "$type $tile $grid_x $grid_y $skip_tile $clock_region $typed_sites"
    typed_sites: foreach t $site_types s $sites
    '''
    tiles = list()
    with open(tiles_fn) as f:
        for line in f:
            # CLBLM_L CLBLM_L_X10Y98 30 106 SLICEL SLICE_X13Y98 SLICEM SLICE_X12Y98
            record = line.split()
            tile_type, tile_name, grid_x, grid_y, skip_tile = record[0:5]
            grid_x, grid_y = int(grid_x), int(grid_y)
            skip_tile = int(skip_tile) != 0
            sites = {}
            # prohibits is the list of sites that the Vivado placer will not
            # place at.
            #
            # Speculation: These sites are prohibited not because the hardware
            # doesn't work, but because the interconnect around these sites is
            # extremely narrow due to the hardblocks to the left and right of
            # tiles.  As a result, these sites should be avoided because
            # congestion and delays when using these sites might be very very
            # high.
            prohibits = []
            clock_region = None
            if len(record) >= 6:
                clock_region = record[5]
                if clock_region == "NA":
                    clock_region = None
                for i in range(6, len(record), 3):
                    site_type, site_name, prohibited = record[i:i + 3]
                    sites[site_name] = site_type
                    if int(prohibited):
                        prohibits.append(site_name)
            if not skip_tile:
                tile = {
                    'type': tile_type,
                    'name': tile_name,
                    'grid_x': grid_x,
                    'grid_y': grid_y,
                    'sites': sites,
                    'prohibited_sites': sorted(prohibits),
                    'clock_region': clock_region,
                }
            else:
                # Replace tiles within the exclude_roi with NULL tiles to
                # ensure no gaps in the tilegrid.
                #
                # The name will reflect the original tile.
                tile = {
                    'type': 'NULL',
                    'name': tile_name,
                    'grid_x': grid_x,
                    'grid_y': grid_y,
                    'sites': {},
                    'prohibited_sites': [],
                    'clock_region': clock_region,
                }
            tiles.append(tile)
    return tiles