1386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
2386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * lfsr.c
3386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari *
4386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
5386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
6386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
7386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include <stdio.h>
8386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#include "datatypes.h"
9386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
10386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint32_t
11386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariparity(uint32_t x) {
12386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
13386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x ^= (x >> 16);
14386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x ^= (x >> 8);
15386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x ^= (x >> 4);
16386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x ^= (x >> 2);
17386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x ^= (x >> 1);
18386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
19386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return x & 1;
20386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
21386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
22386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
23386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* typedef struct { */
24386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*   uint32_t register[8]; */
25386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/* } lfsr_t; */
26386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
27386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
28386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagaricompute_period(uint32_t feedback_polynomial) {
29386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
30386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v32_t lfsr;
31386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v32_t mask;
32386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
33386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  mask.value = feedback_polynomial;
34386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  lfsr.value = 1;
35386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
36386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("polynomial: %s\t", v32_bit_string(mask));
37386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
38386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 256; i++) {
39386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*     printf("%s\n", v32_bit_string(lfsr)); */
40386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (parity(mask.value & lfsr.value))
41386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      lfsr.value = ((lfsr.value << 1) | 1) & 0xff;
42386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    else
43386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      lfsr.value = (lfsr.value << 1) & 0xff;
44386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
45386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* now halt if we're back at the initial state */
46386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (lfsr.value == 1) {
47386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      printf("period: %d\n", i);
48386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      break;
49386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    }
50386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
51386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
52386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
53386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint32_t poly0 = 223;
54386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
55386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
56386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariuint32_t polynomials[39] = {
57386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari31,
58386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari47,
59386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari55,
60386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari59,
61386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari61,
62386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari79,
63386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari87,
64386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari91,
65386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari103,
66386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari107,
67386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari109,
68386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari115,
69386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari117,
70386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari121,
71386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari143,
72386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari151,
73386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari157,
74386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari167,
75386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari171,
76386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari173,
77386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari179,
78386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari181,
79386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari185,
80386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari199,
81386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari203,
82386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari205,
83386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari211,
84386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari213,
85386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari227,
86386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari229,
87386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari233,
88386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari241,
89386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari127,
90386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari191,
91386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari223,
92386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari239,
93386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari247,
94386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari251,
95386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari253
96386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari};
97386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
98386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar binary_string[32];
99386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
100386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarichar *
101386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariu32_bit_string(uint32_t x, unsigned int length) {
102386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  unsigned int mask;
103386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int index;
104386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
105386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  mask = 1 << length;
106386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  index = 0;
107386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (; mask > 0; mask >>= 1)
108386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if ((x & mask) == 0)
109386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      binary_string[index++] = '0';
110386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    else
111386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      binary_string[index++] = '1';
112386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
113386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  binary_string[index++] = 0;  /* NULL terminate string */
114386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return binary_string;
115386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
116386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
117386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariextern int octet_weight[256];
118386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
119386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariunsigned int
120386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariweight(uint32_t poly) {
121386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int wt = 0;
122386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
123386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* note: endian-ness makes no difference */
124386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  wt += octet_weight[poly        & 0xff];
125386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  wt += octet_weight[(poly >> 8) & 0xff];
126386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  wt += octet_weight[(poly >> 16) & 0xff];
127386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  wt += octet_weight[(poly >> 24)];
128386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
129386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return wt;
130386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
131386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
132386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define MAX_PERIOD 65535
133386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
134386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define debug_print 0
135386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
136386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
137386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariperiod(uint32_t poly) {
138386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
139386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t x;
140386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
141386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
142386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* set lfsr to 1 */
143386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x = 1;
144386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if debug_print
145386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("%d:\t%s\n", 0, u32_bit_string(x,8));
146386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
147386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=1; i < MAX_PERIOD; i++) {
148386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (x & 1)
149386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x = (x >> 1) ^ poly;
150386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    else
151386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x = (x >> 1);
152386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
153386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if debug_print
154386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* print for a sanity check */
155386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("%d:\t%s\n", i, u32_bit_string(x,8));
156386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
157386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
158386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* check for return to original value */
159386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (x == 1)
160386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      return i;
161386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
162386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return i;
163386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
164386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
165386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari/*
166386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * weight distribution computes the weight distribution of the
167386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari * code generated by the polynomial poly
168386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari */
169386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
170386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define MAX_LEN    8
171386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#define MAX_WEIGHT (1 << MAX_LEN)
172386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
173386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint A[MAX_WEIGHT+1];
174386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
175386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
176386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariweight_distribution2(uint32_t poly, int *A) {
177386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
178386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t x;
179386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
180386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* zeroize array */
181386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < MAX_WEIGHT+1; i++)
182386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    A[i] = 0;
183386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
184386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* loop over all input sequences */
185386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
186386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
187386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* set lfsr to 1 */
188386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x = 1;
189386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if debug_print
190386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("%d:\t%s\n", 0, u32_bit_string(x,8));
191386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
192386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=1; i < MAX_PERIOD; i++) {
193386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (x & 1)
194386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x = (x >> 1) ^ poly;
195386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    else
196386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x = (x >> 1);
197386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
198386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if debug_print
199386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* print for a sanity check */
200386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("%d:\t%s\n", i, u32_bit_string(x,8));
201386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
202386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
203386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* increment weight */
204386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    wt += (x & 1);
205386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
206386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* check for return to original value */
207386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (x == 1)
208386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      break;
209386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
210386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
211386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* set zero */
212386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  A[0] = 0;
213386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
214386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
215386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
216386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarivoid
217386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariweight_distribution(uint32_t poly, int *A) {
218386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i;
219386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  uint32_t x;
220386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
221386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* zeroize array */
222386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < MAX_WEIGHT+1; i++)
223386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    A[i] = 0;
224386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
225386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* set lfsr to 1 */
226386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  x = 1;
227386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if debug_print
228386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("%d:\t%s\n", 0, u32_bit_string(x,8));
229386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
230386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=1; i < MAX_PERIOD; i++) {
231386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (x & 1)
232386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x = (x >> 1) ^ poly;
233386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    else
234386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      x = (x >> 1);
235386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
236386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if debug_print
237386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* print for a sanity check */
238386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("%d:\t%s\n", i, u32_bit_string(x,8));
239386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
240386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
241386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* compute weight, increment proper element */
242386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    A[weight(x)]++;
243386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
244386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    /* check for return to original value */
245386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    if (x == 1)
246386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      break;
247386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
248386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
249386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* set zero */
250386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  A[0] = 0;
251386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
252386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
253386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
254386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
255386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
256386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagariint
257386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagarimain () {
258386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
259386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  int i,j;
260386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v32_t x;
261386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  v32_t p;
262386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
263386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* originally 0xaf */
264386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  p.value = 0x9;
265386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
266386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  printf("polynomial: %s\tperiod: %d\n",
267386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 	   u32_bit_string(p.value,8), period(p.value));
268386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
269386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari   /* compute weight distribution */
270386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  weight_distribution(p.value, A);
271386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
272386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  /* print weight distribution */
273386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i <= 8; i++) {
274386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    printf("A[%d]: %d\n", i, A[i]);
275386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
276386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
277386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#if 0
278386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  for (i=0; i < 39; i++) {
279386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     printf("polynomial: %s\tperiod: %d\n",
280386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari 	   u32_bit_string(polynomials[i],8), period(polynomials[i]));
281386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
282386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     /* compute weight distribution */
283386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     weight_distribution(p.value, A);
284386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
285386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     /* print weight distribution */
286386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     for (j=0; j <= 8; j++) {
287386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari       printf("A[%d]: %d\n", j, A[j]);
288386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari     }
289386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
290386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari#endif
291386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
292386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  {
293386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    int bits = 8;
294386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    uint32_t y;
295386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    for (y=0; y < (1 << bits); y++) {
296386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      printf("polynomial: %s\tweight: %d\tperiod: %d\n",
297386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	     u32_bit_string(y,bits), weight(y), period(y));
298386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
299386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      /* compute weight distribution */
300386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      weight_distribution(y, A);
301386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
302386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      /* print weight distribution */
303386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      for (j=0; j <= 8; j++) {
304386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari	printf("A[%d]: %d\n", j, A[j]);
305386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari      }
306386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari    }
307386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  }
308386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari
309386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari  return 0;
310386ce4d9144fc190797f4e43a31aeaf76ca2e373Param Reddappagari}
311