Протокол v0.2
Event Protocol / SHM ABI / UDP
📡 Внешние События (API)
EV_FLASH(tag_u32)
| Параметр |
Описание |
| Назначение |
Один детерминированный цикл READ→WRITE |
| Возврат |
readout (R0/R1), FLAGS читаются отдельно |
| Условие |
Разрешён только если BAKE_APPLIED==1 |
if BAKE_APPLIED == 0:
return NotBaked # состояние не меняется
# Выполняет PHASE_READ → TURNAROUND → PHASE_WRITE → READOUT_SAMPLE
# Заполняет OUT_buf
return readout, FLAGS32
EV_RESET_DOMAIN(mask16)
| Параметр |
Описание |
| Назначение |
Сброс доменов (thr_cur16=0, locked=0) |
| Условие |
Только между EV_FLASH |
| Условие |
Только если BAKE_APPLIED==1 |
if BAKE_APPLIED == 0:
return NotBaked
for tile in tiles:
if (mask16 >> domain_id4[tile]) & 1:
thr_cur16[tile] := 0
locked[tile] := 0
EV_BAKE()
| Параметр |
Описание |
| Назначение |
Применение staging BakeBlob атомарно |
| Условие |
Только между EV_FLASH |
| Эффект |
Делает reset runtime после применения |
if BAKE_APPLIED == 0:
return NotBaked
# Применяет staging BakeBlob атомарно
if validation_error:
return error # ничего не меняет
# При успехе:
reset_runtime() # thr_cur16=0, locked=0 для всех
BAKE_APPLIED := 1
🔄 Внутренние Подфазы EV_FLASH
graph LR
A[1. PHASE_READ] --> B[2. TURNAROUND]
B --> C[3. PHASE_WRITE]
C --> D[4. READOUT_SAMPLE]
D --> E[5. INTERPHASE_AUTORESET]
style A fill:#e8f5e9
style B fill:#fff3e0
style C fill:#fce4ec
style D fill:#f3e5f5
style E fill:#ffebee
| Подфаза |
Описание |
| PHASE_READ |
Тайлы семплируют вход, обновляют runtime |
| TURNAROUND |
Conductor: Hi-Z, Island: prepare drive |
| PHASE_WRITE |
Island драйвит BUS16 |
| READOUT_SAMPLE |
Conductor читает BUS16 |
| INTERPHASE_AUTORESET |
Опциональный сброс доменов |
📊 Readout Timing
Default R0_RAW_BUS
Conductor читает BUS16[0..7] сразу после завершения PHASE_WRITE
В SHM: EV_FLASH заполняет OUT_buf
Conductor читает после возврата из вызова
readout = BUS16[0..7] как 8×Level16
🚨 Ошибки EV_BAKE
| Ошибка |
Код |
Описание |
| OK |
0 |
Успех |
| BakeBadMagic |
1 |
Неверный magic |
| BakeBadVersion |
2 |
Неверная версия |
| BakeBadLen |
3 |
Неверная длина |
| BakeMissingTLV |
4 |
Отсутствует обязательный TLV |
| BakeBadTLVLen |
5 |
Неверная длина TLV |
| BakeCRCFail |
6 |
Ошибка CRC |
| BakeReservedNonZero |
7 |
Reserved поля не нули |
| TopologyMismatch |
8 |
Несоответствие топологии |
| BakeNoBlob |
9 |
Blob отсутствует |
🎛️ Runtime FLAGS32
Island отдаёт FLAGS32 (минимум):
| Бит |
Флаг |
Описание |
| bit0 |
READY_LAST |
Последний цикл завершён |
| bit1 |
OVF_ANY_LAST |
Переполнение в последнем цикле |
| bit2 |
COLLIDE_ANY_LAST |
Коллизия в последнем цикле |
🌐 UDP Protocol (packet_v1)
Каскадирование машин
Формат Пакета (37 bytes)
| Offset |
Поле |
Тип |
Описание |
| 0 |
magic |
u32 |
'D8UP' (0x50553844) |
| 4 |
version |
u16 |
1 |
| 6 |
flags |
u16 |
has_winner, has_bus, has_cycle, has_flags |
| 8 |
frame_tag |
u32 |
Тег кадра |
| 12 |
domain_id |
u8 |
ID домена |
| 13 |
pattern_id |
u16 |
ID паттерна |
| 15 |
reset_mask16 |
u16 |
Маска сброса |
| 17 |
collision_mask16 |
u16 |
Маска коллизий |
| 19 |
winner_tile_id |
u16 |
ID победителя |
| 21 |
cycle_time_us |
u32 |
Время цикла |
| 25 |
flags32_last |
u32 |
FLAGS последнего цикла |
| 29 |
bus16[8] |
u8×8 |
Значения шины |
Flags (u16)
| Бит |
Флаг |
Описание |
| bit0 |
has_winner |
winner_tile_id/pattern_id валидны |
| bit1 |
has_bus |
bus16[8] валидны |
| bit2 |
has_cycle |
cycle_time_us валиден |
| bit3 |
has_flags |
flags32_last валиден |
Примечания
reset_mask16 задаёт домены для RESET_DOMAIN
collision_mask16/winner_tile_id/pattern_id валидны если flags has_winner
bus16 валиден если flags has_bus
cycle_time_us валиден если flags has_cycle
flags32_last валиден если flags has_flags
🎯 COLLIDE: Домены и Winner
Определения
FIRE(t) = (locked_before[t]==0 && locked_after[t]==1)
FIRED_SET(d) = { t | domain_id(t)=d && FIRE(t)=1 }
cnt(d) = |FIRED_SET(d)|
Правила
| cnt(d) |
Winner |
COLLIDE(d) |
| 0 |
нет |
0 |
| 1 |
единственный |
0 |
| ≥2 |
выбирается |
1 |
Выбор Winner (при cnt≥2)
1. max priority8
2. при равенстве min tile_id
winner(d) = argmax_{t∈FIRED_SET(d)} (priority8(t), -tile_id(t))
🔄 AutoReset-by-Fire
Маска Авто-Reset
AUTO_RESET_MASK16 = OR_{d | cnt(d)>0} reset_on_fire_mask16[winner(d)]
Применение
Применяется строго после READOUT_SAMPLE текущего EV_FLASH
apply_reset_domain(AUTO_RESET_MASK16)
Эффект: как 6.3 для доменов в маске, КРОМЕ:
- тайла-сбрасывателя
- всей цепочки его предков
📐 Readout Policy
Default: R0_RAW_BUS
mode = 0
readout = BUS16[0..7]
Опционально: R1_DOMAIN_WINNER_ID32
mode = 1
readout = winner_tile_id (требует дисциплины "только winner драйвит ID")
Примечание: R1 требует чтобы только winner драйвил ID, иначе сумма разрушит ID.
📋 Bake Transaction / CFG Staging
Staging Buffer
CFG_CS, CFG_SCLK, CFG_MOSI, CFG_MISO
Через CFG:
- загрузка BakeBlob в staging
- чтение FLAGS
- команда EV_RESET_DOMAIN(mask16)
- (опционально) чтение BAKE_ID_ACTIVE / PROFILE_ID_ACTIVE
Bake the Future. Build the Substrate. 🛠️⚡️