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