Clean up VcsSim init()
authorTim Newsome <tim@sifive.com>
Thu, 30 Nov 2017 19:50:18 +0000 (11:50 -0800)
committerTim Newsome <tim@sifive.com>
Thu, 30 Nov 2017 19:50:18 +0000 (11:50 -0800)
Use a unique log file, so you can run multiple instances at once.
Add time out to waiting for the simulator to be ready.

debug/testlib.py

index 5fc384aa66af3e1ff727f120c01d0f2a6efba523..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()