5.6 KiB
5.6 KiB
V2 规格总览(阶段 1 主参考)
状态:规格冻结,阶段 1 开工前的主参考文档。 本文汇总 V2 全部已定案设计,作为重写三份规范文档(指令与映像.md / 指令配置.md / stb文件格式.md)的依据。细节见各参考文档,本文只给"下一阶段要看什么、写什么"。
1. 阶段 1 任务
| 产出物 | 内容 | 依据 |
|---|---|---|
Doc/isa/指令与映像.md(重写为 V2) |
指令编码、数据模型、类型/func、调用栈、映像格式 | 本文 + 指令编码.md + 指令集清单.md |
Doc/isa/指令配置.md(重写为 V2) |
machine.toml V2 schema(本文唯一开放项 N5) | 本文 §6 |
Doc/isa/stb文件格式.md(重写为 V2) |
新 .stb 结构拆解(头 128B/段序/line1 字节) | 本文 §5 + 阶段 5 再补 line1 推演 |
阶段 1 完成后:V2 规格文档与代码蓝图自洽,进入阶段 2(isa 重构)。
2. 指令编码(定案,详见指令编码.md)
字节 0 = [前缀+形态分区 | op] 字节 1 = [func:4 | 空:4](空位 = N1,延后)
| 前缀 | 长度 | 形态 | op 空间 |
|---|---|---|---|
11 |
4B | RR | 6 位(用 21) |
10 |
4B | NONE | 6 位(用 2) |
011 |
8B | RRR | 5 位(用 26) |
010 000..101 |
8B | IMM/SLOT/JMP/JC/CALL/CAL | 2 位(用 8,全直推零查表) |
0010 |
16B | SLOT+off | 4 位(用 8) |
0011 |
16B | IMM64 | 4 位(用 1) |
0001 |
32B | 预留(N2) | 4 位(用 6) |
- func 位段:0..7 = 宽度×符号、8=F32、9=F64、无类型指令 = 0
- 位掩码推导:uses_rd/uses_ra/uses_rb 全部前缀直推
- 跳转/PC 字节单位(off32 相对下一条);code 段 16 对齐
3. 数据模型与类型(定案)
- 槽表(8B/条 {addr:u32, 预留:u32})→ 值区:两级间接;全 32 位寻址(槽 2^32、值区 4GB)
- 值区变宽紧凑:1/2/4/8B 对齐编译器保证(值段起点 16 对齐)
- 类型:19 IEC 类型 → 10 种 func 编译期映射;BOOL 编译器强制 0/1;字面量按上下文适配、默认 DINT 兜底;进制前缀 2#/8#/16#;禁隐式变量转换(编译期报错)
- DATE/TOD/DT:DATE=u32(天)、TOD=u32(当日 ms)、DT=u64 {date:32|tod:32} 拼接;v1 不运算(仅存取/比较);字面量 V2 支持(D#/TOD#/DT#,纪元 1970)
- 常量表:条目 8B 原始值(无 tag),LOADK 按 func 解释,同值多类型复用
4. 执行语义(定案)
- 寄存器:编号 8 位(256 = 寻址上限)、值 int64;帧按函数头 nregs 动态分配;调用约定 r0 结果 / r1..r7 参数 / r8+ 变量临时;CALL/RET 复制 r0..r7 全宽
- 调用栈(方案 C):递归 = 链接层环检测编译期报错;max_stack = MAIN + DAG 最坏路径 Σ(帧头 12B + nregs×8) 写入映像头 @116;预分配栈区、运行期零分配;溢出双检查(字节 + 深度 64);MAIN 帧常驻
- 整数除法(A 定案):除零 → 返回被除数;MIN/-1 → 饱和夹界(各宽度模板);截断除法(向零);MOD 符号随被除数
- 浮点:IEEE 754(溢出/零除 → ±inf、NaN 传播)
- TIME:+ - 比较;DATE/TOD/DT 不运算(仅存取/比较)
- 字段访问:LOAD/STORE 16B 变体(基槽 + 偏移)= 结构体 + FB 共享体统一(LOADF 取消)
- I/Q/M 合并:LOAD/STORE 两条;语义标签交 sidecar(绑定粒度 slot=槽号不变)
- 内建 FB:15 条(CAL + fb_id16);字段布局终稿见指令集清单 §8.1(含 SR/RS、PWM、RTC);RTC 用虚拟时钟(周期×dt_ms,确定性)
5. 映像格式(定案,详见指令集优化.md §2.5)
头 128B(16 对齐):
0 magic "STSC"(不变)
4 version = 2(V1=1)
8..71 cycle_limit/dt_ms/project_hash/entry_fn_id/n_globals/n_i/n_q/n_m/
n_consts/n_funcs + offset_const/funcs/code/fb/data(n_i/n_q/n_m 保留恒 0)
64 offset_slots 68 offset_values(16 对齐)
72..103 型号标识 STATOR2
104 n_slots(= n_globals + 实例/字段槽数) 108 values_size
112 offset_meta(v1=0 空段) 116 max_stack 120..127 预留 8B
段序:头 → 常量表 → 函数表 → 字节码 → 槽表段 → 值段 → 元数据段(v1 空)→ SHA-256[32]
6. machine.toml V2 schema(N5,阶段 1 内定)
阶段 1 重写指令配置.md 时定稿,方向已定:
[meta] # name="STATOR"、version=2
[[type]] # 19 条:name/width/signed/tag(func 值 0..18)/kind(int|uint|bit|float|time|date)
[[op]] # 按前缀分区:prefix/op/func/fmt 互锁校验
[[fb]] # 15 条:fb_id/name/字段列表(字段名+类型,布局规则 1/2/4/8 对齐)
7. 延后项(阶段 1 不处理)
| 项 | 内容 |
|---|---|
| N1 | 字节 1 空 4 位用途(待全部编码完后定) |
| N2 | 32B 组(0001)操作数形态(JTBL/STR_/ARR_) |
| N3 | 010 区子 op 2 位扩展策略 |
| N4 | 字符串/数组操作数区语义 |
| C5 | line1 推演重算(阶段 5) |
8. 参考文档索引
| 文档 | 角色 |
|---|---|
指令编码.md |
编码定案(前缀分区/func/fmt 位号/uses_*)——阶段 1 指令部分主依据 |
指令集清单.md |
全指令编码表 + FB 字段布局终稿(§8.1) |
指令集优化.md |
全部设计定案 + 决策历史(K/U/A/B/C 全闭合) |
编译器优化.md |
编译侧策略(FB 共享体/max_stack 职责/类型→func 映射) |