/ scripts / run_signature.py
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()