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