| # MACROGROK β AGC-Inspired Fixed-Point Macro-Model | |
| Patent Pending β BEL ESPRIT D ACCORD TRUST HOLDINGS INC. | |
| Extremely constrained, narrow-task models for 15-bit / Qm.n environments. Code lives in ROM, state in ~2K erasable words. Every bit is budgeted. | |
| ## 1. Model Purpose & Scope | |
| * Single, narrowly defined task: attitude correction, trajectory offset, binary/multi-class decision, low-dimensional control law. | |
| * No general-purpose LM or large feature spaces. | |
| * Input/output dimensions very small (typically β€ 8β16). | |
| ## 2. Numeric Representation | |
| * Word: 15-bit data (modern 16-bit with 1-bit reserved). | |
| * Fixed-point Qm.n (e.g., Q1.14, Q3.12, Q7.8) chosen per variable, scale documented per quantity. | |
| * Double/triple precision only where required. | |
| * Saturation handling: clamp, wrap, or flag β defined per variable. | |
| ## 3. Memory Layout | |
| **Erasable (RAM) β ~2K words target:** | |
| State vector, input buffer, accumulators, flags/mode bits, tiny stack. | |
| **Fixed (ROM) β majority:** | |
| Model constants (weights/biases, lookup tables, scale factors), code/macros, pre-computed coefficients. Bank/segment switching optional. | |
| ## 4. Core Data Structures | |
| ``` | |
| STATE : fixed-point vector (persistent) | |
| INPUT : fixed-point vector (current observation) | |
| OUTPUT : fixed-point vector or discrete command | |
| ACC : accumulator(s) β single/double precision | |
| SCALES : constant scale factors | |
| FLAGS : mode, validity, saturation bits | |
| ``` | |
| ## 5. Macro Routine Categories | |
| `LOAD_INPUT` / `SCALE_INPUT` Β· `MATVEC_TINY` / `DOT_PRODUCT_FIXED` (unrolled) Β· `LOOKUP_SEGMENT` / `PIECEWISE_LINEAR` Β· `ACTIVATE` (clip/ReLU/threshold) Β· `UPDATE_STATE` Β· `NORMALIZE`/`RESCALE` Β· `SATURATE` Β· `EMIT_OUTPUT` | |
| Macros expand to shifts, adds, MUL16, and table lookups β no floating point. | |
| ## 6. Forward Pass | |
| ``` | |
| 1. Acquire and scale input β INPUT | |
| 2. Optional tiny feature transform | |
| 3. Core block(s) (mat-vec + nonlinearity, macro-expanded) | |
| 4. State update (if recurrent) | |
| 5. Output scaling + saturation | |
| 6. Write command / flags | |
| ``` | |
| All steps use fixed-point ops and explicit erasable temporaries. | |
| ## 7. Initialization | |
| Weights/biases/tables in fixed storage; init routine copies needed values to erasable once. Constants never modified at runtime. | |
| ## 8. Executive Wrapper (Optional) | |
| Cyclic/priority executive, ability to skip non-critical sections under pressure, watchdog/validity flags. | |
| ## 9. Documentation Requirement | |
| For every variable and macro: Qm.n format, physical units, scale, valid range, overflow behavior, memory location (erasable bank or fixed address). | |
| ## 10. Example Skeleton | |
| ``` | |
| ; FIXED (ROM) | |
| WEIGHTS_Q3_12 ... | |
| BIAS_Q3_12 ... | |
| SCALE_IN ... SCALE_OUT ... | |
| ; ERASABLE (RAM) | |
| STATE DS 4 ; Q3.12 | |
| INPUT DS 4 | |
| OUTPUT DS 2 | |
| ACC DS 2 ; double precision | |
| ; MACROS | |
| MACRO DOT4 ; 4-element dot | |
| MACRO SAT_Q3_12 | |
| MACRO UPDATE_STATE | |
| INFER | |
| LOAD_INPUT | |
| SCALE_INPUT | |
| DOT4 WEIGHTS_Q3_12, INPUT, ACC | |
| ADD BIAS | |
| SAT_Q3_12 | |
| UPDATE_STATE | |
| SCALE_OUTPUT | |
| STORE OUTPUT | |
| RETURN | |
| ``` | |
| ## Design Principles | |
| Every bit budgeted β tables + interpolation over general arithmetic β unrolled tiny loops β minimal contiguous mutable state β specialized routine, not general engine. | |
| --- | |
| ## Fixed-Point Contract (INFER4 Example) | |
| 4-input binary decision, Q format per quantity, saturate to 32-bit ACC. | |
| | Symbol | Format | Role | Overflow | | |
| |---|---|---|---| | |
| | `INPUT[4]` | Q1.14 | sensors [-1,1) | clamp | | |
| | `WEIGHTS[4]` | Q1.14 | ROM coefficients | const | | |
| | `BIAS` | Q3.12 | offset | const | | |
| | `ACC` | Q7.24 32-bit | dot accumulator | saturate | | |
| | `STATE` | Q3.12 | smoothed output | clamp | | |
| | `OUTPUT` | Q1.14 | command | clamp | | |
| | `FLAGS` | bits | validity/sat/decision | β | | |
| Q1.14 * Q1.14 β Q2.28 β >>4 β Q3.24 (4 products in 32-bit), >>12 β Q3.12 + `BIAS`. | |
| ## Memory Map | |
| ``` | |
| ; FIXED / ROM | |
| WEIGHTS_Q1_14: DC 2458, -1638, 819, 3277 | |
| BIAS_Q3_12: DC -256 | |
| ALPHA_Q1_14: DC 12288 ; 0.75 | |
| ONE_Q1_14: DC 16384 | |
| OUT_MIN_Q1_14: DC -16384 | |
| OUT_MAX_Q1_14: DC 16383 | |
| SCORE_MIN_Q3_12: DC -8192 ; -2.0 Q3.12 | |
| SCORE_MAX_Q3_12: DC 8191 ; +2.0 | |
| ; ERASABLE / RAM | |
| INPUT: DS 4 | |
| STATE: DS 1 ; Q3.12 | |
| OUTPUT: DS 1 | |
| ACC_HI: DS 1 ; 32-bit hi | |
| ACC_LO: DS 1 ; 32-bit lo | |
| TMP0: DS 1 | |
| TMP1: DS 1 | |
| FLAGS: DS 1 | |
| FLAG_VALID=0001 FLAG_SAT=0002 FLAG_POSITIVE=0004 | |
| ``` | |
| ## Primitive Macros | |
| See `examples/infer4.asm` for full `CLR_ACC`, `MAC_Q1_14` (preserves `PROD_HI:PROD_LO` before `ADD32`), `ACC_TO_Q3_12`, `SAT_Q3_12`, `DOT4_Q1_14`, `THRESHOLD_Q3_12` (+1.0/-1.0), `UPDATE_STATE_3_4` (`(3*STATE+TARGET)/4`). | |
| ## INFER4 Routine | |
| `examples/infer4.asm` β `INFER4: CLR FLAGS β DOT4 β ACC_TO_Q3_12 β ADD BIAS β SAT β THRESHOLD β UPDATE_STATE_3_4 β OUTPUT=STATE β FLAG_VALID β RET` | |
| Simulator: `python src/sim.py` (Q1.14/Q3.12 fixed-point, matches assembly semantics). | |
| ## References | |
| [1] Virtual AGC Manual β ibiblio.org/apollo/assembly_language_manual.html | |
| [2] AGC β Wikipedia | |
| [3] Block II: 2048 erasable + 36864 fixed words, 15 data bits + parity | |