1#!/usr/bin/python 2 3# produce a sync word for a given LAP 4 5lap = 0xffffff 6 7pn = 0x83848D96BBCC54FC 8 9# generator matrix for (64,30) linear block code 10# based on polynomial 0260534236651 11# (see gen_check_tables.py for automatic generation) 12g = ( 13 0x8000000000000001, 14 0x40000002c2b89ed4, 15 0x20000001615c4f6a, 16 0x10000000b0ae27b5, 17 0x080000029aef8d0e, 18 0x040000014d77c687, 19 0x0200000264037d97, 20 0x01000003f0b9201f, 21 0x008000033ae40edb, 22 0x004000035fca99b9, 23 0x002000036d5dd208, 24 0x00100001b6aee904, 25 0x00080000db577482, 26 0x000400006dabba41, 27 0x00020002f46d43f4, 28 0x000100017a36a1fa, 29 0x00008000bd1b50fd, 30 0x000040029c3536aa, 31 0x000020014e1a9b55, 32 0x0000100265b5d37e, 33 0x0000080132dae9bf, 34 0x000004025bd5ea0b, 35 0x00000203ef526bd1, 36 0x000001033511ab3c, 37 0x000000819a88d59e, 38 0x00000040cd446acf, 39 0x00000022a41aabb3, 40 0x0000001390b5cb0d, 41 0x0000000b0ae27b52, 42 0x0000000585713da9) 43 44def encode(data): 45 assert data < 2**30 46 codeword = 0 47 for i in range(30): 48 if (data & (0x20000000 >> i)): 49 codeword ^= g[i] 50 return codeword 51 52# append barker code 53if (lap & 0x800000): 54 data = 0x13000000 | lap 55else: 56 data = 0x2c000000 | lap 57 58# scramble 59data ^= (pn >> 34) 60 61# encode 62codeword = encode(data) 63 64# scramble again 65syncword = codeword ^ pn 66 67print "0x%06x 0x%016x 0x%016x" % (lap, codeword, syncword) 68