blob: 74a20d277e0b7605f32ad2e2b69103041231e94b [file] [log] [blame] [edit]
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# Copyright 2020-2022 F4PGA Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
"""
Extracts block usage information from VPR block usage json summary and
reports it or verifies the information against expressions passed in
--assert-usage argument.
It is used in ASSERT_BLOCK_TYPES_ARE_USED test cases to catch any regressions
to design implementation that would affect block usage.
"""
import argparse
import json
import re
USAGE_SPEC = re.compile(
r"(?P<type>[A-Za-z0-9_-]+)(?P<op>=|<|<=|>=|>)(?P<val>[0-9]+)"
)
def main():
parser = argparse.ArgumentParser(
description="Converts VPR block_usage.json into usage numbers."
)
parser.add_argument('block_usage')
parser.add_argument(
'--assert_usage',
help='Comma seperate block name list with expected usage stats.'
)
parser.add_argument(
'--no_print_usage',
action='store_false',
dest='print_usage',
help='Disables printing of output.'
)
args = parser.parse_args()
with open(args.block_usage) as f:
usage_report = json.load(f)
usage = usage_report['blocks']
if args.print_usage:
print(json.dumps(usage, indent=2))
if args.assert_usage:
for usage_spec in args.assert_usage.split(","):
match = USAGE_SPEC.fullmatch(usage_spec)
assert match is not None, usage_spec
type = match.group("type")
op = match.group("op")
val = int(match.group("val"))
count = int(usage.get(type, 0))
msg = "Expect usage of block {} {} {}, found {}".format(
type, op, val, count
)
if op == "=":
assert count == val, msg
elif op == "<":
assert count < val, msg
elif op == "<=":
assert count <= val, msg
elif op == ">":
assert count > val, msg
elif op == ">=":
assert count >= val, msg
else:
assert False, op
if __name__ == "__main__":
main()