阶段5-4:executor --sidecar 显式指定 I/O 绑定文件(缺省同名推导不变,向后兼容)
This commit is contained in:
+19
-10
@@ -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,不链 compiler;dt_ms / cycle_limit 从映像头取
|
||||
* - I 采样 / Q 写回按 sidecar(var → 槽号 → 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());
|
||||
|
||||
Reference in New Issue
Block a user