Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / sam / cpus / vonk / bl / lib / ecc / src / BL_Hsiao_256_10_Synd.cc
CommitLineData
920dae64
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: BL_Hsiao_256_10_Synd.cc
4// Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
5// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
6//
7// The above named program is free software; you can redistribute it and/or
8// modify it under the terms of the GNU General Public
9// License version 2 as published by the Free Software Foundation.
10//
11// The above named program is distributed in the hope that it will be
12// useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14// General Public License for more details.
15//
16// You should have received a copy of the GNU General Public
17// License along with this work; if not, write to the Free Software
18// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
19//
20// ========== Copyright Header End ============================================
21/************************************************************************
22**
23** Copyright (C) 2006, Sun Microsystems, Inc.
24**
25** Sun considers its source code as an unpublished, proprietary
26** trade secret and it is available only under strict license provisions.
27** This copyright notice is placed here only to protect Sun in the event
28** the source is deemed a published work. Disassembly, decompilation,
29** or other means of reducing the object code to human readable form
30** is prohibited by the license agreement under which this code is
31** provided to the user or company in possession of this copy.
32**
33*************************************************************************/
34
35#include <stdlib.h>
36#include "BL_Types.h"
37#include "BL_Hsiao_256_10_Synd.h"
38
39
40BL_EccBits BL_Hsiao_256_10_Synd::Patterns::syndromes[256];
41
42BL_Hsiao_256_10_Synd::Patterns BL_Hsiao_256_10_Synd::hsiao_256_10_patterns;
43
44BL_Hsiao_256_10_Synd::Patterns::Patterns()
45{
46 // These syndromes are defined in PRM 1.3 Section 16.14.1
47 // Note they are written in base 2 so we use strtoul() to convert them.
48 syndromes[0] = strtoul("1110000000", NULL, 2);
49 syndromes[1] = strtoul("1101000000", NULL, 2);
50 syndromes[2] = strtoul("1011000000", NULL, 2);
51 syndromes[3] = strtoul("0111000000", NULL, 2);
52 syndromes[4] = strtoul("1100100000", NULL, 2);
53 syndromes[5] = strtoul("1010100000", NULL, 2);
54 syndromes[6] = strtoul("0110100000", NULL, 2);
55 syndromes[7] = strtoul("1001100000", NULL, 2);
56 syndromes[8] = strtoul("0101100000", NULL, 2);
57 syndromes[9] = strtoul("0011100000", NULL, 2);
58 syndromes[10] = strtoul("1100010000", NULL, 2);
59 syndromes[11] = strtoul("1010010000", NULL, 2);
60 syndromes[12] = strtoul("0110010000", NULL, 2);
61 syndromes[13] = strtoul("1001010000", NULL, 2);
62 syndromes[14] = strtoul("0101010000", NULL, 2);
63 syndromes[15] = strtoul("0011010000", NULL, 2);
64 syndromes[16] = strtoul("1000110000", NULL, 2);
65 syndromes[17] = strtoul("0100110000", NULL, 2);
66 syndromes[18] = strtoul("0010110000", NULL, 2);
67 syndromes[19] = strtoul("0001110000", NULL, 2);
68 syndromes[20] = strtoul("1100001000", NULL, 2);
69 syndromes[21] = strtoul("1010001000", NULL, 2);
70 syndromes[22] = strtoul("0110001000", NULL, 2);
71 syndromes[23] = strtoul("1001001000", NULL, 2);
72 syndromes[24] = strtoul("0101001000", NULL, 2);
73 syndromes[25] = strtoul("0011001000", NULL, 2);
74 syndromes[26] = strtoul("1000101000", NULL, 2);
75 syndromes[27] = strtoul("0100101000", NULL, 2);
76 syndromes[28] = strtoul("0010101000", NULL, 2);
77 syndromes[29] = strtoul("0001101000", NULL, 2);
78 syndromes[30] = strtoul("1000011000", NULL, 2);
79 syndromes[31] = strtoul("0100011000", NULL, 2);
80 syndromes[32] = strtoul("0010011000", NULL, 2);
81 syndromes[33] = strtoul("0001011000", NULL, 2);
82 syndromes[34] = strtoul("0000111000", NULL, 2);
83 syndromes[35] = strtoul("1100000100", NULL, 2);
84 syndromes[36] = strtoul("1010000100", NULL, 2);
85 syndromes[37] = strtoul("0110000100", NULL, 2);
86 syndromes[38] = strtoul("1001000100", NULL, 2);
87 syndromes[39] = strtoul("0101000100", NULL, 2);
88 syndromes[40] = strtoul("0011000100", NULL, 2);
89 syndromes[41] = strtoul("1000100100", NULL, 2);
90 syndromes[42] = strtoul("0100100100", NULL, 2);
91 syndromes[43] = strtoul("0010100100", NULL, 2);
92 syndromes[44] = strtoul("0001100100", NULL, 2);
93 syndromes[45] = strtoul("1000010100", NULL, 2);
94 syndromes[46] = strtoul("0100010100", NULL, 2);
95 syndromes[47] = strtoul("0010010100", NULL, 2);
96 syndromes[48] = strtoul("0001010100", NULL, 2);
97 syndromes[49] = strtoul("0000110100", NULL, 2);
98 syndromes[50] = strtoul("1000001100", NULL, 2);
99 syndromes[51] = strtoul("0100001100", NULL, 2);
100 syndromes[52] = strtoul("0010001100", NULL, 2);
101 syndromes[53] = strtoul("0001001100", NULL, 2);
102 syndromes[54] = strtoul("0000101100", NULL, 2);
103 syndromes[55] = strtoul("0000011100", NULL, 2);
104 syndromes[56] = strtoul("1100000010", NULL, 2);
105 syndromes[57] = strtoul("1010000010", NULL, 2);
106 syndromes[58] = strtoul("0110000010", NULL, 2);
107 syndromes[59] = strtoul("1001000010", NULL, 2);
108 syndromes[60] = strtoul("0101000010", NULL, 2);
109 syndromes[61] = strtoul("0011000010", NULL, 2);
110 syndromes[62] = strtoul("1000100010", NULL, 2);
111 syndromes[63] = strtoul("0100100010", NULL, 2);
112 syndromes[64] = strtoul("0010100010", NULL, 2);
113 syndromes[65] = strtoul("0001100010", NULL, 2);
114 syndromes[66] = strtoul("1000010010", NULL, 2);
115 syndromes[67] = strtoul("0100010010", NULL, 2);
116 syndromes[68] = strtoul("0010010010", NULL, 2);
117 syndromes[69] = strtoul("0001010010", NULL, 2);
118 syndromes[70] = strtoul("0000110010", NULL, 2);
119 syndromes[71] = strtoul("1000001010", NULL, 2);
120 syndromes[72] = strtoul("0100001010", NULL, 2);
121 syndromes[73] = strtoul("0010001010", NULL, 2);
122 syndromes[74] = strtoul("0001001010", NULL, 2);
123 syndromes[75] = strtoul("0000101010", NULL, 2);
124 syndromes[76] = strtoul("0000011010", NULL, 2);
125 syndromes[77] = strtoul("1000000110", NULL, 2);
126 syndromes[78] = strtoul("0100000110", NULL, 2);
127 syndromes[79] = strtoul("0010000110", NULL, 2);
128 syndromes[80] = strtoul("0001000110", NULL, 2);
129 syndromes[81] = strtoul("0000100110", NULL, 2);
130 syndromes[82] = strtoul("0000010110", NULL, 2);
131 syndromes[83] = strtoul("0000001110", NULL, 2);
132 syndromes[84] = strtoul("1100000001", NULL, 2);
133 syndromes[85] = strtoul("1010000001", NULL, 2);
134 syndromes[86] = strtoul("0110000001", NULL, 2);
135 syndromes[87] = strtoul("1001000001", NULL, 2);
136 syndromes[88] = strtoul("0101000001", NULL, 2);
137 syndromes[89] = strtoul("0011000001", NULL, 2);
138 syndromes[90] = strtoul("1000100001", NULL, 2);
139 syndromes[91] = strtoul("0100100001", NULL, 2);
140 syndromes[92] = strtoul("0010100001", NULL, 2);
141 syndromes[93] = strtoul("0001100001", NULL, 2);
142 syndromes[94] = strtoul("1000010001", NULL, 2);
143 syndromes[95] = strtoul("0100010001", NULL, 2);
144 syndromes[96] = strtoul("0010010001", NULL, 2);
145 syndromes[97] = strtoul("0001010001", NULL, 2);
146 syndromes[98] = strtoul("0000110001", NULL, 2);
147 syndromes[99] = strtoul("1000001001", NULL, 2);
148 syndromes[100] = strtoul("0100001001", NULL, 2);
149 syndromes[101] = strtoul("0010001001", NULL, 2);
150 syndromes[102] = strtoul("0001001001", NULL, 2);
151 syndromes[103] = strtoul("0000101001", NULL, 2);
152 syndromes[104] = strtoul("0000011001", NULL, 2);
153 syndromes[105] = strtoul("1000000101", NULL, 2);
154 syndromes[106] = strtoul("0100000101", NULL, 2);
155 syndromes[107] = strtoul("0010000101", NULL, 2);
156 syndromes[108] = strtoul("0001000101", NULL, 2);
157 syndromes[109] = strtoul("0000100101", NULL, 2);
158 syndromes[110] = strtoul("0000010101", NULL, 2);
159 syndromes[111] = strtoul("0000001101", NULL, 2);
160 syndromes[112] = strtoul("1000000011", NULL, 2);
161 syndromes[113] = strtoul("0100000011", NULL, 2);
162 syndromes[114] = strtoul("0010000011", NULL, 2);
163 syndromes[115] = strtoul("0001000011", NULL, 2);
164 syndromes[116] = strtoul("0000100011", NULL, 2);
165 syndromes[117] = strtoul("0000010011", NULL, 2);
166 syndromes[118] = strtoul("0000001011", NULL, 2);
167 syndromes[119] = strtoul("0000000111", NULL, 2);
168 syndromes[120] = strtoul("1111100000", NULL, 2);
169 syndromes[121] = strtoul("0000011111", NULL, 2);
170 syndromes[122] = strtoul("1111010000", NULL, 2);
171 syndromes[123] = strtoul("0000101111", NULL, 2);
172 syndromes[124] = strtoul("0111101000", NULL, 2);
173 syndromes[125] = strtoul("1000010111", NULL, 2);
174 syndromes[126] = strtoul("0011100110", NULL, 2);
175 syndromes[127] = strtoul("1100011001", NULL, 2);
176 syndromes[128] = strtoul("1100010110", NULL, 2);
177 syndromes[129] = strtoul("0011101001", NULL, 2);
178 syndromes[130] = strtoul("1010010110", NULL, 2);
179 syndromes[131] = strtoul("0101101001", NULL, 2);
180 syndromes[132] = strtoul("0110010110", NULL, 2);
181 syndromes[133] = strtoul("1001101001", NULL, 2);
182 syndromes[134] = strtoul("1001010110", NULL, 2);
183 syndromes[135] = strtoul("0110101001", NULL, 2);
184 syndromes[136] = strtoul("0101010110", NULL, 2);
185 syndromes[137] = strtoul("1010101001", NULL, 2);
186 syndromes[138] = strtoul("0011010110", NULL, 2);
187 syndromes[139] = strtoul("1100101001", NULL, 2);
188 syndromes[140] = strtoul("1000110110", NULL, 2);
189 syndromes[141] = strtoul("0111001001", NULL, 2);
190 syndromes[142] = strtoul("0100110110", NULL, 2);
191 syndromes[143] = strtoul("1011001001", NULL, 2);
192 syndromes[144] = strtoul("0010110110", NULL, 2);
193 syndromes[145] = strtoul("1101001001", NULL, 2);
194 syndromes[146] = strtoul("1110011000", NULL, 2);
195 syndromes[147] = strtoul("0001100111", NULL, 2);
196 syndromes[148] = strtoul("0001110110", NULL, 2);
197 syndromes[149] = strtoul("1110001001", NULL, 2);
198 syndromes[150] = strtoul("1100001110", NULL, 2);
199 syndromes[151] = strtoul("0011110001", NULL, 2);
200 syndromes[152] = strtoul("1010001110", NULL, 2);
201 syndromes[153] = strtoul("0101110001", NULL, 2);
202 syndromes[154] = strtoul("0110001110", NULL, 2);
203 syndromes[155] = strtoul("1001110001", NULL, 2);
204 syndromes[156] = strtoul("1001001110", NULL, 2);
205 syndromes[157] = strtoul("0110110001", NULL, 2);
206 syndromes[158] = strtoul("0101001110", NULL, 2);
207 syndromes[159] = strtoul("1010110001", NULL, 2);
208 syndromes[160] = strtoul("0011001110", NULL, 2);
209 syndromes[161] = strtoul("1100110001", NULL, 2);
210 syndromes[162] = strtoul("1000101110", NULL, 2);
211 syndromes[163] = strtoul("0111010001", NULL, 2);
212 syndromes[164] = strtoul("0100101110", NULL, 2);
213 syndromes[165] = strtoul("1011010001", NULL, 2);
214 syndromes[166] = strtoul("0010101110", NULL, 2);
215 syndromes[167] = strtoul("1101010001", NULL, 2);
216 syndromes[168] = strtoul("1101011000", NULL, 2);
217 syndromes[169] = strtoul("0010100111", NULL, 2);
218 syndromes[170] = strtoul("0001101110", NULL, 2);
219 syndromes[171] = strtoul("1110010001", NULL, 2);
220 syndromes[172] = strtoul("1000011110", NULL, 2);
221 syndromes[173] = strtoul("0111100001", NULL, 2);
222 syndromes[174] = strtoul("0100011110", NULL, 2);
223 syndromes[175] = strtoul("1011100001", NULL, 2);
224 syndromes[176] = strtoul("0010011110", NULL, 2);
225 syndromes[177] = strtoul("1101100001", NULL, 2);
226 syndromes[178] = strtoul("0001011110", NULL, 2);
227 syndromes[179] = strtoul("1110100001", NULL, 2);
228 syndromes[180] = strtoul("0000111110", NULL, 2);
229 syndromes[181] = strtoul("1111000001", NULL, 2);
230 syndromes[182] = strtoul("1011011000", NULL, 2);
231 syndromes[183] = strtoul("0100100111", NULL, 2);
232 syndromes[184] = strtoul("0111011000", NULL, 2);
233 syndromes[185] = strtoul("1000100111", NULL, 2);
234 syndromes[186] = strtoul("1100111000", NULL, 2);
235 syndromes[187] = strtoul("0011000111", NULL, 2);
236 syndromes[188] = strtoul("1010011001", NULL, 2);
237 syndromes[189] = strtoul("0101100110", NULL, 2);
238 syndromes[190] = strtoul("0110011001", NULL, 2);
239 syndromes[191] = strtoul("1001100110", NULL, 2);
240 syndromes[192] = strtoul("1001011001", NULL, 2);
241 syndromes[193] = strtoul("0110100110", NULL, 2);
242 syndromes[194] = strtoul("0101011001", NULL, 2);
243 syndromes[195] = strtoul("1010100110", NULL, 2);
244 syndromes[196] = strtoul("0011011001", NULL, 2);
245 syndromes[197] = strtoul("1100100110", NULL, 2);
246 syndromes[198] = strtoul("1000111001", NULL, 2);
247 syndromes[199] = strtoul("0111000110", NULL, 2);
248 syndromes[200] = strtoul("0100111001", NULL, 2);
249 syndromes[201] = strtoul("1011000110", NULL, 2);
250 syndromes[202] = strtoul("0010111001", NULL, 2);
251 syndromes[203] = strtoul("1101000110", NULL, 2);
252 syndromes[204] = strtoul("1010111000", NULL, 2);
253 syndromes[205] = strtoul("0101000111", NULL, 2);
254 syndromes[206] = strtoul("0001111001", NULL, 2);
255 syndromes[207] = strtoul("1110000110", NULL, 2);
256 syndromes[208] = strtoul("1110000101", NULL, 2);
257 syndromes[209] = strtoul("0001111010", NULL, 2);
258 syndromes[210] = strtoul("1101000101", NULL, 2);
259 syndromes[211] = strtoul("0010111010", NULL, 2);
260 syndromes[212] = strtoul("1011000101", NULL, 2);
261 syndromes[213] = strtoul("0100111010", NULL, 2);
262 syndromes[214] = strtoul("0111000101", NULL, 2);
263 syndromes[215] = strtoul("1000111010", NULL, 2);
264 syndromes[216] = strtoul("1100100101", NULL, 2);
265 syndromes[217] = strtoul("0011011010", NULL, 2);
266 syndromes[218] = strtoul("1010100101", NULL, 2);
267 syndromes[219] = strtoul("0101011010", NULL, 2);
268 syndromes[220] = strtoul("0110100101", NULL, 2);
269 syndromes[221] = strtoul("1001011010", NULL, 2);
270 syndromes[222] = strtoul("1001100101", NULL, 2);
271 syndromes[223] = strtoul("0110011010", NULL, 2);
272 syndromes[224] = strtoul("0101100101", NULL, 2);
273 syndromes[225] = strtoul("1010011010", NULL, 2);
274 syndromes[226] = strtoul("0110111000", NULL, 2);
275 syndromes[227] = strtoul("1001000111", NULL, 2);
276 syndromes[228] = strtoul("0011100101", NULL, 2);
277 syndromes[229] = strtoul("1100011010", NULL, 2);
278 syndromes[230] = strtoul("1100010101", NULL, 2);
279 syndromes[231] = strtoul("0011101010", NULL, 2);
280 syndromes[232] = strtoul("1010010101", NULL, 2);
281 syndromes[233] = strtoul("0101101010", NULL, 2);
282 syndromes[234] = strtoul("0110010101", NULL, 2);
283 syndromes[235] = strtoul("1001101010", NULL, 2);
284 syndromes[236] = strtoul("1001010101", NULL, 2);
285 syndromes[237] = strtoul("0110101010", NULL, 2);
286 syndromes[238] = strtoul("0101010101", NULL, 2);
287 syndromes[239] = strtoul("1010101010", NULL, 2);
288 syndromes[240] = strtoul("0011010101", NULL, 2);
289 syndromes[241] = strtoul("1100101010", NULL, 2);
290 syndromes[242] = strtoul("1000110101", NULL, 2);
291 syndromes[243] = strtoul("0111001010", NULL, 2);
292 syndromes[244] = strtoul("0100110101", NULL, 2);
293 syndromes[245] = strtoul("1011001010", NULL, 2);
294 syndromes[246] = strtoul("0010110101", NULL, 2);
295 syndromes[247] = strtoul("1101001010", NULL, 2);
296 syndromes[248] = strtoul("1001111000", NULL, 2);
297 syndromes[249] = strtoul("0110000111", NULL, 2);
298 syndromes[250] = strtoul("0001110101", NULL, 2);
299 syndromes[251] = strtoul("1110001010", NULL, 2);
300 syndromes[252] = strtoul("1100001101", NULL, 2);
301 syndromes[253] = strtoul("0011110010", NULL, 2);
302 syndromes[254] = strtoul("1010001101", NULL, 2);
303 syndromes[255] = strtoul("0101110010", NULL, 2);
304
305 // Convert the syndromes for each single bit error into the H matrix.
306 // Each pattern (there are 10) is multiplied by the data (a
307 // BL_Uint256) to generate one bit of ECC.
308 for (uint_t pattern_ndx = 0; pattern_ndx < 10; ++pattern_ndx)
309 {
310 for (uint_t syndrome_ndx = 0; syndrome_ndx < 256; syndrome_ndx += 64)
311 {
312 patterns[9 - pattern_ndx].set(syndrome_ndx/64,
313 calc_pattern(syndrome_ndx, pattern_ndx));
314 }
315 }
316
317 // self check
318 // For Hsiao ECC, the check bits and the syndrome are calculated
319 // using the same algorithm.
320 // Check that inverting one data bit and calculating the resulting
321 // ECC matching the bit's syndrome.
322 for (uint_t syndrome_ndx = 0; syndrome_ndx < 256; ++syndrome_ndx)
323 {
324 BL_Uint256 data;
325 data.invert(syndrome_ndx);
326
327 if (calc_checks(10, patterns, data).get() != syndromes[syndrome_ndx].get())
328 {
329 fprintf(stderr,
330 "syndrome mismatch: ndx %d calc_check 0x%x syndrome 0x%x\n",
331 syndrome_ndx,
332 calc_checks(10, patterns, data).get(),
333 syndromes[syndrome_ndx].get());
334 exit(-1);
335 }
336 }
337}
338
339uint64_t BL_Hsiao_256_10_Synd::Patterns::calc_pattern(uint_t syndrome_ndx,
340 uint_t pattern_ndx)
341{
342 uint64_t pattern = 0;
343
344 for (uint_t ndx = 0; ndx < 64; ++ndx)
345 {
346 if (syndromes[syndrome_ndx + ndx].get() == 0)
347 {
348 fprintf(stderr, "bad zero syndrome: %d\n", syndrome_ndx + ndx);
349 exit(-1);
350 }
351
352 pattern |= ((syndromes[syndrome_ndx + ndx].get() >> pattern_ndx) & 0x1ULL)
353 << ndx;
354 }
355
356 return pattern;
357}