Compare commits

...

60 Commits

Author SHA1 Message Date
8eed85377b updates dbt-rise-tgc 2024-12-06 15:51:12 +01:00
fabceb7a93 updates submodules 2024-12-06 13:40:30 +01:00
88ad16ec94 updates submodules 2024-11-14 17:27:50 +01:00
abef96d93d lowers CXX standard and elfio version 2024-11-14 17:26:37 +01:00
478d1d4ac5 includes GC cores into Jenkins 2024-09-30 09:51:56 +02:00
5f43bb9c0f updates submodules 2024-09-30 08:48:31 +02:00
d9706c58f9 updates submodules 2024-09-27 20:10:53 +02:00
45b55d5c24 updates submodule 2024-09-24 08:42:33 +02:00
bacc9a8296 updates elfio and c++ version 2024-09-24 08:42:17 +02:00
b6e22e863a updates dbt-rise-tgc submodule 2024-09-23 10:06:10 +02:00
aad4a27516 updates dbt-rise submodules 2024-09-23 09:30:33 +02:00
e6b34cfad9 updates submodule, Jenkins displays available isa after building 2024-08-21 12:09:41 +02:00
3fb45df48c updates submodule 2024-08-21 11:05:01 +02:00
3489fd1516 updates submodule 2024-08-17 23:22:14 +02:00
8d199ba7ca changes c++ back to 14 2024-08-17 23:20:29 +02:00
30dd1044b0 updates submodule 2024-08-17 11:20:03 +02:00
d27cbcc05b adds TGC5F to testing 2024-08-17 09:22:33 +02:00
020a4d793f updates submodules 2024-08-17 09:22:03 +02:00
ed08913f26 updates submodules 2024-08-04 18:42:54 +02:00
17773cf9b1 updates tgc 2024-08-02 11:59:10 +02:00
ae71682920 updates TGC impl 2024-08-02 10:33:29 +02:00
5cfbbbc9ca updates dbt-rise-tgc to fix fcsr presence 2024-08-02 08:59:48 +02:00
7d71ebca30 update submodules 2024-08-01 11:02:45 +02:00
0b7969becf updates submodule 2024-07-31 12:31:10 +02:00
5bb29d2d3a adds script for annotating memory addrs to riscof memory dumps 2024-07-31 12:30:54 +02:00
46128e395f update submodule 2024-07-30 13:34:57 +02:00
3dc80460ac updates submodules 2024-07-25 19:35:37 +02:00
5d9d146aa2 updates submodules and script 2024-07-25 13:08:38 +02:00
a4ac323306 updates submodules 2024-07-24 14:49:19 +02:00
97190a133c updates submodules 2024-07-24 12:45:23 +02:00
c09fda3f25 updates submodules 2024-07-24 12:29:21 +02:00
47d7357ed9 updates submodules 2024-07-23 14:36:16 +02:00
78245ec817 updates submodules 2024-07-23 13:47:51 +02:00
4058eed106 updates submodules 2024-07-22 09:24:19 +02:00
1fee44c084 enables all cores in Jenkinsfile 2024-07-18 14:32:59 +02:00
497b1d33d4 updates submodules 2024-07-18 14:32:46 +02:00
db0d125651 adds Debug tools 2024-07-18 14:21:24 +02:00
c365d4f822 removes TGC5B from testing as it is also not generated atm 2024-07-11 22:05:07 +02:00
6ce8eada3e removes TGC5C from generation as it is already in TGC-ISS 2024-07-11 16:37:21 +02:00
6ee4840d8d removes TGC5B from testing 2024-07-11 15:46:56 +02:00
2a0899a671 adjust cache line size 2024-07-11 14:06:07 +02:00
c0e557316f adds switch to mkdir 2024-07-11 12:59:43 +02:00
c4a746d4c8 splits 32 and 64 bits, disables RVE for now 2024-07-11 12:41:14 +02:00
45e5ab6133 cleans repo before checkout 2024-07-11 11:26:54 +02:00
8811f13d1c checks out ISS explicitly 2024-07-11 11:23:17 +02:00
c2056c30f3 fixes syntax for multiline command 2024-07-11 10:55:27 +02:00
3da38170ff generates cores manually 2024-07-11 10:53:59 +02:00
5c31d06a58 . 2024-07-11 10:24:49 +02:00
99e36acbae fixes bugs 2024-07-11 10:19:56 +02:00
21ca5aee7a different agents for different stages 2024-07-11 10:14:46 +02:00
c99a7982b7 adds seperate image for core gen 2024-07-11 10:04:35 +02:00
3d657d42bc fixes typo yet again 2024-07-11 09:52:02 +02:00
8de84ca4be fixes typo 2024-07-11 09:46:25 +02:00
fa1c960247 updates Jenkinsfile 2024-07-11 09:41:06 +02:00
ab4a0eeb6e updates submodule 2024-07-11 08:41:16 +02:00
cc61e0b476 changes dockerless to local 2024-07-10 13:16:11 +02:00
856e251be4 updates submodules 2024-07-10 12:57:36 +02:00
b118b43988 upgrades cxx version for std::variant in vmbase, updates asmjit and reorder for proper build 2024-07-10 12:57:36 +02:00
e8037b9c27 updates dbt-rise-tgc 2024-07-09 13:57:43 +02:00
c0bae483c1 updates submodules 2024-07-09 13:52:50 +02:00
12 changed files with 425 additions and 52 deletions

