mirror of
https://github.com/verilator/verilator.git
synced 2025-02-08 06:32:24 +00:00
64 lines
2.2 KiB
Python
Executable File
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()
|