| #!/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() |