57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
#!/usr/bin/env python3
|
|
import os
|
|
import subprocess
|
|
import sys
|
|
|
|
MAX_FAILED = 1
|
|
START_TEST = 0
|
|
|
|
TEMPFILE = subprocess.run("mktemp -u".split(), stdout=subprocess.PIPE).stdout.decode().strip() # use linux :)
|
|
FILL_SIZE = os.get_terminal_size().columns
|
|
filled = lambda x: f"{x}{' ' * (FILL_SIZE - len(x.replace('\r', '').replace('\n', '')))}"
|
|
|
|
with open("tests.csv") as f:
|
|
tests = [[y for y in x.split(',')] for x in f.read().strip().split('\n')[1:]][START_TEST:]
|
|
|
|
print('Compiling...', end='')
|
|
ps = subprocess.run(f'iverilog -g2012 -o {TEMPFILE} ./sqrt2_tb.sv'.split(), stderr=subprocess.PIPE)
|
|
exit_code = ps.returncode
|
|
output = ps.stderr.decode().strip()
|
|
|
|
if exit_code != 0:
|
|
print('\r!COMPILATION FAILED!')
|
|
print(output, file=sys.stderr)
|
|
exit(exit_code)
|
|
elif output:
|
|
print("\rCompiled with warnings")
|
|
print(output)
|
|
else:
|
|
print("\rCompiled successfully")
|
|
|
|
good = bad = 0
|
|
for i, test in enumerate(tests):
|
|
try:
|
|
ps = subprocess.run([TEMPFILE, '+' + test[0]], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, timeout=.1)
|
|
except subprocess.TimeoutExpired:
|
|
out = 'TIMEOUT'
|
|
else:
|
|
out = ps.stdout.decode().strip().split('\n')[0]
|
|
|
|
cmp = ' '.join(test[1:])
|
|
if out != cmp:
|
|
bad += 1
|
|
print('\n'.join((
|
|
filled(f'\rTEST #{i + 1 + START_TEST}' + (' (TIMEOUT)' if out == 'TIMEOUT' else '')),
|
|
filled(f'INPUT: {test[0]}'),
|
|
filled(f'OUTPUT: {out}'),
|
|
filled(f'EXPECTED: {cmp}'),
|
|
)), end='\n\n')
|
|
else:
|
|
good += 1
|
|
|
|
print(filled(f'\rGOOD: {good}, BAD: {bad}, TOTAL: {len(tests)}'), end='')
|
|
|
|
if MAX_FAILED and bad >= MAX_FAILED:
|
|
print("\nToo many failed tests. Aborting.")
|
|
exit(1)
|
|
print()
|