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