Compare commits
No commits in common. "develop" and "main" have entirely different histories.
|
@ -1,4 +1,5 @@
|
||||||
/build/
|
/build/
|
||||||
|
/Debug/
|
||||||
.settings
|
.settings
|
||||||
/.venv*
|
/.venv*
|
||||||
/Debug-PA/
|
/Debug-PA/
|
||||||
|
|
|
@ -85,7 +85,7 @@ if(CMAKE_PROJECT_NAME STREQUAL "TGC-ISS")
|
||||||
spdlog/1.9.2
|
spdlog/1.9.2
|
||||||
boost/1.75.0
|
boost/1.75.0
|
||||||
gsl-lite/0.37.0
|
gsl-lite/0.37.0
|
||||||
elfio/3.11
|
elfio/3.8
|
||||||
lz4/1.9.3
|
lz4/1.9.3
|
||||||
yaml-cpp/0.7.0
|
yaml-cpp/0.7.0
|
||||||
jsoncpp/1.9.5
|
jsoncpp/1.9.5
|
||||||
|
@ -98,7 +98,7 @@ if(CMAKE_PROJECT_NAME STREQUAL "TGC-ISS")
|
||||||
list(APPEND CONAN_PACKAGE_OPTIONS libiconv:shared=True)
|
list(APPEND CONAN_PACKAGE_OPTIONS libiconv:shared=True)
|
||||||
endif()
|
endif()
|
||||||
if(WITH_ASMJIT)
|
if(WITH_ASMJIT)
|
||||||
list(APPEND CONAN_PACKAGE_LIST asmjit/cci.20240531)
|
list(APPEND CONAN_PACKAGE_LIST asmjit/cci.20230325)
|
||||||
list(APPEND CONAN_PACKAGE_OPTIONS asmjit:shared=False)
|
list(APPEND CONAN_PACKAGE_OPTIONS asmjit:shared=False)
|
||||||
endif()
|
endif()
|
||||||
if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dbt-rise-plugins)
|
if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dbt-rise-plugins)
|
||||||
|
|
|
@ -6,7 +6,7 @@ void checkout_project(String repoUrl, String branch = 'develop') {
|
||||||
],
|
],
|
||||||
extensions: [
|
extensions: [
|
||||||
[$class: 'CleanBeforeCheckout'],
|
[$class: 'CleanBeforeCheckout'],
|
||||||
[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: true, reference: '', trackingSubmodules: false, shallow: true]
|
[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: true, reference: '', trackingSubmodules: false]
|
||||||
],
|
],
|
||||||
submoduleCfg: [],
|
submoduleCfg: [],
|
||||||
userRemoteConfigs: [
|
userRemoteConfigs: [
|
||||||
|
@ -16,46 +16,6 @@ void checkout_project(String repoUrl, String branch = 'develop') {
|
||||||
}
|
}
|
||||||
|
|
||||||
pipeline {
|
pipeline {
|
||||||
agent any
|
|
||||||
stages {
|
|
||||||
stage("Checkout and build"){
|
|
||||||
agent {docker { image 'ubuntu-riscv' }}
|
|
||||||
stages{
|
|
||||||
stage("Checkout TGC-Compliance and TGC-GEN"){
|
|
||||||
steps {
|
|
||||||
sh 'rm -rf * .??* '
|
|
||||||
checkout_project("https://git.minres.com/TGFS/TGC-ISS.git", "develop")
|
|
||||||
dir("TGC-COMPLIANCE"){
|
|
||||||
checkout_project("https://git.minres.com/TGFS/TGC-COMPLIANCE.git", "master")
|
|
||||||
}
|
|
||||||
dir("TGC-GEN"){
|
|
||||||
checkout_project("https://git.minres.com/TGFS/TGC-GEN.git", "develop")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage("Generate cores and build TGC-ISS"){
|
|
||||||
steps {
|
|
||||||
sh '''
|
|
||||||
for core in TGC5A TGC5B TGC5D TGC5E TGC5F RV32GC; do
|
|
||||||
for backend in interp llvm tcc asmjit; do
|
|
||||||
TGC-GEN/scripts/generate_iss.sh -o dbt-rise-tgc/ -c $core -b ${backend} TGC-GEN/CoreDSL/${core}.core_desc
|
|
||||||
done
|
|
||||||
done
|
|
||||||
for core in TGC6B TGC6C TGC6D TGC6E RV64GC; do
|
|
||||||
for backend in interp llvm asmjit; do
|
|
||||||
TGC-GEN/scripts/generate_iss.sh -o dbt-rise-tgc/ -c $core -b ${backend} TGC-GEN/CoreDSL/${core}.core_desc
|
|
||||||
done
|
|
||||||
done
|
|
||||||
'''
|
|
||||||
sh 'conan profile new default --detect --force'
|
|
||||||
sh 'cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DWITH_ASMJIT=ON -DWITH_TCC=ON -DWITH_LLVM=ON'
|
|
||||||
sh 'cmake --build build -j'
|
|
||||||
sh 'build/dbt-rise-tgc/tgc-sim --isa ?'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage("Run test suite") {
|
|
||||||
agent {
|
agent {
|
||||||
docker {
|
docker {
|
||||||
image 'git.minres.com/tooling/riscof_sail:latest'
|
image 'git.minres.com/tooling/riscof_sail:latest'
|
||||||
|
@ -63,48 +23,49 @@ pipeline {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stages {
|
stages {
|
||||||
stage('ACT 32bit') {
|
stage("Checkout TGC-ISS"){
|
||||||
matrix {
|
|
||||||
axes {
|
|
||||||
axis {
|
|
||||||
name 'CORE'
|
|
||||||
values 'TGC5A', 'TGC5B', 'TGC5C', 'TGC5D', 'TGC5E', 'TGC5F', 'RV32GC'
|
|
||||||
}
|
|
||||||
axis {
|
|
||||||
name 'BACKEND'
|
|
||||||
values 'interp', 'llvm', 'tcc', 'asmjit'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stages {
|
|
||||||
stage('Run riscof') {
|
|
||||||
steps {
|
steps {
|
||||||
sh "mkdir -p ${BACKEND}"
|
checkout_project("https://git.minres.com/TGFS/TGC-ISS.git", "develop")
|
||||||
sh "python3 TGC-COMPLIANCE/run_act.py -core ${CORE} -sim build/dbt-rise-tgc/tgc-sim -w ${BACKEND} --local --backend ${BACKEND}"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
stage("build TGC-ISS"){
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('ACT 64bit') {
|
|
||||||
matrix {
|
|
||||||
axes {
|
|
||||||
axis {
|
|
||||||
name 'CORE'
|
|
||||||
values 'TGC6B', 'TGC6C', 'TGC6D', 'TGC6E', 'RV64GC'
|
|
||||||
}
|
|
||||||
axis {
|
|
||||||
name 'BACKEND'
|
|
||||||
values 'interp', 'llvm', 'asmjit'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stages {
|
|
||||||
stage('Run riscof') {
|
|
||||||
steps {
|
steps {
|
||||||
sh "mkdir -p ${BACKEND}"
|
sh 'conan profile new default --detect --force '
|
||||||
sh "python3 TGC-COMPLIANCE/run_act.py -core ${CORE} -sim build/dbt-rise-tgc/tgc-sim -w ${BACKEND} --local --backend ${BACKEND}"
|
sh 'cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DWITH_ASMJIT=ON -DWITH_TCC=ON -DWITH_LLVM=ON'
|
||||||
|
sh 'cmake --build build -j'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage("Checkout TGC-Compliance"){
|
||||||
|
steps {
|
||||||
|
dir("TGC-COMPLIANCE"){
|
||||||
|
checkout_project("https://git.minres.com/TGFS/TGC-COMPLIANCE.git", "master")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
stage("Test backends"){
|
||||||
|
parallel {
|
||||||
|
stage("Test interp") {
|
||||||
|
steps {
|
||||||
|
sh "mkdir interp"
|
||||||
|
sh "python3 TGC-COMPLIANCE/run_act.py -core TGC5C -sim build/dbt-rise-tgc/tgc-sim -w interp --dockerless --backend interp"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage("Test tcc") {
|
||||||
|
steps {
|
||||||
|
sh "mkdir tcc"
|
||||||
|
sh "python3 TGC-COMPLIANCE/run_act.py -core TGC5C -sim build/dbt-rise-tgc/tgc-sim -w tcc --dockerless --backend tcc"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage("Test asmjit") {
|
||||||
|
steps {
|
||||||
|
sh "mkdir asmjit"
|
||||||
|
sh "python3 TGC-COMPLIANCE/run_act.py -core TGC5C -sim build/dbt-rise-tgc/tgc-sim -w asmjit --dockerless --backend asmjit"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
stage("Test llvm") {
|
||||||
|
steps {
|
||||||
|
sh "mkdir llvm"
|
||||||
|
sh "python3 TGC-COMPLIANCE/run_act.py -core TGC5C -sim build/dbt-rise-tgc/tgc-sim -w llvm --dockerless --backend llvm"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 99cf6823a9f565ecb6cc7f8fe2cef1e52830890b
|
Subproject commit b725ff307be15ae274b5b4e97bcb73856212b1b4
|
|
@ -1 +1 @@
|
||||||
Subproject commit ac818f304d4e71ce5361684c10dbc8cabf3aefaf
|
Subproject commit 346b177a87b8bfa9f3e895e63910f9c7cf7a1561
|
|
@ -1,5 +0,0 @@
|
||||||
*.log
|
|
||||||
*.dis
|
|
||||||
*.asm
|
|
||||||
*.ll
|
|
||||||
*tcc_*
|
|
|
@ -1,43 +0,0 @@
|
||||||
X0 (zero) : 0 (0x00)
|
|
||||||
X1 (ra) : 4 (0x04)
|
|
||||||
X2 (sp) : 8 (0x08)
|
|
||||||
X3 (gp) : 12 (0x0c)
|
|
||||||
X4 (tp) : 16 (0x10)
|
|
||||||
X5 (t0) : 20 (0x14)
|
|
||||||
X6 (t1) : 24 (0x18)
|
|
||||||
X7 (t2) : 28 (0x1c)
|
|
||||||
X8 (s0/fp): 32 (0x20)
|
|
||||||
X9 (s1) : 36 (0x24)
|
|
||||||
X10 (a0) : 40 (0x28)
|
|
||||||
X11 (a1) : 44 (0x2c)
|
|
||||||
X12 (a2) : 48 (0x30)
|
|
||||||
X13 (a3) : 52 (0x34)
|
|
||||||
X14 (a4) : 56 (0x38)
|
|
||||||
X15 (a5) : 60 (0x3c)
|
|
||||||
X16 (a6) : 64 (0x40)
|
|
||||||
X17 (a7) : 68 (0x44)
|
|
||||||
X18 (s2) : 72 (0x48)
|
|
||||||
X19 (s3) : 76 (0x4c)
|
|
||||||
X20 (s4) : 80 (0x50)
|
|
||||||
X21 (s5) : 84 (0x54)
|
|
||||||
X22 (s6) : 88 (0x58)
|
|
||||||
X23 (s7) : 92 (0x5c)
|
|
||||||
X24 (s8) : 96 (0x60)
|
|
||||||
X25 (s9) : 100 (0x64)
|
|
||||||
X26 (s10) : 104 (0x68)
|
|
||||||
X27 (s11) : 108 (0x6c)
|
|
||||||
X28 (t3) : 112 (0x70)
|
|
||||||
X29 (t4) : 116 (0x74)
|
|
||||||
X30 (t5) : 120 (0x78)
|
|
||||||
X31 (t6) : 124 (0x7c)
|
|
||||||
PC : 128 (0x80)
|
|
||||||
NEXT_PC : 132 (0x84)
|
|
||||||
PRIV : 136 (0x88)
|
|
||||||
DPC : 137 (0x89)
|
|
||||||
trap_state : 141 (0x8d)
|
|
||||||
pending_trap : 145 (0x91)
|
|
||||||
icount : 149 (0x95)
|
|
||||||
cycle : 157 (0x9d)
|
|
||||||
instret : 165 (0xa5)
|
|
||||||
instruction : 173 (0xad)
|
|
||||||
last_branch : 177 (0xb1)
|
|
2
scc
2
scc
|
@ -1 +1 @@
|
||||||
Subproject commit 66d3b8f9ee209d7343448bf259b93cc4ab85218b
|
Subproject commit 59d07fbc6678f5676dc508925ed1982007e350f1
|
|
@ -1,75 +0,0 @@
|
||||||
import argparse
|
|
||||||
import os
|
|
||||||
import subprocess
|
|
||||||
|
|
||||||
|
|
||||||
def get_address_from_objdump(elf_file, symbol):
|
|
||||||
result = subprocess.run(
|
|
||||||
["riscv64-unknown-elf-objdump", "-t", elf_file], capture_output=True, text=True
|
|
||||||
)
|
|
||||||
for line in result.stdout.splitlines():
|
|
||||||
if symbol in line:
|
|
||||||
return int(line.split()[0], 16)
|
|
||||||
return None
|
|
||||||
|
|
||||||
|
|
||||||
def annotate_dump(signature_file, elf_file):
|
|
||||||
begin_signature = get_address_from_objdump(elf_file, "begin_signature")
|
|
||||||
end_signature = get_address_from_objdump(elf_file, "end_signature")
|
|
||||||
|
|
||||||
if begin_signature is None or end_signature is None:
|
|
||||||
print(f"Symbols not found in {elf_file}")
|
|
||||||
return
|
|
||||||
|
|
||||||
address = begin_signature
|
|
||||||
annotated_lines = []
|
|
||||||
|
|
||||||
with open(signature_file, "r") as sig_file:
|
|
||||||
for line in sig_file:
|
|
||||||
annotated_lines.append(f"{hex(address)}: {line.strip()}")
|
|
||||||
address += 4
|
|
||||||
|
|
||||||
output_file = signature_file + ".annotated"
|
|
||||||
with open(output_file, "w") as out_file:
|
|
||||||
out_file.write("\n".join(annotated_lines))
|
|
||||||
print(f"Annotated file created: {output_file}")
|
|
||||||
|
|
||||||
|
|
||||||
def process_directory(root_dir):
|
|
||||||
for subdir, _, files in os.walk(root_dir):
|
|
||||||
elf_file = None
|
|
||||||
signature_file = None
|
|
||||||
|
|
||||||
for file in files:
|
|
||||||
if file.endswith(".elf"):
|
|
||||||
elf_file = os.path.join(subdir, file)
|
|
||||||
elif file.endswith(".signature"):
|
|
||||||
signature_file = os.path.join(subdir, file)
|
|
||||||
|
|
||||||
if elf_file and signature_file:
|
|
||||||
annotate_dump(signature_file, elf_file)
|
|
||||||
elif signature_file:
|
|
||||||
print(f"No ELF file found for {signature_file}")
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
|
||||||
parser = argparse.ArgumentParser(
|
|
||||||
description="""
|
|
||||||
Annotate memory dumps with addresses. Parses all subdirectories from the given root.
|
|
||||||
Expects a .signature with a corresponding .elf in the same directory.
|
|
||||||
Designed to annotate riscof signatures."""
|
|
||||||
)
|
|
||||||
parser.add_argument(
|
|
||||||
"root_dir", type=str, help="Root directory to search for .signature files"
|
|
||||||
)
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
if not os.path.isdir(args.root_dir):
|
|
||||||
print("Invalid root directory")
|
|
||||||
return
|
|
||||||
|
|
||||||
process_directory(args.root_dir)
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
main()
|
|
|
@ -1,157 +0,0 @@
|
||||||
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__":
|
|
||||||
# sys.exit(
|
|
||||||
# "This script needs to be adapted, it assumed to be in a directory named 'Debug'"
|
|
||||||
# )
|
|
||||||
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="asmjit",
|
|
||||||
help="The backend to be used. Default is asmjit.",
|
|
||||||
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())
|
|
|
@ -1,29 +0,0 @@
|
||||||
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()
|
|
|
@ -1,26 +0,0 @@
|
||||||
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()
|
|
Loading…
Reference in New Issue