updates submodules

This commit is contained in:
2024-07-24 12:44:52 +02:00
parent c09fda3f25
commit 97190a133c
9 changed files with 3 additions and 3 deletions

View File

@ -0,0 +1,154 @@
import argparse
import os
import shutil
import subprocess
from pathlib import Path
def validate_elf_file(filepath: str) -> str:
if not os.path.isfile(filepath):
raise argparse.ArgumentTypeError(f"{filepath} is not a valid file.")
# Use the 'file' command to check if it's an ELF file
result = subprocess.run(
["file", filepath], capture_output=True, text=True, check=False
)
if "ELF" not in result.stdout:
raise argparse.ArgumentTypeError(f"{filepath} is not a valid ELF file.")
return filepath
def run_test_and_move_output(elf_file: str, backend: str, isa: str = "tgc5c") -> None:
# Call 'test' with the specified backend mode
os.chdir(Path(__file__).parent.parent)
sim_path = "build/Debug/dbt-rise-tgc/tgc-sim"
run_command = [
sim_path,
"-f",
elf_file,
"--backend",
backend,
"--isa",
isa,
"-p",
"build/Debug/dbt-rise-plugins/pctrace/pctrace.so=dbt-rise-tgc/contrib/instr/TGC5C_instr.yaml",
"-i",
"10000",
]
print(f"Running: \n{' '.join(run_command)}")
try:
subprocess.run(run_command, check=False, timeout=10)
except subprocess.TimeoutExpired:
print("Execution timed out")
# Move the output.trc file
if os.path.exists("output.trc"):
shutil.move("output.trc", f"Debug/{backend}.trc")
else:
print(
f"output.trc does not exist after running with backend {backend}, so it cannot be renamed."
)
def create_shortened_diff_files(backend: str) -> None:
file1_path = "Debug/interp.trc"
file2_path = f"Debug/{backend}.trc"
def validate_file(filepath: str) -> str:
if not os.path.isfile(filepath):
raise ValueError(f"{filepath} is not a valid file.")
return filepath
file1_path = validate_file(file1_path)
file2_path = validate_file(file2_path)
with open(file1_path, "r", encoding="utf8") as file1, open(
file2_path, "r", encoding="utf8"
) as file2:
lines1 = file1.readlines()
lines2 = file2.readlines()
diff_index = -1
for index, (line1, line2) in enumerate(zip(lines1, lines2)):
if line1 != line2:
diff_index = index
break
if diff_index == -1:
print("The files are identical.")
return
start_index = max(0, diff_index - 5)
end_index = min(len(lines1), diff_index + 6)
shortened_lines1 = lines1[start_index:end_index]
shortened_lines2 = lines2[start_index:end_index]
with open("Debug/short_interp.trc", "w", encoding="utf8") as short_file1:
short_file1.writelines(shortened_lines1)
with open(f"Debug/short_{backend}.trc", "w", encoding="utf8") as short_file2:
short_file2.writelines(shortened_lines2)
def create_disassembly(elf_file_path: str) -> None:
def validate_file(filepath: str) -> str:
if not os.path.isfile(filepath):
raise ValueError(f"{filepath} is not a valid file.")
return filepath
elf_file_path = validate_file(elf_file_path)
output_file_path = "Debug/dut.dis"
with open(output_file_path, "w", encoding="utf8") as output_file:
subprocess.run(
[
"riscv64-unknown-elf-objdump",
"-d",
"-Mnumeric",
"-Mno-aliases",
elf_file_path,
],
stdout=output_file,
check=True,
)
def main(args: argparse.Namespace) -> None:
elf_file = args.elf_file
backend = args.backend
isa = args.isa
# Set environment variable
os.environ["REGDUMP"] = "True"
# Run the tests and move the output files
run_test_and_move_output(elf_file, "interp", isa)
run_test_and_move_output(elf_file, backend, isa)
create_shortened_diff_files(backend)
create_disassembly(elf_file)
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="Process an ELF file with a specified backend. Generates register traces for interp and the specified backend"
)
parser.add_argument(
"elf_file", type=validate_elf_file, help="The ELF file to be processed."
)
parser.add_argument(
"--backend",
type=str,
default="amsjit",
help="The backend to be used. Default is amsjit.",
required=False,
)
parser.add_argument(
"--isa",
type=str,
default="tgc5c",
help="The isa to be used. Default 'tgc5c'",
required=False,
)
main(args=parser.parse_args())

View File

@ -0,0 +1,26 @@
import re
import os
'''
This script takes all files that get dumped by the tcc backend when using the --dump-ir
option and replaces the Integers of addresses with their hex representation to allow
for easier debugging.
'''
current_dir = os.getcwd() # Get the current directory
files_with_tcc_jit = [file for file in os.listdir(current_dir) if"jit" in file and not file.startswith("readable")]
for each in files_with_tcc_jit:
readable_file = f"readable_{each}"
if os.path.exists(readable_file):
os.remove(readable_file)
with open(each, "r") as file:
content = file.read()
for each in files_with_tcc_jit:
with open(each, "r") as file:
content = file.read()
# Replace numbers ending with "U" by their hex representation
content = re.sub(r'\b(\d+)U\b(?=U)?', lambda m: hex(int(m.group(1))), content)
with open(f"readable_{each}", "w") as file:
file.write(content)

View File

@ -0,0 +1,29 @@
import argparse
import re
def simplify_trace(input_file, output_file):
with open(input_file, "r") as infile, open(output_file, "w") as outfile:
for line in infile:
# Enhanced regex to match the instruction number, mode, and PC
match = re.search(r"\[\d+\] \[[MI]\]: (0x[0-9A-Fa-f]+)", line)
if match:
pc = match.group(1).lower()
outfile.write(f"{pc}\n")
def main():
parser = argparse.ArgumentParser(
description="Simplify a trace from an instruction set simulator."
)
parser.add_argument("input_file", type=str, help="The input trace file")
parser.add_argument(
"output_file", type=str, help="The output file for the simplified trace"
)
args = parser.parse_args()
simplify_trace(args.input_file, args.output_file)
if __name__ == "__main__":
main()

View File

@ -0,0 +1,26 @@
import argparse
def simplify_trace(input_file, output_file):
with open(input_file, "r") as infile, open(output_file, "w") as outfile:
for line in infile:
# Split the line by the first comma and take the PC part
pc = line.split(",")[0].strip().lower()
outfile.write(f"{pc}\n")
def main():
parser = argparse.ArgumentParser(
description="Simplify traces from instruction set simulators."
)
parser.add_argument("input_file", type=str, help="The input trace file")
parser.add_argument(
"output_file", type=str, help="The output file for the simplified trace"
)
args = parser.parse_args()
simplify_trace(args.input_file, args.output_file)
if __name__ == "__main__":
main()