Фазы READ / WRITE
Двухфазный предохранитель: детерминированный ритм Decima-8
🔄 Канонический Tick (EV_FLASH)
graph LR
A[1. Setup] --> B[2. PHASE_READ]
B --> C[3. TURNAROUND]
C --> D[4. PHASE_WRITE]
D --> E[5. READOUT_SAMPLE]
E --> F[6. INTERPHASE_AUTORESET]
style A fill:#e1f5fe,stroke:#01579b
style B fill:#e8f5e9,stroke:#1b5e20
style C fill:#fff3e0,stroke:#e65100
style D fill:#fce4ec,stroke:#880e4f
style E fill:#f3e5f5,stroke:#4a148c
style F fill:#ffebee,stroke:#b71c1c
1️⃣ Setup (Conductor)
Действия
Conductor выставляет VSB_INGRESS16[0..7] (Level16)
Держит стабильным до конца апертуры READ
Требования
| Требование | Описание |
|---|---|
| Стабильность | Данные не меняются во время READ |
| Диапазон | Level16: 0..15 на каждой линии |
| Все 8 lane | Нет per-lane масок |
2️⃣ PHASE_READ (Island)
Начало READ
# Снимок locked для всех тайлов
locked_before[t] = locked[t]
# Вычисление ACTIVE closure (least fixed point)
ACTIVE[t] = вычислить по графу активации
# Если ACTIVE[t] == 0 → принудительный сброс
if ACTIVE[t] == 0:
thr_cur16[t] := 0
locked[t] := 0
drive_vec[t] := {0..0}
# веса/row/decay не применяются
Для ACTIVE[t] == 1
Чтение Входа
for i in 0..7:
in16[t][i] = clamp15(VSB_INGRESS16[i])
IN_CLIP[t][i] = (VSB_INGRESS16[i] > 15)
Если locked_before == 0
# 1. Row-pipeline (для каждой строки r=0..7)
row_raw_signed[r] = Σ_{i=0..7} (in16[i] * Wmag[r][i] * sign)
row16_out[r] = clamp15((max(row_raw_signed[r], 0) + 7) / 8)
row16_signed[r] = row_raw_signed[r]
# 2. Аккумулятор + decay
delta_raw = Σ_{r=0..7} row16_signed[r]
thr_tmp = thr_cur16 + delta_raw
# Decay к 0 (не перескакивает)
if decay16 > 0:
if thr_tmp > 0: thr_tmp = max(thr_tmp - decay16, 0)
elif thr_tmp < 0: thr_tmp = min(thr_tmp + decay16, 0)
thr_cur16 = clamp_range(thr_tmp, -32768, 32767)
# 3. Фьюз по диапазону
in_range = (thr_lo16 <= thr_cur16 <= thr_hi16) AND (thr_lo16 < thr_hi16)
has_signal = (delta_raw != 0)
entered_by_decay = (decay16 > 0) AND (in_range) AND (!in_range_before_decay)
locked_after = (BAKE_APPLIED == 1) AND in_range AND (has_signal OR entered_by_decay)
Если locked_before == 1
locked_after := 1
# thr_cur16 не меняется, матрица/decay не применяются
Выбор Drive Vector
if locked_after == 1:
drive_vec[i] = in16[i] # passthrough
else:
drive_vec[i] = row16_out[i]
3️⃣ TURNAROUND
Смена Направления
Conductor: снимает драйв VSB (Hi-Z / no-drive)
Island: включает драйв BUS16
Важно: Обязателен turnaround (зазор направления), чтобы Conductor отпустил VSB и Island мог её драйвить.
4️⃣ PHASE_WRITE (Island)
Условия Записи
Тайл пишет в BUS16 только если:
BUS_W == 1 AND (locked self OR locked_ancestor)
Запись
# Пишется весь drive_vec[0..7] (все 8 lane)
for t где BUS_W[t]==1 и (locked[t] или locked_ancestor[t]):
contrib += drive_vec[t]
# Честное суммирование
for i in 0..7:
BUS16[i] = clamp15(contrib[i])
BUS_CLIP[i] = (contrib[i] > 15)
5️⃣ READOUT_SAMPLE (Conductor)
Default R0_RAW_BUS
R0_RAW_BUS: readout = BUS16[0..7] как 8×Level16
Timing
Conductor читает BUS16 сразу после завершения PHASE_WRITE этого же EV_FLASH
В SHM: EV_FLASH заполняет OUT_buf, Conductor читает после возврата
6️⃣ INTERPHASE_AUTORESET (Опционально)
AutoReset-by-Fire
Применяется после фиксации readout и FLAGS32_LAST:
# Вычисление маски авто-сброса
AUTO_RESET_MASK16 = OR_{d | cnt(d)>0} reset_on_fire_mask16[winner(d)]
# Применение
apply_reset_domain(AUTO_RESET_MASK16)
Эффект
Для доменов в маске:
thr_cur16 := 0
locked := 0
# Кроме тайла-сбрасывателя и цепочки его предков
⏱️ Тайминги (Референс)
| Фаза | Длительность |
|---|---|
| READ | ~10µs |
| TURNAROUND | ~2µs |
| WRITE | ~8µs |
| READOUT | ~1µs |
| AUTORESET | ~1µs |
| Total | ~22µs |
Примечание: Тайминги зависят от реализации (эмулятор/PCB/FPGA/ASIC).
🚫 Ограничения
| Ограничение | Описание |
|---|---|
| EV_RESET_DOMAIN | Только между EV_FLASH |
| EV_BAKE | Только между EV_FLASH |
| BAKE_APPLIED | EV_FLASH разрешён только если BAKE_APPLIED==1 |
| Нет изменений baked | Внутри EV_FLASH baked-параметры не меняются |
📊 FLAGS32 (Runtime)
Island отдаёт FLAGS32 (минимум):
| Бит | Флаг | Описание |
|---|---|---|
| bit0 | READY_LAST | Последний цикл завершён |
| bit1 | OVF_ANY_LAST | Переполнение в последнем цикле |
| bit2 | COLLIDE_ANY_LAST | Коллизия в последнем цикле |
Bake the Future. Build the Substrate. 🛠️⚡️