|  | #!/usr/bin/env python3 | 
|  | # -*- coding: utf-8 -*- | 
|  | # | 
|  | # Copyright (C) 2017-2020  The Project X-Ray Authors. | 
|  | # | 
|  | # Use of this source code is governed by a ISC-style | 
|  | # license that can be found in the LICENSE file or at | 
|  | # https://opensource.org/licenses/ISC | 
|  | # | 
|  | # SPDX-License-Identifier: ISC | 
|  | import argparse | 
|  | from prjxray.db import Database | 
|  | from prjxray.grid import BlockType | 
|  | from prjxray 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() |