ec82764bef
RTL (GS rasterizer, EE core stub, platform bridge, LPDDR4B path), sim regression (272 TBs), docs, and tooling. Copyrighted PS2 content (BIOS, game code, GS dumps, and all dump-derived textures/traces) is excluded via .gitignore and stays local. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
60 lines
1.9 KiB
Python
Executable File
60 lines
1.9 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Generate a NOP-sled golden trace in the retroDE_ps2 common envelope.
|
|
|
|
Produces one EE IFETCH record per fetch, starting at --reset-vector (default
|
|
0xBFC00000), advancing PC += 4 each step. Each instruction word is 0x00000000
|
|
(MIPS NOP: sll $0, $0, 0).
|
|
|
|
Format: see docs/decisions/0000-trace-format.md.
|
|
Spec: see sim/golden/trace_compare_spec.md.
|
|
"""
|
|
import argparse
|
|
import sys
|
|
|
|
|
|
def main() -> int:
|
|
ap = argparse.ArgumentParser(description="NOP-sled golden trace generator")
|
|
ap.add_argument("--count", type=int, default=32,
|
|
help="number of IFETCH records to emit (default: 32)")
|
|
ap.add_argument("--reset-vector", type=lambda s: int(s, 0),
|
|
default=0xBFC00000,
|
|
help="starting PC (default: 0xBFC00000)")
|
|
ap.add_argument("-o", "--output", default="-",
|
|
help="output file, '-' for stdout (default: -)")
|
|
args = ap.parse_args()
|
|
|
|
if args.count <= 0:
|
|
print("error: --count must be positive", file=sys.stderr)
|
|
return 2
|
|
|
|
if args.output == "-":
|
|
out = sys.stdout
|
|
close = False
|
|
else:
|
|
try:
|
|
out = open(args.output, "w")
|
|
except OSError as e:
|
|
print(f"error: cannot open {args.output}: {e}", file=sys.stderr)
|
|
return 2
|
|
close = True
|
|
|
|
try:
|
|
out.write("# retroDE_ps2 golden trace, schema v1, "
|
|
"source=generated, scenario=nop_sled\n")
|
|
out.write("# columns: cycle subsystem event arg0 arg1 arg2 arg3 flags\n")
|
|
for i in range(args.count):
|
|
pc = (args.reset_vector + i * 4) & 0xFFFFFFFFFFFFFFFF
|
|
out.write(
|
|
f"{i} EE IFETCH "
|
|
f"0x{pc:016x} 0x{0:016x} 0x{0:016x} 0x{0:016x} -\n"
|
|
)
|
|
finally:
|
|
if close:
|
|
out.close()
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|