Clean up VcsSim init()
[riscv-tests.git] / debug / testlib.py
index b19eafcb865f6bfa97f51674930137843541e86c..21eeb3d511c55b91ed52a29e3381b21a13bc48d6 100644 (file)
@@ -142,9 +142,10 @@ class Spike(object):
         return self.process.wait(*args, **kwargs)
 
 class VcsSim(object):
-    logname = "simv.log"
+    logfile = tempfile.NamedTemporaryFile(prefix='simv', suffix='.log')
+    logname = logfile.name
 
-    def __init__(self, sim_cmd=None, debug=False):
+    def __init__(self, sim_cmd=None, debug=False, timeout=300):
         if sim_cmd:
             cmd = shlex.split(sim_cmd)
         else:
@@ -153,14 +154,19 @@ class VcsSim(object):
         if debug:
             cmd[0] = cmd[0] + "-debug"
             cmd += ["+vcdplusfile=output/gdbserver.vpd"]
+
         logfile = open(self.logname, "w")
+        if print_log_names:
+            real_stdout.write("Temporary VCS log: %s\n" % self.logname)
         logfile.write("+ %s\n" % " ".join(cmd))
         logfile.flush()
+
         listenfile = open(self.logname, "r")
         listenfile.seek(0, 2)
         self.process = subprocess.Popen(cmd, stdin=subprocess.PIPE,
                 stdout=logfile, stderr=logfile)
         done = False
+        start = time.time()
         while not done:
             # Fail if VCS exits early
             exit_code = self.process.poll()
@@ -177,6 +183,10 @@ class VcsSim(object):
                 self.port = int(match.group(1))
                 os.environ['JTAG_VPI_PORT'] = str(self.port)
 
+            if (time.time() - start) > timeout:
+                raise Exception("Timed out waiting for VCS to listen for JTAG "
+                        "vpi")
+
     def __del__(self):
         try:
             self.process.kill()
@@ -606,6 +616,7 @@ def run_tests(parsed, target, todo):
         finally:
             sys.stdout = real_stdout
             log_fd.write("Time elapsed: %.2fs\n" % (time.time() - start))
+            log_fd.flush()
         print "[%s] %s in %.2fs" % (name, result, time.time() - start)
         if result not in good_results and parsed.print_failures:
             sys.stdout.write(open(log_name).read())
@@ -836,8 +847,9 @@ class ExamineTarget(GdbTest):
                 raise TestFailed("Couldn't determine XLEN from $misa (0x%x)" %
                         self.hart.misa)
 
-            if (misa_xlen != hart.xlen):
-                raise TestFailed("MISA reported XLEN of %d but we were expecting XLEN of %d\n" % (misa_xlen, hart.xlen))
+            if misa_xlen != hart.xlen:
+                raise TestFailed("MISA reported XLEN of %d but we were "\
+                        "expecting XLEN of %d\n" % (misa_xlen, hart.xlen))
 
             txt += ("%d" % misa_xlen)