if (xlen == 32):
cmd.append("-march=rv32imac")
cmd.append("-mabi=ilp32")
+ else:
+ cmd.append("-march=rv64imac")
+ cmd.append("-mabi=lp64")
for arg in args:
found = find_file(arg)
if found:
class Spike(object):
logname = "spike.log"
- def __init__(self, cmd, binary=None, halted=False, with_gdb=True,
+ def __init__(self, sim_cmd, binary=None, halted=False, with_jtag_gdb=True,
timeout=None, xlen=64):
"""Launch spike. Return tuple of its process and the port it's running
on."""
- if cmd:
- cmd = shlex.split(cmd)
+ if sim_cmd:
+ cmd = shlex.split(sim_cmd)
else:
- cmd = ["spike"]
+ spike = os.path.expandvars("$RISCV/bin/spike")
+ cmd = [spike]
if xlen == 32:
- cmd += ["--isa", "RV32"]
+ cmd += ["--isa", "RV32G"]
+ else:
+ cmd += ["--isa", "RV64G"]
if timeout:
cmd = ["timeout", str(timeout)] + cmd
if halted:
cmd.append('-H')
- if with_gdb:
- self.port = unused_port()
- cmd += ['--gdb-port', str(self.port)]
- cmd.append("-m32")
- cmd.append('pk')
+ if with_jtag_gdb:
+ cmd += ['--rbb-port', '0']
+ os.environ['REMOTE_BITBANG_HOST'] = 'localhost'
+ cmd.append('programs/infinite_loop')
if binary:
cmd.append(binary)
logfile = open(self.logname, "w")
self.process = subprocess.Popen(cmd, stdin=subprocess.PIPE,
stdout=logfile, stderr=logfile)
+ if with_jtag_gdb:
+ self.port = None
+ for _ in range(30):
+ m = re.search(r"Listening for remote bitbang connection on "
+ r"port (\d+).", open(self.logname).read())
+ if m:
+ self.port = int(m.group(1))
+ os.environ['REMOTE_BITBANG_PORT'] = m.group(1)
+ break
+ time.sleep(0.11)
+ assert self.port, "Didn't get spike message about bitbang " \
+ "connection"
+
def __del__(self):
try:
self.process.kill()
return self.process.wait(*args, **kwargs)
class VcsSim(object):
- def __init__(self, simv=None, debug=False):
- if simv:
- cmd = shlex.split(simv)
+ def __init__(self, sim_cmd=None, debug=False):
+ if sim_cmd:
+ cmd = shlex.split(sim_cmd)
else:
cmd = ["simv"]
cmd += ["+jtag_vpi_enable"]
class Openocd(object):
logname = "openocd.log"
- def __init__(self, cmd=None, config=None, debug=False):
- if cmd:
- cmd = shlex.split(cmd)
+ def __init__(self, server_cmd=None, config=None, debug=False):
+ if server_cmd:
+ cmd = shlex.split(server_cmd)
else:
- cmd = ["openocd"]
- if config:
- cmd += ["-f", find_file(config)]
- if debug:
- cmd.append("-d")
-
+ openocd = os.path.expandvars("$RISCV/bin/riscv-openocd")
+ cmd = [openocd]
+ if (debug):
+ cmd.append("-d")
+
# This command needs to come before any config scripts on the command
# line, since they are executed in order.
- cmd[1:1] = [
+ cmd += [
# Tell OpenOCD to bind gdb to an unused, ephemeral port.
"--command",
"gdb_port 0",
"telnet_port disabled",
]
+ if config:
+ f = find_file(config)
+ if f is None:
+ print("Unable to read file " + config)
+ exit(1)
+
+ cmd += ["-f", f]
+ if debug:
+ cmd.append("-d")
+
logfile = open(Openocd.logname, "w")
logfile.write("+ %s\n" % " ".join(cmd))
logfile.flush()
messaged = False
while True:
log = open(Openocd.logname).read()
- if "OK GO NOW" in log:
+ if "Ready for Remote Connections" in log:
break
if not self.process.poll() is None:
raise Exception(
self.child.expect(r"\(gdb\)", timeout=timeout)
return self.child.before.strip()
- def c(self, wait=True):
+ def c(self, wait=True, timeout=-1):
if wait:
- output = self.command("c")
+ output = self.command("c", timeout=timeout)
assert "Continuing" in output
return output
else: