OB.DAAC Logo
NASA Logo
Ocean Color Science Software

ocssw V2022
fec_seahawk.c
Go to the documentation of this file.
1 /* This function wraps around the fixed 8-bit decoder, performing the
2  * basis transformations necessary to meet the CCSDS standard
3  *
4  * Copyright 2002, Phil Karn, KA9Q
5  * May be used under the terms of the GNU Lesser General Public License (LGPL)
6  */
7 #include <stdlib.h>
8 #include <memory.h>
9 #include <limits.h>
10 
11 #include "ccsds.h"
12 #include "fec.h"
13 #ifdef DEBUG
14 #include <stdio.h>
15 #endif
16 
17 #include <string.h>
18 
19 /* Stuff specific to the CCSDS (255,223) RS codec
20  * (255,223) code over GF(256). Note: the conventional basis is still
21  * used; the dual-basis mappings are performed in [en|de]code_rs_ccsds.c
22  *
23  * Copyright 2003 Phil Karn, KA9Q
24  * May be used under the terms of the GNU Lesser General Public License (LGPL)
25  */
26 typedef unsigned char data_t;
27 
28 static inline int mod255(int x){
29  while (x >= 255) {
30  x -= 255;
31  x = (x >> 8) + (x & 255);
32  }
33  return x;
34 }
35 #define MODNN(x) mod255(x)
36 
40 
41 #define MM 8
42 #define NN 255
43 #define ALPHA_TO CCSDS_alpha_to
44 #define INDEX_OF CCSDS_index_of
45 #define GENPOLY CCSDS_poly
46 #define NROOTS 32
47 #define FCR 112
48 #define PRIM 11
49 #define IPRIM 116
50 #define PAD pad
51 
52 
53 int decode_rs_ccsds(data_t *data,int *eras_pos,int no_eras,int pad){
54  int i,r;
55  data_t cdata[NN];
56 
57  /* Convert data from dual basis to conventional */
58  for(i=0;i<NN-pad;i++)
59  cdata[i] = Tal1tab[data[i]];
60 
61  r = decode_rs_8(cdata,eras_pos,no_eras,pad);
62 
63  if(r > 0){
64  /* Convert from conventional to dual basis */
65  for(i=0;i<NN-pad;i++)
66  data[i] = Taltab[cdata[i]];
67  }
68  return r;
69 }
70 /* General purpose Reed-Solomon decoder for 8-bit symbols or less
71  * Copyright 2003 Phil Karn, KA9Q
72  * May be used under the terms of the GNU Lesser General Public License (LGPL)
73  */
74 
75 
76 int decode_rs_8(data_t *data, int *eras_pos, int no_eras, int pad){
77  int retval;
78 
79  if(pad < 0 || pad > 222){
80  return -1;
81  }
82 
83 #include "decode_rs.h"
84 
85  return retval;
86 }
88 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x87,0x89,0x95,0xad,0xdd,0x3d,0x7a,0xf4,
89 0x6f,0xde,0x3b,0x76,0xec,0x5f,0xbe,0xfb,0x71,0xe2,0x43,0x86,0x8b,0x91,0xa5,0xcd,
90 0x1d,0x3a,0x74,0xe8,0x57,0xae,0xdb,0x31,0x62,0xc4,0x0f,0x1e,0x3c,0x78,0xf0,0x67,
91 0xce,0x1b,0x36,0x6c,0xd8,0x37,0x6e,0xdc,0x3f,0x7e,0xfc,0x7f,0xfe,0x7b,0xf6,0x6b,
92 0xd6,0x2b,0x56,0xac,0xdf,0x39,0x72,0xe4,0x4f,0x9e,0xbb,0xf1,0x65,0xca,0x13,0x26,
93 0x4c,0x98,0xb7,0xe9,0x55,0xaa,0xd3,0x21,0x42,0x84,0x8f,0x99,0xb5,0xed,0x5d,0xba,
94 0xf3,0x61,0xc2,0x03,0x06,0x0c,0x18,0x30,0x60,0xc0,0x07,0x0e,0x1c,0x38,0x70,0xe0,
95 0x47,0x8e,0x9b,0xb1,0xe5,0x4d,0x9a,0xb3,0xe1,0x45,0x8a,0x93,0xa1,0xc5,0x0d,0x1a,
96 0x34,0x68,0xd0,0x27,0x4e,0x9c,0xbf,0xf9,0x75,0xea,0x53,0xa6,0xcb,0x11,0x22,0x44,
97 0x88,0x97,0xa9,0xd5,0x2d,0x5a,0xb4,0xef,0x59,0xb2,0xe3,0x41,0x82,0x83,0x81,0x85,
98 0x8d,0x9d,0xbd,0xfd,0x7d,0xfa,0x73,0xe6,0x4b,0x96,0xab,0xd1,0x25,0x4a,0x94,0xaf,
99 0xd9,0x35,0x6a,0xd4,0x2f,0x5e,0xbc,0xff,0x79,0xf2,0x63,0xc6,0x0b,0x16,0x2c,0x58,
100 0xb0,0xe7,0x49,0x92,0xa3,0xc1,0x05,0x0a,0x14,0x28,0x50,0xa0,0xc7,0x09,0x12,0x24,
101 0x48,0x90,0xa7,0xc9,0x15,0x2a,0x54,0xa8,0xd7,0x29,0x52,0xa4,0xcf,0x19,0x32,0x64,
102 0xc8,0x17,0x2e,0x5c,0xb8,0xf7,0x69,0xd2,0x23,0x46,0x8c,0x9f,0xb9,0xf5,0x6d,0xda,
103 0x33,0x66,0xcc,0x1f,0x3e,0x7c,0xf8,0x77,0xee,0x5b,0xb6,0xeb,0x51,0xa2,0xc3,0x00,
104 };
105 
107 255, 0, 1, 99, 2,198,100,106, 3,205,199,188,101,126,107, 42,
108  4,141,206, 78,200,212,189,225,102,221,127, 49,108, 32, 43,243,
109  5, 87,142,232,207,172, 79,131,201,217,213, 65,190,148,226,180,
110 103, 39,222,240,128,177, 50, 53,109, 69, 33, 18, 44, 13,244, 56,
111  6,155, 88, 26,143,121,233,112,208,194,173,168, 80,117,132, 72,
112 202,252,218,138,214, 84, 66, 36,191,152,149,249,227, 94,181, 21,
113 104, 97, 40,186,223, 76,241, 47,129,230,178, 63, 51,238, 54, 16,
114 110, 24, 70,166, 34,136, 19,247, 45,184, 14, 61,245,164, 57, 59,
115  7,158,156,157, 89,159, 27, 8,144, 9,122, 28,234,160,113, 90,
116 209, 29,195,123,174, 10,169,145, 81, 91,118,114,133,161, 73,235,
117 203,124,253,196,219, 30,139,210,215,146, 85,170, 67, 11, 37,175,
118 192,115,153,119,150, 92,250, 82,228,236, 95, 74,182,162, 22,134,
119 105,197, 98,254, 41,125,187,204,224,211, 77,140,242, 31, 48,220,
120 130,171,231, 86,179,147, 64,216, 52,176,239, 38, 55, 12, 17, 68,
121 111,120, 25,154, 71,116,167,193, 35, 83,137,251, 20, 93,248,151,
122  46, 75,185, 96, 15,237, 62,229,246,135,165, 23, 58,163, 60,183,
123 };
124 
125 data_t CCSDS_poly[] = {
126  0,249, 59, 66, 4, 43,126,251, 97, 30, 3,213, 50, 66,170, 5,
127  24, 5,170, 66, 50,213, 3, 30, 97,251,126, 43, 4, 66, 59,249,
128  0,
129 };
130 unsigned char Taltab[] = {
131 
132 0x00,0x7b,0xaf,0xd4,0x99,0xe2,0x36,0x4d,0xfa,0x81,0x55,0x2e,0x63,0x18,0xcc,0xb7,
133 0x86,0xfd,0x29,0x52,0x1f,0x64,0xb0,0xcb,0x7c,0x07,0xd3,0xa8,0xe5,0x9e,0x4a,0x31,
134 0xec,0x97,0x43,0x38,0x75,0x0e,0xda,0xa1,0x16,0x6d,0xb9,0xc2,0x8f,0xf4,0x20,0x5b,
135 0x6a,0x11,0xc5,0xbe,0xf3,0x88,0x5c,0x27,0x90,0xeb,0x3f,0x44,0x09,0x72,0xa6,0xdd,
136 0xef,0x94,0x40,0x3b,0x76,0x0d,0xd9,0xa2,0x15,0x6e,0xba,0xc1,0x8c,0xf7,0x23,0x58,
137 0x69,0x12,0xc6,0xbd,0xf0,0x8b,0x5f,0x24,0x93,0xe8,0x3c,0x47,0x0a,0x71,0xa5,0xde,
138 0x03,0x78,0xac,0xd7,0x9a,0xe1,0x35,0x4e,0xf9,0x82,0x56,0x2d,0x60,0x1b,0xcf,0xb4,
139 0x85,0xfe,0x2a,0x51,0x1c,0x67,0xb3,0xc8,0x7f,0x04,0xd0,0xab,0xe6,0x9d,0x49,0x32,
140 0x8d,0xf6,0x22,0x59,0x14,0x6f,0xbb,0xc0,0x77,0x0c,0xd8,0xa3,0xee,0x95,0x41,0x3a,
141 0x0b,0x70,0xa4,0xdf,0x92,0xe9,0x3d,0x46,0xf1,0x8a,0x5e,0x25,0x68,0x13,0xc7,0xbc,
142 0x61,0x1a,0xce,0xb5,0xf8,0x83,0x57,0x2c,0x9b,0xe0,0x34,0x4f,0x02,0x79,0xad,0xd6,
143 0xe7,0x9c,0x48,0x33,0x7e,0x05,0xd1,0xaa,0x1d,0x66,0xb2,0xc9,0x84,0xff,0x2b,0x50,
144 0x62,0x19,0xcd,0xb6,0xfb,0x80,0x54,0x2f,0x98,0xe3,0x37,0x4c,0x01,0x7a,0xae,0xd5,
145 0xe4,0x9f,0x4b,0x30,0x7d,0x06,0xd2,0xa9,0x1e,0x65,0xb1,0xca,0x87,0xfc,0x28,0x53,
146 0x8e,0xf5,0x21,0x5a,0x17,0x6c,0xb8,0xc3,0x74,0x0f,0xdb,0xa0,0xed,0x96,0x42,0x39,
147 0x08,0x73,0xa7,0xdc,0x91,0xea,0x3e,0x45,0xf2,0x89,0x5d,0x26,0x6b,0x10,0xc4,0xbf,
148 };
149 
150 unsigned char Tal1tab[] = {
151 0x00,0xcc,0xac,0x60,0x79,0xb5,0xd5,0x19,0xf0,0x3c,0x5c,0x90,0x89,0x45,0x25,0xe9,
152 0xfd,0x31,0x51,0x9d,0x84,0x48,0x28,0xe4,0x0d,0xc1,0xa1,0x6d,0x74,0xb8,0xd8,0x14,
153 0x2e,0xe2,0x82,0x4e,0x57,0x9b,0xfb,0x37,0xde,0x12,0x72,0xbe,0xa7,0x6b,0x0b,0xc7,
154 0xd3,0x1f,0x7f,0xb3,0xaa,0x66,0x06,0xca,0x23,0xef,0x8f,0x43,0x5a,0x96,0xf6,0x3a,
155 0x42,0x8e,0xee,0x22,0x3b,0xf7,0x97,0x5b,0xb2,0x7e,0x1e,0xd2,0xcb,0x07,0x67,0xab,
156 0xbf,0x73,0x13,0xdf,0xc6,0x0a,0x6a,0xa6,0x4f,0x83,0xe3,0x2f,0x36,0xfa,0x9a,0x56,
157 0x6c,0xa0,0xc0,0x0c,0x15,0xd9,0xb9,0x75,0x9c,0x50,0x30,0xfc,0xe5,0x29,0x49,0x85,
158 0x91,0x5d,0x3d,0xf1,0xe8,0x24,0x44,0x88,0x61,0xad,0xcd,0x01,0x18,0xd4,0xb4,0x78,
159 0xc5,0x09,0x69,0xa5,0xbc,0x70,0x10,0xdc,0x35,0xf9,0x99,0x55,0x4c,0x80,0xe0,0x2c,
160 0x38,0xf4,0x94,0x58,0x41,0x8d,0xed,0x21,0xc8,0x04,0x64,0xa8,0xb1,0x7d,0x1d,0xd1,
161 0xeb,0x27,0x47,0x8b,0x92,0x5e,0x3e,0xf2,0x1b,0xd7,0xb7,0x7b,0x62,0xae,0xce,0x02,
162 0x16,0xda,0xba,0x76,0x6f,0xa3,0xc3,0x0f,0xe6,0x2a,0x4a,0x86,0x9f,0x53,0x33,0xff,
163 0x87,0x4b,0x2b,0xe7,0xfe,0x32,0x52,0x9e,0x77,0xbb,0xdb,0x17,0x0e,0xc2,0xa2,0x6e,
164 0x7a,0xb6,0xd6,0x1a,0x03,0xcf,0xaf,0x63,0x8a,0x46,0x26,0xea,0xf3,0x3f,0x5f,0x93,
165 0xa9,0x65,0x05,0xc9,0xd0,0x1c,0x7c,0xb0,0x59,0x95,0xf5,0x39,0x20,0xec,0x8c,0x40,
166 0x54,0x98,0xf8,0x34,0x2d,0xe1,0x81,0x4d,0xa4,0x68,0x08,0xc4,0xdd,0x11,0x71,0xbd,
167 };
168 /* K=7 r=1/2 Viterbi decoder with optional Intel or PowerPC SIMD
169  * Copyright Feb 2004, Phil Karn, KA9Q
170  */
171 
172 /* Create a new instance of a Viterbi decoder */
173 void *create_viterbi27(int len){
174  find_cpu_mode();
175 
176  switch(Cpu_mode){
177  case PORT:
178  default:
179  return create_viterbi27_port(len);
180 #ifdef __VEC__
181  case ALTIVEC:
182  return create_viterbi27_av(len);
183 #endif
184 #ifdef __i386__
185  case MMX:
186  return create_viterbi27_mmx(len);
187  case SSE:
188  return create_viterbi27_sse(len);
189  case SSE2:
190  return create_viterbi27_sse2(len);
191 #endif
192  }
193 }
194 
195 void set_viterbi27_polynomial(int polys[2]){
196  switch(Cpu_mode){
197  case PORT:
198  default:
200  break;
201 #ifdef __VEC__
202  case ALTIVEC:
203  set_viterbi27_polynomial_av(polys);
204  break;
205 #endif
206 #ifdef __i386__
207  case MMX:
208  set_viterbi27_polynomial_mmx(polys);
209  break;
210  case SSE:
211  set_viterbi27_polynomial_sse(polys);
212  break;
213  case SSE2:
214  set_viterbi27_polynomial_sse2(polys);
215  break;
216 #endif
217  }
218 }
219 
220 /* Initialize Viterbi decoder for start of new frame */
221 int init_viterbi27(void *p,int starting_state){
222  switch(Cpu_mode){
223  case PORT:
224  default:
225  return init_viterbi27_port(p,starting_state);
226 #ifdef __VEC__
227  case ALTIVEC:
228  return init_viterbi27_av(p,starting_state);
229 #endif
230 #ifdef __i386__
231  case MMX:
232  return init_viterbi27_mmx(p,starting_state);
233  case SSE:
234  return init_viterbi27_sse(p,starting_state);
235  case SSE2:
236  return init_viterbi27_sse2(p,starting_state);
237 #endif
238  }
239 }
240 
241 /* Viterbi chainback */
243  void *p,
244  unsigned char *data, /* Decoded output data */
245  unsigned int nbits, /* Number of data bits */
246  unsigned int endstate){ /* Terminal encoder state */
247 
248  switch(Cpu_mode){
249  case PORT:
250  default:
251  return chainback_viterbi27_port(p,data,nbits,endstate);
252 #ifdef __VEC__
253  case ALTIVEC:
254  return chainback_viterbi27_av(p,data,nbits,endstate);
255 #endif
256 #ifdef __i386__
257  case MMX:
258  return chainback_viterbi27_mmx(p,data,nbits,endstate);
259  case SSE:
260  return chainback_viterbi27_sse(p,data,nbits,endstate);
261  case SSE2:
262  return chainback_viterbi27_sse2(p,data,nbits,endstate);
263 #endif
264  }
265 }
266 
267 /* Delete instance of a Viterbi decoder */
268 void delete_viterbi27(void *p){
269  switch(Cpu_mode){
270  case PORT:
271  default:
273  break;
274 #ifdef __VEC__
275  case ALTIVEC:
276  delete_viterbi27_av(p);
277  break;
278 #endif
279 #ifdef __i386__
280  case MMX:
281  delete_viterbi27_mmx(p);
282  break;
283  case SSE:
284  delete_viterbi27_sse(p);
285  break;
286  case SSE2:
287  delete_viterbi27_sse2(p);
288  break;
289 #endif
290  }
291 }
292 
293 /* Update decoder with a block of demodulated symbols
294  * Note that nbits is the number of decoded data bits, not the number
295  * of symbols!
296  */
297 int update_viterbi27_blk(void *p,unsigned char syms[],int nbits){
298  if(p == NULL)
299  return -1;
300 
301  switch(Cpu_mode){
302  case PORT:
303  default:
304  update_viterbi27_blk_port(p,syms,nbits);
305  break;
306 #ifdef __VEC__
307  case ALTIVEC:
308  update_viterbi27_blk_av(p,syms,nbits);
309  break;
310 #endif
311 #ifdef __i386__
312  case MMX:
313  update_viterbi27_blk_mmx(p,syms,nbits);
314  break;
315  case SSE:
316  update_viterbi27_blk_sse(p,syms,nbits);
317  break;
318  case SSE2:
319  update_viterbi27_blk_sse2(p,syms,nbits);
320  break;
321 #endif
322  }
323  return 0;
324 }
325 /* K=7 r=1/2 Viterbi decoder in portable C
326  * Copyright Feb 2004, Phil Karn, KA9Q
327  * May be used under the terms of the GNU Lesser General Public License (LGPL)
328  */
329 
330 typedef union { unsigned int w[64]; } metric_t;
331 typedef union { unsigned long w[2];} decision_t;
332 static union branchtab27 { unsigned char c[32]; } Branchtab27[2] __attribute__ ((aligned(16)));
333 static int Init = 0;
334 
335 /* State info for instance of Viterbi decoder
336  * Don't change this without also changing references in [mmx|sse|sse2]bfly29.s!
337  */
338 struct v27 {
339  metric_t metrics1; /* path metric buffer 1 */
340  metric_t metrics2; /* path metric buffer 2 */
341  decision_t *dp; /* Pointer to current decision */
342  metric_t *old_metrics,*new_metrics; /* Pointers to path metrics, swapped on every bit */
343  decision_t *decisions; /* Beginning of decisions for block */
344 };
345 
346 /* Initialize Viterbi decoder for start of new frame */
347 int init_viterbi27_port(void *p,int starting_state){
348  struct v27 *vp = p;
349  int i;
350 
351  if(p == NULL)
352  return -1;
353  for(i=0;i<64;i++)
354  vp->metrics1.w[i] = 63;
355 
356  vp->old_metrics = &vp->metrics1;
357  vp->new_metrics = &vp->metrics2;
358  vp->dp = vp->decisions;
359  vp->old_metrics->w[starting_state & 63] = 0; /* Bias known start state */
360  return 0;
361 }
362 
363 void set_viterbi27_polynomial_port(int polys[2]){
364  int state;
365 
366  for(state=0;state < 32;state++){
367  Branchtab27[0].c[state] = (polys[0] < 0) ^ parity((2*state) & abs(polys[0])) ? 255 : 0;
368  Branchtab27[1].c[state] = (polys[1] < 0) ^ parity((2*state) & abs(polys[1])) ? 255 : 0;
369  }
370  Init++;
371 }
372 
373 /* Create a new instance of a Viterbi decoder */
374 void *create_viterbi27_port(int len){
375  struct v27 *vp;
376 
377  if(!Init){
378  int polys[2] = { V27POLYA, V27POLYB };
380  }
381  if((vp = malloc(sizeof(struct v27))) == NULL)
382  return NULL;
383  if((vp->decisions = malloc((len+6)*sizeof(decision_t))) == NULL){
384  free(vp);
385  return NULL;
386  }
387  init_viterbi27_port(vp,0);
388 
389  return vp;
390 }
391 
392 /* Viterbi chainback */
394  void *p,
395  unsigned char *data, /* Decoded output data */
396  unsigned int nbits, /* Number of data bits */
397  unsigned int endstate){ /* Terminal encoder state */
398  struct v27 *vp = p;
399  decision_t *d;
400 
401  if(p == NULL)
402  return -1;
403  d = vp->decisions;
404  /* Make room beyond the end of the encoder register so we can
405  * accumulate a full byte of decoded data
406  */
407  endstate %= 64;
408  endstate <<= 2;
409 
410  /* The store into data[] only needs to be done every 8 bits.
411  * But this avoids a conditional branch, and the writes will
412  * combine in the cache anyway
413  */
414  d += 6; /* Look past tail */
415  while(nbits-- != 0){
416  int k;
417 
418  k = (d[nbits].w[(endstate>>2)/32] >> ((endstate>>2)%32)) & 1;
419  data[nbits>>3] = endstate = (endstate >> 1) | (k << 7);
420  }
421  return 0;
422 }
423 
424 /* Delete instance of a Viterbi decoder */
426  struct v27 *vp = p;
427 
428  if(vp != NULL){
429  free(vp->decisions);
430  free(vp);
431  }
432 }
433 
434 /* C-language butterfly */
435 #define BFLY(i) {\
436 unsigned int metric,m0,m1,decision;\
437  metric = (Branchtab27[0].c[i] ^ sym0) + (Branchtab27[1].c[i] ^ sym1);\
438  m0 = vp->old_metrics->w[i] + metric;\
439  m1 = vp->old_metrics->w[i+32] + (510 - metric);\
440  decision = (signed int)(m0-m1) > 0;\
441  vp->new_metrics->w[2*i] = decision ? m1 : m0;\
442  d->w[i/16] |= decision << ((2*i)&31);\
443  m0 -= (metric+metric-510);\
444  m1 += (metric+metric-510);\
445  decision = (signed int)(m0-m1) > 0;\
446  vp->new_metrics->w[2*i+1] = decision ? m1 : m0;\
447  d->w[i/16] |= decision << ((2*i+1)&31);\
448 }
449 
450 /* Update decoder with a block of demodulated symbols
451  * Note that nbits is the number of decoded data bits, not the number
452  * of symbols!
453  */
454 int update_viterbi27_blk_port(void *p,unsigned char *syms,int nbits){
455  struct v27 *vp = p;
456  void *tmp;
457  decision_t *d;
458 
459  if(p == NULL)
460  return -1;
461  d = (decision_t *)vp->dp;
462  while(nbits--){
463  unsigned char sym0,sym1;
464 
465  d->w[0] = d->w[1] = 0;
466  sym0 = *syms++;
467  sym1 = *syms++;
468 
469  BFLY(0);
470  BFLY(1);
471  BFLY(2);
472  BFLY(3);
473  BFLY(4);
474  BFLY(5);
475  BFLY(6);
476  BFLY(7);
477  BFLY(8);
478  BFLY(9);
479  BFLY(10);
480  BFLY(11);
481  BFLY(12);
482  BFLY(13);
483  BFLY(14);
484  BFLY(15);
485  BFLY(16);
486  BFLY(17);
487  BFLY(18);
488  BFLY(19);
489  BFLY(20);
490  BFLY(21);
491  BFLY(22);
492  BFLY(23);
493  BFLY(24);
494  BFLY(25);
495  BFLY(26);
496  BFLY(27);
497  BFLY(28);
498  BFLY(29);
499  BFLY(30);
500  BFLY(31);
501  d++;
502  /* Swap pointers to old and new metrics */
503  tmp = vp->old_metrics;
504  vp->old_metrics = vp->new_metrics;
505  vp->new_metrics = tmp;
506  }
507  vp->dp = d;
508  return 0;
509 }
510 /* Utility routines for FEC support
511  * Copyright 2004, Phil Karn, KA9Q
512  */
513 
514 unsigned char Partab[256];
515 int P_init;
516 
517 /* Create 256-entry odd-parity lookup table
518  * Needed only on non-ia32 machines
519  */
520 void partab_init(void){
521  int i,cnt,ti;
522 
523  /* Initialize parity lookup table */
524  for(i=0;i<256;i++){
525  cnt = 0;
526  ti = i;
527  while(ti){
528  if(ti & 1)
529  cnt++;
530  ti >>= 1;
531  }
532  Partab[i] = cnt & 1;
533  }
534  P_init=1;
535 }
536 
537 /* Lookup table giving count of 1 bits for integers 0-255 */
538 int Bitcnt[] = {
539  0, 1, 1, 2, 1, 2, 2, 3,
540  1, 2, 2, 3, 2, 3, 3, 4,
541  1, 2, 2, 3, 2, 3, 3, 4,
542  2, 3, 3, 4, 3, 4, 4, 5,
543  1, 2, 2, 3, 2, 3, 3, 4,
544  2, 3, 3, 4, 3, 4, 4, 5,
545  2, 3, 3, 4, 3, 4, 4, 5,
546  3, 4, 4, 5, 4, 5, 5, 6,
547  1, 2, 2, 3, 2, 3, 3, 4,
548  2, 3, 3, 4, 3, 4, 4, 5,
549  2, 3, 3, 4, 3, 4, 4, 5,
550  3, 4, 4, 5, 4, 5, 5, 6,
551  2, 3, 3, 4, 3, 4, 4, 5,
552  3, 4, 4, 5, 4, 5, 5, 6,
553  3, 4, 4, 5, 4, 5, 5, 6,
554  4, 5, 5, 6, 5, 6, 6, 7,
555  1, 2, 2, 3, 2, 3, 3, 4,
556  2, 3, 3, 4, 3, 4, 4, 5,
557  2, 3, 3, 4, 3, 4, 4, 5,
558  3, 4, 4, 5, 4, 5, 5, 6,
559  2, 3, 3, 4, 3, 4, 4, 5,
560  3, 4, 4, 5, 4, 5, 5, 6,
561  3, 4, 4, 5, 4, 5, 5, 6,
562  4, 5, 5, 6, 5, 6, 6, 7,
563  2, 3, 3, 4, 3, 4, 4, 5,
564  3, 4, 4, 5, 4, 5, 5, 6,
565  3, 4, 4, 5, 4, 5, 5, 6,
566  4, 5, 5, 6, 5, 6, 6, 7,
567  3, 4, 4, 5, 4, 5, 5, 6,
568  4, 5, 5, 6, 5, 6, 6, 7,
569  4, 5, 5, 6, 5, 6, 6, 7,
570  5, 6, 6, 7, 6, 7, 7, 8,
571 };
572 
573 /* Determine CPU support for SIMD
574  * Copyright 2004 Phil Karn, KA9Q
575  */
576 
577 /* Various SIMD instruction set names */
578 char *Cpu_modes[] = {"Unknown","Portable C","x86 Multi Media Extensions (MMX)",
579  "x86 Streaming SIMD Extensions (SSE)",
580  "x86 Streaming SIMD Extensions 2 (SSE2)",
581  "PowerPC G4/G5 Altivec/Velocity Engine"};
582 
584 
585 void find_cpu_mode(void){
586 
587  if(Cpu_mode != UNKNOWN)
588  return;
589 
590  /* Figure out what kind of CPU we have */
591  //f = cpu_features();
592  //if(f & (1<<26)){ /* SSE2 is present */
593  // Cpu_mode = SSE2;
594  //} else if(f & (1<<25)){ /* SSE is present */
595  // Cpu_mode = SSE;
596  //} else if(f & (1<<23)){ /* MMX is present */
597  // Cpu_mode = MMX;
598  //} else { /* No SIMD at all */
599  // Cpu_mode = PORT;
600  //}
601  Cpu_mode = PORT;
602 
603 }
unsigned char data_t
Definition: fec_seahawk.c:26
int decode_rs_ccsds(data_t *data, int *eras_pos, int no_eras, int pad)
Definition: fec_seahawk.c:53
int r
Definition: decode_rs.h:73
cpu_mode
Definition: fec.h:261
unsigned int w[64]
Definition: fec_seahawk.c:330
void delete_viterbi27(void *p)
Definition: fec_seahawk.c:268
void set_viterbi27_polynomial_port(int polys[2])
Definition: fec_seahawk.c:363
char * Cpu_modes[]
Definition: fec_seahawk.c:578
#define BFLY(i)
Definition: fec_seahawk.c:435
unsigned char Tal1tab[]
Definition: fec_seahawk.c:150
void * create_viterbi27(int len)
Definition: fec_seahawk.c:173
int P_init
Definition: fec_seahawk.c:515
#define NULL
Definition: decode_rs.h:63
@ PORT
Definition: fec.h:261
decision_t * decisions
Definition: fec_seahawk.c:343
int Bitcnt[]
Definition: fec_seahawk.c:538
metric_t metrics2
Definition: fec_seahawk.c:340
@ SSE
Definition: fec.h:261
void * create_viterbi27_port(int len)
Definition: fec_seahawk.c:374
void partab_init(void)
Definition: fec_seahawk.c:520
unsigned char Taltab[]
Definition: fec_seahawk.c:130
#define V27POLYA
Definition: fec.h:13
unsigned char c[32]
Definition: fec_seahawk.c:297
@ ALTIVEC
Definition: fec.h:261
@ MMX
Definition: fec.h:261
data_t CCSDS_alpha_to[]
Definition: fec_seahawk.c:37
unsigned char data_t
Definition: ccsds.h:1
int update_viterbi27_blk_port(void *p, unsigned char *syms, int nbits)
Definition: fec_seahawk.c:454
void set_viterbi27_polynomial(int polys[2])
Definition: fec_seahawk.c:195
enum cpu_mode Cpu_mode
Definition: fec_seahawk.c:583
int chainback_viterbi27_port(void *p, unsigned char *data, unsigned int nbits, unsigned int endstate)
Definition: fec_seahawk.c:393
int state(double tjdTDB, JPLIntUtilType *util, double posvel[13][6], double *pnut)
data_t CCSDS_index_of[]
Definition: fec_seahawk.c:38
struct v27 __attribute__[2]
int init_viterbi27_port(void *p, int starting_state)
Definition: fec_seahawk.c:347
data_t tmp
Definition: decode_rs.h:74
int init_viterbi27(void *p, int starting_state)
Definition: fec_seahawk.c:221
int chainback_viterbi27(void *p, unsigned char *data, unsigned int nbits, unsigned int endstate)
Definition: fec_seahawk.c:242
unsigned long w[2]
Definition: fec_seahawk.c:331
subroutine cdata
Definition: cdata.f:2
metric_t * new_metrics
Definition: fec_seahawk.c:342
int update_viterbi27_blk(void *p, unsigned char syms[], int nbits)
Definition: fec_seahawk.c:297
#define NN
Definition: fec_seahawk.c:42
void delete_viterbi27_port(void *p)
Definition: fec_seahawk.c:425
no change in intended resolving MODur00064 Corrected handling of bad ephemeris attitude data
Definition: HISTORY.txt:356
void find_cpu_mode(void)
Definition: fec_seahawk.c:585
#define V27POLYB
Definition: fec.h:14
data_t CCSDS_poly[]
Definition: fec_seahawk.c:39
decision_t * dp
Definition: fec_seahawk.c:341
int decode_rs_8(data_t *data, int *eras_pos, int no_eras, int pad)
Definition: fec_seahawk.c:76
@ SSE2
Definition: fec.h:261
metric_t metrics1
Definition: fec_seahawk.c:339
metric_t * old_metrics
Definition: fec_seahawk.c:342
unsigned char Partab[256]
Definition: fec_seahawk.c:514
#define abs(a)
Definition: misc.h:90
int i
Definition: decode_rs.h:71
int k
Definition: decode_rs.h:73
float p[MODELMAX]
Definition: atrem_corl1.h:131
@ UNKNOWN
Definition: fec.h:261