1
.gitignore vendored
View File

@ -1,5 +1,4 @@
/build/
/Debug/
.settings
/.venv*
/Debug-PA/

View File

@ -85,7 +85,7 @@ if(CMAKE_PROJECT_NAME STREQUAL "TGC-ISS")
spdlog/1.9.2
boost/1.75.0
gsl-lite/0.37.0
elfio/3.8
elfio/3.11
lz4/1.9.3
yaml-cpp/0.7.0
jsoncpp/1.9.5
@ -98,7 +98,7 @@ if(CMAKE_PROJECT_NAME STREQUAL "TGC-ISS")
list(APPEND CONAN_PACKAGE_OPTIONS libiconv:shared=True)
endif()
if(WITH_ASMJIT)
list(APPEND CONAN_PACKAGE_LIST asmjit/cci.20230325)
list(APPEND CONAN_PACKAGE_LIST asmjit/cci.20240531)
list(APPEND CONAN_PACKAGE_OPTIONS asmjit:shared=False)
endif()
if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dbt-rise-plugins)

129
Jenkinsfile vendored
View File

@ -6,7 +6,7 @@ void checkout_project(String repoUrl, String branch = 'develop') {
],
extensions: [
[$class: 'CleanBeforeCheckout'],
[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: true, reference: '', trackingSubmodules: false]
[$class: 'SubmoduleOption', disableSubmodules: false, parentCredentials: true, recursiveSubmodules: true, reference: '', trackingSubmodules: false, shallow: true]
],
submoduleCfg: [],
userRemoteConfigs: [
@ -16,56 +16,95 @@ void checkout_project(String repoUrl, String branch = 'develop') {
}
pipeline {
agent {
docker {
image 'git.minres.com/tooling/riscof_sail:latest'
args ' -e CONAN_USER_HOME=/var/jenkins_home/workspace/riscof_sail'
}
}
agent any
stages {
stage("Checkout TGC-ISS"){
steps {
checkout_project("https://git.minres.com/TGFS/TGC-ISS.git", "develop")
}
}
stage("build TGC-ISS"){
steps {
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'
}
}
stage("Checkout TGC-Compliance"){
steps {
dir("TGC-COMPLIANCE"){
checkout_project("https://git.minres.com/TGFS/TGC-COMPLIANCE.git", "master")
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("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("Run test suite") {
agent {
docker {
image 'git.minres.com/tooling/riscof_sail:latest'
args ' -e CONAN_USER_HOME=/var/jenkins_home/workspace/riscof_sail'
}
}
stages {
stage('ACT 32bit') {
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 {
sh "mkdir -p ${BACKEND}"
sh "python3 TGC-COMPLIANCE/run_act.py -core ${CORE} -sim build/dbt-rise-tgc/tgc-sim -w ${BACKEND} --local --backend ${BACKEND}"
}
}
}
}
}
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"
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 {
sh "mkdir -p ${BACKEND}"
sh "python3 TGC-COMPLIANCE/run_act.py -core ${CORE} -sim build/dbt-rise-tgc/tgc-sim -w ${BACKEND} --local --backend ${BACKEND}"
}
}
}
}
}
}

@ -1 +1 @@
Subproject commit b725ff307be15ae274b5b4e97bcb73856212b1b4
Subproject commit 72a4673f395abf130295644479ca150d318306e9

@ -1 +1 @@
Subproject commit 346b177a87b8bfa9f3e895e63910f9c7cf7a1561
Subproject commit a6a6f51f0bbbd0cda2d33ed7696c307ed528987b

5
docs/.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
*.log
*.dis
*.asm
*.ll
*tcc_*

43
docs/offsets.txt Normal file
View File

@ -0,0 +1,43 @@
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

@ -1 +1 @@
Subproject commit 59d07fbc6678f5676dc508925ed1982007e350f1
Subproject commit 9daeaadc357550f323f2198463b22dad4cb40ba4

View File

@ -0,0 +1,75 @@
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()

View File

@ -0,0 +1,157 @@
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())

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()