add dir for future plan
This commit is contained in:
+369
@@ -0,0 +1,369 @@
|
|||||||
|
# 时序控制专用 IL 规范(草案 v0.1)
|
||||||
|
|
||||||
|
## 1. 概述
|
||||||
|
|
||||||
|
本 IL(Intermediate Language)设计用于 i 线曝光机的实时运动控制与时序协调系统。它是一个**无分支、无跳转、无堆内存**的直线执行字节码,适用于确定性实时控制场景。
|
||||||
|
|
||||||
|
### 1.1 设计原则
|
||||||
|
- **极简性**:无分支/跳转/循环,所有指令直线执行
|
||||||
|
- **确定性**:固定长度指令(32-bit),WCET 可精确计算
|
||||||
|
- **时间驱动**:所有动作通过时间戳对齐,而非依赖/分支控制
|
||||||
|
- **安全性**:静态验证,无动态内存分配
|
||||||
|
|
||||||
|
### 1.2 适用场景
|
||||||
|
- 多坐标系时序协调
|
||||||
|
- 运动控制序列生成
|
||||||
|
- IO 触发与数据采集
|
||||||
|
- 轻量级数学运算(定点/简单序列生成)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Bundle 结构
|
||||||
|
|
||||||
|
一个完整的传输单元称为 **Bundle**,包含三部分:
|
||||||
|
|
||||||
|
```
|
||||||
|
+----------------+
|
||||||
|
| Header | 固定大小(建议 32 字节)
|
||||||
|
+----------------+
|
||||||
|
| .data 段 | 可变长度,4B 对齐
|
||||||
|
+----------------+
|
||||||
|
| .instruction 段| 可变长度,每条指令 4B
|
||||||
|
+----------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2.1 Header(32 字节)
|
||||||
|
|
||||||
|
| 偏移 | 大小 | 字段名 | 说明 |
|
||||||
|
|------|------|---------------------|-------------------------------------------|
|
||||||
|
| 0 | 4 | `magic` | 魔数,建议 `0x58494C31` ("XIL1") |
|
||||||
|
| 4 | 2 | `proto_ver` | 协议版本,例如 `0x0001` |
|
||||||
|
| 6 | 2 | `bundle_type` | 包类型(运动/IO/通用) |
|
||||||
|
| 8 | 8 | `execute_at_tick` | 绝对执行时刻(64-bit tick) |
|
||||||
|
| 16 | 2 | `data_slot_count` | `.data` 段 slot 数量 |
|
||||||
|
| 18 | 2 | `instruction_count` | `.instruction` 段指令条数 |
|
||||||
|
| 20 | 4 | `flags` | 预留标志位 |
|
||||||
|
| 24 | 4 | `data_crc` | `.data` 段 CRC32 |
|
||||||
|
| 28 | 4 | `bundle_crc` | 整个 bundle CRC32(不含此字段本身) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. .data 段
|
||||||
|
|
||||||
|
### 3.1 Slot 模型
|
||||||
|
- **最小粒度**:4 字节(32-bit slot)
|
||||||
|
- **寻址方式**:所有指令通过 `slotIndex`(u8 或 u16)引用
|
||||||
|
- **对齐规则**:
|
||||||
|
- 所有对象起始地址必须是 4B 的倍数(slot 对齐)
|
||||||
|
- 大对象可跨越多个 slot
|
||||||
|
- 如需更高对齐(8/16B),由 assembler 插入 padding slot
|
||||||
|
|
||||||
|
### 3.2 支持的类型
|
||||||
|
|
||||||
|
| 类型名 | 大小(slot) | 对齐(slot) | 说明 |
|
||||||
|
|------------------|--------------|--------------|-----------------------------------|
|
||||||
|
| `INT32` / `U32` | 1 | 1 | 有符号/无符号 32 位整数 |
|
||||||
|
| `INT64` / `U64` | 2 | 2 | 64 位整数(占 2 个 slot) |
|
||||||
|
| `FLOAT32` | 1 | 1 | IEEE 754 单精度浮点(可选支持) |
|
||||||
|
| `MOTION_PROFILE` | N | 1 | 运动参数结构体(可扩展) |
|
||||||
|
| `VEC2` | 2 | 1 | 二维向量(2×i32 或 2×f32) |
|
||||||
|
| `ARRAY[N]` | N | 1 | 定长数组(每个元素 1 slot) |
|
||||||
|
|
||||||
|
### 3.3 示例
|
||||||
|
|
||||||
|
```asm
|
||||||
|
.data
|
||||||
|
MOTION_PROFILE profile {
|
||||||
|
steps = 10,
|
||||||
|
direction = 0,
|
||||||
|
mode = 0
|
||||||
|
} ; slot 0 ~ slot N-1
|
||||||
|
INT32 tick 100 ; slot N
|
||||||
|
INT32 end 0 ; slot N+1
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Instruction 段
|
||||||
|
|
||||||
|
### 4.1 指令格式(固定 32-bit)
|
||||||
|
|
||||||
|
```
|
||||||
|
+-------+-------+-------+-------+
|
||||||
|
| set | op | a | b |
|
||||||
|
| byte0 | byte1 | byte2 | byte3 |
|
||||||
|
+-------+-------+-------+-------+
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 字段说明
|
||||||
|
- `set`(byte0):指令集/域(Instruction Set)
|
||||||
|
- `op`(byte1):域内操作码(Operation)
|
||||||
|
- `a`(byte2):参数 A(8-bit)
|
||||||
|
- `b`(byte3):参数 B(8-bit)
|
||||||
|
|
||||||
|
#### 参数解释规则
|
||||||
|
每条指令的 `(a, b)` 解释方式由 `(set, op)` 唯一确定:
|
||||||
|
- **双参数模式**:`a` 和 `b` 分别作为两个 u8 参数
|
||||||
|
- **单参数模式**:`imm16 = a | (b << 8)`(小端序)
|
||||||
|
|
||||||
|
**禁止同一 opcode 混用两种解释方式。**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4.2 指令集分类(set 域)
|
||||||
|
|
||||||
|
| set 值 | 域名 | 说明 |
|
||||||
|
|--------|--------|------------------------|
|
||||||
|
| `0x00` | TIME | 时间控制与同步 |
|
||||||
|
| `0x10` | MOTION | 运动控制 |
|
||||||
|
| `0x20` | SYS | 系统参数读写 |
|
||||||
|
| `0x30` | IO | IO 控制与数据上报 |
|
||||||
|
| `0xF0` | META | 元指令(END/NOP/FAULT)|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4.3 指令表(最小集合示例)
|
||||||
|
|
||||||
|
#### TIME 域(0x00)
|
||||||
|
|
||||||
|
| op | 助记符 | 参数 | 说明 |
|
||||||
|
|------|--------------|--------------|---------------------------------------|
|
||||||
|
| 0x00 | `AT_TICK` | `imm16` | 等待直到绝对 tick,`imm16=slotIndex` |
|
||||||
|
| 0x01 | `WAIT_DT` | `imm16` | 相对等待 dt tick |
|
||||||
|
|
||||||
|
**编码示例**:
|
||||||
|
```asm
|
||||||
|
AT_TICK tick ; 编码:0x00 0x00 [tick_slot_lo] [tick_slot_hi]
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### MOTION 域(0x10)
|
||||||
|
|
||||||
|
| op | 助记符 | 参数 | 说明 |
|
||||||
|
|------|----------------|-----------|----------------------------------------|
|
||||||
|
| 0x00 | `AXIS_MOVE` | `a` | 执行运动,参数 `a=profile_slotIndex` |
|
||||||
|
| 0x01 | `AXIS_STOP` | `a` | 停止轴,参数 `a=axis_id` |
|
||||||
|
| 0x02 | `AXIS_START` | `a` | 启动轴队列 |
|
||||||
|
|
||||||
|
**编码示例**:
|
||||||
|
```asm
|
||||||
|
AXIS_MOVE profile ; 编码:0x10 0x00 [profile_slot] 0x00
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### SYS 域(0x20)
|
||||||
|
|
||||||
|
| op | 助记符 | 参数 | 说明 |
|
||||||
|
|------|--------------|-----------|----------------------------------------------|
|
||||||
|
| 0x00 | `READ_SYS` | `a, b` | 读取系统参数,`a=dst_slot`, `b=sys_id` |
|
||||||
|
| 0x01 | `WRITE_SYS` | `a, b` | 写入系统参数 |
|
||||||
|
|
||||||
|
**系统参数 ID(b)**:
|
||||||
|
- `0x00`:`SYS_TICK`(当前 tick)
|
||||||
|
- `0x01`:`SYS_STATUS`(设备状态)
|
||||||
|
- ...(可扩展)
|
||||||
|
|
||||||
|
**编码示例**:
|
||||||
|
```asm
|
||||||
|
READ_SYS end SYS_TICK ; 编码:0x20 0x00 [end_slot] 0x00
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### IO 域(0x30)
|
||||||
|
|
||||||
|
| op | 助记符 | 参数 | 说明 |
|
||||||
|
|------|--------------|-----------|-------------------------------------------|
|
||||||
|
| 0x00 | `IO_SET` | `a, b` | 设置 IO,`a=pin`, `b=value` |
|
||||||
|
| 0x01 | `REPORT` | `a` | 上报数据,`a=src_slot` |
|
||||||
|
| 0x02 | `SAMPLE` | `a, b` | 采样,`a=chan`, `b=dst_slot` |
|
||||||
|
|
||||||
|
**编码示例**:
|
||||||
|
```asm
|
||||||
|
REPORT end ; 编码:0x30 0x01 [end_slot] 0x00
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### META 域(0xF0)
|
||||||
|
|
||||||
|
| op | 助记符 | 参数 | 说明 |
|
||||||
|
|------|----------|------|------------------|
|
||||||
|
| 0x00 | `END` | 无 | 指令流结束 |
|
||||||
|
| 0x01 | `NOP` | 无 | 空操作 |
|
||||||
|
|
||||||
|
**编码示例**:
|
||||||
|
```asm
|
||||||
|
END ; 编码:0xF0 0x00 0x00 0x00
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 完整示例
|
||||||
|
|
||||||
|
### 5.1 汇编源码
|
||||||
|
|
||||||
|
```asm
|
||||||
|
; 等待到指定 tick,执行一次运动,记录结束时刻并上报
|
||||||
|
|
||||||
|
.bundle t=123456 type=MOTION
|
||||||
|
|
||||||
|
.data
|
||||||
|
MOTION_PROFILE profile {
|
||||||
|
steps = 10,
|
||||||
|
direction = 0,
|
||||||
|
mode = OPEN_LOOP
|
||||||
|
} ; slot 0
|
||||||
|
INT32 tick 100 ; slot 1
|
||||||
|
INT32 end 0 ; slot 2
|
||||||
|
|
||||||
|
.instruction
|
||||||
|
AT_TICK tick ; 等待到 tick=100
|
||||||
|
AXIS_MOVE profile ; 执行运动
|
||||||
|
READ_SYS end SYS_TICK ; 读取当前 tick 到 end
|
||||||
|
REPORT end ; 上报 end
|
||||||
|
END ; 结束
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5.2 二进制布局(示意)
|
||||||
|
|
||||||
|
#### Header(32 字节)
|
||||||
|
```
|
||||||
|
58 49 4C 31 00 01 00 01 00 01 E2 40 00 00 00 00
|
||||||
|
03 00 05 00 00 00 00 00 XX XX XX XX YY YY YY YY
|
||||||
|
```
|
||||||
|
- magic: `XIL1`
|
||||||
|
- proto_ver: `0x0001`
|
||||||
|
- bundle_type: `0x0001`(MOTION)
|
||||||
|
- execute_at_tick: `123456`
|
||||||
|
- data_slot_count: `3`
|
||||||
|
- instruction_count: `5`
|
||||||
|
- CRC 略
|
||||||
|
|
||||||
|
#### .data 段(3 slots × 4 bytes = 12 bytes)
|
||||||
|
```
|
||||||
|
; slot 0: MOTION_PROFILE(示意,实际结构依实现)
|
||||||
|
0A 00 00 00 ; steps=10
|
||||||
|
00 00 00 00 ; direction=0, mode=0
|
||||||
|
|
||||||
|
; slot 1: tick=100
|
||||||
|
64 00 00 00
|
||||||
|
|
||||||
|
; slot 2: end=0
|
||||||
|
00 00 00 00
|
||||||
|
```
|
||||||
|
|
||||||
|
#### .instruction 段(5 条 × 4 bytes = 20 bytes)
|
||||||
|
```
|
||||||
|
00 00 01 00 ; AT_TICK slot[1]
|
||||||
|
10 00 00 00 ; AXIS_MOVE slot[0]
|
||||||
|
20 00 02 00 ; READ_SYS slot[2], SYS_TICK
|
||||||
|
30 01 02 00 ; REPORT slot[2]
|
||||||
|
F0 00 00 00 ; END
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 校验与安全
|
||||||
|
|
||||||
|
### 6.1 静态验证(加载阶段)
|
||||||
|
- Header CRC 校验
|
||||||
|
- `data_slot_count` 与实际长度一致性
|
||||||
|
- `instruction_count` 与实际条数一致性
|
||||||
|
- 所有 slotIndex 不越界(`< data_slot_count`)
|
||||||
|
- 所有 `(set, op)` 在白名单内
|
||||||
|
|
||||||
|
### 6.2 运行时保护
|
||||||
|
- 执行时间上限(timeout)
|
||||||
|
- 状态机约束(例如未 Homed 禁止 MOTION)
|
||||||
|
- 参数范围校验(速度/加速度/行程边界)
|
||||||
|
- 看门狗与硬件急停链路
|
||||||
|
|
||||||
|
### 6.3 错误处理
|
||||||
|
- 验证失败:拒绝加载,返回错误码
|
||||||
|
- 执行超时:触发 FAULT,进入安全态
|
||||||
|
- 非法 opcode:触发 FAULT
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. 工具链
|
||||||
|
|
||||||
|
### 7.1 Assembler(文本 → 二进制)
|
||||||
|
- 输入:`.asm` 汇编文本
|
||||||
|
- 输出:`.bin` bundle 二进制
|
||||||
|
- 功能:
|
||||||
|
- 符号表管理(slotIndex 分配)
|
||||||
|
- CRC 自动计算
|
||||||
|
- 对齐与 padding 插入
|
||||||
|
|
||||||
|
### 7.2 Disassembler(二进制 → 文本)
|
||||||
|
- 输入:`.bin` bundle 或抓包数据
|
||||||
|
- 输出:可读汇编文本
|
||||||
|
- 功能:
|
||||||
|
- 指令解码
|
||||||
|
- slotIndex 显示(可选符号名)
|
||||||
|
- CRC 验证
|
||||||
|
|
||||||
|
### 7.3 Debugger / Simulator(可选)
|
||||||
|
- 离线模拟执行
|
||||||
|
- 单步调试
|
||||||
|
- 时间轴可视化
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 扩展与版本化
|
||||||
|
|
||||||
|
### 8.1 版本控制
|
||||||
|
- 每个 bundle 携带 `proto_ver`
|
||||||
|
- 节点启动时上报支持的版本列表
|
||||||
|
- 主控拒绝不兼容版本的 bundle
|
||||||
|
|
||||||
|
### 8.2 向后兼容策略
|
||||||
|
- 新增 opcode 分配到未使用的 `(set, op)`
|
||||||
|
- 已有 opcode 语义不变
|
||||||
|
- 大版本变更时允许不兼容
|
||||||
|
|
||||||
|
### 8.3 未来扩展点
|
||||||
|
- 子过程/宏指令(`CALL_MACRO`)
|
||||||
|
- 条件执行(predication,非跳转)
|
||||||
|
- 多轴并行编排(multi-axis bundle)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. 附录
|
||||||
|
|
||||||
|
### 9.1 字节序
|
||||||
|
- 所有多字节字段使用**小端序(Little-Endian)**
|
||||||
|
|
||||||
|
### 9.2 Tick 分辨率
|
||||||
|
- 建议:1 tick = 1 µs 或 10 µs
|
||||||
|
- 由系统配置决定,在文档中明确
|
||||||
|
|
||||||
|
### 9.3 MOTION_PROFILE 结构(示例)
|
||||||
|
```c
|
||||||
|
struct MotionProfile {
|
||||||
|
int32_t steps; // 步数
|
||||||
|
uint8_t direction; // 方向:0=负,1=正
|
||||||
|
uint8_t mode; // 模式:0=开环,1=闭环
|
||||||
|
uint16_t reserved; // 预留
|
||||||
|
int32_t velocity; // 速度(可选)
|
||||||
|
int32_t acceleration; // 加速度(可选)
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. 参考文献与致谢
|
||||||
|
- VLIW 架构设计原则
|
||||||
|
- PLC 微编程语言
|
||||||
|
- 实时系统可验证字节码设计
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**文档版本**:v0.1
|
||||||
|
**最后更新**:2026-01-25
|
||||||
|
**维护者**:[你的团队名称]
|
||||||
+111
@@ -0,0 +1,111 @@
|
|||||||
|
# ngra 技术构想与里程碑路线图(草案)
|
||||||
|
|
||||||
|
> 当前阶段:项目尚在早期准备期(正则状态机 + CPU 线代库同步开发),
|
||||||
|
> ngra 核心尚未正式开工,因此本文仅作为整体方向与路线规划。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. ngra 的核心定位
|
||||||
|
|
||||||
|
ngra 是一个以 **“语法岛划分 + token 序列驱动”** 为核心的结构化前端系统,
|
||||||
|
目标是支持多语言解析、可扩展语义分析,并最终作为跨语言编译链的一部分。
|
||||||
|
|
||||||
|
核心原则:
|
||||||
|
|
||||||
|
- 强制内置 token 集,避免不受控的字符正则扩展
|
||||||
|
- 规则描述以 **token 序列 + 结构规则** 为主
|
||||||
|
- 优先工程可行性与可维护性,而非极端语法自由度
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. 解析策略
|
||||||
|
|
||||||
|
### 2.1 语法岛 + 并行语义模型
|
||||||
|
- **第一阶段:语法岛划分**
|
||||||
|
- 得到最外层符号结构(schema / entity / function / block 等)
|
||||||
|
- **第二阶段:并行语义分析**
|
||||||
|
- 岛屿之间并行解析与语义分析
|
||||||
|
- 外层上下文以只读快照共享
|
||||||
|
|
||||||
|
### 2.2 宏处理策略
|
||||||
|
- 宏视为结构级符号
|
||||||
|
- 进行“替换 → 局部重解析”
|
||||||
|
- 避免在完整语法解析中引入宏的动态不确定性
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. 输出形式
|
||||||
|
|
||||||
|
ngra 的输出形态计划分为两级:
|
||||||
|
|
||||||
|
- **High AST**:语义节点
|
||||||
|
- **Low-level C# AST**:可降级、可转译的中间表示
|
||||||
|
|
||||||
|
后续可进一步扩展为 LLVM-like IR 或面向 GLSL 的特化 IR。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. 里程碑路线图(先 EXPRESS 后 Lua)
|
||||||
|
|
||||||
|
### 里程碑 1:EXPRESS 前端(ISO 10303-11)
|
||||||
|
**目标**:解决 STEP 文件解析的关键技术依赖
|
||||||
|
**原因**:EXPRESS 是 STEP 模型解释的核心语言,必须优先完成
|
||||||
|
|
||||||
|
交付内容:
|
||||||
|
- EXPRESS 的 token 规则集
|
||||||
|
- 语法岛划分策略(schema / entity / type / rule)
|
||||||
|
- EXPRESS AST + 语义检查(最小闭环)
|
||||||
|
- STEP 文件解析所需的语义映射基础
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 里程碑 2:Lua 前端(通用前端验证)
|
||||||
|
**目标**:验证 ngra 可作为图灵完备语言前端
|
||||||
|
**理由**:Lua 语法稳定、结构清晰,适合验证通用性
|
||||||
|
|
||||||
|
交付内容:
|
||||||
|
- Lua 最小子集语法
|
||||||
|
- Lua AST → Low-level C# AST
|
||||||
|
- 最小执行闭环(不依赖外部解释器)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 里程碑 3:内部脚本系统
|
||||||
|
**目标**:将 ngra 发展为可扩展脚本前端
|
||||||
|
|
||||||
|
交付内容:
|
||||||
|
- 统一 AST/IR 接口
|
||||||
|
- Low-level C# 执行/编译通道
|
||||||
|
- 标准化 token / 规则机制
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 里程碑 4:C# → GLSL(GPGPU 编译链)
|
||||||
|
**目标**:将符合约束的 C# 子集转译为着色器语言
|
||||||
|
|
||||||
|
交付内容:
|
||||||
|
- C# 可转译子集规范
|
||||||
|
- Low-level C# → GLSL 编译器
|
||||||
|
- GPGPU 运行时绑定支持
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. 当前阶段说明
|
||||||
|
|
||||||
|
当前阶段尚处于准备期:
|
||||||
|
|
||||||
|
- 正则状态机仍在开发
|
||||||
|
- 同时进行 CPU 线性代数库开发
|
||||||
|
- ngra 核心尚未正式启动
|
||||||
|
|
||||||
|
因此本文仅作为 **方向与路线规划**,具体实现细节将在核心启动后展开。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. 后续可展开内容(待定)
|
||||||
|
|
||||||
|
- EXPRESS 最小语法子集
|
||||||
|
- Lua 最小可运行语法集
|
||||||
|
- Low-level C# AST 草图
|
||||||
|
- C# → GLSL 子集约束清单
|
||||||
|
- 规则 DSL 草案
|
||||||
Reference in New Issue
Block a user