run_signature.py
1 #!/usr/bin/env python3 2 3 import asyncio 4 import argparse 5 import sys 6 import os 7 import subprocess 8 from typing import Literal 9 10 if __name__ == "__main__": 11 parent = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 12 sys.path.insert(0, parent) 13 14 import test.regression.signature # noqa: E402 15 from test.regression.pysim import PySimulation # noqa: E402 16 17 18 def run_with_cocotb(test_name: str, traces: bool, output: str) -> bool: 19 arglist = [ 20 "make", 21 "-C", 22 (parent + "/" if parent else "") + "test/regression/cocotb", 23 "-f", 24 "signature.Makefile", 25 "--no-print-directory", 26 ] 27 28 if os.path.isfile(output): 29 os.remove(output) 30 31 arglist += [f"TESTNAME={test_name}"] 32 arglist += [f"OUTPUT={output}"] 33 34 verilog_code = f"{parent}/core.v" 35 gen_info_path = f"{verilog_code}.json" 36 37 arglist += [f"VERILOG_SOURCES={verilog_code}"] 38 arglist += [f"_COREBLOCKS_GEN_INFO={gen_info_path}"] 39 40 if traces: 41 arglist += ["TRACES=1"] 42 43 subprocess.run(arglist) 44 45 return os.path.isfile(output) # completed successfully if signature file was created 46 47 48 def run_with_pysim(test_name: str, traces: bool, output: str) -> bool: 49 traces_file = None 50 if traces: 51 traces_file = os.path.basename(test_name) 52 try: 53 asyncio.run(test.regression.signature.run_test(PySimulation(traces_file=traces_file), test_name, output)) 54 except RuntimeError as e: 55 print("RuntimeError:", e) 56 return False 57 return True 58 59 60 def run_test(test: str, backend: Literal["pysim", "cocotb"], traces: bool, output: str) -> bool: 61 if backend == "cocotb": 62 return run_with_cocotb(test, traces, output) 63 elif backend == "pysim": 64 return run_with_pysim(test, traces, output) 65 return False 66 67 68 def main(): 69 parser = argparse.ArgumentParser() 70 parser.add_argument("-t", "--trace", action="store_true", help="Dump waveforms") 71 parser.add_argument("--log-level", default="WARNING", action="store", help="Level of messages to display.") 72 parser.add_argument("--log-filter", default=".*", action="store", help="Regexp used to filter out logs.") 73 parser.add_argument("-b", "--backend", default="pysim", choices=["cocotb", "pysim"], help="Simulation backend") 74 parser.add_argument("-o", "--output", default=None, help="Selects output file to write test signature to") 75 parser.add_argument("path") 76 77 args = parser.parse_args() 78 79 output = args.output if args.output else args.path + ".signature" 80 81 os.environ["__TRANSACTRON_LOG_LEVEL"] = args.log_level 82 os.environ["__TRANSACTRON_LOG_FILTER"] = args.log_filter 83 84 success = run_test(args.path, args.backend, args.trace, output) 85 if not success: 86 print(f"{args.path}: Program execution failed") 87 88 if output is not None: # create empty file on failure for checker scripts 89 with open(output, "w"): 90 pass 91 92 sys.exit(1) 93 94 95 if __name__ == "__main__": 96 main()