iverilog/ivtest/blif_reg.py

87 lines
2.4 KiB
Python

#
# This is a python script for testing the blif code generator with
# programs specifically set aside for it. The general pattern is that
# the test program comes in two parts: the test bench and the device
# to be tested. The files blif/*_tb.v are the test benches for the
# corresponding files blif/*.v.
#
# This script requires the "abc" command available here:
# <http://www.eecs.berkeley.edu/~alanmi/abc/>
#
# Run this script with the command: python blif_reg.py
#
import os
import subprocess
import re
# This is the name of the iverilog command and vvp command. These may
# vary in different installations.
iverilog = "iverilog"
vvp = "vvp"
list_file = open("blif.list")
# The list file contains a list of test names. The first word in the
# line is the name of the test.
match_prog = re.compile(r"^([a-zA-Z0-9_.]+).*$")
tests = []
for line in list_file:
if line[0] == "#":
continue
match = match_prog.search(line)
if match:
tests.append(match.group(1))
list_file.close()
def run_test(test):
global count_passed, count_failed
# Assemble the paths for the test-bench and DUT.
dut = "blif/" + test + ".v"
tb = "blif/" + test + "_tb.v"
redirect = "log/" + test + ".log 2>&1"
# Process the DUT into a .blif file
ivl_blif_cmd = iverilog + " -g2009 -tblif -otmp_blif.blif " + dut + " > " + redirect
rc = subprocess.call(ivl_blif_cmd, shell=True)
if rc == 0:
# Use ABC to convert the .blif file to Verilog
abc_cmd = "abc -c 'read_blif tmp_blif.blif ; write_verilog tmp_blif.v' >> " + redirect
rc = subprocess.call(abc_cmd, shell=True);
if rc == 0:
# Compile
ivl_blif_tb_cmd = iverilog + " -g2009 -otmp_blif.vvp " + tb + " tmp_blif.v >> " + redirect
rc = subprocess.call(ivl_blif_tb_cmd, shell=True)
if rc == 0:
# Now simulate to make sure the tranlation worked properly.
vvp_cmd = vvp + " tmp_blif.vvp"
output = subprocess.check_output(vvp_cmd, shell=True)
rc = 0 if output == "PASSED\n" else 1
if rc == 0:
print test, "PASSED"
count_passed = count_passed + 1
else:
print test, "FAILED"
count_failed = count_failed + 1
for tmp in ["tmp_blif.blif", "tmp_blif.v", "tmp_blif.vvp"]:
if os.path.exists(tmp):
os.remove(tmp)
count_passed = 0
count_failed = 0
for test in tests:
run_test(test)
print
print count_passed, "tests passed,", count_failed, "tests failed."