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