xref: /libbtbb/python/utils/gen_check_tables.py (revision 209acb71879f8217753a8fe9c1dea1aa65f3d819)
1#!/usr/bin/python
2
3# (64,30) linear block code stuff
4
5polynomial = 0260534236651
6
7# produce generator matrix g
8g = []
9for i in range(30):
10	g.append(polynomial << i)
11	for j in range(i):
12		if g[i] & (1 << (33 + i - j)):
13			g[i] ^= g[i-j-1]
14
15#print
16#for i in range(29,-1,-1):
17	#print "0x%016x," % g[i]
18#print
19
20# produce check matrix h
21h = []
22for i in range(34):
23	h.append(0)
24	for j in range(30):
25		h[i] |= (g[29-j] >> i) & 0x1
26		h[i] <<= 1
27	h[i] <<= 33
28	h[i] |= (0x1 << i)
29
30#print
31#for i in range(34):
32	#print "0x%016x," % h[i]
33#print
34
35# reverse the order
36g = g[::-1]
37h = h[::-1]
38
39def count_bits(n):
40	i = 0
41	while n != 0:
42		n &= n - 1
43		i += 1
44	return i
45
46def gen_syndrome(c):
47	assert c < 2**64
48	s = 0
49	# look for a faster GF(2) matrix multiplication algorithm
50	for i in range(34):
51		s <<= 1
52		s |= (count_bits(c & h[i]) % 2)
53	return s
54
55# optimized check table generation (sw_check_tables.h)
56for shift in range(8):
57	for i in range(256):
58			print "0x%09x, " % gen_syndrome(i<<(shift*8)),
59	print
60