OpenCores
URL https://opencores.org/ocsvn/bluespec-reedsolomon/bluespec-reedsolomon/trunk

Subversion Repositories bluespec-reedsolomon

[/] [bluespec-reedsolomon/] [trunk/] [sw-reedsolomon/] [gf_arith.cpp] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 4 abhiag
//----------------------------------------------------------------------//
2
// The MIT License 
3
// 
4
// Copyright (c) 2008 Abhinav Agarwal, Alfred Man Cheuk Ng
5
// Contact: abhiag@gmail.com
6
// 
7
// Permission is hereby granted, free of charge, to any person 
8
// obtaining a copy of this software and associated documentation 
9
// files (the "Software"), to deal in the Software without 
10
// restriction, including without limitation the rights to use,
11
// copy, modify, merge, publish, distribute, sublicense, and/or sell
12
// copies of the Software, and to permit persons to whom the
13
// Software is furnished to do so, subject to the following conditions:
14
// 
15
// The above copyright notice and this permission notice shall be
16
// included in all copies or substantial portions of the Software.
17
// 
18
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
20
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
22
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
24
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
25
// OTHER DEALINGS IN THE SOFTWARE.
26
//----------------------------------------------------------------------//
27
 
28
/*
29
  Incorporates all GF arithmetic used in various modules
30
*/
31
//#include "ac_int.h"
32
#include "gf_arith.h"
33
 
34
 
35
unsigned char gfadd_hw(unsigned char a, unsigned char b)
36
{
37
    return a^b;
38
}
39
 
40
unsigned char gfmult_hw(unsigned char a, unsigned char b)
41
{
42
 
43
   unsigned int temp = 0;
44
 
45 9 abhiag
   // Directive: Unroll loop maximally
46 4 abhiag
   for (int i = 0; i < 8; i++)
47
      if (b & (1 << i))
48
         temp ^= (unsigned int)(a << i);
49
 
50 9 abhiag
   // Directive: Unroll loop maximally 
51 4 abhiag
   for (int k = 15; k > 7; k--)
52
      if (temp & (1 << k))
53
             temp ^= (unsigned int)(pp_char << (k - 8));
54
 
55
   return (temp & 255);
56
 
57
}
58
 
59
unsigned char alpha (unsigned char n)
60
{
61
    unsigned char alpha_lut[256] = {
62
        1,
63
        2,
64
        4,
65
        8,
66
        16,
67
        32,
68
        64,
69
        128,
70
        29,
71
        58,
72
        116,
73
        232,
74
        205,
75
        135,
76
        19,
77
        38,
78
        76,
79
        152,
80
        45,
81
        90,
82
        180,
83
        117,
84
        234,
85
        201,
86
        143,
87
        3,
88
        6,
89
        12,
90
        24,
91
        48,
92
        96,
93
        192,
94
        157,
95
        39,
96
        78,
97
        157,
98
        37,
99
        74,
100
        148,
101
        53,
102
        106,
103
        212,181, 119, 238, 193,159,35, 70, 140, 5, 10, 20, 40, 80, 160,
104
        93, 186, 105,210, 185,111,222,161,95,190,97,194,153,47,94,188,101,202,137,15,30,60,120,240,253,
105
        231,211,187,107,214,177,127,254,225,223,163,91,182,113,226,217,175,65,134,17,34,68,136,13,26,52,104,
106
        208,189,103,206,129,31,62,124,248,237,199,147,59,118,236,197,151,51,102,204,133,23,46,92,184,109,218,
107
        169,79,158,33,66,132,21,42,84,168,77,154,41,82,164,85,170,73,146,57,114,228,213,183,115,230,209,
108
        191,99,198,145,63,126,252,229,215,179,123,246,241,255,227,219,171,75,150,49,98,196,149,55,110,220,165,87,174,
109
        65,130,25,50,100,200,141,7,14,28,56,112,224,221,167,83,166,81,162,89,178,121,242,249,239,195,155,43,86,172,
110
        69,138,9,18,36,72,144,61,122,244,245,247,243,251,235,203,139,11,22,44,88,176,125,250,233,207,131,27,54,108,216,
111
        173,71,142,0};
112
        return alpha_lut[n];
113
}
114
 
