mirror of https://github.com/openXC7/prjxray.git
95 lines
2.7 KiB
Python
Executable File
95 lines
2.7 KiB
Python
Executable File
#!/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()
|