cva6/.gitlab-ci/scripts/report_coverage.py

80 lines
2.1 KiB
Python
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Copyright 2023 Thales Silicon Security
#
# Licensed under the Solderpad Hardware Licence, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# SPDX-License-Identifier: Apache-2.0 WITH SHL-2.0
# You may obtain a copy of the License at https://solderpad.org/licenses/
#
# Original Author: Alae Eddine EZ ZEJJARI (alae-eddine.ez-zejjari@external.thalesgroup.com)  sub-contractor MU-Electronics for Thales group
import re
import sys
import yaml
import report_builder as rb
from pprint import pprint
log_cc_path = str(sys.argv[1])
with open(log_cc_path, 'r') as f:
cc_log = f.read()
log_fc_path = str(sys.argv[2])
with open(log_fc_path, 'r') as f:
fc_log = f.read()
pattern = re.compile(r'\S{2,}')
def get_cc_scores(component):
for l in cc_log.splitlines():
if re.search(r'\b'+component+r'\b', l):
line = l
scores = pattern.findall(line)
return [float(score) for score in scores[0:4]]
def get_fc_scores(component):
for l in fc_log.splitlines():
if re.search(r'\b'+component+r'\b', l):
line = l
scores = pattern.findall(line)
return [float(scores[0])]
cc_components = [
"i_cva6",
"commit_stage_i",
"controller_i",
"csr_regfile_i",
"ex_stage_i",
"i_frontend",
"id_stage_i",
"issue_stage_i",
]
fc_components = [
"ISA",
"CSR access",
"TRAPs",
]
cc_score_metric = rb.TableMetric('Coverage results')
cc_score_metric.add_value("COMPONENT", "SCORE", "LINE", "COND", "TOGGLE")
for component in cc_components:
cc_scores = get_cc_scores(component)
cc_score_metric.add_value(component, *cc_scores)
fc_score_metric = rb.TableMetric('Functional results')
fc_score_metric.add_value("FEATURE", "SCORE")
for component in fc_components:
fc_scores = get_fc_scores(component)
fc_score_metric.add_value(component, *fc_scores)
coverage_score = int(get_cc_scores("i_cva6")[0])
report = rb.Report(f'{coverage_score}%')
report.add_metric(cc_score_metric)
report.add_metric(fc_score_metric)
report.dump()
print("Code Coverage Results :\n")
pprint(cc_score_metric.values)
print("\nFunctional Coverage Results :\n")
for i in range(0, 4):
pprint(fc_score_metric.values[i])