3
0
Fork 0
mirror of https://github.com/YosysHQ/yosys synced 2026-03-23 12:59:15 +00:00
yosys/tests/gen_tests_makefile.py
2026-03-13 09:51:15 +01:00

97 lines
3.1 KiB
Python

#!/usr/bin/env python3
import glob
import os
import sys
import argparse
yosys_basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
def _cwd_base():
return os.path.basename(os.getcwd())
def generate_target(name, command):
target = f"{_cwd_base()}-{name}"
print(f"all: {target}")
print(f".PHONY: {target}")
print(f"{target}:")
print(f"\t@@$(call run_test,{target}, \\")
print(f"\tYOSYS_MAX_THREADS=4 {command})")
def generate_ys_test(ys_file, yosys_args=""):
cmd = f'$(YOSYS) -ql {ys_file}.err {yosys_args} {ys_file} >/dev/null 2>&1 && mv {ys_file}.err {ys_file}.log'
generate_target(ys_file, cmd)
def generate_tcl_test(tcl_file, yosys_args=""):
cmd = f'$(YOSYS) -ql {tcl_file}.err {yosys_args} {tcl_file} >/dev/null 2>&1 && mv {tcl_file}.err {tcl_file}.log'
generate_target(tcl_file, cmd)
def generate_sv_test(sv_file, yosys_args=""):
base = os.path.splitext(sv_file)[0]
if not os.path.exists(base + ".ys"):
yosys_cmd = '-p "prep -top top; async2sync; sat -enable_undef -verify -prove-asserts"'
cmd = f'$(YOSYS) -ql {sv_file}.err {yosys_cmd} {yosys_args} {sv_file} >/dev/null 2>&1 && mv {sv_file}.err {sv_file}.log'
generate_target(sv_file, cmd)
def generate_bash_test(sh_file):
cmd = f"bash -v {sh_file} >{sh_file}.err 2>&1 && mv {sh_file}.err {sh_file}.log"
generate_target(sh_file, cmd)
def generate_tests(argv):
parser = argparse.ArgumentParser(add_help=False)
parser.add_argument("-y", "--yosys-scripts", action="store_true")
parser.add_argument("-t", "--tcl-scripts", action="store_true")
parser.add_argument("-s", "--prove-sv", action="store_true")
parser.add_argument("-b", "--bash", action="store_true")
parser.add_argument("-a", "--yosys-args", default="")
args = parser.parse_args(argv)
if not (args.yosys_scripts or args.tcl_scripts or args.prove_sv or args.bash):
raise RuntimeError("No file types selected")
print(f"YOSYS ?= {yosys_basedir}/yosys")
print()
print("define run_test")
print(" rc=0; \\")
print(" $(2) || rc=$$?; \\")
print(" if [ $$rc -eq 0 ]; then \\")
print(" echo \"PASS $1\"; \\")
print(" echo PASS > $1.result; \\")
print(" else \\")
print(" echo \"FAIL $1\"; \\")
print(" echo FAIL > $1.result; \\")
print(" fi")
print("endef")
print()
print(".PHONY: all")
print("all:")
if args.yosys_scripts:
for f in sorted(glob.glob("*.ys")):
generate_ys_test(f, args.yosys_args)
if args.tcl_scripts:
for f in sorted(glob.glob("*.tcl")):
generate_tcl_test(f, args.yosys_args)
if args.prove_sv:
for f in sorted(glob.glob("*.sv")):
generate_sv_test(f, args.yosys_args)
if args.bash:
for f in sorted(glob.glob("*.sh")):
if f != "run-test.sh":
generate_bash_test(f)
def generate(argv, extra=None):
with open("Makefile", "w") as f:
old = sys.stdout
sys.stdout = f
try:
if extra:
for line in extra:
print(line)
generate_tests(argv)
finally:
sys.stdout = old