OpenCores
URL https://opencores.org/ocsvn/reed_solomon_codec_generator/reed_solomon_codec_generator/trunk

Subversion Repositories reed_solomon_codec_generator

[/] [reed_solomon_codec_generator/] [trunk/] [source/] [RsDecodeEuclideEmulator.cpp] - Blame information for rev 3

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 issei
//===================================================================
2
// Module Name : RsDecodeEuclideEmulator
3
// File Name   : RsDecodeEuclideEmulator.cpp
4
// Function    : RS Decoder euclide emulator
5
// 
6
// Revision History:
7
// Date          By           Version    Change Description
8
//===================================================================
9
// 2009/02/03  Gael Sapience     1.0       Original
10
//
11
//===================================================================
12
// (C) COPYRIGHT 2009 SYSTEM LSI CO., Ltd.
13
//
14
#include <stdio.h>
15
#include <stdlib.h>
16
#include <iostream>
17
void RsGfMultiplier( int*, int*,int*, int, int);
18
void RsGfInverse( int*, int*, int, int);
19
 
20
 
21
void RsDecodeEuclideEmulator(int *numShiftedReg, int *OmegaRegTab, int *LambdaRegTab, int numErasure, int DataSize, int TotalSize, int PrimPoly, int bitSymbol, int *syndromeRegTab) {
22
 
23
 
24
   //---------------------------------------------------------------
25
   // c++ variables
26
   //---------------------------------------------------------------
27
   int syndromeLength;
28
   int ii,jj,kk;;
29
   int phase;
30
   int offset;
31
   int skip = 0;
32
   int tempNum;
33
 
34
 
35
   //---------------------------------------------------------------
36
   // initialize numShiftedReg
37
   //---------------------------------------------------------------
38
   numShiftedReg[0] = 0;
39
 
40
 
41
   //---------------------------------------------------------------
42
   // syndrome Length Calculation
43
   //---------------------------------------------------------------
44
   syndromeLength = TotalSize - DataSize;
45
 
46
 
47
   //---------------------------------------------------------------
48
   // c++ variables
49
   //---------------------------------------------------------------
50
   int *euclideTab;
51
   int *OmegaBkpTab;
52
   int *OmegaMultqNewTab;
53
   int *LambdaBkpTab;
54
   int *LambdaXorRegTab;
55
   int *LambdaMultqNewTab;
56
   int *saveOmega;
57
   int *OmegaInvIn;
58
   int *OmegaInv;
59
   int *OmegaRegTabSAVE;
60
   int *OmegaBkpReg;
61
   int *OmegaInvReg;
62
   int *LambdaRegTabSAVE;
63
   int *qNew;
64
   int *qNewReg;
65
   int *tempTab2;
66
   int *tempTab;
67
   int *powerTab;
68
   int LoopSize;
69
 
70
 
71
   euclideTab        = new int[(syndromeLength+1)];
72
   powerTab          = new int[bitSymbol];
73
   OmegaBkpTab       = new int[syndromeLength*bitSymbol];
74
   OmegaMultqNewTab  = new int[syndromeLength*bitSymbol];
75
   OmegaRegTabSAVE   = new int[syndromeLength*bitSymbol];
76
   saveOmega         = new int[bitSymbol];
77
   OmegaInvIn        = new int[bitSymbol];
78
   OmegaInv          = new int[bitSymbol];
79
   OmegaBkpReg       = new int[bitSymbol];
80
   OmegaInvReg       = new int[bitSymbol];
81
   LambdaBkpTab      = new int[syndromeLength*bitSymbol];
82
   LambdaXorRegTab   = new int[syndromeLength*bitSymbol];
83
   LambdaMultqNewTab = new int[syndromeLength*bitSymbol];
84
   LambdaRegTabSAVE  = new int[syndromeLength*bitSymbol];
85
   qNew              = new int[bitSymbol];
86
   qNewReg           = new int[bitSymbol];
87
   tempTab2          = new int[bitSymbol];
88
   tempTab           = new int[bitSymbol];
89
 
90
 
91
   //---------------------------------------------------------------
92
   // calculate powerTab
93
   //---------------------------------------------------------------
94
   powerTab[0] = 1;
95
   for (ii=1; ii<bitSymbol;ii++){
96
      powerTab[ii] = 2*powerTab[ii-1];
97
   }
98
 
99
 
100
   //------------------------------------------------------------------------
101
   //- Euclide Length calculation
102
   //------------------------------------------------------------------------
103
   euclideTab [syndromeLength] = 3;
104
   euclideTab [syndromeLength-1] = 3;
105
 
106
   for(ii=(syndromeLength-2); ii>0; ii=ii-2){
107
      euclideTab [ii] = euclideTab   [ii+2] + 6;
108
      euclideTab [ii-1] = euclideTab [ii+1] + 6;
109
   }
110
 
111
   euclideTab [0] = euclideTab [2] + 6;
112
 
113
 
114
   //---------------------------------------------------------------
115
   // Initialize variables
116
   //---------------------------------------------------------------
117
   phase             = 0;
118
   offset            = 0;
119
   numShiftedReg [0] = 0;
120
 
121
   for(kk=0; kk< bitSymbol; kk++){
122
      qNew[kk]        = 0;
123
      qNewReg[kk]     = 0;
124
      tempTab2[kk]    = 0;
125
      tempTab[kk]     = 0;
126
      OmegaInvIn[kk]  = 0;
127
      OmegaInv[kk]    = 0;
128
      saveOmega[kk]   = 0;
129
      OmegaInvReg[kk] = 0;
130
   }
131
 
132
 
133
   //---------------------------------------------------------------
134
   // calculate LoopSize of Euclide algorithm
135
   //---------------------------------------------------------------
136
   if (numErasure <= syndromeLength) {
137
      LoopSize = euclideTab[numErasure];
138
   }else{
139
      LoopSize = 3;
140
   }
141
 
142
 
143
   //---------------------------------------------------------------
144
   // OmegaRegTab && LambdaRegTab calculation
145
   //---------------------------------------------------------------
146
   for(ii=0; ii <= LoopSize; ii++){
147
      //---------------------------------------------------------------
148
      // sync == 1'b1
149
      //---------------------------------------------------------------
150
      if (ii == 0){
151
         for(jj=0; jj < syndromeLength*bitSymbol; jj++){
152
            OmegaRegTab[jj]      = syndromeRegTab[jj];
153
            OmegaBkpTab[jj]      = 0;
154
            LambdaRegTab[jj]     = 0;
155
            LambdaXorRegTab[jj]  = 0;
156
            LambdaBkpTab[jj]     = 0;
157
            OmegaRegTabSAVE[jj]  = 0;
158
            OmegaMultqNewTab[jj] = 0;
159
            LambdaMultqNewTab[jj]= 0;
160
            LambdaRegTabSAVE[jj] = 0;
161
         }
162
         LambdaRegTab[0]  = 1;
163
         OmegaBkpTab[(syndromeLength-1)*bitSymbol] = 1;
164
         phase            = 1;
165
         offset           = 1;
166
         numShiftedReg[0] = 0;
167
      }
168
 
169
      //---------------------------------------------------------------
170
      // sync == 1'b0
171
      //---------------------------------------------------------------
172
      else{
173
         skip = 1;
174
         //---------------------------------------------------------------
175
         // calculate skip
176
         //---------------------------------------------------------------
177
         for(kk=0; kk< bitSymbol; kk++){
178
            if (OmegaRegTab[(syndromeLength-1)*bitSymbol+kk] == 1){
179
               skip = 0;
180
            }
181
         }
182
 
183
         //---------------------------------------------------------------
184
         // save omega_bkp[syndromeLength-1]
185
         //---------------------------------------------------------------
186
         for(kk=0; kk< bitSymbol; kk++){
187
            saveOmega[kk] = OmegaBkpTab[(syndromeLength-1)*bitSymbol+kk];
188
         }
189
 
190
 
191
         //---------------------------------------------------------------
192
         // selectOmegaInverse Input
193
         //---------------------------------------------------------------
194
         for(kk=0; kk< bitSymbol; kk++){
195
            OmegaInvIn[kk] = OmegaRegTab[(syndromeLength-1)*bitSymbol+kk];
196
         }
197
 
198
         //---------------------------------------------------------------
199
         // calculate omegaInv
200
         //---------------------------------------------------------------
201
         RsGfInverse(OmegaInv, OmegaInvIn, PrimPoly, bitSymbol);
202
 
203
 
204
         //---------------------------------------------------------------
205
         // calculate qNew
206
         //---------------------------------------------------------------
207
         RsGfMultiplier(qNew, OmegaBkpReg, OmegaInvReg, PrimPoly, bitSymbol);
208
 
209
 
210
         //---------------------------------------------------------------
211
         // update OmegaMultqNewTab && LambdaMultqNewTab
212
         //---------------------------------------------------------------
213
         for(jj=0; jj< syndromeLength; jj++){
214
            //---------------------------------------------------------------
215
            // for omegaMultqNew
216
            //---------------------------------------------------------------
217
            for(kk=0; kk< bitSymbol; kk++){
218
               tempTab[kk] = OmegaRegTab[jj*bitSymbol+kk];
219
            }
220
            RsGfMultiplier(tempTab2, tempTab, qNewReg, PrimPoly, bitSymbol);
221
            for(kk=0; kk< bitSymbol; kk++){
222
               OmegaMultqNewTab[jj*bitSymbol+kk] = tempTab2[kk];
223
            }
224
            //---------------------------------------------------------------
225
            // for lambdaMultqNew
226
            //---------------------------------------------------------------
227
            for(kk=0; kk< bitSymbol; kk++){
228
               tempTab[kk] = LambdaRegTab[jj*bitSymbol+kk];
229
            }
230
            RsGfMultiplier(tempTab2, tempTab, qNewReg, PrimPoly, bitSymbol);
231
            for(kk=0; kk< bitSymbol; kk++){
232
               LambdaMultqNewTab[jj*bitSymbol+kk] = tempTab2[kk];
233
            }
234
         }
235
 
236
 
237
         //---------------------------------------------------------------
238
         // phase == 2'd0
239
         //---------------------------------------------------------------
240
         if (phase == 0){
241
            //---------------------------------------------------------------
242
            // skip == 0 && offset == 0
243
            //---------------------------------------------------------------
244
            if ((skip == 0) && (offset == 0)) {
245
               numShiftedReg[0] = numShiftedReg[0]+1;
246
 
247
               //---------------------------------------------------------------
248
               // save OmegaRegTab Value
249
               //---------------------------------------------------------------
250
               for(jj=0; jj < syndromeLength*bitSymbol; jj++){
251
                  OmegaRegTabSAVE[jj]  = OmegaRegTab[jj];
252
                  LambdaRegTabSAVE[jj] = LambdaRegTab[jj];
253
               }
254
 
255
 
256
               //---------------------------------------------------------------
257
               // compute Next OmegaRegTab Value
258
               //---------------------------------------------------------------
259
               for(jj=syndromeLength-1; jj >=0; jj--){
260
                  if (jj > 0) {
261
                     for(kk=0; kk< bitSymbol; kk++){
262
                        OmegaRegTab[jj*bitSymbol+kk] = OmegaMultqNewTab[(jj-1)*bitSymbol+kk] ^ OmegaBkpTab[(jj-1)*bitSymbol+kk];
263
                     }
264
                  }else{
265
                     for(kk=0; kk< bitSymbol; kk++){
266
                        OmegaRegTab[kk] = 0;
267
                     }
268
                  }
269
               }
270
 
271
 
272
               //---------------------------------------------------------------
273
               // compute Next LambdaRegTab Value
274
               //---------------------------------------------------------------
275
               for(jj=syndromeLength-1; jj >=0; jj--){
276
                  if (jj > 0) {
277
                     for(kk=0; kk< bitSymbol; kk++){
278
                        LambdaRegTab[jj*bitSymbol+kk] = LambdaBkpTab[jj*bitSymbol+kk] ^ LambdaMultqNewTab[jj*bitSymbol+kk] ^ LambdaXorRegTab[(jj-1)*bitSymbol+kk];
279
                     }
280
                  }else{
281
                     for(kk=0; kk< bitSymbol; kk++){
282
                        LambdaRegTab[kk] = LambdaBkpTab[kk] ^ LambdaMultqNewTab[kk];
283
                     }
284
                  }
285
               }
286
 
287
 
288
               //---------------------------------------------------------------
289
               // compute Next OmegaBkpTab Value
290
               //---------------------------------------------------------------
291
               for(jj=0; jj < syndromeLength*bitSymbol; jj++){
292
                  OmegaBkpTab[jj] = OmegaRegTabSAVE[jj];
293
               }
294
 
295
 
296
               //---------------------------------------------------------------
297
               // compute Next LambdaBkpTab Value
298
               //---------------------------------------------------------------
299
               for(jj=0; jj < syndromeLength*bitSymbol; jj++){
300
                  LambdaBkpTab[jj] = LambdaRegTabSAVE[jj];
301
               }
302
 
303
 
304
               //---------------------------------------------------------------
305
               // compute Next LambdaXorRegTab Value
306
               //---------------------------------------------------------------
307
               for(jj=0; jj < (syndromeLength-1)*bitSymbol; jj++){
308
                  LambdaXorRegTab[jj] = 0;
309
               }
310
            }
311
            else{
312
               //---------------------------------------------------------------
313
               // skip == 1
314
               //---------------------------------------------------------------
315
               if (skip == 1) {
316
                  numShiftedReg [0]= numShiftedReg[0]+1;
317
 
318
                  for(jj=syndromeLength-1; jj >=0; jj=jj-1){
319
                     if (jj > 0) {
320
                        for(kk=0; kk< bitSymbol; kk++){
321
                           OmegaRegTab[jj*bitSymbol+kk] = OmegaRegTab[(jj-1)*bitSymbol+kk];
322
                        }
323
                     }else{
324
                        for(kk=0; kk< bitSymbol; kk++){
325
                           OmegaRegTab[kk] = 0;
326
                        }
327
                     }
328
                  }
329
               }
330
               else{
331
               //---------------------------------------------------------------
332
               // skip == 0
333
               //---------------------------------------------------------------
334
                  //---------------------------------------------------------------
335
                  // for OmegaBkpTab
336
                  //---------------------------------------------------------------
337
                  for(jj=(syndromeLength-1); jj>=0; jj=jj-1){
338
                     if (jj > 0) {
339
                        for(kk=0; kk< bitSymbol; kk++){
340
                           OmegaBkpTab[jj*bitSymbol+kk] = OmegaMultqNewTab[(jj-1)*bitSymbol+kk] ^ OmegaBkpTab[(jj-1)*bitSymbol+kk];
341
                        }
342
                     }else{
343
                        for(kk=0; kk< bitSymbol; kk++){
344
                           OmegaBkpTab[kk] = 0;
345
                        }
346
                     }
347
                  }
348
 
349
 
350
                  //---------------------------------------------------------------
351
                  // compute Next LambdaXorRegTab Value
352
                  //---------------------------------------------------------------
353
                  for(jj=(syndromeLength-2); jj>=0; jj--){
354
                     if (jj > 0) {
355
                        for(kk=0; kk< bitSymbol; kk++){
356
                           LambdaXorRegTab[jj*bitSymbol+kk] = LambdaMultqNewTab[jj*bitSymbol+kk] ^ LambdaXorRegTab[(jj-1)*bitSymbol+kk];
357
                        }
358
                     }else{
359
                        for(kk=0; kk< bitSymbol; kk++){
360
                           LambdaXorRegTab[kk] = LambdaMultqNewTab[kk];
361
                        }
362
                     }
363
                  }
364
               }
365
            }
366
         }
367
 
368
 
369
         //---------------------------------------------------------------
370
         // update offset
371
         //---------------------------------------------------------------
372
         if (phase == 0) {
373
            if ((skip == 0) && (offset == 0)){
374
               offset = 1;
375
            }
376
            else{
377
               if (skip == 1){
378
                  offset = offset + 1;
379
               }else{
380
                  offset = offset - 1;
381
               }
382
            }
383
         }
384
 
385
 
386
         //---------------------------------------------------------------
387
         // update phase
388
         //---------------------------------------------------------------
389
         if (phase == 2) {
390
            phase = 0;
391
         }else{
392
            phase = phase + 1;
393
         }
394
 
395
 
396
         //---------------------------------------------------------------
397
         // update qNewReg
398
         //---------------------------------------------------------------
399
         for(kk=0; kk< bitSymbol; kk++){
400
            qNewReg[kk] = qNew[kk];
401
         }
402
 
403
 
404
         //---------------------------------------------------------------
405
         // update omegaInvReg
406
         //---------------------------------------------------------------
407
         for(kk=0; kk< bitSymbol; kk++){
408
            OmegaInvReg[kk] = OmegaInv[kk];
409
         }
410
 
411
 
412
         //---------------------------------------------------------------
413
         // update omegaBkpReg
414
         //---------------------------------------------------------------
415
         for(kk=0; kk< bitSymbol; kk++){
416
            OmegaBkpReg[kk] = saveOmega[kk];
417
         }
418
      }
419
   }
420
 
421
 
422
   //---------------------------------------------------------------
423
   // Free memory
424
   //---------------------------------------------------------------
425
   delete[] euclideTab;
426
   delete[] OmegaBkpTab;
427
   delete[] OmegaMultqNewTab;
428
   delete[] LambdaBkpTab;
429
   delete[] LambdaXorRegTab;
430
   delete[] LambdaMultqNewTab;
431
   delete[] saveOmega;
432
   delete[] OmegaInvIn;
433
   delete[] OmegaInv;
434
   delete[] OmegaRegTabSAVE;
435
   delete[] OmegaBkpReg;
436
   delete[] OmegaInvReg;
437
   delete[] LambdaRegTabSAVE;
438
   delete[] qNew;
439
   delete[] qNewReg;
440
   delete[] tempTab2;
441
   delete[] tempTab;
442
   delete[] powerTab;
443
 
444
}

powered by: WebSVN 2.1.0

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