snapkitty
compilers
python
File size: 2,672 Bytes
b86c469
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
; MACROGROK — INFER4 (4-input fixed-point binary decision)
; AGC-inspired pseudo-ISA. Not authentic yaYUL. 15 data bits + parity.
; See README.md for Q formats and memory map.

; ===== FIXED / ROM =====
WEIGHTS_Q1_14: DC 2458, -1638, 819, 3277   ; Q1.14
BIAS_Q3_12: DC -256                         ; Q3.12
ALPHA_Q1_14: DC 12288                       ; 0.75 Q1.14
ONE_Q1_14: DC 16384
OUT_MIN_Q1_14: DC -16384
OUT_MAX_Q1_14: DC 16383
SCORE_MIN_Q3_12: DC -8192
SCORE_MAX_Q3_12: DC 8191

; ===== ERASABLE / RAM =====
INPUT: DS 4
STATE: DS 1
OUTPUT: DS 1
ACC_HI: DS 1
ACC_LO: DS 1
PROD_HI: DS 1
PROD_LO: DS 1
TMP0: DS 1
TMP1: DS 1
FLAGS: DS 1
FLAG_VALID EQU 0001
FLAG_SAT EQU 0002
FLAG_POSITIVE EQU 0004

; ===== PRIMITIVE MACROS =====
; LOAD/STORE/ADD/SUB/MUL16/ADD32/ASR32/CMP/BR* assumed.

MACRO CLR_ACC
    CLR ACC_HI
    CLR ACC_LO
ENDM

MACRO MAC_Q1_14 a, b
    LOAD R0, a
    LOAD R1, b
    MUL16 R0, R1         ; PROD_HI:PROD_LO
    LOAD R2, PROD_HI
    LOAD R3, PROD_LO
    ASR32 R2:R3, 4
    ADD32 ACC_HI:ACC_LO, R2:R3
ENDM

MACRO ACC_TO_Q3_12 dest
    ASR32 ACC_HI:ACC_LO, 12
    STORE dest, ACC_LO
ENDM

MACRO SAT_Q3_12 value, lo, hi
    LOAD R0, value
    LOAD R1, lo
    CMP R0, R1
    BRLT %%LOW
    LOAD R1, hi
    CMP R0, R1
    BRGT %%HIGH
    BR %%DONE
%%LOW:
    LOAD R0, lo
    STORE value, R0
    LOAD R1, FLAGS
    OR R1, FLAG_SAT
    STORE FLAGS, R1
    BR %%DONE
%%HIGH:
    LOAD R0, hi
    STORE value, R0
    LOAD R1, FLAGS
    OR R1, FLAG_SAT
    STORE FLAGS, R1
%%DONE:
ENDM

MACRO DOT4_Q1_14
    CLR_ACC
    MAC_Q1_14 INPUT+0, WEIGHTS_Q1_14+0
    MAC_Q1_14 INPUT+1, WEIGHTS_Q1_14+1
    MAC_Q1_14 INPUT+2, WEIGHTS_Q1_14+2
    MAC_Q1_14 INPUT+3, WEIGHTS_Q1_14+3
ENDM

MACRO THRESHOLD_Q3_12
    LOAD R0, TMP0
    CLR R1
    CMP R0, R1
    BRLT %%NEG
    LOAD R0, ONE_Q1_14
    STORE TMP1, R0
    LOAD R0, FLAGS
    OR R0, FLAG_POSITIVE
    STORE FLAGS, R0
    BR %%DONE
%%NEG:
    LOAD R0, OUT_MIN_Q1_14
    STORE TMP1, R0
%%DONE:
ENDM

MACRO UPDATE_STATE_3_4
    LOAD R0, STATE
    ADD R1, R0
    ADD R1, R0
    ADD R1, R0          ; R1=3*STATE
    LOAD R2, TMP1
    ADD R1, R2          ; 3*STATE+TARGET
    ASR R1, 2           ; /4
    STORE STATE, R1
ENDM

; ===== MAIN =====
INFER4:
    CLR FLAGS
    DOT4_Q1_14
    ACC_TO_Q3_12 TMP0
    LOAD R0, TMP0
    LOAD R1, BIAS_Q3_12
    ADD R0, R1
    STORE TMP0, R0
    SAT_Q3_12 TMP0, SCORE_MIN_Q3_12, SCORE_MAX_Q3_12
    THRESHOLD_Q3_12
    UPDATE_STATE_3_4
    LOAD R0, STATE
    STORE OUTPUT, R0
    LOAD R0, FLAGS
    OR R0, FLAG_VALID
    STORE FLAGS, R0
    RET