阶段5-4:executor --sidecar 显式指定 I/O 绑定文件(缺省同名推导不变,向后兼容)
This commit is contained in:
@@ -7,7 +7,7 @@ BytecodeExecutor 模块:可执行入口。CMake 目标:`BytecodeExecutor`(
|
||||
## 用法
|
||||
|
||||
```text
|
||||
BytecodeExecutor <name>.stb [--cycles N] [--replay <file>] [--step]
|
||||
BytecodeExecutor <name>.stb [--cycles N] [--replay <file>] [--step] [--sidecar <path>]
|
||||
```
|
||||
|
||||
- `--cycles N`:跑 N 个周期(缺省 10)
|
||||
@@ -18,7 +18,7 @@ BytecodeExecutor <name>.stb [--cycles N] [--replay <file>] [--step]
|
||||
### sidecar 定位(当前 + 计划)
|
||||
|
||||
- **当前(已实现)**:sidecar 路径按「同名替换扩展名」推导——`<name>.stb` → `<name>.runtime.toml`。依据:sidecar 是编译产物的配对文件,同名约束由 STCompiler 写侧强制,约定即可。
|
||||
- **计划(未实现)**:加可选参数 `--sidecar <path>` 显式指定 I/O 绑定文件。适用场景:同一程序多套接线配置并存(厂内/现场不同 sidecar)、接线文件与 `.stb` 不同目录。缺省行为**不变**(未指定时回退到同名推导),向后兼容。
|
||||
- **已实现**:`--sidecar <path>` 显式指定 I/O 绑定文件。适用场景:同一程序多套接线配置并存(厂内/现场不同 sidecar)、接线文件与 `.stb` 不同目录。缺省行为**不变**(未指定时回退到同名推导),向后兼容。
|
||||
|
||||
## 职责
|
||||
|
||||
|
||||
+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