1 #include "golay_20_8.h"
2 
3 /* generator matrix according to ETSI B.3.1
4 1 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 1 0
5 0 1 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 0 0 1
6 0 0 1 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 0 1
7 0 0 0 1 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 1
8 0 0 0 0 1 0 0 0 1 1 0 1 1 1 0 0 0 1 1 0
9 0 0 0 0 0 1 0 0 1 0 1 0 1 0 0 1 0 1 1 1
10 0 0 0 0 0 0 1 0 1 0 0 1 0 0 1 1 1 1 1 0
11 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 0 1 0 1 1
12 
13 parity check matrix according to H = [-PT|In-k]
14 0 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
15 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0
16 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0
17 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0
18 1 1 1 0 1 1 0 1 0 0 0 0 1 0 0 0 0 0 0 0
19 1 0 1 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
20 0 0 0 1 0 0 1 1 0 0 0 0 0 0 1 0 0 0 0 0
21 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 0
22 1 1 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0
23 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0 0
24 1 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 1 0
25 0 1 1 1 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1
26 */
27 
28 // parity check matrix as code
29 uint32_t golay_20_8_parity_check_matrix[] = {
30     0b01001111100000000000,
31     0b01101000010000000000,
32     0b10110100001000000000,
33     0b11011010000100000000,
34     0b11101101000010000000,
35     0b10111001000001000000,
36     0b00010011000000100000,
37     0b11000110000000010000,
38     0b11100011000000001000,
39     0b00111110000000000100,
40     0b10011111000000000010,
41     0b01110101000000000001
42 };
43 
44 struct correction {
45     uint32_t syndrome;
46     uint32_t error_pattern;
47 };
48 
49 // generated by applying possible combinations of errors
50 static struct correction corrections[] = {
51     { 1, 1 },
52     { 2, 2 },
53     { 3, 3 },
54     { 4, 4 },
55     { 5, 5 },
56     { 6, 6 },
57     { 7, 7 },
58     { 8, 8 },
59     { 9, 9 },
60     { 10, 10 },
61     { 11, 11 },
62     { 12, 12 },
63     { 13, 13 },
64     { 14, 14 },
65     { 16, 16 },
66     { 17, 17 },
67     { 18, 18 },
68     { 19, 19 },
69     { 20, 20 },
70     { 21, 21 },
71     { 22, 22 },
72     { 24, 24 },
73     { 25, 25 },
74     { 26, 26 },
75     { 28, 28 },
76     { 32, 32 },
77     { 33, 33 },
78     { 34, 34 },
79     { 35, 35 },
80     { 36, 36 },
81     { 37, 37 },
82     { 38, 38 },
83     { 40, 40 },
84     { 41, 41 },
85     { 42, 42 },
86     { 44, 44 },
87     { 48, 48 },
88     { 49, 49 },
89     { 50, 50 },
90     { 52, 52 },
91     { 56, 56 },
92     { 64, 64 },
93     { 65, 65 },
94     { 66, 66 },
95     { 67, 67 },
96     { 68, 68 },
97     { 69, 69 },
98     { 70, 70 },
99     { 72, 72 },
100     { 73, 73 },
101     { 74, 74 },
102     { 76, 76 },
103     { 80, 80 },
104     { 81, 81 },
105     { 82, 82 },
106     { 84, 84 },
107     { 88, 88 },
108     { 96, 96 },
109     { 97, 97 },
110     { 98, 98 },
111     { 100, 100 },
112     { 104, 104 },
113     { 112, 112 },
114     { 128, 128 },
115     { 129, 129 },
116     { 130, 130 },
117     { 131, 131 },
118     { 132, 132 },
119     { 133, 133 },
120     { 134, 134 },
121     { 136, 136 },
122     { 137, 137 },
123     { 138, 138 },
124     { 140, 140 },
125     { 144, 144 },
126     { 145, 145 },
127     { 146, 146 },
128     { 148, 148 },
129     { 152, 152 },
130     { 160, 160 },
131     { 161, 161 },
132     { 162, 162 },
133     { 164, 164 },
134     { 168, 168 },
135     { 176, 176 },
136     { 192, 192 },
137     { 193, 193 },
138     { 194, 194 },
139     { 196, 196 },
140     { 200, 200 },
141     { 208, 208 },
142     { 224, 224 },
143     { 256, 256 },
144     { 257, 257 },
145     { 258, 258 },
146     { 259, 259 },
147     { 260, 260 },
148     { 261, 261 },
149     { 262, 262 },
150     { 264, 264 },
151     { 265, 265 },
152     { 266, 266 },
153     { 268, 268 },
154     { 272, 272 },
155     { 273, 273 },
156     { 274, 274 },
157     { 276, 276 },
158     { 280, 280 },
159     { 288, 288 },
160     { 289, 289 },
161     { 290, 290 },
162     { 292, 292 },
163     { 296, 296 },
164     { 304, 304 },
165     { 320, 320 },
166     { 321, 321 },
167     { 322, 322 },
168     { 324, 324 },
169     { 328, 328 },
170     { 336, 336 },
171     { 352, 352 },
172     { 384, 384 },
173     { 385, 385 },
174     { 386, 386 },
175     { 388, 388 },
176     { 392, 392 },
177     { 400, 400 },
178     { 416, 416 },
179     { 448, 448 },
180     { 512, 512 },
181     { 513, 513 },
182     { 514, 514 },
183     { 515, 515 },
184     { 516, 516 },
185     { 517, 517 },
186     { 518, 518 },
187     { 520, 520 },
188     { 521, 521 },
189     { 522, 522 },
190     { 524, 524 },
191     { 528, 528 },
192     { 529, 529 },
193     { 530, 530 },
194     { 532, 532 },
195     { 536, 536 },
196     { 544, 544 },
197     { 545, 545 },
198     { 546, 546 },
199     { 548, 548 },
200     { 552, 552 },
201     { 560, 560 },
202     { 576, 576 },
203     { 577, 577 },
204     { 578, 578 },
205     { 580, 580 },
206     { 584, 584 },
207     { 592, 592 },
208     { 608, 608 },
209     { 640, 640 },
210     { 641, 641 },
211     { 642, 642 },
212     { 644, 644 },
213     { 648, 648 },
214     { 656, 656 },
215     { 672, 672 },
216     { 704, 704 },
217     { 768, 768 },
218     { 769, 769 },
219     { 770, 770 },
220     { 772, 772 },
221     { 776, 776 },
222     { 784, 784 },
223     { 800, 800 },
224     { 832, 832 },
225     { 896, 896 },
226     { 1024, 1024 },
227     { 1025, 1025 },
228     { 1026, 1026 },
229     { 1027, 1027 },
230     { 1028, 1028 },
231     { 1029, 1029 },
232     { 1030, 1030 },
233     { 1032, 1032 },
234     { 1033, 1033 },
235     { 1034, 1034 },
236     { 1036, 1036 },
237     { 1040, 1040 },
238     { 1041, 1041 },
239     { 1042, 1042 },
240     { 1044, 1044 },
241     { 1048, 1048 },
242     { 1056, 1056 },
243     { 1057, 1057 },
244     { 1058, 1058 },
245     { 1060, 1060 },
246     { 1064, 1064 },
247     { 1072, 1072 },
248     { 1088, 1088 },
249     { 1089, 1089 },
250     { 1090, 1090 },
251     { 1092, 1092 },
252     { 1096, 1096 },
253     { 1104, 1104 },
254     { 1120, 1120 },
255     { 1152, 1152 },
256     { 1153, 1153 },
257     { 1154, 1154 },
258     { 1156, 1156 },
259     { 1160, 1160 },
260     { 1168, 1168 },
261     { 1184, 1184 },
262     { 1216, 1216 },
263     { 1280, 1280 },
264     { 1281, 1281 },
265     { 1282, 1282 },
266     { 1284, 1284 },
267     { 1288, 1288 },
268     { 1296, 1296 },
269     { 1312, 1312 },
270     { 1344, 1344 },
271     { 1408, 1408 },
272     { 1536, 1536 },
273     { 1537, 1537 },
274     { 1538, 1538 },
275     { 1540, 1540 },
276     { 1544, 1544 },
277     { 1552, 1552 },
278     { 1568, 1568 },
279     { 1600, 1600 },
280     { 1664, 1664 },
281     { 1792, 1792 },
282     { 2048, 2048 },
283     { 2049, 2049 },
284     { 2050, 2050 },
285     { 2051, 2051 },
286     { 2052, 2052 },
287     { 2053, 2053 },
288     { 2054, 2054 },
289     { 2056, 2056 },
290     { 2057, 2057 },
291     { 2058, 2058 },
292     { 2060, 2060 },
293     { 2064, 2064 },
294     { 2065, 2065 },
295     { 2066, 2066 },
296     { 2068, 2068 },
297     { 2072, 2072 },
298     { 2080, 2080 },
299     { 2081, 2081 },
300     { 2082, 2082 },
301     { 2084, 2084 },
302     { 2088, 2088 },
303     { 2096, 2096 },
304     { 2112, 2112 },
305     { 2113, 2113 },
306     { 2114, 2114 },
307     { 2116, 2116 },
308     { 2120, 2120 },
309     { 2128, 2128 },
310     { 2144, 2144 },
311     { 2176, 2176 },
312     { 2177, 2177 },
313     { 2178, 2178 },
314     { 2180, 2180 },
315     { 2184, 2184 },
316     { 2192, 2192 },
317     { 2208, 2208 },
318     { 2240, 2240 },
319     { 2304, 2304 },
320     { 2305, 2305 },
321     { 2306, 2306 },
322     { 2308, 2308 },
323     { 2312, 2312 },
324     { 2320, 2320 },
325     { 2336, 2336 },
326     { 2368, 2368 },
327     { 2432, 2432 },
328     { 2560, 2560 },
329     { 2561, 2561 },
330     { 2562, 2562 },
331     { 2564, 2564 },
332     { 2568, 2568 },
333     { 2576, 2576 },
334     { 2592, 2592 },
335     { 2624, 2624 },
336     { 2688, 2688 },
337     { 2816, 2816 },
338     { 3072, 3072 },
339     { 3073, 3073 },
340     { 3074, 3074 },
341     { 3076, 3076 },
342     { 3080, 3080 },
343     { 3088, 3088 },
344     { 3104, 3104 },
345     { 3136, 3136 },
346     { 3200, 3200 },
347     { 3328, 3328 },
348     { 3584, 3584 },
349     { 2283, 4096 },
350     { 2282, 4097 },
351     { 2281, 4098 },
352     { 2280, 4099 },
353     { 2287, 4100 },
354     { 2286, 4101 },
355     { 2285, 4102 },
356     { 2275, 4104 },
357     { 2274, 4105 },
358     { 2273, 4106 },
359     { 2279, 4108 },
360     { 2299, 4112 },
361     { 2298, 4113 },
362     { 2297, 4114 },
363     { 2303, 4116 },
364     { 2291, 4120 },
365     { 2251, 4128 },
366     { 2250, 4129 },
367     { 2249, 4130 },
368     { 2255, 4132 },
369     { 2243, 4136 },
370     { 2267, 4144 },
371     { 2219, 4160 },
372     { 2218, 4161 },
373     { 2217, 4162 },
374     { 2223, 4164 },
375     { 2211, 4168 },
376     { 2235, 4176 },
377     { 2187, 4192 },
378     { 2155, 4224 },
379     { 2154, 4225 },
380     { 2153, 4226 },
381     { 2159, 4228 },
382     { 2147, 4232 },
383     { 2171, 4240 },
384     { 2123, 4256 },
385     { 2091, 4288 },
386     { 2539, 4352 },
387     { 2538, 4353 },
388     { 2537, 4354 },
389     { 2543, 4356 },
390     { 2531, 4360 },
391     { 2555, 4368 },
392     { 2507, 4384 },
393     { 2475, 4416 },
394     { 2411, 4480 },
395     { 2795, 4608 },
396     { 2794, 4609 },
397     { 2793, 4610 },
398     { 2799, 4612 },
399     { 2787, 4616 },
400     { 2811, 4624 },
401     { 2763, 4640 },
402     { 2731, 4672 },
403     { 2667, 4736 },
404     { 3051, 4864 },
405     { 3307, 5120 },
406     { 3306, 5121 },
407     { 3305, 5122 },
408     { 3311, 5124 },
409     { 3299, 5128 },
410     { 3323, 5136 },
411     { 3275, 5152 },
412     { 3243, 5184 },
413     { 3179, 5248 },
414     { 3563, 5376 },
415     { 3819, 5632 },
416     { 235, 6144 },
417     { 234, 6145 },
418     { 233, 6146 },
419     { 239, 6148 },
420     { 227, 6152 },
421     { 251, 6160 },
422     { 203, 6176 },
423     { 171, 6208 },
424     { 107, 6272 },
425     { 491, 6400 },
426     { 747, 6656 },
427     { 1259, 7168 },
428     { 2366, 8192 },
429     { 2367, 8193 },
430     { 2364, 8194 },
431     { 2365, 8195 },
432     { 2362, 8196 },
433     { 2363, 8197 },
434     { 2360, 8198 },
435     { 2358, 8200 },
436     { 2359, 8201 },
437     { 2356, 8202 },
438     { 2354, 8204 },
439     { 2350, 8208 },
440     { 2351, 8209 },
441     { 2348, 8210 },
442     { 2346, 8212 },
443     { 2342, 8216 },
444     { 2334, 8224 },
445     { 2335, 8225 },
446     { 2332, 8226 },
447     { 2330, 8228 },
448     { 2326, 8232 },
449     { 2318, 8240 },
450     { 2430, 8256 },
451     { 2431, 8257 },
452     { 2428, 8258 },
453     { 2426, 8260 },
454     { 2422, 8264 },
455     { 2414, 8272 },
456     { 2398, 8288 },
457     { 2494, 8320 },
458     { 2495, 8321 },
459     { 2492, 8322 },
460     { 2490, 8324 },
461     { 2486, 8328 },
462     { 2478, 8336 },
463     { 2462, 8352 },
464     { 2558, 8384 },
465     { 2110, 8448 },
466     { 2111, 8449 },
467     { 2108, 8450 },
468     { 2106, 8452 },
469     { 2102, 8456 },
470     { 2094, 8464 },
471     { 2078, 8480 },
472     { 2174, 8512 },
473     { 2238, 8576 },
474     { 2878, 8704 },
475     { 2879, 8705 },
476     { 2876, 8706 },
477     { 2874, 8708 },
478     { 2870, 8712 },
479     { 2862, 8720 },
480     { 2846, 8736 },
481     { 2942, 8768 },
482     { 3006, 8832 },
483     { 2622, 8960 },
484     { 3390, 9216 },
485     { 3391, 9217 },
486     { 3388, 9218 },
487     { 3386, 9220 },
488     { 3382, 9224 },
489     { 3374, 9232 },
490     { 3358, 9248 },
491     { 3454, 9280 },
492     { 3518, 9344 },
493     { 3134, 9472 },
494     { 3902, 9728 },
495     { 318, 10240 },
496     { 319, 10241 },
497     { 316, 10242 },
498     { 314, 10244 },
499     { 310, 10248 },
500     { 302, 10256 },
501     { 286, 10272 },
502     { 382, 10304 },
503     { 446, 10368 },
504     { 62, 10496 },
505     { 830, 10752 },
506     { 1342, 11264 },
507     { 469, 12288 },
508     { 468, 12289 },
509     { 471, 12290 },
510     { 465, 12292 },
511     { 477, 12296 },
512     { 453, 12304 },
513     { 501, 12320 },
514     { 405, 12352 },
515     { 341, 12416 },
516     { 213, 12544 },
517     { 981, 12800 },
518     { 1493, 13312 },
519     { 2517, 14336 },
520     { 2711, 16384 },
521     { 2710, 16385 },
522     { 2709, 16386 },
523     { 2708, 16387 },
524     { 2707, 16388 },
525     { 2706, 16389 },
526     { 2705, 16390 },
527     { 2719, 16392 },
528     { 2718, 16393 },
529     { 2717, 16394 },
530     { 2715, 16396 },
531     { 2695, 16400 },
532     { 2694, 16401 },
533     { 2693, 16402 },
534     { 2691, 16404 },
535     { 2703, 16408 },
536     { 2743, 16416 },
537     { 2742, 16417 },
538     { 2741, 16418 },
539     { 2739, 16420 },
540     { 2751, 16424 },
541     { 2727, 16432 },
542     { 2775, 16448 },
543     { 2774, 16449 },
544     { 2773, 16450 },
545     { 2771, 16452 },
546     { 2783, 16456 },
547     { 2759, 16464 },
548     { 2807, 16480 },
549     { 2583, 16512 },
550     { 2582, 16513 },
551     { 2581, 16514 },
552     { 2579, 16516 },
553     { 2591, 16520 },
554     { 2567, 16528 },
555     { 2615, 16544 },
556     { 2647, 16576 },
557     { 2967, 16640 },
558     { 2966, 16641 },
559     { 2965, 16642 },
560     { 2963, 16644 },
561     { 2975, 16648 },
562     { 2951, 16656 },
563     { 2999, 16672 },
564     { 3031, 16704 },
565     { 2839, 16768 },
566     { 2199, 16896 },
567     { 2198, 16897 },
568     { 2197, 16898 },
569     { 2195, 16900 },
570     { 2207, 16904 },
571     { 2183, 16912 },
572     { 2231, 16928 },
573     { 2263, 16960 },
574     { 2071, 17024 },
575     { 2455, 17152 },
576     { 3735, 17408 },
577     { 3734, 17409 },
578     { 3733, 17410 },
579     { 3731, 17412 },
580     { 3743, 17416 },
581     { 3719, 17424 },
582     { 3767, 17440 },
583     { 3799, 17472 },
584     { 3607, 17536 },
585     { 3991, 17664 },
586     { 3223, 17920 },
587     { 663, 18432 },
588     { 662, 18433 },
589     { 661, 18434 },
590     { 659, 18436 },
591     { 671, 18440 },
592     { 647, 18448 },
593     { 695, 18464 },
594     { 727, 18496 },
595     { 535, 18560 },
596     { 919, 18688 },
597     { 151, 18944 },
598     { 1687, 19456 },
599     { 636, 20480 },
600     { 637, 20481 },
601     { 638, 20482 },
602     { 632, 20484 },
603     { 628, 20488 },
604     { 620, 20496 },
605     { 604, 20512 },
606     { 572, 20544 },
607     { 764, 20608 },
608     { 892, 20736 },
609     { 124, 20992 },
610     { 1660, 21504 },
611     { 2684, 22528 },
612     { 937, 24576 },
613     { 936, 24577 },
614     { 939, 24578 },
615     { 941, 24580 },
616     { 929, 24584 },
617     { 953, 24592 },
618     { 905, 24608 },
619     { 1001, 24640 },
620     { 809, 24704 },
621     { 681, 24832 },
622     { 425, 25088 },
623     { 1961, 25600 },
624     { 2985, 26624 },
625     { 2882, 28672 },
626     { 3526, 32768 },
627     { 3527, 32769 },
628     { 3524, 32770 },
629     { 3525, 32771 },
630     { 3522, 32772 },
631     { 3523, 32773 },
632     { 3520, 32774 },
633     { 3534, 32776 },
634     { 3535, 32777 },
635     { 3532, 32778 },
636     { 3530, 32780 },
637     { 3542, 32784 },
638     { 3543, 32785 },
639     { 3540, 32786 },
640     { 3538, 32788 },
641     { 3550, 32792 },
642     { 3558, 32800 },
643     { 3559, 32801 },
644     { 3556, 32802 },
645     { 3554, 32804 },
646     { 3566, 32808 },
647     { 3574, 32816 },
648     { 3462, 32832 },
649     { 3463, 32833 },
650     { 3460, 32834 },
651     { 3458, 32836 },
652     { 3470, 32840 },
653     { 3478, 32848 },
654     { 3494, 32864 },
655     { 3398, 32896 },
656     { 3399, 32897 },
657     { 3396, 32898 },
658     { 3394, 32900 },
659     { 3406, 32904 },
660     { 3414, 32912 },
661     { 3430, 32928 },
662     { 3334, 32960 },
663     { 3270, 33024 },
664     { 3271, 33025 },
665     { 3268, 33026 },
666     { 3266, 33028 },
667     { 3278, 33032 },
668     { 3286, 33040 },
669     { 3302, 33056 },
670     { 3206, 33088 },
671     { 3142, 33152 },
672     { 4038, 33280 },
673     { 4039, 33281 },
674     { 4036, 33282 },
675     { 4034, 33284 },
676     { 4046, 33288 },
677     { 4054, 33296 },
678     { 4070, 33312 },
679     { 3974, 33344 },
680     { 3910, 33408 },
681     { 3782, 33536 },
682     { 2502, 33792 },
683     { 2503, 33793 },
684     { 2500, 33794 },
685     { 2498, 33796 },
686     { 2510, 33800 },
687     { 2518, 33808 },
688     { 2534, 33824 },
689     { 2438, 33856 },
690     { 2374, 33920 },
691     { 2246, 34048 },
692     { 3014, 34304 },
693     { 1478, 34816 },
694     { 1479, 34817 },
695     { 1476, 34818 },
696     { 1474, 34820 },
697     { 1486, 34824 },
698     { 1494, 34832 },
699     { 1510, 34848 },
700     { 1414, 34880 },
701     { 1350, 34944 },
702     { 1222, 35072 },
703     { 1990, 35328 },
704     { 454, 35840 },
705     { 1325, 36864 },
706     { 1324, 36865 },
707     { 1327, 36866 },
708     { 1321, 36868 },
709     { 1317, 36872 },
710     { 1341, 36880 },
711     { 1293, 36896 },
712     { 1389, 36928 },
713     { 1453, 36992 },
714     { 1069, 37120 },
715     { 1837, 37376 },
716     { 301, 37888 },
717     { 3373, 38912 },
718     { 1272, 40960 },
719     { 1273, 40961 },
720     { 1274, 40962 },
721     { 1276, 40964 },
722     { 1264, 40968 },
723     { 1256, 40976 },
724     { 1240, 40992 },
725     { 1208, 41024 },
726     { 1144, 41088 },
727     { 1528, 41216 },
728     { 1784, 41472 },
729     { 248, 41984 },
730     { 3320, 43008 },
731     { 3091, 45056 },
732     { 1873, 49152 },
733     { 1872, 49153 },
734     { 1875, 49154 },
735     { 1877, 49156 },
736     { 1881, 49160 },
737     { 1857, 49168 },
738     { 1905, 49184 },
739     { 1809, 49216 },
740     { 2001, 49280 },
741     { 1617, 49408 },
742     { 1361, 49664 },
743     { 849, 50176 },
744     { 3921, 51200 },
745     { 4026, 53248 },
746     { 3695, 57344 },
747     { 871, 65536 },
748     { 870, 65537 },
749     { 869, 65538 },
750     { 868, 65539 },
751     { 867, 65540 },
752     { 866, 65541 },
753     { 865, 65542 },
754     { 879, 65544 },
755     { 878, 65545 },
756     { 877, 65546 },
757     { 875, 65548 },
758     { 887, 65552 },
759     { 886, 65553 },
760     { 885, 65554 },
761     { 883, 65556 },
762     { 895, 65560 },
763     { 839, 65568 },
764     { 838, 65569 },
765     { 837, 65570 },
766     { 835, 65572 },
767     { 847, 65576 },
768     { 855, 65584 },
769     { 807, 65600 },
770     { 806, 65601 },
771     { 805, 65602 },
772     { 803, 65604 },
773     { 815, 65608 },
774     { 823, 65616 },
775     { 775, 65632 },
776     { 999, 65664 },
777     { 998, 65665 },
778     { 997, 65666 },
779     { 995, 65668 },
780     { 1007, 65672 },
781     { 1015, 65680 },
782     { 967, 65696 },
783     { 935, 65728 },
784     { 615, 65792 },
785     { 614, 65793 },
786     { 613, 65794 },
787     { 611, 65796 },
788     { 623, 65800 },
789     { 631, 65808 },
790     { 583, 65824 },
791     { 551, 65856 },
792     { 743, 65920 },
793     { 359, 66048 },
794     { 358, 66049 },
795     { 357, 66050 },
796     { 355, 66052 },
797     { 367, 66056 },
798     { 375, 66064 },
799     { 327, 66080 },
800     { 295, 66112 },
801     { 487, 66176 },
802     { 103, 66304 },
803     { 1895, 66560 },
804     { 1894, 66561 },
805     { 1893, 66562 },
806     { 1891, 66564 },
807     { 1903, 66568 },
808     { 1911, 66576 },
809     { 1863, 66592 },
810     { 1831, 66624 },
811     { 2023, 66688 },
812     { 1639, 66816 },
813     { 1383, 67072 },
814     { 2919, 67584 },
815     { 2918, 67585 },
816     { 2917, 67586 },
817     { 2915, 67588 },
818     { 2927, 67592 },
819     { 2935, 67600 },
820     { 2887, 67616 },
821     { 2855, 67648 },
822     { 3047, 67712 },
823     { 2663, 67840 },
824     { 2407, 68096 },
825     { 3943, 68608 },
826     { 2956, 69632 },
827     { 2957, 69633 },
828     { 2958, 69634 },
829     { 2952, 69636 },
830     { 2948, 69640 },
831     { 2972, 69648 },
832     { 2988, 69664 },
833     { 3020, 69696 },
834     { 2828, 69760 },
835     { 2700, 69888 },
836     { 2444, 70144 },
837     { 3980, 70656 },
838     { 908, 71680 },
839     { 2649, 73728 },
840     { 2648, 73729 },
841     { 2651, 73730 },
842     { 2653, 73732 },
843     { 2641, 73736 },
844     { 2633, 73744 },
845     { 2681, 73760 },
846     { 2585, 73792 },
847     { 2777, 73856 },
848     { 2905, 73984 },
849     { 2137, 74240 },
850     { 3673, 74752 },
851     { 601, 75776 },
852     { 690, 77824 },
853     { 2544, 81920 },
854     { 2545, 81921 },
855     { 2546, 81922 },
856     { 2548, 81924 },
857     { 2552, 81928 },
858     { 2528, 81936 },
859     { 2512, 81952 },
860     { 2480, 81984 },
861     { 2416, 82048 },
862     { 2288, 82176 },
863     { 3056, 82432 },
864     { 3568, 82944 },
865     { 496, 83968 },
866     { 283, 86016 },
867     { 206, 90112 },
868     { 3745, 98304 },
869     { 3744, 98305 },
870     { 3747, 98306 },
871     { 3749, 98308 },
872     { 3753, 98312 },
873     { 3761, 98320 },
874     { 3713, 98336 },
875     { 3809, 98368 },
876     { 3617, 98432 },
877     { 4001, 98560 },
878     { 3233, 98816 },
879     { 2721, 99328 },
880     { 1697, 100352 },
881     { 1610, 102400 },
882     { 1951, 106496 },
883     { 1078, 114688 },
884     { 1741, 131072 },
885     { 1740, 131073 },
886     { 1743, 131074 },
887     { 1742, 131075 },
888     { 1737, 131076 },
889     { 1736, 131077 },
890     { 1739, 131078 },
891     { 1733, 131080 },
892     { 1732, 131081 },
893     { 1735, 131082 },
894     { 1729, 131084 },
895     { 1757, 131088 },
896     { 1756, 131089 },
897     { 1759, 131090 },
898     { 1753, 131092 },
899     { 1749, 131096 },
900     { 1773, 131104 },
901     { 1772, 131105 },
902     { 1775, 131106 },
903     { 1769, 131108 },
904     { 1765, 131112 },
905     { 1789, 131120 },
906     { 1677, 131136 },
907     { 1676, 131137 },
908     { 1679, 131138 },
909     { 1673, 131140 },
910     { 1669, 131144 },
911     { 1693, 131152 },
912     { 1709, 131168 },
913     { 1613, 131200 },
914     { 1612, 131201 },
915     { 1615, 131202 },
916     { 1609, 131204 },
917     { 1605, 131208 },
918     { 1629, 131216 },
919     { 1645, 131232 },
920     { 1549, 131264 },
921     { 1997, 131328 },
922     { 1996, 131329 },
923     { 1999, 131330 },
924     { 1993, 131332 },
925     { 1989, 131336 },
926     { 2013, 131344 },
927     { 2029, 131360 },
928     { 1933, 131392 },
929     { 1869, 131456 },
930     { 1229, 131584 },
931     { 1228, 131585 },
932     { 1231, 131586 },
933     { 1225, 131588 },
934     { 1221, 131592 },
935     { 1245, 131600 },
936     { 1261, 131616 },
937     { 1165, 131648 },
938     { 1101, 131712 },
939     { 1485, 131840 },
940     { 717, 132096 },
941     { 716, 132097 },
942     { 719, 132098 },
943     { 713, 132100 },
944     { 709, 132104 },
945     { 733, 132112 },
946     { 749, 132128 },
947     { 653, 132160 },
948     { 589, 132224 },
949     { 973, 132352 },
950     { 205, 132608 },
951     { 3789, 133120 },
952     { 3788, 133121 },
953     { 3791, 133122 },
954     { 3785, 133124 },
955     { 3781, 133128 },
956     { 3805, 133136 },
957     { 3821, 133152 },
958     { 3725, 133184 },
959     { 3661, 133248 },
960     { 4045, 133376 },
961     { 3277, 133632 },
962     { 2765, 134144 },
963     { 3622, 135168 },
964     { 3623, 135169 },
965     { 3620, 135170 },
966     { 3618, 135172 },
967     { 3630, 135176 },
968     { 3638, 135184 },
969     { 3590, 135200 },
970     { 3686, 135232 },
971     { 3750, 135296 },
972     { 3878, 135424 },
973     { 3110, 135680 },
974     { 2598, 136192 },
975     { 1574, 137216 },
976     { 4083, 139264 },
977     { 4082, 139265 },
978     { 4081, 139266 },
979     { 4087, 139268 },
980     { 4091, 139272 },
981     { 4067, 139280 },
982     { 4051, 139296 },
983     { 4019, 139328 },
984     { 3955, 139392 },
985     { 3827, 139520 },
986     { 3571, 139776 },
987     { 3059, 140288 },
988     { 2035, 141312 },
989     { 1816, 143360 },
990     { 3162, 147456 },
991     { 3163, 147457 },
992     { 3160, 147458 },
993     { 3166, 147460 },
994     { 3154, 147464 },
995     { 3146, 147472 },
996     { 3194, 147488 },
997     { 3098, 147520 },
998     { 3290, 147584 },
999     { 3418, 147712 },
1000     { 3674, 147968 },
1001     { 2138, 148480 },
1002     { 1114, 149504 },
1003     { 1201, 151552 },
1004     { 1380, 155648 },
1005     { 2827, 163840 },
1006     { 2826, 163841 },
1007     { 2825, 163842 },
1008     { 2831, 163844 },
1009     { 2819, 163848 },
1010     { 2843, 163856 },
1011     { 2859, 163872 },
1012     { 2891, 163904 },
1013     { 2955, 163968 },
1014     { 2571, 164096 },
1015     { 2315, 164352 },
1016     { 3851, 164864 },
1017     { 779, 165888 },
1018     { 992, 167936 },
1019     { 565, 172032 },
1020     { 412, 180224 },
1021     { 1450, 196608 },
1022     { 1451, 196609 },
1023     { 1448, 196610 },
1024     { 1454, 196612 },
1025     { 1442, 196616 },
1026     { 1466, 196624 },
1027     { 1418, 196640 },
1028     { 1514, 196672 },
1029     { 1322, 196736 },
1030     { 1194, 196864 },
1031     { 1962, 197120 },
1032     { 426, 197632 },
1033     { 3498, 198656 },
1034     { 3393, 200704 },
1035     { 3220, 204800 },
1036     { 3901, 212992 },
1037     { 2156, 229376 },
1038     { 3481, 262144 },
1039     { 3480, 262145 },
1040     { 3483, 262146 },
1041     { 3482, 262147 },
1042     { 3485, 262148 },
1043     { 3484, 262149 },
1044     { 3487, 262150 },
1045     { 3473, 262152 },
1046     { 3472, 262153 },
1047     { 3475, 262154 },
1048     { 3477, 262156 },
1049     { 3465, 262160 },
1050     { 3464, 262161 },
1051     { 3467, 262162 },
1052     { 3469, 262164 },
1053     { 3457, 262168 },
1054     { 3513, 262176 },
1055     { 3512, 262177 },
1056     { 3515, 262178 },
1057     { 3517, 262180 },
1058     { 3505, 262184 },
1059     { 3497, 262192 },
1060     { 3545, 262208 },
1061     { 3544, 262209 },
1062     { 3547, 262210 },
1063     { 3549, 262212 },
1064     { 3537, 262216 },
1065     { 3529, 262224 },
1066     { 3577, 262240 },
1067     { 3353, 262272 },
1068     { 3352, 262273 },
1069     { 3355, 262274 },
1070     { 3357, 262276 },
1071     { 3345, 262280 },
1072     { 3337, 262288 },
1073     { 3385, 262304 },
1074     { 3417, 262336 },
1075     { 3225, 262400 },
1076     { 3224, 262401 },
1077     { 3227, 262402 },
1078     { 3229, 262404 },
1079     { 3217, 262408 },
1080     { 3209, 262416 },
1081     { 3257, 262432 },
1082     { 3289, 262464 },
1083     { 3097, 262528 },
1084     { 3993, 262656 },
1085     { 3992, 262657 },
1086     { 3995, 262658 },
1087     { 3997, 262660 },
1088     { 3985, 262664 },
1089     { 3977, 262672 },
1090     { 4025, 262688 },
1091     { 4057, 262720 },
1092     { 3865, 262784 },
1093     { 3737, 262912 },
1094     { 2457, 263168 },
1095     { 2456, 263169 },
1096     { 2459, 263170 },
1097     { 2461, 263172 },
1098     { 2449, 263176 },
1099     { 2441, 263184 },
1100     { 2489, 263200 },
1101     { 2521, 263232 },
1102     { 2329, 263296 },
1103     { 2201, 263424 },
1104     { 2969, 263680 },
1105     { 1433, 264192 },
1106     { 1432, 264193 },
1107     { 1435, 264194 },
1108     { 1437, 264196 },
1109     { 1425, 264200 },
1110     { 1417, 264208 },
1111     { 1465, 264224 },
1112     { 1497, 264256 },
1113     { 1305, 264320 },
1114     { 1177, 264448 },
1115     { 1945, 264704 },
1116     { 409, 265216 },
1117     { 1394, 266240 },
1118     { 1395, 266241 },
1119     { 1392, 266242 },
1120     { 1398, 266244 },
1121     { 1402, 266248 },
1122     { 1378, 266256 },
1123     { 1362, 266272 },
1124     { 1330, 266304 },
1125     { 1522, 266368 },
1126     { 1138, 266496 },
1127     { 1906, 266752 },
1128     { 370, 267264 },
1129     { 3442, 268288 },
1130     { 1191, 270336 },
1131     { 1190, 270337 },
1132     { 1189, 270338 },
1133     { 1187, 270340 },
1134     { 1199, 270344 },
1135     { 1207, 270352 },
1136     { 1159, 270368 },
1137     { 1255, 270400 },
1138     { 1063, 270464 },
1139     { 1447, 270592 },
1140     { 1703, 270848 },
1141     { 167, 271360 },
1142     { 3239, 272384 },
1143     { 3148, 274432 },
1144     { 1806, 278528 },
1145     { 1807, 278529 },
1146     { 1804, 278530 },
1147     { 1802, 278532 },
1148     { 1798, 278536 },
1149     { 1822, 278544 },
1150     { 1838, 278560 },
1151     { 1870, 278592 },
1152     { 1934, 278656 },
1153     { 1550, 278784 },
1154     { 1294, 279040 },
1155     { 782, 279552 },
1156     { 3854, 280576 },
1157     { 4069, 282624 },
1158     { 3632, 286720 },
1159     { 95, 294912 },
1160     { 94, 294913 },
1161     { 93, 294914 },
1162     { 91, 294916 },
1163     { 87, 294920 },
1164     { 79, 294928 },
1165     { 127, 294944 },
1166     { 31, 294976 },
1167     { 223, 295040 },
1168     { 351, 295168 },
1169     { 607, 295424 },
1170     { 1119, 295936 },
1171     { 2143, 296960 },
1172     { 2228, 299008 },
1173     { 2401, 303104 },
1174     { 2760, 311296 },
1175     { 3838, 327680 },
1176     { 3839, 327681 },
1177     { 3836, 327682 },
1178     { 3834, 327684 },
1179     { 3830, 327688 },
1180     { 3822, 327696 },
1181     { 3806, 327712 },
1182     { 3774, 327744 },
1183     { 3710, 327808 },
1184     { 4094, 327936 },
1185     { 3326, 328192 },
1186     { 2814, 328704 },
1187     { 1790, 329728 },
1188     { 1557, 331776 },
1189     { 1984, 335872 },
1190     { 1129, 344064 },
1191     { 824, 360448 },
1192     { 2900, 393216 },
1193     { 2901, 393217 },
1194     { 2902, 393218 },
1195     { 2896, 393220 },
1196     { 2908, 393224 },
1197     { 2884, 393232 },
1198     { 2932, 393248 },
1199     { 2836, 393280 },
1200     { 3028, 393344 },
1201     { 2644, 393472 },
1202     { 2388, 393728 },
1203     { 3924, 394240 },
1204     { 852, 395264 },
1205     { 959, 397312 },
1206     { 618, 401408 },
1207     { 451, 409600 },
1208     { 1682, 425984 },
1209     { 2099, 458752 },
1210     { 986, 524288 },
1211     { 987, 524289 },
1212     { 984, 524290 },
1213     { 985, 524291 },
1214     { 990, 524292 },
1215     { 991, 524293 },
1216     { 988, 524294 },
1217     { 978, 524296 },
1218     { 979, 524297 },
1219     { 976, 524298 },
1220     { 982, 524300 },
1221     { 970, 524304 },
1222     { 971, 524305 },
1223     { 968, 524306 },
1224     { 974, 524308 },
1225     { 962, 524312 },
1226     { 1018, 524320 },
1227     { 1019, 524321 },
1228     { 1016, 524322 },
1229     { 1022, 524324 },
1230     { 1010, 524328 },
1231     { 1002, 524336 },
1232     { 922, 524352 },
1233     { 923, 524353 },
1234     { 920, 524354 },
1235     { 926, 524356 },
1236     { 914, 524360 },
1237     { 906, 524368 },
1238     { 954, 524384 },
1239     { 858, 524416 },
1240     { 859, 524417 },
1241     { 856, 524418 },
1242     { 862, 524420 },
1243     { 850, 524424 },
1244     { 842, 524432 },
1245     { 890, 524448 },
1246     { 794, 524480 },
1247     { 730, 524544 },
1248     { 731, 524545 },
1249     { 728, 524546 },
1250     { 734, 524548 },
1251     { 722, 524552 },
1252     { 714, 524560 },
1253     { 762, 524576 },
1254     { 666, 524608 },
1255     { 602, 524672 },
1256     { 474, 524800 },
1257     { 475, 524801 },
1258     { 472, 524802 },
1259     { 478, 524804 },
1260     { 466, 524808 },
1261     { 458, 524816 },
1262     { 506, 524832 },
1263     { 410, 524864 },
1264     { 346, 524928 },
1265     { 218, 525056 },
1266     { 2010, 525312 },
1267     { 2011, 525313 },
1268     { 2008, 525314 },
1269     { 2014, 525316 },
1270     { 2002, 525320 },
1271     { 1994, 525328 },
1272     { 2042, 525344 },
1273     { 1946, 525376 },
1274     { 1882, 525440 },
1275     { 1754, 525568 },
1276     { 1498, 525824 },
1277     { 3034, 526336 },
1278     { 3035, 526337 },
1279     { 3032, 526338 },
1280     { 3038, 526340 },
1281     { 3026, 526344 },
1282     { 3018, 526352 },
1283     { 3066, 526368 },
1284     { 2970, 526400 },
1285     { 2906, 526464 },
1286     { 2778, 526592 },
1287     { 2522, 526848 },
1288     { 4058, 527360 },
1289     { 2865, 528384 },
1290     { 2864, 528385 },
1291     { 2867, 528386 },
1292     { 2869, 528388 },
1293     { 2873, 528392 },
1294     { 2849, 528400 },
1295     { 2833, 528416 },
1296     { 2929, 528448 },
1297     { 2993, 528512 },
1298     { 2609, 528640 },
1299     { 2353, 528896 },
1300     { 3889, 529408 },
1301     { 817, 530432 },
1302     { 2788, 532480 },
1303     { 2789, 532481 },
1304     { 2790, 532482 },
1305     { 2784, 532484 },
1306     { 2796, 532488 },
1307     { 2804, 532496 },
1308     { 2756, 532512 },
1309     { 2724, 532544 },
1310     { 2660, 532608 },
1311     { 3044, 532736 },
1312     { 2276, 532992 },
1313     { 3812, 533504 },
1314     { 740, 534528 },
1315     { 527, 536576 },
1316     { 2381, 540672 },
1317     { 2380, 540673 },
1318     { 2383, 540674 },
1319     { 2377, 540676 },
1320     { 2373, 540680 },
1321     { 2397, 540688 },
1322     { 2413, 540704 },
1323     { 2317, 540736 },
1324     { 2509, 540800 },
1325     { 2125, 540928 },
1326     { 2893, 541184 },
1327     { 3405, 541696 },
1328     { 333, 542720 },
1329     { 422, 544768 },
1330     { 115, 548864 },
1331     { 3612, 557056 },
1332     { 3613, 557057 },
1333     { 3614, 557058 },
1334     { 3608, 557060 },
1335     { 3604, 557064 },
1336     { 3596, 557072 },
1337     { 3644, 557088 },
1338     { 3676, 557120 },
1339     { 3740, 557184 },
1340     { 3868, 557312 },
1341     { 3100, 557568 },
1342     { 2588, 558080 },
1343     { 1564, 559104 },
1344     { 1783, 561152 },
1345     { 1826, 565248 },
1346     { 1163, 573440 },
1347     { 189, 589824 },
1348     { 188, 589825 },
1349     { 191, 589826 },
1350     { 185, 589828 },
1351     { 181, 589832 },
1352     { 173, 589840 },
1353     { 157, 589856 },
1354     { 253, 589888 },
1355     { 61, 589952 },
1356     { 445, 590080 },
1357     { 701, 590336 },
1358     { 1213, 590848 },
1359     { 2237, 591872 },
1360     { 2134, 593920 },
1361     { 2435, 598016 },
1362     { 2602, 606208 },
1363     { 3451, 622592 },
1364     { 1303, 655360 },
1365     { 1302, 655361 },
1366     { 1301, 655362 },
1367     { 1299, 655364 },
1368     { 1311, 655368 },
1369     { 1287, 655376 },
1370     { 1335, 655392 },
1371     { 1367, 655424 },
1372     { 1431, 655488 },
1373     { 1047, 655616 },
1374     { 1815, 655872 },
1375     { 279, 656384 },
1376     { 3351, 657408 },
1377     { 3580, 659456 },
1378     { 3113, 663552 },
1379     { 3968, 671744 },
1380     { 2257, 688128 },
1381     { 1648, 720896 },
1382     { 3651, 786432 },
1383     { 3650, 786433 },
1384     { 3649, 786434 },
1385     { 3655, 786436 },
1386     { 3659, 786440 },
1387     { 3667, 786448 },
1388     { 3683, 786464 },
1389     { 3587, 786496 },
1390     { 3779, 786560 },
1391     { 3907, 786688 },
1392     { 3139, 786944 },
1393     { 2627, 787456 },
1394     { 1603, 788480 },
1395     { 1704, 790528 },
1396     { 1917, 794624 },
1397     { 1236, 802816 },
1398     { 901, 819200 },
1399     { 3364, 851968 },
1400     { 2190, 917504 }
1401 };
1402 
golay_20_8_parity(uint32_t * data)1403 uint32_t golay_20_8_parity(uint32_t* data) {
1404     uint32_t parity = 0;
1405 
1406     uint8_t k;
1407     for (k = 0; k < 12; k++) {
1408         uint8_t bit = 0, l;
1409         for (l = 0; l < 20; l++) {
1410             if ((golay_20_8_parity_check_matrix[k] >> l) & 1) {
1411                 bit ^= ((*data >> l) & 1);
1412             }
1413         }
1414 
1415         parity = (parity << 1) | (bit & 1);
1416     }
1417 
1418     return parity;
1419 }
1420 
golay_20_8(uint32_t * data)1421 bool golay_20_8(uint32_t* data) {
1422     uint32_t parity = golay_20_8_parity(data);
1423 
1424     if (parity == 0) return true;
1425 
1426     int num_corrections = sizeof(corrections)/sizeof(corrections[0]);
1427     for (int i = 0; i < num_corrections; i++) {
1428         if (corrections[i].syndrome == parity) {
1429             *data = *data ^ corrections[i].error_pattern;
1430             return true;
1431         }
1432     }
1433 
1434     return false;
1435 }
1436