阶段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
+2 -2
View File
@@ -7,7 +7,7 @@ BytecodeExecutor 模块:可执行入口。CMake 目标:`BytecodeExecutor`
## 用法 ## 用法
```text ```text
BytecodeExecutor <name>.stb [--cycles N] [--replay <file>] [--step] BytecodeExecutor <name>.stb [--cycles N] [--replay <file>] [--step] [--sidecar <path>]
``` ```
- `--cycles N`:跑 N 个周期(缺省 10 - `--cycles N`:跑 N 个周期(缺省 10
@@ -18,7 +18,7 @@ BytecodeExecutor <name>.stb [--cycles N] [--replay <file>] [--step]
### sidecar 定位(当前 + 计划) ### sidecar 定位(当前 + 计划)
- **当前(已实现)**:sidecar 路径按「同名替换扩展名」推导——`<name>.stb``<name>.runtime.toml`。依据:sidecar 是编译产物的配对文件,同名约束由 STCompiler 写侧强制,约定即可。 - **当前(已实现)**:sidecar 路径按「同名替换扩展名」推导——`<name>.stb``<name>.runtime.toml`。依据:sidecar 是编译产物的配对文件,同名约束由 STCompiler 写侧强制,约定即可。
- **计划(未实现**加可选参数 `--sidecar <path>` 显式指定 I/O 绑定文件。适用场景:同一程序多套接线配置并存(厂内/现场不同 sidecar)、接线文件与 `.stb` 不同目录。缺省行为**不变**(未指定时回退到同名推导),向后兼容。 - **实现**`--sidecar <path>` 显式指定 I/O 绑定文件。适用场景:同一程序多套接线配置并存(厂内/现场不同 sidecar)、接线文件与 `.stb` 不同目录。缺省行为**不变**(未指定时回退到同名推导),向后兼容。
## 职责 ## 职责
+19 -10
View File
@@ -5,7 +5,7 @@
* @date 2026-08-21 * @date 2026-08-21
* *
* @details 12.10:加载 .stb + sidecar,按扫描周期执行。 * @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 从映像头取 * - 只链 vm + isa,不链 compilerdt_ms / cycle_limit 从映像头取
* - I 采样 / Q 写回按 sidecarvar → 槽号 → channel/bit),不创造变量 * - I 采样 / Q 写回按 sidecarvar → 槽号 → channel/bit),不创造变量
* - --replay:读录制文本(每行空格分隔的 0/1,按 io.input 绑定顺序), * - --replay:读录制文本(每行空格分隔的 0/1,按 io.input 绑定顺序),
@@ -28,11 +28,12 @@ namespace {
/// 打印命令行用法。 /// 打印命令行用法。
void usage() { void usage() {
std::printf("usage: BytecodeExecutor <name>.stb [--cycles N] [--replay <file>] [--step]\n" std::printf("usage: BytecodeExecutor <name>.stb [--cycles N] [--replay <file>] [--step] [--sidecar <path>]\n"
" 加载 .stb + <name>.runtime.toml,按扫描周期执行\n" " 加载 .stb + sidecar(缺省 <name>.runtime.toml,按扫描周期执行\n"
" --cycles N 跑 N 个周期(缺省 10)\n" " --cycles N 跑 N 个周期(缺省 10)\n"
" --replay <file> 读录制的 I 序列(每行按 io.input 顺序的 0/1\n" " --replay <file> 读录制的 I 序列(每行按 io.input 顺序的 0/1\n"
" --step 单步:逐指令打印 pc/fn/反汇编/寄存器(跑 1 个周期)\n" " --step 单步:逐指令打印 pc/fn/反汇编/寄存器(跑 1 个周期)\n"
" --sidecar <path> 显式指定 I/O 绑定文件(缺省同名推导)\n"
" --help 打印本帮助\n"); " --help 打印本帮助\n");
} }
@@ -234,10 +235,12 @@ int main(int argc, char** argv) {
} }
const std::string stb_path = argv[1]; 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; uint32_t cycles = 10;
bool step_mode = false; bool step_mode = false;
std::string replay; std::string replay;
std::string sidecar_override;
for (int i = 2; i < argc; ++i) { for (int i = 2; i < argc; ++i) {
if (std::strcmp(argv[i], "--cycles") == 0 && i + 1 < argc) { if (std::strcmp(argv[i], "--cycles") == 0 && i + 1 < argc) {
cycles = static_cast<uint32_t>(std::stoul(argv[i + 1])); cycles = static_cast<uint32_t>(std::stoul(argv[i + 1]));
@@ -245,6 +248,8 @@ int main(int argc, char** argv) {
replay = argv[i + 1]; replay = argv[i + 1];
} else if (std::strcmp(argv[i], "--step") == 0) { } else if (std::strcmp(argv[i], "--step") == 0) {
step_mode = true; 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; return 1;
} }
// sidecar 路径推导<name>.stb → <name>.runtime.toml // sidecar 路径:--sidecar 显式指定,否则同名推导 <name>.stb → <name>.runtime.toml
std::string sidecar_path = stb_path; std::string sidecar_path = sidecar_override.empty()
const size_t dot = sidecar_path.find_last_of('.'); ? stb_path
if (dot != std::string::npos) { : sidecar_override;
sidecar_path = sidecar_path.substr(0, dot); 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; std::vector<Binding> bindings;
if (!parse_sidecar(sidecar_path, &bindings, &err)) { if (!parse_sidecar(sidecar_path, &bindings, &err)) {
std::fprintf(stderr, "error: %s\n", err.c_str()); std::fprintf(stderr, "error: %s\n", err.c_str());