mirror of
https://github.com/verilator/verilator.git
synced 2025-01-01 04:07:34 +00:00
102 lines
3.4 KiB
Python
Executable File
102 lines
3.4 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# pylint: disable=C0103,C0114,C0116,C0209,eval-used
|
|
######################################################################
|
|
|
|
import argparse
|
|
import re
|
|
import sys
|
|
# from pprint import pprint
|
|
|
|
Items = []
|
|
|
|
######################################################################
|
|
|
|
|
|
def read_keys(filename):
|
|
with open(filename, "r", encoding="utf8") as fh:
|
|
for line in fh:
|
|
line = re.sub(r'\/\/.*$', '', line)
|
|
if re.match(r'^\s*$', line):
|
|
continue
|
|
if re.search(r'^\s*VLCOVGEN_ITEM', line):
|
|
match = re.search(r'^\s*VLCOVGEN_ITEM *\( *"([^"]+)" *\)', line)
|
|
if not match:
|
|
sys.exit("%Error: " + filename + ": vlcovgen misformed VLCOVGEN_ITEM line")
|
|
code = "{" + match.group(1) + "}"
|
|
data = eval(code)
|
|
# pprint(data)
|
|
Items.append(data)
|
|
|
|
|
|
######################################################################
|
|
|
|
|
|
def lint():
|
|
shorts = {}
|
|
for item in Items:
|
|
if item['short'] in shorts:
|
|
sys.exit("%Error: vlcovgen duplicate short code: " + item['short'])
|
|
shorts[item['short']] = True
|
|
|
|
|
|
def write_keys(filename):
|
|
orig = []
|
|
out = []
|
|
|
|
with open(filename, "r", encoding="utf8") as fh:
|
|
deleting = False
|
|
for line in fh:
|
|
orig.append(line)
|
|
if re.search(r'VLCOVGEN_CIK_AUTO_EDIT_BEGIN', line):
|
|
deleting = True
|
|
out.append(line)
|
|
for keyref in sorted(Items, key=lambda a: a['name']):
|
|
out.append("#define VL_CIK_%s \"%s\"\n" %
|
|
(keyref['name'].upper(), keyref['short']))
|
|
elif re.search(r'VLCOVGEN_SHORT_AUTO_EDIT_BEGIN', line):
|
|
deleting = True
|
|
out.append(line)
|
|
for keyref in sorted(Items, key=lambda a: a['name']):
|
|
out.append(" if (key == \"%s\") return VL_CIK_%s;\n" %
|
|
(keyref['name'], keyref['name'].upper()))
|
|
elif re.search(r'VLCOVGEN_.*AUTO_EDIT_END', line):
|
|
deleting = False
|
|
out.append(line)
|
|
elif not deleting:
|
|
out.append(line)
|
|
|
|
ok = "".join(out) == "".join(orig)
|
|
if not ok:
|
|
with open(filename, "w", encoding="utf8") as fhw:
|
|
fhw.write("".join(out))
|
|
|
|
|
|
######################################################################
|
|
######################################################################
|
|
|
|
parser = argparse.ArgumentParser(
|
|
allow_abbrev=False,
|
|
formatter_class=argparse.RawDescriptionHelpFormatter,
|
|
description="""Generate verilated_cov headers to reduce C++ code duplication.""",
|
|
epilog="""Copyright 2002-2024 by Wilson Snyder. This program is free software; you
|
|
can redistribute it and/or modify it under the terms of either the GNU
|
|
Lesser General Public License Version 3 or the Perl Artistic License
|
|
Version 2.0.
|
|
|
|
SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0""")
|
|
|
|
parser.add_argument('--srcdir', action='store', help='directory containing Verilator sources')
|
|
|
|
parser.set_defaults(srcdir=".")
|
|
|
|
Args = parser.parse_args()
|
|
|
|
read_keys(Args.srcdir + "/../include/verilated_cov_key.h")
|
|
lint()
|
|
write_keys(Args.srcdir + "/../include/verilated_cov_key.h")
|
|
|
|
######################################################################
|
|
# Local Variables:
|
|
# compile-command: "./vlcovgen --srcdir ."
|
|
# End:
|