verilator/test_regress/t/t_preproc.py
2024-09-08 13:00:03 -04:00

64 lines
2.2 KiB
Python
Executable File

#!/usr/bin/env python3
# DESCRIPTION: Verilator: Verilog Test driver/expect definition
#
# Copyright 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
import vltest_bootstrap
import collections
test.scenarios('vlt')
def preproc_check(filename1, filename2):
# Read line comments.
line_checks = collections.deque()
with open(filename1, 'r', encoding="latin-1", newline='\n') as fh:
lineno = 0
for line in fh:
lineno += 1
if re.match(r'^Line_Preproc_Check', line):
line_checks.append(lineno)
# See if output file agrees.
with open(filename2, 'r', encoding="latin-1", newline='\n') as fh:
lineno = 0
for line in fh:
lineno += 1
m = re.match(r'^\`line\s+(\d+)', line)
if m:
lineno = int(m.group(1)) - 1
m = re.match(r'^Line_Preproc_Check\s+(\d+)', line)
if m:
linecmt = m.group(1)
check = line_checks.popleft()
file2ln = filename2 + ":" + str(lineno)
if not check:
test.error(file2ln + ": Extra Line_Preproc_Check")
if str(linecmt) != str(check):
test.error(file2ln + ": __LINE__ inserted " + str(linecmt) + ", exp=" +
str(check))
if str(lineno) != str(check):
test.error(file2ln + ": __LINE__ on `line " + str(lineno) + ", exp=" +
str(check))
if len(line_checks):
test.error(filename2 + ": Missing a Line_Preproc_Check")
stdout_filename = test.obj_dir + "/" + test.name + "__test.vpp"
test.compile(verilator_flags2=['-DDEF_A0 -DPREDEF_COMMAND_LINE -E'],
verilator_make_gmake=False,
make_top_shell=False,
make_main=False,
stdout_filename=stdout_filename)
preproc_check(test.top_filename, stdout_filename)
test.files_identical(stdout_filename, test.golden_filename)
test.passes()