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

Subversion Repositories reedsolomon

[/] [reedsolomon/] [trunk/] [bluespec-source/] [GFArith.bsv] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 abhiag
//----------------------------------------------------------------------//
2
// The MIT License
3
//
4
// Copyright (c) 2010 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
// Galois field arithmetic
30
//----------------------------------------------------------------------
31
// $Id: GFArith.bsv
32
//
33
 
34
import GFTypes::*;
35
import Vector::*;
36
 
37
`include "GFInv.bsv"
38
 
39
// -----------------------------------------------------------
40
//(* noinline *)
41
function Byte gf_mult(Byte left, Byte right);
42
 
43
   Bit#(15) first  = 15'b0;
44
   Bit#(15) result = 15'b0;
45
 
46
   // this function bring back higher degree values back to the field
47
   function Bit#(15) getNewResult(Integer shift, Bit#(15) res);
48
      Bit#(15) shiftPoly = zeroExtend(primitive_poly) << shift;
49
      Bit#(15) newRes    = res ^ ((res[8+shift] == 1'b1) ? shiftPoly : 0);
50
      return newRes;
51
   endfunction
52
 
53
  for (Integer i = 0; i < 8; i = i + 1)
54
     for (Integer j = 0; j < 8 ; j = j + 1)
55
        begin
56
           if (first[i+j] == 0) // initialize result[i+j]
57
              result[i+j] = (left[i] & right[j]);
58
           else                 // accumulate
59
              result[i+j] = result[i+j] ^ (left[i] & right[j]);
60
           first[i+j] = 1; // only initialize each signal once
61
        end
62
 
63
  Vector#(7,Integer) shftAmntV = genVector;
64
  Bit#(15) finalResult = foldr(getNewResult,result,shftAmntV);
65
 
66
  return finalResult[7:0];
67
 
68
endfunction
69
 
70
(* noinline *)
71
function Byte gf_mult_inst(Byte x, Byte y);
72
   return gf_mult(x,y);
73
endfunction
74
 
75
// -----------------------------------------------------------
76
function Byte gf_add(Byte left, Byte right);
77
   return (left ^ right);
78
endfunction
79
 
80
(* noinline *)
81
function Byte gf_add_inst(Byte x, Byte y);
82
   return gf_add(x,y);
83
endfunction
84
 
85
 
86
// -----------------------------------------------------------
87
//(* noinline *)
88
function Byte alpha_n(Byte n);
89
        return times_alpha_n(1,n);
90
endfunction
91
 
92
// -----------------------------------------------------------
93
//(* noinline *)
94
function Byte times_alpha_n(Byte a, Byte n);
95
//    Byte multVal = 1 << n;
96
//    return gf_mult(primitive_poly,a,multVal);
97
 
98
   Byte b=a;
99
   for (Byte i = 0; i < n; i = i + 1)
100
      b=times_alpha(b);
101
   return b;
102
endfunction
103
 
104
// -----------------------------------------------------------
105
//(* noinline *)
106
function Byte times_alpha(Byte a);
107
//   return gf_mult(primitive_poly, a, 2);
108
 
109
   return (a<<1)^({a[7],a[7],a[7],a[7],a[7],a[7],a[7],a[7]} & primitive_poly);
110
endfunction
111
 
112
// -----------------------------------------------------------
113
/*
114
function Byte gf_inv (Byte a);
115
 
116
   case (a) matches
117
 
118
        1 : return         1;
119
        2 : return       142;
120
        3 : return       244;
121
        4 : return        71;
122
        5 : return       167;
123
        6 : return       122;
124
        7 : return       186;
125
        8 : return       173;
126
        9 : return       157;
127
       10 : return       221;
128
       11 : return       152;
129
       12 : return        61;
130
       13 : return       170;
131
       14 : return        93;
132
       15 : return       150;
133
       16 : return       216;
134
       17 : return       114;
135
       18 : return       192;
136
       19 : return        88;
137
       20 : return       224;
138
       21 : return        62;
139
       22 : return        76;
140
       23 : return       102;
141
       24 : return       144;
142
       25 : return       222;
143
       26 : return        85;
144
       27 : return       128;
145
       28 : return       160;
146
       29 : return       131;
147
       30 : return        75;
148
       31 : return        42;
149
       32 : return       108;
150
       33 : return       237;
151
       34 : return        57;
152
       35 : return        81;
153
       36 : return        96;
154
       37 : return        86;
155
       38 : return        44;
156
       39 : return       138;
157
       40 : return       112;
158
       41 : return       208;
159
       42 : return        31;
160
       43 : return        74;
161
       44 : return        38;
162
       45 : return       139;
163
       46 : return        51;
164
       47 : return       110;
165
       48 : return        72;
166
       49 : return       137;
167
       50 : return       111;
168
       51 : return        46;
169
       52 : return       164;
170
       53 : return       195;
171
       54 : return        64;
172
       55 : return        94;
173
       56 : return        80;
174
       57 : return        34;
175
       58 : return       207;
176
       59 : return       169;
177
       60 : return       171;
178
       61 : return        12;
179
       62 : return        21;
180
       63 : return       225;
181
       64 : return        54;
182
       65 : return        95;
183
       66 : return       248;
184
       67 : return       213;
185
       68 : return       146;
186
       69 : return        78;
187
       70 : return       166;
188
       71 : return         4;
189
       72 : return        48;
190
       73 : return       136;
191
       74 : return        43;
192
       75 : return        30;
193
       76 : return        22;
194
       77 : return       103;
195
       78 : return        69;
196
       79 : return       147;
197
       80 : return        56;
198
       81 : return        35;
199
       82 : return       104;
200
       83 : return       140;
201
       84 : return       129;
202
       85 : return        26;
203
       86 : return        37;
204
       87 : return        97;
205
       88 : return        19;
206
       89 : return       193;
207
       90 : return       203;
208
       91 : return        99;
209
       92 : return       151;
210
       93 : return        14;
211
       94 : return        55;
212
       95 : return        65;
213
       96 : return        36;
214
       97 : return        87;
215
       98 : return       202;
216
       99 : return        91;
217
      100 : return       185;
218
      101 : return       196;
219
      102 : return        23;
220
      103 : return        77;
221
      104 : return        82;
222
      105 : return       141;
223
      106 : return       239;
224
      107 : return       179;
225
      108 : return        32;
226
      109 : return       236;
227
      110 : return        47;
228
      111 : return        50;
229
      112 : return        40;
230
      113 : return       209;
231
      114 : return        17;
232
      115 : return       217;
233
      116 : return       233;
234
      117 : return       251;
235
      118 : return       218;
236
      119 : return       121;
237
      120 : return       219;
238
      121 : return       119;
239
      122 : return         6;
240
      123 : return       187;
241
      124 : return       132;
242
      125 : return       205;
243
      126 : return       254;
244
      127 : return       252;
245
      128 : return        27;
246
      129 : return        84;
247
      130 : return       161;
248
      131 : return        29;
249
      132 : return       124;
250
      133 : return       204;
251
      134 : return       228;
252
      135 : return       176;
253
      136 : return        73;
254
      137 : return        49;
255
      138 : return        39;
256
      139 : return        45;
257
      140 : return        83;
258
      141 : return       105;
259
      142 : return         2;
260
      143 : return       245;
261
      144 : return        24;
262
      145 : return       223;
263
      146 : return        68;
264
      147 : return        79;
265
      148 : return       155;
266
      149 : return       188;
267
      150 : return        15;
268
      151 : return        92;
269
      152 : return        11;
270
      153 : return       220;
271
      154 : return       189;
272
      155 : return       148;
273
      156 : return       172;
274
      157 : return         9;
275
      158 : return       199;
276
      159 : return       162;
277
      160 : return        28;
278
      161 : return       130;
279
      162 : return       159;
280
      163 : return       198;
281
      164 : return        52;
282
      165 : return       194;
283
      166 : return        70;
284
      167 : return         5;
285
      168 : return       206;
286
      169 : return        59;
287
      170 : return        13;
288
      171 : return        60;
289
      172 : return       156;
290
      173 : return         8;
291
      174 : return       190;
292
      175 : return       183;
293
      176 : return       135;
294
      177 : return       229;
295
      178 : return       238;
296
      179 : return       107;
297
      180 : return       235;
298
      181 : return       242;
299
      182 : return       191;
300
      183 : return       175;
301
      184 : return       197;
302
      185 : return       100;
303
      186 : return         7;
304
      187 : return       123;
305
      188 : return       149;
306
      189 : return       154;
307
      190 : return       174;
308
      191 : return       182;
309
      192 : return        18;
310
      193 : return        89;
311
      194 : return       165;
312
      195 : return        53;
313
      196 : return       101;
314
      197 : return       184;
315
      198 : return       163;
316
      199 : return       158;
317
      200 : return       210;
318
      201 : return       247;
319
      202 : return        98;
320
      203 : return        90;
321
      204 : return       133;
322
      205 : return       125;
323
      206 : return       168;
324
      207 : return        58;
325
      208 : return        41;
326
      209 : return       113;
327
      210 : return       200;
328
      211 : return       246;
329
      212 : return       249;
330
      213 : return        67;
331
      214 : return       215;
332
      215 : return       214;
333
      216 : return        16;
334
      217 : return       115;
335
      218 : return       118;
336
      219 : return       120;
337
      220 : return       153;
338
      221 : return        10;
339
      222 : return        25;
340
      223 : return       145;
341
      224 : return        20;
342
      225 : return        63;
343
      226 : return       230;
344
      227 : return       240;
345
      228 : return       134;
346
      229 : return       177;
347
      230 : return       226;
348
      231 : return       241;
349
      232 : return       250;
350
      233 : return       116;
351
      234 : return       243;
352
      235 : return       180;
353
      236 : return       109;
354
      237 : return        33;
355
      238 : return       178;
356
      239 : return       106;
357
      240 : return       227;
358
      241 : return       231;
359
      242 : return       181;
360
      243 : return       234;
361
      244 : return         3;
362
      245 : return       143;
363
      246 : return       211;
364
      247 : return       201;
365
      248 : return        66;
366
      249 : return       212;
367
      250 : return       232;
368
      251 : return       117;
369
      252 : return       127;
370
      253 : return       255;
371
      254 : return       126;
372
      255 : return       253;
373
   endcase
374
endfunction
375
*/

powered by: WebSVN 2.1.0

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