xref: /XiangShan/scripts/coverage/coverage.py (revision c8b1e4db9cf506f40d3cbddfbd259cfecf0168b7)
1d70a2272SAllen#/usr/bin/python3
2d70a2272SAllen# -*- coding: UTF-8 -*-
3d70a2272SAllenimport sys
4d70a2272SAllenimport re
5d70a2272SAllenimport copy
6d70a2272SAllen
7d70a2272SAllenif __name__ == "__main__":
8d70a2272SAllen    assert len(sys.argv) == 3, "Expect input_file and output_file"
9d70a2272SAllen    input_file = sys.argv[1]
10d70a2272SAllen    output_file = sys.argv[2]
11d70a2272SAllen    lines = []
12d70a2272SAllen    line_count = 0
13d70a2272SAllen    synthesis_nest_level = 0
14*c8b1e4dbSAllen    reg_init_nest_level = 0
15*c8b1e4dbSAllen    mem_init_nest_level = 0
16d70a2272SAllen    with open(input_file) as f:
17d70a2272SAllen        for line in f:
18d70a2272SAllen            line_count += 1
19d70a2272SAllen
20d70a2272SAllen            ifdef = re.compile('`ifdef')
21d70a2272SAllen            ifndef = re.compile('`ifndef')
22d70a2272SAllen            endif = re.compile('`endif')
23*c8b1e4dbSAllen            # remove the line coverage results of not synthesizable code(mostly assert and fwrite)
24d70a2272SAllen            synthesis = re.compile('`ifndef SYNTHESIS')
25*c8b1e4dbSAllen            # remove the coverage results of random init variables
26*c8b1e4dbSAllen            reg_init = re.compile('`ifdef RANDOMIZE_REG_INIT')
27*c8b1e4dbSAllen            mem_init = re.compile('`ifdef RANDOMIZE_MEM_INIT')
28*c8b1e4dbSAllen            coverage = re.compile('^\s*(%?\d+)\s+')
29*c8b1e4dbSAllen
30d70a2272SAllen
31d70a2272SAllen            ifdef_match = ifdef.search(line)
32d70a2272SAllen            ifndef_match = ifndef.search(line)
33d70a2272SAllen            endif_match = endif.search(line)
34d70a2272SAllen            synthesis_match = synthesis.search(line)
35*c8b1e4dbSAllen            reg_init_match = reg_init.search(line)
36*c8b1e4dbSAllen            mem_init_match = mem_init.search(line)
37*c8b1e4dbSAllen            coverage_match = coverage.search(line)
38d70a2272SAllen
39d70a2272SAllen            # enter synthesis block
40d70a2272SAllen            if synthesis_match:
41d70a2272SAllen                assert synthesis_nest_level == 0, "Should not nest SYNTHESIS macro"
42d70a2272SAllen                synthesis_nest_level = 1
43d70a2272SAllen
44*c8b1e4dbSAllen            if synthesis_nest_level > 0:
45d70a2272SAllen                if ifdef_match or (ifndef_match and not synthesis_match):
46d70a2272SAllen                    synthesis_nest_level += 1
47d70a2272SAllen                if endif_match:
48d70a2272SAllen                    synthesis_nest_level -= 1
49d70a2272SAllen                    assert synthesis_nest_level >= 0, "Macro nest level should be >= 0"
50d70a2272SAllen
51d70a2272SAllen                # remove line coverage results in systhesis block
52*c8b1e4dbSAllen                if coverage_match:
53*c8b1e4dbSAllen                    coverage_stat = coverage_match.group(1)
54*c8b1e4dbSAllen                    line = line.replace(coverage_match.group(1), " " * len(coverage_stat))
55*c8b1e4dbSAllen
56*c8b1e4dbSAllen            # enter reg_init block
57*c8b1e4dbSAllen            if reg_init_match:
58*c8b1e4dbSAllen                assert reg_init_nest_level == 0, "Should not nest reg_init macro"
59*c8b1e4dbSAllen                reg_init_nest_level = 1
60*c8b1e4dbSAllen
61*c8b1e4dbSAllen            if reg_init_nest_level > 0:
62*c8b1e4dbSAllen                if (ifdef_match and not reg_init_match) or ifndef_match:
63*c8b1e4dbSAllen                    reg_init_nest_level += 1
64*c8b1e4dbSAllen                if endif_match:
65*c8b1e4dbSAllen                    reg_init_nest_level -= 1
66*c8b1e4dbSAllen                    assert reg_init_nest_level >= 0, "Macro nest level should be >= 0"
67*c8b1e4dbSAllen
68*c8b1e4dbSAllen                # remove line coverage results in systhesis block
69*c8b1e4dbSAllen                if coverage_match:
70*c8b1e4dbSAllen                    coverage_stat = coverage_match.group(1)
71*c8b1e4dbSAllen                    line = line.replace(coverage_match.group(1), " " * len(coverage_stat))
72*c8b1e4dbSAllen
73*c8b1e4dbSAllen            # enter mem_init block
74*c8b1e4dbSAllen            if mem_init_match:
75*c8b1e4dbSAllen                assert mem_init_nest_level == 0, "Should not nest mem_init macro"
76*c8b1e4dbSAllen                mem_init_nest_level = 1
77*c8b1e4dbSAllen
78*c8b1e4dbSAllen            if mem_init_nest_level > 0:
79*c8b1e4dbSAllen                if (ifdef_match and not mem_init_match) or ifndef_match:
80*c8b1e4dbSAllen                    mem_init_nest_level += 1
81*c8b1e4dbSAllen                if endif_match:
82*c8b1e4dbSAllen                    mem_init_nest_level -= 1
83*c8b1e4dbSAllen                    assert mem_init_nest_level >= 0, "Macro nest level should be >= 0"
84*c8b1e4dbSAllen
85*c8b1e4dbSAllen                # remove line coverage results in systhesis block
86*c8b1e4dbSAllen                if coverage_match:
87*c8b1e4dbSAllen                    coverage_stat = coverage_match.group(1)
88*c8b1e4dbSAllen                    line = line.replace(coverage_match.group(1), " " * len(coverage_stat))
89d70a2272SAllen
90d70a2272SAllen            lines += line
91d70a2272SAllen
92d70a2272SAllen    with open(output_file, "w") as f:
93d70a2272SAllen        for line in lines:
94d70a2272SAllen            f.write(line)
95