//----------------------------------------------------------------------//
|
//----------------------------------------------------------------------//
|
// The MIT License
|
// The MIT License
|
//
|
//
|
// Copyright (c) 2008 Abhinav Agarwal, Alfred Man Cheuk Ng
|
// Copyright (c) 2008 Abhinav Agarwal, Alfred Man Cheuk Ng
|
// Contact: abhiag@gmail.com
|
// Contact: abhiag@gmail.com
|
//
|
//
|
// Permission is hereby granted, free of charge, to any person
|
// Permission is hereby granted, free of charge, to any person
|
// obtaining a copy of this software and associated documentation
|
// obtaining a copy of this software and associated documentation
|
// files (the "Software"), to deal in the Software without
|
// files (the "Software"), to deal in the Software without
|
// restriction, including without limitation the rights to use,
|
// restriction, including without limitation the rights to use,
|
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
// copy, modify, merge, publish, distribute, sublicense, and/or sell
|
// copies of the Software, and to permit persons to whom the
|
// copies of the Software, and to permit persons to whom the
|
// Software is furnished to do so, subject to the following conditions:
|
// Software is furnished to do so, subject to the following conditions:
|
//
|
//
|
// The above copyright notice and this permission notice shall be
|
// The above copyright notice and this permission notice shall be
|
// included in all copies or substantial portions of the Software.
|
// included in all copies or substantial portions of the Software.
|
//
|
//
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
// OTHER DEALINGS IN THE SOFTWARE.
|
// OTHER DEALINGS IN THE SOFTWARE.
|
//----------------------------------------------------------------------//
|
//----------------------------------------------------------------------//
|
|
|
/*
|
/*
|
Incorporates all GF arithmetic used in various modules
|
Incorporates all GF arithmetic used in various modules
|
*/
|
*/
|
//#include "ac_int.h"
|
//#include "ac_int.h"
|
#include "gf_arith.h"
|
#include "gf_arith.h"
|
|
|
|
|
unsigned char gfadd_hw(unsigned char a, unsigned char b)
|
unsigned char gfadd_hw(unsigned char a, unsigned char b)
|
{
|
{
|
return a^b;
|
return a^b;
|
}
|
}
|
|
|
unsigned char gfmult_hw(unsigned char a, unsigned char b)
|
unsigned char gfmult_hw(unsigned char a, unsigned char b)
|
{
|
{
|
|
|
unsigned int temp = 0;
|
unsigned int temp = 0;
|
|
|
#pragma unroll yes
|
// Directive: Unroll loop maximally
|
for (int i = 0; i < 8; i++)
|
for (int i = 0; i < 8; i++)
|
if (b & (1 << i))
|
if (b & (1 << i))
|
temp ^= (unsigned int)(a << i);
|
temp ^= (unsigned int)(a << i);
|
|
|
#pragma unroll yes
|
// Directive: Unroll loop maximally
|
for (int k = 15; k > 7; k--)
|
for (int k = 15; k > 7; k--)
|
if (temp & (1 << k))
|
if (temp & (1 << k))
|
temp ^= (unsigned int)(pp_char << (k - 8));
|
temp ^= (unsigned int)(pp_char << (k - 8));
|
|
|
return (temp & 255);
|
return (temp & 255);
|
|
|
}
|
}
|
|
|
unsigned char alpha (unsigned char n)
|
unsigned char alpha (unsigned char n)
|
{
|
{
|
unsigned char alpha_lut[256] = {
|
unsigned char alpha_lut[256] = {
|
1,
|
1,
|
2,
|
2,
|
4,
|
4,
|
8,
|
8,
|
16,
|
16,
|
32,
|
32,
|
64,
|
64,
|
128,
|
128,
|
29,
|
29,
|
58,
|
58,
|
116,
|
116,
|
232,
|
232,
|
205,
|
205,
|
135,
|
135,
|
19,
|
19,
|
38,
|
38,
|
76,
|
76,
|
152,
|
152,
|
45,
|
45,
|
90,
|
90,
|
180,
|
180,
|
117,
|
117,
|
234,
|
234,
|
201,
|
201,
|
143,
|
143,
|
3,
|
3,
|
6,
|
6,
|
12,
|
12,
|
24,
|
24,
|
48,
|
48,
|
96,
|
96,
|
192,
|
192,
|
157,
|
157,
|
39,
|
39,
|
78,
|
78,
|
157,
|
157,
|
37,
|
37,
|
74,
|
74,
|
148,
|
148,
|
53,
|
53,
|
106,
|
106,
|
212,181, 119, 238, 193,159,35, 70, 140, 5, 10, 20, 40, 80, 160,
|
212,181, 119, 238, 193,159,35, 70, 140, 5, 10, 20, 40, 80, 160,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
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,
|
173,71,142,0};
|
173,71,142,0};
|
return alpha_lut[n];
|
return alpha_lut[n];
|
}
|
}
|
|
|
unsigned char gfinv_lut (unsigned char a)
|
unsigned char gfinv_lut (unsigned char a)
|
{
|
{
|
|
|
unsigned char lut[256] = {
|
unsigned char lut[256] = {
|
2
|
2
|
,1
|
,1
|
,142
|
,142
|
,244
|
,244
|
,71
|
,71
|
,167
|
,167
|
,122
|
,122
|
,186
|
,186
|
,173
|
,173
|
,157
|
,157
|
,221
|
,221
|
,152
|
,152
|
,61
|
,61
|
,170
|
,170
|
,93
|
,93
|
,150
|
,150
|
,216
|
,216
|
,114
|
,114
|
,192
|
,192
|
,88
|
,88
|
,224
|
,224
|
,62
|
,62
|
,76
|
,76
|
,102
|
,102
|
,144
|
,144
|
,222
|
,222
|
,85
|
,85
|
,128
|
,128
|
,160
|
,160
|
,131
|
,131
|
,75
|
,75
|
,42
|
,42
|
,108
|
,108
|
,237
|
,237
|
,57
|
,57
|
,81
|
,81
|
,96
|
,96
|
,86
|
,86
|
,44
|
,44
|
,138
|
,138
|
,112
|
,112
|
,208
|
,208
|
,31
|
,31
|
,74
|
,74
|
,38
|
,38
|
,139
|
,139
|
,51
|
,51
|
,110
|
,110
|
,72
|
,72
|
,137
|
,137
|
,111
|
,111
|
,46
|
,46
|
,164
|
,164
|
,195
|
,195
|
,64
|
,64
|
,94
|
,94
|
,80
|
,80
|
,34
|
,34
|
,207
|
,207
|
,169
|
,169
|
,171
|
,171
|
,12
|
,12
|
,21
|
,21
|
,225
|
,225
|
,54
|
,54
|
,95
|
,95
|
,248
|
,248
|
,213
|
,213
|
,146
|
,146
|
,78
|
,78
|
,166
|
,166
|
,4
|
,4
|
,48
|
,48
|
,136
|
,136
|
,43
|
,43
|
,30
|
,30
|
,22
|
,22
|
,103
|
,103
|
,69
|
,69
|
,147
|
,147
|
,56
|
,56
|
,35
|
,35
|
,104
|
,104
|
,140
|
,140
|
,129
|
,129
|
,26
|
,26
|
,37
|
,37
|
,97
|
,97
|
,19
|
,19
|
,193
|
,193
|
,203
|
,203
|
,99
|
,99
|
,151
|
,151
|
,14
|
,14
|
,55
|
,55
|
,65
|
,65
|
,36
|
,36
|
,87
|
,87
|
,202
|
,202
|
,91
|
,91
|
,185
|
,185
|
,196
|
,196
|
,23
|
,23
|
,77
|
,77
|
,82
|
,82
|
,141
|
,141
|
,239
|
,239
|
,179
|
,179
|
,32
|
,32
|
,236
|
,236
|
,47
|
,47
|
,50
|
,50
|
,40
|
,40
|
,209
|
,209
|
,17
|
,17
|
,217
|
,217
|
,233
|
,233
|
,251
|
,251
|
,218
|
,218
|
,121
|
,121
|
,219
|
,219
|
,119
|
,119
|
,6
|
,6
|
,187
|
,187
|
,132
|
,132
|
,205
|
,205
|
,254
|
,254
|
,252
|
,252
|
,27
|
,27
|
,84
|
,84
|
,161
|
,161
|
,29
|
,29
|
,124
|
,124
|
,204
|
,204
|
,228
|
,228
|
,176
|
,176
|
,73
|
,73
|
,49
|
,49
|
,39
|
,39
|
,45
|
,45
|
,83
|
,83
|
,105
|
,105
|
,2
|
,2
|
,245
|
,245
|
,24
|
,24
|
,223
|
,223
|
,68
|
,68
|
,79
|
,79
|
,155
|
,155
|
,188
|
,188
|
,15
|
,15
|
,92
|
,92
|
,11
|
,11
|
,220
|
,220
|
,189
|
,189
|
,148
|
,148
|
,172
|
,172
|
,9
|
,9
|
,199
|
,199
|
,162
|
,162
|
,28
|
,28
|
,130
|
,130
|
,159
|
,159
|
,198
|
,198
|
,52
|
,52
|
,194
|
,194
|
,70
|
,70
|
,5
|
,5
|
,206
|
,206
|
,59
|
,59
|
,13
|
,13
|
,60
|
,60
|
,156
|
,156
|
,8
|
,8
|
,190
|
,190
|
,183
|
,183
|
,135
|
,135
|
,229
|
,229
|
,238
|
,238
|
,107
|
,107
|
,235
|
,235
|
,242
|
,242
|
,191
|
,191
|
,175
|
,175
|
,197
|
,197
|
,100
|
,100
|
,7
|
,7
|
,123
|
,123
|
,149
|
,149
|
,154
|
,154
|
,174
|
,174
|
,182
|
,182
|
,18
|
,18
|
,89
|
,89
|
,165
|
,165
|
,53
|
,53
|
,101
|
,101
|
,184
|
,184
|
,163
|
,163
|
,158
|
,158
|
,210
|
,210
|
,247
|
,247
|
,98
|
,98
|
,90
|
,90
|
,133
|
,133
|
,125
|
,125
|
,168
|
,168
|
,58
|
,58
|
,41
|
,41
|
,113
|
,113
|
,200
|
,200
|
,246
|
,246
|
,249
|
,249
|
,67
|
,67
|
,215
|
,215
|
,214
|
,214
|
,16
|
,16
|
,115
|
,115
|
,118
|
,118
|
,120
|
,120
|
,153
|
,153
|
,10
|
,10
|
,25
|
,25
|
,145
|
,145
|
,20
|
,20
|
,63
|
,63
|
,230
|
,230
|
,240
|
,240
|
,134
|
,134
|
,177
|
,177
|
,226
|
,226
|
,241
|
,241
|
,250
|
,250
|
,116
|
,116
|
,243
|
,243
|
,180
|
,180
|
,109
|
,109
|
,33
|
,33
|
,178
|
,178
|
,106
|
,106
|
,227
|
,227
|
,231
|
,231
|
,181
|
,181
|
,234
|
,234
|
,3
|
,3
|
,143
|
,143
|
,211
|
,211
|
,201
|
,201
|
,66
|
,66
|
,212
|
,212
|
,232
|
,232
|
,117
|
,117
|
,127
|
,127
|
,255
|
,255
|
,126
|
,126
|
,253};
|
,253};
|
|
|
return lut[a];
|
return lut[a];
|
}
|
}
|
|
|
unsigned char alphainv_lut (unsigned char n)
|
unsigned char alphainv_lut (unsigned char n)
|
{
|
{
|
if (n == 0)
|
if (n == 0)
|
return 1;
|
return 1;
|
// unsigned char a = 2;
|
|
// for (int i = 1; i < n; ++ i)
|
|
// a = gfmult_hw (a, 2);
|
|
|
|
// return gfinv_lut( a );
|
|
return gfinv_lut( alpha (n) );
|
return gfinv_lut( alpha (n) );
|
}
|
}
|
|
|
unsigned char gfdiv_lut (unsigned char dividend, unsigned char divisor)
|
unsigned char gfdiv_lut (unsigned char dividend, unsigned char divisor)
|
{
|
{
|
return gfmult_hw ( dividend, gfinv_lut(divisor));
|
return gfmult_hw ( dividend, gfinv_lut(divisor));
|
}
|
}
|
|
|
|
|
|
|
// Assumption: First bit of Lambda (alpha**0) is not transmitted
|
// Assumption: First bit of Lambda (alpha**0) is not transmitted
|
void compute_deriv (unsigned char lambda[tt], unsigned char lambda_deriv[tt])
|
void compute_deriv (unsigned char lambda[tt], unsigned char lambda_deriv[tt])
|
{
|
{
|
#pragma unroll true
|
// Directive: Unroll loop maximally
|
for (int i = 0; i < tt; i++)
|
for (int i = 0; i < tt; i++)
|
lambda_deriv[i] = (i % 2 == 0) ? lambda[i] : 0;
|
lambda_deriv[i] = (i % 2 == 0) ? lambda[i] : 0;
|
}
|
}
|
|
|
|
|
unsigned char poly_eval (unsigned char poly[tt], unsigned char alpha_inv)
|
unsigned char poly_eval (unsigned char poly[tt], unsigned char alpha_inv)
|
{
|
{
|
unsigned char val = 0;
|
unsigned char val = 0;
|
|
|
#pragma unroll true
|
// Directive: Unroll loop maximally
|
for (int j = tt-1; j >= 0; j--)
|
for (int j = tt-1; j >= 0; j--)
|
{
|
{
|
val = gfadd_hw(gfmult_hw(val, alpha_inv), poly[j]);
|
val = gfadd_hw(gfmult_hw(val, alpha_inv), poly[j]);
|
}
|
}
|
return val;
|
return val;
|
}
|
}
|
|
|
// int main() {
|
|
// for(int i=0; i<256; i++)
|
|
// cout << "," << (int)gfinv_lut(i) << endl;
|
|
// };
|
|
|
|
No newline at end of file
|
No newline at end of file
|