Files
Interpreter/Doc/isa/阶段1规格总览.md
T

100 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)
```text
字节 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 不运算
- **常量表**:条目 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)
```text
头 128B16 对齐):
0 magic "STSC"(不变)
4 version = 2V1=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/datan_i/n_q/n_m 保留恒 0
64 offset_slots 68 offset_values16 对齐)
72..103 型号标识 STATOR2
104 n_slots= n_globals + 实例/字段槽数) 108 values_size
112 offset_metav1=0 空段) 116 max_stack 120..127 预留 8B
段序:头 → 常量表 → 函数表 → 字节码 → 槽表段 → 值段 → 元数据段(v1 空)→ SHA-256[32]
```
## 6. machine.toml V2 schemaN5,阶段 1 内定)
阶段 1 重写指令配置.md 时定稿,方向已定:
```toml
[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`](指令编码.md) | 编码定案(前缀分区/func/fmt 位号/uses_*)——阶段 1 指令部分主依据 |
| [`指令集清单.md`](指令集清单.md) | 全指令编码表 + FB 字段布局终稿(§8.1) |
| [`指令集优化.md`](指令集优化.md) | 全部设计定案 + 决策历史(K/U/A/B/C 全闭合) |
| [`编译器优化.md`](../compiler/编译器优化.md) | 编译侧策略(FB 共享体/max_stack 职责/类型→func 映射) |