115
unsigned char gfinv_lut (unsigned char a)
116
{
117
 
118
unsigned char lut[256] = {
119
2
120
,1
121
,142
122
,244
123
,71
124
,167
125
,122
126
,186
127
,173
128
,157
129
,221
130
,152
131
,61
132
,170
133
,93
134
,150
135
,216
136
,114
137
,192
138
,88
139
,224
140
,62
141
,76
142
,102
143
,144
144
,222
145
,85
146
,128
147
,160
148
,131
149
,75
150
,42
151
,108
152
,237
153
,57
154
,81
155
,96
156
,86
157
,44
158
,138
159
,112
160
,208
161
,31
162
,74
163
,38
164
,139
165
,51
166
,110
167
,72
168
,137
169
,111
170
,46
171
,164
172
,195
173
,64
174
,94
175
,80
176
,34
177
,207
178
,169
179
,171
180
,12
181
,21
182
,225
183
,54
184
,95
185
,248
186
,213
187
,146
188
,78
189
,166
190
,4
191
,48
192
,136
193
,43
194
,30
195
,22
196
,103
197
,69
198
,147
199
,56
200
,35
201
,104
202
,140
203
,129
204
,26
205
,37
206
,97
207
,19
208
,193
209
,203
210
,99
211
,151
212
,14
213
,55
214
,65
215
,36
216
,87
217
,202
218
,91
219
,185
220
,196
221
,23
222
,77
223
,82
224
,141
225
,239
226
,179
227
,32
228
,236
229
,47
230
,50
231
,40
232
,209
233
,17
234
,217
235
,233
236
,251
237
,218
238
,121
239
,219
240
,119
241
,6
242
,187
243
,132
244
,205
245
,254
246
,252
247
,27
248
,84
249
,161
250
,29
251
,124
252
,204
253
,228
254
,176
255
,73
256
,49
257
,39
258
,45
259
,83
260
,105
261
,2
262
,245
263
,24
264
,223
265
,68
266
,79
267
,155
268
,188
269
,15
270
,92
271
,11
272
,220
273
,189
274
,148
275
,172
276
,9
277
,199
278
,162
279
,28
280
,130
281
,159
282
,198
283
,52
284
,194
285
,70
286
,5
287
,206
288
,59
289
,13
290
,60
291
,156
292
,8
293
,190
294
,183
295
,135
296
,229
297
,238
298
,107
299
,235
300
,242
301
,191
302
,175
303
,197
304
,100
305
,7
306
,123
307
,149
308
,154
309
,174
310
,182
311
,18
312
,89
313
,165
314
,53
315
,101
316
,184
317
,163
318
,158
319
,210
320
,247
321
,98
322
,90
323
,133
324
,125
325
,168
326
,58
327
,41
328
,113
329
,200
330
,246
331
,249
332
,67
333
,215
334
,214
335
,16
336
,115
337
,118
338
,120
339
,153
340
,10
341
,25
342
,145
343
,20
344
,63
345
,230
346
,240
347
,134
348
,177
349
,226
350
,241
351
,250
352
,116
353
,243
354
,180
355
,109
356
,33
357
,178
358
,106
359
,227
360
,231
361
,181
362
,234
363
,3
364
,143
365
,211
366
,201
367
,66
368
,212
369
,232
370
,117
371
,127
372
,255
373
,126
374
,253};
375
 
376
 return lut[a];
377
}
378
 
379
unsigned char alphainv_lut (unsigned char n)
380
{
381
  if (n == 0)
382
     return 1;
383
   return gfinv_lut( alpha (n) );
384
}
385
 
386
unsigned char gfdiv_lut (unsigned char dividend, unsigned char divisor)
387
{
388
  return gfmult_hw ( dividend, gfinv_lut(divisor));
389
}
390
 
391
 
392
 
393
// Assumption: First bit of Lambda (alpha**0) is not transmitted
394
void compute_deriv (unsigned char lambda[tt], unsigned char lambda_deriv[tt])
395
{
396 9 abhiag
   // Directive: Unroll loop maximally
397 4 abhiag
   for (int i = 0; i < tt; i++)
398
        lambda_deriv[i] = (i % 2 == 0) ? lambda[i] : 0;
399
}
400
 
401
 
402
unsigned char poly_eval (unsigned char poly[tt], unsigned char alpha_inv)
403
{
404
   unsigned char val = 0;
405
 
406 9 abhiag
   // Directive: Unroll loop maximally
407 4 abhiag
   for (int j = tt-1; j >= 0; j--)
408
   {
409
      val = gfadd_hw(gfmult_hw(val, alpha_inv), poly[j]);
410
   }
411
   return val;
412
}
413
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.