147 std::cout <<
"testMuxedRegisterAccessor" << std::endl;
153 BOOST_CHECK(device->someMuxedRegister.getNumberOfElements() == 4096);
154 BOOST_CHECK(device->someMuxedRegister.getNumberOfSequences() == 16);
158 static const int areaIndexOffset = 1000 / 4;
181 } __attribute__((packed)) cooked;
185 int pitch =
sizeof(mixedReg.raw);
188 mixedReg.cooked.r0 = 42;
189 mixedReg.cooked.r1 = 120;
190 mixedReg.cooked.r2 = 222;
191 mixedReg.cooked.r3 = -110;
192 mixedReg.cooked.r4 = 1;
193 mixedReg.cooked.r5 = 33;
194 mixedReg.cooked.r6 = 6;
195 mixedReg.cooked.r7 = 7;
196 mixedReg.cooked.r8 = 8;
197 mixedReg.cooked.r9 = 9;
198 mixedReg.cooked.r10 = 10;
199 mixedReg.cooked.r11 = 11;
200 mixedReg.cooked.r12 = 12;
201 mixedReg.cooked.r13 = 13;
202 mixedReg.cooked.r14 = 14;
203 mixedReg.cooked.r15 = 15;
204 for(
int i = 0; i < 13; i++) device->_barContents[0xD][areaIndexOffset + i] = mixedReg.raw[i];
207 BOOST_CHECK((
int)((
char*)&(mixedReg.cooked.r5) - (
char*)&(mixedReg.cooked.r0)) == 10);
208 BOOST_CHECK((
int)((
char*)&(mixedReg.cooked.r10) - (
char*)&(mixedReg.cooked.r0)) == 28);
209 BOOST_CHECK((
int)((
char*)&(mixedReg.cooked.r15) - (
char*)&(mixedReg.cooked.r0)) == pitch - 4);
210 BOOST_CHECK(device->_barContents[0xD][areaIndexOffset + 0] == 42);
211 BOOST_CHECK(device->_barContents[0xD][areaIndexOffset + 1] == 120 + 0x10000 * 222);
212 BOOST_CHECK(device->_barContents[0xD][areaIndexOffset + 9] == 12);
213 BOOST_CHECK(device->_barContents[0xD][areaIndexOffset + 12] == 15);
215 mixedReg.cooked.r0 = 1;
216 mixedReg.cooked.r1 = 11;
217 mixedReg.cooked.r2 = 22;
218 mixedReg.cooked.r3 = 33;
219 mixedReg.cooked.r4 = 0;
220 mixedReg.cooked.r5 = 55;
221 mixedReg.cooked.r6 = 66;
222 mixedReg.cooked.r7 = 77;
223 mixedReg.cooked.r8 = 88;
224 mixedReg.cooked.r9 = 99;
225 mixedReg.cooked.r10 = 100;
226 mixedReg.cooked.r11 = 111;
227 mixedReg.cooked.r12 = 222;
228 mixedReg.cooked.r13 = 333;
229 mixedReg.cooked.r14 = 444;
230 mixedReg.cooked.r15 = 555;
231 for(
int i = 0; i < 13; i++) device->_barContents[0xD][areaIndexOffset + pitch / 4 + i] = mixedReg.raw[i];
234 BOOST_CHECK(device->_barContents[0xD][areaIndexOffset + pitch / 4 + 0] == 1);
235 BOOST_CHECK(device->_barContents[0xD][areaIndexOffset + pitch / 4 + 1] == 11 + 0x10000 * 22);
236 BOOST_CHECK(device->_barContents[0xD][areaIndexOffset + pitch / 4 + 9] == 222);
237 BOOST_CHECK(device->_barContents[0xD][areaIndexOffset + pitch / 4 + 12] == 555);
240 for(
int i = 2; i < 4096; i++) {
241 mixedReg.cooked.r0 = i + 0;
242 mixedReg.cooked.r1 = i + 1;
243 mixedReg.cooked.r2 = i + 2;
244 mixedReg.cooked.r3 = i + 3;
245 mixedReg.cooked.r4 = i + 4;
246 mixedReg.cooked.r5 = i + 5;
247 mixedReg.cooked.r6 = i + 6;
248 mixedReg.cooked.r7 = i + 7;
249 mixedReg.cooked.r8 = i + 8;
250 mixedReg.cooked.r9 = i + 9;
251 mixedReg.cooked.r10 = i + 10;
252 mixedReg.cooked.r11 = i + 11;
253 mixedReg.cooked.r12 = i + 12;
254 mixedReg.cooked.r13 = i + 13;
255 mixedReg.cooked.r14 = i + 14;
256 mixedReg.cooked.r15 = i + 15;
257 for(
int k = 0; k < 13; k++) device->_barContents[0xD][areaIndexOffset + i * (pitch / 4) + k] = mixedReg.raw[k];
261 BOOST_CHECK(device->someMuxedRegister[0][0] == 42);
262 BOOST_CHECK(device->someMuxedRegister[1][0] == 120);
263 BOOST_CHECK(device->someMuxedRegister[2][0] == 222);
264 BOOST_CHECK(device->someMuxedRegister[3][0] == -110);
265 BOOST_CHECK(device->someMuxedRegister[4][0] == 1);
266 BOOST_CHECK(device->someMuxedRegister[5][0] == 33);
267 BOOST_CHECK(device->someMuxedRegister[6][0] == 6);
268 BOOST_CHECK(device->someMuxedRegister[7][0] == 7);
269 BOOST_CHECK(device->someMuxedRegister[8][0] == 8);
270 BOOST_CHECK(device->someMuxedRegister[9][0] == 9);
271 BOOST_CHECK(device->someMuxedRegister[10][0] == 10);
272 BOOST_CHECK(device->someMuxedRegister[11][0] == 11);
273 BOOST_CHECK(device->someMuxedRegister[12][0] == 12);
274 BOOST_CHECK(device->someMuxedRegister[13][0] == 13);
275 BOOST_CHECK(device->someMuxedRegister[14][0] == 14);
276 BOOST_CHECK(device->someMuxedRegister[15][0] == 15);
278 BOOST_CHECK(device->someMuxedRegister[0][1] == 1);
279 BOOST_CHECK(device->someMuxedRegister[1][1] == 11);
280 BOOST_CHECK(device->someMuxedRegister[2][1] == 22);
281 BOOST_CHECK(device->someMuxedRegister[3][1] == 33);
282 BOOST_CHECK(device->someMuxedRegister[4][1] == 0);
283 BOOST_CHECK(device->someMuxedRegister[5][1] == 55);
284 BOOST_CHECK(device->someMuxedRegister[6][1] == 66);
285 BOOST_CHECK(device->someMuxedRegister[7][1] == 77);
286 BOOST_CHECK(device->someMuxedRegister[8][1] == 88);
287 BOOST_CHECK(device->someMuxedRegister[9][1] == 99);
288 BOOST_CHECK(device->someMuxedRegister[10][1] == 100);
289 BOOST_CHECK(device->someMuxedRegister[11][1] == 111);
290 BOOST_CHECK(device->someMuxedRegister[12][1] == 222);
291 BOOST_CHECK(device->someMuxedRegister[13][1] == 333);
292 BOOST_CHECK(device->someMuxedRegister[14][1] == 444);
293 BOOST_CHECK(device->someMuxedRegister[15][1] == 555);
295 for(
int i = 2; i < 65536 / 16; i++) {
296 for(
int k = 0; k < 16; k++) {
297 int expectedValue = i + k;
298 void* ptr = (
void*)&expectedValue;
299 if(k == 1 || k == 2 || k == 6) {
300 expectedValue = *(
reinterpret_cast<int16_t*
>(ptr));
303 expectedValue = *(
reinterpret_cast<int8_t*
>(ptr));
306 expectedValue = expectedValue & 0x1;
309 expectedValue = expectedValue & 0xFFFFFF;
311 std::stringstream message;
312 message <<
"someMuxedRegister[" << k <<
"][" << i <<
"] == " << device->someMuxedRegister[k][i] <<
" but "
313 << expectedValue <<
" expected.";
314 BOOST_CHECK_MESSAGE(device->someMuxedRegister[k][i] == expectedValue, message.str());
319 device->someMuxedRegister[0][0] = 666;
320 device->someMuxedRegister[1][0] = 999;
321 device->someMuxedRegister[2][0] = 222;
322 device->someMuxedRegister[3][0] = -111;
323 device->someMuxedRegister[4][0] = 0;
324 device->someMuxedRegister[5][0] = 555;
325 device->someMuxedRegister[6][0] = 666;
326 device->someMuxedRegister[7][0] = 777;
327 device->someMuxedRegister[8][0] = 888;
328 device->someMuxedRegister[9][0] = 999;
329 device->someMuxedRegister[10][0] = 1111;
330 device->someMuxedRegister[11][0] = 2222;
331 device->someMuxedRegister[12][0] = 3333;
332 device->someMuxedRegister[13][0] = 4444;
333 device->someMuxedRegister[14][0] = 5555;
334 device->someMuxedRegister[15][0] = 6666;
336 for(
int i = 1; i < 65536 / 16; i++) {
337 for(
int k = 0; k < 16; k++) {
338 device->someMuxedRegister[k][i] = 10 * k + i;
342 for(
int k = 0; k < 13; k++) mixedReg.raw[k] = device->_barContents[0xD][areaIndexOffset + k];
343 BOOST_CHECK(mixedReg.cooked.r0 == 666);
344 BOOST_CHECK(mixedReg.cooked.r1 == 999);
345 BOOST_CHECK(mixedReg.cooked.r2 == 222);
346 BOOST_CHECK(mixedReg.cooked.r3 == -111);
347 BOOST_CHECK(mixedReg.cooked.r4 == 0);
348 BOOST_CHECK(mixedReg.cooked.r5 == 555);
349 BOOST_CHECK(mixedReg.cooked.r6 == 666);
350 BOOST_CHECK(mixedReg.cooked.r7 == 777);
351 BOOST_CHECK(mixedReg.cooked.r8 == 888);
352 BOOST_CHECK(mixedReg.cooked.r9 == 999);
353 BOOST_CHECK(mixedReg.cooked.r10 == 1111);
354 BOOST_CHECK(mixedReg.cooked.r11 == 2222);
355 BOOST_CHECK(mixedReg.cooked.r12 == 3333);
356 BOOST_CHECK(mixedReg.cooked.r13 == 4444);
357 BOOST_CHECK(mixedReg.cooked.r14 == 5555);
358 BOOST_CHECK(mixedReg.cooked.r15 == 6666);
360 for(
int i = 1; i < 65536 / 16; i++) {
361 for(
int k = 0; k < 13; k++) mixedReg.raw[k] = device->_barContents[0xD][areaIndexOffset + i * (pitch / 4) + k];
362 BOOST_CHECK(mixedReg.cooked.r0 == 10 * 0 + i);
363 BOOST_CHECK(mixedReg.cooked.r1 == std::min(10 * 1 + i, 32767));
364 BOOST_CHECK(mixedReg.cooked.r2 == std::min(10 * 2 + i, 32767));
365 BOOST_CHECK(mixedReg.cooked.r3 == std::min(10 * 3 + i, 127));
366 BOOST_CHECK(mixedReg.cooked.r4 == std::min(10 * 4 + i, 1));
367 BOOST_CHECK(mixedReg.cooked.r5 == 10 * 5 + i);
368 BOOST_CHECK(mixedReg.cooked.r6 == std::min(10 * 6 + i, 32767));
369 BOOST_CHECK(mixedReg.cooked.r7 == 10 * 7 + i);
370 BOOST_CHECK(mixedReg.cooked.r8 == 10 * 8 + i);
371 BOOST_CHECK(mixedReg.cooked.r9 == 10 * 9 + i);
372 BOOST_CHECK(mixedReg.cooked.r10 == 10 * 10 + i);
373 BOOST_CHECK(mixedReg.cooked.r11 == 10 * 11 + i);
374 BOOST_CHECK(mixedReg.cooked.r12 == 10 * 12 + i);
375 BOOST_CHECK(mixedReg.cooked.r13 == 10 * 13 + i);
376 BOOST_CHECK(mixedReg.cooked.r14 == 10 * 14 + i);
377 BOOST_CHECK(mixedReg.cooked.r15 == (
unsigned int)(10 * 15 + i));