#!/usr/bin/env python3
import argparse
from utils.db import Database
from utils.grid import BlockType
from utils import util


def main():
    parser = argparse.ArgumentParser(
        description="Tool for checking which tiles have bits defined.")

    util.db_root_arg(parser)
    util.part_arg(parser)
    parser.add_argument('--show-only-missing', action='store_true')
    parser.add_argument('--verbose', action='store_true')

    args = parser.parse_args()

    db = Database(args.db_root, args.part)
    grid = db.grid()

    tile_types = {}
    for tile in grid.tiles():
        gridinfo = grid.gridinfo_at_tilename(tile)
        if gridinfo.tile_type not in tile_types:
            tile_types[gridinfo.tile_type] = []

        tile_types[gridinfo.tile_type].append((tile, gridinfo))

    total_tile_count = 0
    total_have_bits = 0

    for tile_type, tiles in sorted(tile_types.items()):
        try:
            tile_type_info = db.get_tile_type(tile_type)

            # Skip empty tiles, as no base address is requied.
            if len(tile_type_info.get_pips()) == 0 and len(
                    tile_type_info.get_sites()) == 0:
                continue
        except KeyError:
            pass

        # INT_INTERFACE tiles likely don't contain configuration?  Remove this
        # if this ends up false.
        if 'INT_INTERFACE' in tile_type:
            continue

        if 'BRKH' in tile_type:
            continue

        have_bits = 0
        for tile_name, gridinfo in tiles:
            total_tile_count += 1
            if BlockType.CLB_IO_CLK in gridinfo.bits:
                have_bits += 1
                total_have_bits += 1

        if args.show_only_missing and have_bits == len(tiles):
            continue

        print('{}: {}/{} ({:.2f} %)'.format(
            tile_type, have_bits, len(tiles),
            100. * float(have_bits) / len(tiles)))

        if args.verbose:
            tiles_with_missing_bits = []
            for tile_name, gridinfo in tiles:
                total_tile_count += 1
                if BlockType.CLB_IO_CLK not in gridinfo.bits:
                    tiles_with_missing_bits.append(tile_name)

            for tile_name in sorted(tiles_with_missing_bits):
                print('{} is missing CLB_IO_CLK'.format(tile_name))

    print('')
    print('Summary: {}/{} ({:.2f} %)'.format(
        total_have_bits, total_tile_count,
        100. * float(total_have_bits) / total_tile_count))


if __name__ == "__main__":
    main()
