OR-1 dataflow CPU sketch

docs: update CLAUDE.md and PE class docstring for Phase 3 code review

- CLAUDE.md line 166: Update FrameOp enum documentation to include ALLOC_SHARED and FREE_LANE
- CLAUDE.md lines 292-293: Update FrameAllocated and FrameFreed event signatures to include lane and frame_freed fields
- emu/pe.py class docstring: Update Manages section to reflect current 3D match storage, lane_free tracking, and lane_count

Orual a2f3f878 e7b0445e

+8 -6
+3 -3
CLAUDE.md
··· 163 163 - `FrameSlotValue = int | FrameDest | None` -- type alias for frame slot contents 164 164 - `OutputStyle` enum -- INHERIT, CHANGE_TAG, SINK for output routing decisions 165 165 - `TokenKind` enum -- DYADIC, MONADIC, INLINE for token kind classification 166 - - `FrameOp(IntEnum)` -- ALLOC, FREE for frame lifecycle control tokens 166 + - `FrameOp(IntEnum)` -- ALLOC, FREE, ALLOC_SHARED, FREE_LANE for frame lifecycle control tokens 167 167 - `is_monadic_alu(op: ALUOp) -> bool` -- canonical source of truth for monadic ALU op classification (used by `emu/pe.py` and `asm/opcodes.py`) 168 168 169 169 ### ALU (emu/alu.py) ··· 289 289 - `Executed(time, component, op, result, bool_out)` -- PE executed an ALU instruction 290 290 - `Emitted(time, component, token)` -- PE emitted an output token 291 291 - `IRAMWritten(time, component, offset, count)` -- PE wrote instructions to IRAM 292 - - `FrameAllocated(time, component, act_id, frame_id)` -- PE allocated a frame 293 - - `FrameFreed(time, component, act_id, frame_id)` -- PE freed a frame 292 + - `FrameAllocated(time, component, act_id, frame_id, lane)` -- PE allocated a frame (lane indicates which matching lane was assigned) 293 + - `FrameFreed(time, component, act_id, frame_id, lane, frame_freed)` -- PE freed a frame lane (frame_freed=True if physical frame returned to pool) 294 294 - `FrameSlotWritten(time, component, frame_id, slot, value)` -- PE wrote to a frame slot 295 295 - `TokenRejected(time, component, token, reason)` -- PE rejected a token (e.g., act_id not in tag store) 296 296 - `CellWritten(time, component, addr, old_pres, new_pres)` -- SM cell presence changed
+5 -3
emu/pe.py
··· 39 39 40 40 Manages: 41 41 - Frame store: [frame_count][frame_slots] dense per-activation data 42 - - Tag store: act_id → frame_id mapping 43 - - Presence bits: [frame_count][matchable_offsets] for dyadic matching 44 - - Port store: [frame_count][matchable_offsets] for port metadata 42 + - Tag store: act_id → (frame_id, lane) mapping 43 + - Match data: [frame_id][matchable_offsets][lane_count] for operand values 44 + - Presence bits: [frame_id][matchable_offsets][lane_count] for dyadic matching 45 + - Port store: [frame_id][matchable_offsets][lane_count] for port metadata 46 + - Lane free: per-frame set of available lane IDs 45 47 - Free frames: pool of available frame IDs 46 48 47 49 Pipeline (per token):