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