阶段5-4:executor --sidecar 显式指定 I/O 绑定文件(缺省同名推导不变,向后兼容)

This commit is contained in:
2026-08-26 11:34:11 +08:00
parent 7e95e8200e
commit 38202fd21e
2 changed files with 21 additions and 12 deletions
+19 -10
View File
@@ -5,7 +5,7 @@
* @date 2026-08-21
*
* @details 12.10:加载 .stb + sidecar,按扫描周期执行。
* - `BytecodeExecutor <name>.stb [--cycles N] [--replay <file>] [--step]`
* - `BytecodeExecutor <name>.stb [--cycles N] [--replay <file>] [--step] [--sidecar <path>]`
* - 只链 vm + isa,不链 compilerdt_ms / cycle_limit 从映像头取
* - I 采样 / Q 写回按 sidecarvar → 槽号 → channel/bit),不创造变量
* - --replay:读录制文本(每行空格分隔的 0/1,按 io.input 绑定顺序),
@@ -28,11 +28,12 @@ namespace {
/// 打印命令行用法。
void usage() {
std::printf("usage: BytecodeExecutor <name>.stb [--cycles N] [--replay <file>] [--step]\n"
" 加载 .stb + <name>.runtime.toml,按扫描周期执行\n"
std::printf("usage: BytecodeExecutor <name>.stb [--cycles N] [--replay <file>] [--step] [--sidecar <path>]\n"
" 加载 .stb + sidecar(缺省 <name>.runtime.toml,按扫描周期执行\n"
" --cycles N 跑 N 个周期(缺省 10)\n"
" --replay <file> 读录制的 I 序列(每行按 io.input 顺序的 0/1\n"
" --step 单步:逐指令打印 pc/fn/反汇编/寄存器(跑 1 个周期)\n"
" --sidecar <path> 显式指定 I/O 绑定文件(缺省同名推导)\n"
" --help 打印本帮助\n");
}
@@ -234,10 +235,12 @@ int main(int argc, char** argv) {
}
const std::string stb_path = argv[1];
// 参数:--cycles N / --replay <file> / --step(缺省 cycles=10、无回放、非单步)
// 参数:--cycles N / --replay <file> / --step / --sidecar <path>
//(缺省 cycles=10、无回放、非单步、sidecar 同名推导)
uint32_t cycles = 10;
bool step_mode = false;
std::string replay;
std::string sidecar_override;
for (int i = 2; i < argc; ++i) {
if (std::strcmp(argv[i], "--cycles") == 0 && i + 1 < argc) {
cycles = static_cast<uint32_t>(std::stoul(argv[i + 1]));
@@ -245,6 +248,8 @@ int main(int argc, char** argv) {
replay = argv[i + 1];
} else if (std::strcmp(argv[i], "--step") == 0) {
step_mode = true;
} else if (std::strcmp(argv[i], "--sidecar") == 0 && i + 1 < argc) {
sidecar_override = argv[i + 1];
}
}
@@ -266,13 +271,17 @@ int main(int argc, char** argv) {
return 1;
}
// sidecar 路径推导<name>.stb → <name>.runtime.toml
std::string sidecar_path = stb_path;
const size_t dot = sidecar_path.find_last_of('.');
if (dot != std::string::npos) {
sidecar_path = sidecar_path.substr(0, dot);
// sidecar 路径:--sidecar 显式指定,否则同名推导 <name>.stb → <name>.runtime.toml
std::string sidecar_path = sidecar_override.empty()
? stb_path
: sidecar_override;
if (sidecar_override.empty()) {
const size_t dot = sidecar_path.find_last_of('.');
if (dot != std::string::npos) {
sidecar_path = sidecar_path.substr(0, dot);
}
sidecar_path += ".runtime.toml";
}
sidecar_path += ".runtime.toml";
std::vector<Binding> bindings;
if (!parse_sidecar(sidecar_path, &bindings, &err)) {
std::fprintf(stderr, "error: %s\n", err.c_str());