blob: 2227f7a44fcf4300301187c66d4203f50f01b482 [file] [log] [blame]
Mark Dykesf41d8ee2025-07-10 16:41:28 -05001# !/usr/bin/env python
2#
3# Copyright (c) 2025 Arm Limited. All rights reserved.
4#
5# SPDX-License-Identifier: BSD-3-Clause
6#
7
8
9#python3 generate_var_coverage.py -sd <smc definition file> -df <SMC data file>
10#This script generates variable coverage tables from SMC definition file and output of FVP SMC calls
11import re
12import copy
13import sys
14import argparse
15import readsmclist
16from tabulate import tabulate
17
18parser = argparse.ArgumentParser(
19 prog='generate_var_coverage.py',
20 description='Creates coverage data from SMC calls in FVP model',
21 epilog='two arguments input')
22
23parser.add_argument('-df', '--datafile',help="Data from UART output of the model .")
24parser.add_argument('-sd', '--smcdefinition',help="SMC definition file .")
25
26args = parser.parse_args()
27
28print("starting variable coverage")
29
30seq = 0
31
32readsmclist.readsmclist(args.smcdefinition,seq)
33
34arglst = readsmclist.arglst
35argnumfield = readsmclist.argnumfield
36argfieldname = readsmclist.argfieldname
37argstartbit = readsmclist.argstartbit
38argendbit = readsmclist.argendbit
39argdefval = readsmclist.argdefval
40smcname = readsmclist.smcname
41argnum = readsmclist.argnum
42argname = readsmclist.argname
43smcid = readsmclist.smcid
44
45varcovvalues = {}
46
47for sn in argfieldname:
48 varcovvalues[sn] = {}
49 for an in argfieldname[sn]:
50 for fn in argfieldname[sn][an]:
51 varcovvalues[sn][fn] = set()
52
53datafile = open(args.datafile, "r")
54data_lines = datafile.readlines()
55datafile.close()
56for dline in data_lines:
57 dl = dline.strip()
58 dinstr = re.search(r'^SMC FUZZER CALL fid:([a-fA-F0-9]+)\s+arg1:([a-fA-F0-9]+)\s+arg2:([a-fA-F0-9]+)\s+arg3:([a-fA-F0-9]+)\s+arg4:([a-fA-F0-9]+)\s+arg5:([a-fA-F0-9]+)\s+arg6:([a-fA-F0-9]+)\s+arg7:([a-fA-F0-9]+)$',dl)
59 if dinstr:
60 if dinstr.group(1) in smcid:
61 scall = smcid[dinstr.group(1)]
62 for an in argfieldname[scall]:
63 for fn in argfieldname[scall][an]:
64 if int(argnumfield[scall][an][fn]) < 8:
65 argval = dinstr.group(int(argnumfield[scall][an][fn])+1)
66 astbit = int(argstartbit[scall][an][fn])
67 aenbit = int(argendbit[scall][an][fn])
68 vval = hex((int(argval,16) >> astbit) & ((2 ** (aenbit - astbit + 1)) - 1))
69 varcovvalues[scall][fn].add(vval)
70
71for sn in varcovvalues:
72 print(sn)
73 largest = 0
74 hdrs = []
75 for fn in varcovvalues[sn]:
76 if len(varcovvalues[sn][fn]) > largest:
77 largest = len(varcovvalues[sn][fn])
78 te = [["-" for x in range(len(varcovvalues[sn]))] for x in range(largest)]
79 k = 0
80 for fn in varcovvalues[sn]:
81 i = 0
82 hdrs.append(fn)
83 for val in varcovvalues[sn][fn]:
84 te[i][k] = val
85 i = i + 1
86 k = k + 1
87 print(tabulate(te, headers=hdrs, tablefmt="grid"))
88 print()