Hazard3/test/sim/riscv-compliance/scrape_testvec

43 lines
1.3 KiB
Python
Executable File

#!/usr/bin/env python3
import sys
import os
model = []
log_path = sys.argv[1] + ".stdout"
elf_path = sys.argv[1] + ".elf"
sigout_path = sys.argv[2]
model_bytes = []
in_testdata = False
for l in open(log_path):
if l.startswith("Dumping memory"):
in_testdata = True
continue
if in_testdata:
try:
model_bytes.extend(int(x, 16) for x in l.split(" "))
except ValueError:
break
for i in range(len(model_bytes) // 4):
model.append(model_bytes[i * 4] | model_bytes[i * 4 + 1] << 8 | model_bytes[i * 4 + 2] << 16 | model_bytes[i * 4 + 3] << 24)
# Trim the output down to size before writing out, by scraping the symbols out
# of the ELF. New riscv-compliance comparison script doesn't accept trailing data.
# Assume that a suitable objdump is on PATH -- sorry, I couldn't figure out
# what on earth they were trying to do with the target creation in their
# Makefile fragments, so it's just been hacked into this script. Problem for
# future Luke
sig_start_addr = int(os.popen("riscv32-unknown-elf-objdump -t " + elf_path + " | grep begin_signature | head -c8").read(), 16)
sig_end_addr = int(os.popen("riscv32-unknown-elf-objdump -t " + elf_path + " | grep end_signature | head -c8").read(), 16)
sig_size_words = (sig_end_addr - sig_start_addr) // 4
model = model[:sig_size_words]
ofile = open(sigout_path, "w")
for n in model:
ofile.write(f"{n:08x}\n")