1 // -*- mode: C++; c-file-style: "cc-mode" -*-
2 //*************************************************************************
3 //
4 // Copyright 2020 by Geza Lore. This program is free software; you can
5 // redistribute it and/or modify it under the terms of either the GNU
6 // Lesser General Public License Version 3 or the Perl Artistic License
7 // Version 2.0.
8 // SPDX-License-Identifier: LGPL-3.0-only OR Artistic-2.0
9 //
10 //*************************************************************************
11
12 #include <cstdio>
13 #include <cstdlib>
14 #include <cstring>
15
16 // clang-format off
17 #if defined(NCSC)
18 // Used by NC's svdpi.h to pick up svLogicVecVal with _.aval and _.bval fields,
19 // rather than the IEEE 1800-2005 version which has _.a and _.b fields.
20 # define DPI_COMPATIBILITY_VERSION_1800v2012
21 #endif
22
23 #include "svdpi.h"
24
25 #if defined(VERILATOR) // Verilator
26 # include "Vt_dpi_arg_output_type__Dpi.h"
27 typedef long long sv_longint_t;
28 typedef unsigned long long sv_longint_unsigned_t;
29 # define NO_SHORTREAL
30 #elif defined(VCS) // VCS
31 # include "../vc_hdrs.h"
32 typedef long long sv_longint_t;
33 typedef unsigned long long sv_longint_unsigned_t;
34 # define NO_TIME
35 #elif defined(NCSC) // NC
36 # include "dpi-exp.h"
37 # include "dpi-imp.h"
38 typedef long long sv_longint_t;
39 typedef unsigned long long sv_longint_unsigned_t;
40 # define NO_TIME
41 # define NO_INTEGER
42 # define NO_SHORTREAL
43 #elif defined(MS) // ModelSim
44 # include "dpi.h"
45 typedef int64_t sv_longint_t;
46 typedef uint64_t sv_longint_unsigned_t;
47 # else
48 # error "Unknown simulator for DPI test"
49 #endif
50 // clang-format on
51
52 //======================================================================
53 // Implementations of imported functions
54 //======================================================================
55
56 void set_bvals(svLogicVecVal* v, unsigned n);
set_bvals(svLogicVecVal * v,unsigned n)57 void set_bvals(svLogicVecVal* v, unsigned n) {
58 for (unsigned i = 0; i < n; i++) v[i].bval = 0;
59 }
60
61 // Basic types as per IEEE 1800-2017 35.5.6
i_byte(char * o)62 void i_byte(char* o) {
63 static int n = 0;
64 *o = 10 - n++;
65 }
66
i_byte_unsigned(unsigned char * o)67 void i_byte_unsigned(unsigned char* o) {
68 static int n = 0;
69 *o = 20 - n++;
70 }
71
i_shortint(short * o)72 void i_shortint(short* o) {
73 static int n = 0;
74 *o = 30 - n++;
75 }
76
i_shortint_unsigned(unsigned short * o)77 void i_shortint_unsigned(unsigned short* o) {
78 static int n = 0;
79 *o = 40 - n++;
80 }
81
i_int(int * o)82 void i_int(int* o) {
83 static int n = 0;
84 *o = 50 - n++;
85 }
86
i_int_unsigned(unsigned * o)87 void i_int_unsigned(unsigned* o) {
88 static int n = 0;
89 *o = 60 - n++;
90 }
91
i_longint(sv_longint_t * o)92 void i_longint(sv_longint_t* o) {
93 static int n = 0;
94 *o = 70 - n++;
95 }
96
i_longint_unsigned(sv_longint_unsigned_t * o)97 void i_longint_unsigned(sv_longint_unsigned_t* o) {
98 static int n = 0;
99 *o = 80 - n++;
100 }
101
102 #ifndef NO_TIME
i_time(svLogicVecVal * o)103 void i_time(svLogicVecVal* o) {
104 static int n = 0;
105 o[0].aval = 90 - n++;
106 o[1].aval = 0;
107 set_bvals(o, 2);
108 }
109 #endif
110
111 #ifndef NO_INTEGER
i_integer(svLogicVecVal * o)112 void i_integer(svLogicVecVal* o) {
113 static int n = 0;
114 o->aval = 100 - n++;
115 set_bvals(o, 1);
116 }
117 #endif
118
i_real(double * o)119 void i_real(double* o) {
120 static int n = 0;
121 *o = (-2.0 * n++ - 1.0) / 2.0;
122 }
123
124 #ifndef NO_SHORTREAL
i_shortreal(float * o)125 void i_shortreal(float* o) {
126 static int n = 0;
127 *o = (-4.0f * n++ - 1.0f) / 4.0f;
128 }
129 #endif
130
i_chandle(void ** o)131 void i_chandle(void** o) {
132 static int n = 0;
133 printf("i_chandle %d\n", n);
134 *o = (n++ % 2) ? reinterpret_cast<void*>(&i_chandle) : NULL;
135 }
136
i_string(const char ** o)137 void i_string(const char** o) {
138 static int n = 0;
139 printf("i_string %d\n", n);
140 *o = (n++ % 2) ? "Hello" : "World";
141 }
142
i_bit(svBit * o)143 void i_bit(svBit* o) {
144 static int n = 0;
145 printf("i_bit %d\n", n);
146 *o = !(n++ % 2);
147 }
148
i_logic(svLogic * o)149 void i_logic(svLogic* o) {
150 static int n = 0;
151 printf("i_logic %d\n", n);
152 *o = n++ % 2;
153 }
154
155 // Basic types via typedefs
i_byte_t(char * o)156 void i_byte_t(char* o) {
157 static int n = 0;
158 const char r = 10 - n;
159 n += 2;
160 *o = r;
161 }
162
i_byte_unsigned_t(unsigned char * o)163 void i_byte_unsigned_t(unsigned char* o) {
164 static int n = 0;
165 const unsigned char r = 20 - n;
166 n += 2;
167 *o = r;
168 }
169
i_shortint_t(short * o)170 void i_shortint_t(short* o) {
171 static int n = 0;
172 const short r = 30 - n;
173 n += 2;
174 *o = r;
175 }
176
i_shortint_unsigned_t(unsigned short * o)177 void i_shortint_unsigned_t(unsigned short* o) {
178 static int n = 0;
179 const unsigned short r = 40 - n;
180 n += 2;
181 *o = r;
182 }
183
i_int_t(int * o)184 void i_int_t(int* o) {
185 static int n = 0;
186 const int r = 50 - n;
187 n += 2;
188 *o = r;
189 }
190
i_int_unsigned_t(unsigned * o)191 void i_int_unsigned_t(unsigned* o) {
192 static int n = 0;
193 const unsigned r = 60 - n;
194 n += 2;
195 *o = r;
196 }
197
i_longint_t(sv_longint_t * o)198 void i_longint_t(sv_longint_t* o) {
199 static int n = 0;
200 const long long r = 70 - n;
201 n += 2;
202 *o = r;
203 }
204
i_longint_unsigned_t(sv_longint_unsigned_t * o)205 void i_longint_unsigned_t(sv_longint_unsigned_t* o) {
206 static int n = 0;
207 const unsigned long long r = 80 - n;
208 n += 2;
209 *o = r;
210 }
211
212 #ifndef NO_TIME
i_time_t(svLogicVecVal * o)213 void i_time_t(svLogicVecVal* o) {
214 static int n = 0;
215 o[0].aval = 90 - n;
216 o[1].aval = 0;
217 set_bvals(o, 2);
218 n += 2;
219 }
220 #endif
221
222 #ifndef NO_INTEGER
i_integer_t(svLogicVecVal * o)223 void i_integer_t(svLogicVecVal* o) {
224 static int n = 0;
225 o->aval = 100 - n;
226 set_bvals(o, 1);
227 n += 2;
228 }
229 #endif
230
i_real_t(double * o)231 void i_real_t(double* o) {
232 static int n = 0;
233 const double r = (-2.0 * n - 1.0) / 2.0;
234 n += 2;
235 *o = r;
236 }
237
238 #ifndef NO_SHORTREAL
i_shortreal_t(float * o)239 void i_shortreal_t(float* o) {
240 static int n = 0;
241 const float r = (-4.0f * n - 1.0f) / 4.0f;
242 n += 2;
243 *o = r;
244 }
245 #endif
246
i_chandle_t(void ** o)247 void i_chandle_t(void** o) {
248 static int n = 0;
249 printf("i_chandle_t %d\n", n);
250 *o = (n++ % 2) ? reinterpret_cast<void*>(&i_chandle) : NULL;
251 }
252
i_string_t(const char ** o)253 void i_string_t(const char** o) {
254 static int n = 0;
255 printf("i_string_t %d\n", n);
256 *o = (n++ % 2) ? "Hello" : "World";
257 }
258
i_bit_t(svBit * o)259 void i_bit_t(svBit* o) {
260 static int n = 0;
261 printf("i_bit_t %d\n", n);
262 *o = !(n++ % 2);
263 }
264
i_logic_t(svLogic * o)265 void i_logic_t(svLogic* o) {
266 static int n = 0;
267 printf("i_logic_t %d\n", n);
268 *o = n++ % 2;
269 }
270
271 // 2-state packed arrays
i_array_2_state_1(svBitVecVal * o)272 void i_array_2_state_1(svBitVecVal* o) {
273 static int n = 0;
274 printf("i_array_2_state_1 %d\n", n);
275 *o = !(n++ % 2);
276 }
277
i_array_2_state_32(svBitVecVal * o)278 void i_array_2_state_32(svBitVecVal* o) {
279 static int n = 0;
280 printf("i_array_2_state_32 %d\n", n);
281 *o = 0xffffffffU << n++;
282 }
283
i_array_2_state_33(svBitVecVal * o)284 void i_array_2_state_33(svBitVecVal* o) {
285 static int n = 0;
286 printf("i_array_2_state_33 %d\n", n);
287 o[0] = 0xffffffffU << n++;
288 o[1] = 1;
289 }
290
i_array_2_state_64(svBitVecVal * o)291 void i_array_2_state_64(svBitVecVal* o) {
292 static int n = 0;
293 printf("i_array_2_state_64 %d\n", n);
294 o[0] = 0xffffffffU << n++;
295 o[1] = -1;
296 }
297
i_array_2_state_65(svBitVecVal * o)298 void i_array_2_state_65(svBitVecVal* o) {
299 static int n = 0;
300 printf("i_array_2_state_65 %d\n", n);
301 o[0] = 0xffffffffU << n++;
302 o[1] = -1;
303 o[2] = 1;
304 }
305
i_array_2_state_128(svBitVecVal * o)306 void i_array_2_state_128(svBitVecVal* o) {
307 static int n = 0;
308 printf("i_array_2_state_128 %d\n", n);
309 o[0] = 0xffffffffU << n++;
310 o[1] = -1;
311 o[2] = -1;
312 o[3] = -1;
313 }
314
315 // 2-state packed structures
i_struct_2_state_1(svBitVecVal * o)316 void i_struct_2_state_1(svBitVecVal* o) {
317 static int n = 0;
318 printf("i_struct_2_state_1 %d\n", n);
319 *o = !(n++ % 2);
320 }
321
i_struct_2_state_32(svBitVecVal * o)322 void i_struct_2_state_32(svBitVecVal* o) {
323 static int n = 0;
324 printf("i_struct_2_state_32 %d\n", n);
325 *o = 0xffffffffU << n++;
326 }
327
i_struct_2_state_33(svBitVecVal * o)328 void i_struct_2_state_33(svBitVecVal* o) {
329 static int n = 0;
330 printf("i_struct_2_state_33 %d\n", n);
331 o[0] = 0xffffffffU << n++;
332 o[1] = 1;
333 }
334
i_struct_2_state_64(svBitVecVal * o)335 void i_struct_2_state_64(svBitVecVal* o) {
336 static int n = 0;
337 printf("i_struct_2_state_64 %d\n", n);
338 o[0] = 0xffffffffU << n++;
339 o[1] = -1;
340 }
341
i_struct_2_state_65(svBitVecVal * o)342 void i_struct_2_state_65(svBitVecVal* o) {
343 static int n = 0;
344 printf("i_struct_2_state_65 %d\n", n);
345 o[0] = 0xffffffffU << n++;
346 o[1] = -1;
347 o[2] = 1;
348 }
349
i_struct_2_state_128(svBitVecVal * o)350 void i_struct_2_state_128(svBitVecVal* o) {
351 static int n = 0;
352 printf("i_struct_2_state_128 %d\n", n);
353 o[0] = 0xffffffffU << n++;
354 o[1] = -1;
355 o[2] = -1;
356 o[3] = -1;
357 }
358
359 // 2-state packed unions
i_union_2_state_1(svBitVecVal * o)360 void i_union_2_state_1(svBitVecVal* o) {
361 static int n = 0;
362 printf("i_union_2_state_1 %d\n", n);
363 *o = !(n++ % 2);
364 }
365
i_union_2_state_32(svBitVecVal * o)366 void i_union_2_state_32(svBitVecVal* o) {
367 static int n = 0;
368 printf("i_union_2_state_32 %d\n", n);
369 *o = 0xffffffffU << n++;
370 }
371
i_union_2_state_33(svBitVecVal * o)372 void i_union_2_state_33(svBitVecVal* o) {
373 static int n = 0;
374 printf("i_union_2_state_33 %d\n", n);
375 o[0] = 0xffffffffU << n++;
376 o[1] = 1;
377 }
378
i_union_2_state_64(svBitVecVal * o)379 void i_union_2_state_64(svBitVecVal* o) {
380 static int n = 0;
381 printf("i_union_2_state_64 %d\n", n);
382 o[0] = 0xffffffffU << n++;
383 o[1] = -1;
384 }
385
i_union_2_state_65(svBitVecVal * o)386 void i_union_2_state_65(svBitVecVal* o) {
387 static int n = 0;
388 printf("i_union_2_state_65 %d\n", n);
389 o[0] = 0xffffffffU << n++;
390 o[1] = -1;
391 o[2] = 1;
392 }
393
i_union_2_state_128(svBitVecVal * o)394 void i_union_2_state_128(svBitVecVal* o) {
395 static int n = 0;
396 printf("i_union_2_state_128 %d\n", n);
397 o[0] = 0xffffffffU << n++;
398 o[1] = -1;
399 o[2] = -1;
400 o[3] = -1;
401 }
402
403 // 4-state packed arrays
i_array_4_state_1(svLogicVecVal * o)404 void i_array_4_state_1(svLogicVecVal* o) {
405 static int n = 0;
406 printf("i_array_4_state_1 %d\n", n);
407 o->aval = !(n++ % 2);
408 set_bvals(o, 1);
409 }
410
i_array_4_state_32(svLogicVecVal * o)411 void i_array_4_state_32(svLogicVecVal* o) {
412 static int n = 0;
413 printf("i_array_4_state_32 %d\n", n);
414 o->aval = 0xffffffffU << n++;
415 set_bvals(o, 1);
416 }
417
i_array_4_state_33(svLogicVecVal * o)418 void i_array_4_state_33(svLogicVecVal* o) {
419 static int n = 0;
420 printf("i_array_4_state_33 %d\n", n);
421 o[0].aval = 0xffffffffU << n++;
422 o[1].aval = 1;
423 set_bvals(o, 2);
424 }
425
i_array_4_state_64(svLogicVecVal * o)426 void i_array_4_state_64(svLogicVecVal* o) {
427 static int n = 0;
428 printf("i_array_4_state_64 %d\n", n);
429 o[0].aval = 0xffffffffU << n++;
430 o[1].aval = -1;
431 set_bvals(o, 2);
432 }
433
i_array_4_state_65(svLogicVecVal * o)434 void i_array_4_state_65(svLogicVecVal* o) {
435 static int n = 0;
436 printf("i_array_4_state_65 %d\n", n);
437 o[0].aval = 0xffffffffU << n++;
438 o[1].aval = -1;
439 o[2].aval = 1;
440 set_bvals(o, 3);
441 }
442
i_array_4_state_128(svLogicVecVal * o)443 void i_array_4_state_128(svLogicVecVal* o) {
444 static int n = 0;
445 printf("i_array_4_state_128 %d\n", n);
446 o[0].aval = 0xffffffffU << n++;
447 o[1].aval = -1;
448 o[2].aval = -1;
449 o[3].aval = -1;
450 set_bvals(o, 4);
451 }
452
453 // 4-state packed structures
i_struct_4_state_1(svLogicVecVal * o)454 void i_struct_4_state_1(svLogicVecVal* o) {
455 static int n = 0;
456 printf("i_struct_4_state_1 %d\n", n);
457 o->aval = !(n++ % 2);
458 set_bvals(o, 1);
459 }
460
i_struct_4_state_32(svLogicVecVal * o)461 void i_struct_4_state_32(svLogicVecVal* o) {
462 static int n = 0;
463 printf("i_struct_4_state_32 %d\n", n);
464 o->aval = 0xffffffffU << n++;
465 set_bvals(o, 1);
466 }
467
i_struct_4_state_33(svLogicVecVal * o)468 void i_struct_4_state_33(svLogicVecVal* o) {
469 static int n = 0;
470 printf("i_struct_4_state_33 %d\n", n);
471 o[0].aval = 0xffffffffU << n++;
472 o[1].aval = 1;
473 set_bvals(o, 2);
474 }
475
i_struct_4_state_64(svLogicVecVal * o)476 void i_struct_4_state_64(svLogicVecVal* o) {
477 static int n = 0;
478 printf("i_struct_4_state_64 %d\n", n);
479 o[0].aval = 0xffffffffU << n++;
480 o[1].aval = -1;
481 set_bvals(o, 2);
482 }
483
i_struct_4_state_65(svLogicVecVal * o)484 void i_struct_4_state_65(svLogicVecVal* o) {
485 static int n = 0;
486 printf("i_struct_4_state_65 %d\n", n);
487 o[0].aval = 0xffffffffU << n++;
488 o[1].aval = -1;
489 o[2].aval = 1;
490 set_bvals(o, 3);
491 }
492
i_struct_4_state_128(svLogicVecVal * o)493 void i_struct_4_state_128(svLogicVecVal* o) {
494 static int n = 0;
495 printf("i_struct_4_state_128 %d\n", n);
496 o[0].aval = 0xffffffffU << n++;
497 o[1].aval = -1;
498 o[2].aval = -1;
499 o[3].aval = -1;
500 set_bvals(o, 4);
501 }
502
503 // 4-state packed unions
i_union_4_state_1(svLogicVecVal * o)504 void i_union_4_state_1(svLogicVecVal* o) {
505 static int n = 0;
506 printf("i_union_4_state_1 %d\n", n);
507 o->aval = !(n++ % 2);
508 set_bvals(o, 1);
509 }
510
i_union_4_state_32(svLogicVecVal * o)511 void i_union_4_state_32(svLogicVecVal* o) {
512 static int n = 0;
513 printf("i_union_4_state_32 %d\n", n);
514 o->aval = 0xffffffffU << n++;
515 set_bvals(o, 1);
516 }
517
i_union_4_state_33(svLogicVecVal * o)518 void i_union_4_state_33(svLogicVecVal* o) {
519 static int n = 0;
520 printf("i_union_4_state_33 %d\n", n);
521 o[0].aval = 0xffffffffU << n++;
522 o[1].aval = 1;
523 set_bvals(o, 2);
524 }
525
i_union_4_state_64(svLogicVecVal * o)526 void i_union_4_state_64(svLogicVecVal* o) {
527 static int n = 0;
528 printf("i_union_4_state_64 %d\n", n);
529 o[0].aval = 0xffffffffU << n++;
530 o[1].aval = -1;
531 set_bvals(o, 2);
532 }
533
i_union_4_state_65(svLogicVecVal * o)534 void i_union_4_state_65(svLogicVecVal* o) {
535 static int n = 0;
536 printf("i_union_4_state_65 %d\n", n);
537 o[0].aval = 0xffffffffU << n++;
538 o[1].aval = -1;
539 o[2].aval = 1;
540 set_bvals(o, 3);
541 }
542
i_union_4_state_128(svLogicVecVal * o)543 void i_union_4_state_128(svLogicVecVal* o) {
544 static int n = 0;
545 printf("i_union_4_state_128 %d\n", n);
546 o[0].aval = 0xffffffffU << n++;
547 o[1].aval = -1;
548 o[2].aval = -1;
549 o[3].aval = -1;
550 set_bvals(o, 4);
551 }
552
553 //======================================================================
554 // Check exported functions
555 //======================================================================
556
557 #define stop() \
558 do { \
559 printf(__FILE__ ":%d Bad value\n", __LINE__); \
560 abort(); \
561 } while (0)
562
563 void check_bvals(const svLogicVecVal* v, unsigned n);
check_bvals(const svLogicVecVal * v,unsigned n)564 void check_bvals(const svLogicVecVal* v, unsigned n) {
565 for (unsigned i = 0; i < n; i++) {
566 if (v[i].bval != 0) {
567 printf(__FILE__ ":%d Bad svLogicVecVal bval\n", __LINE__);
568 abort();
569 }
570 }
571 }
572
check_exports()573 void check_exports() {
574 static unsigned n = 0;
575
576 char x_byte;
577 unsigned char x_byte_unsigned;
578 short x_shortint;
579 unsigned short x_shortint_unsigned;
580 int x_int;
581 unsigned x_int_unsigned;
582 sv_longint_t x_longint;
583 sv_longint_unsigned_t x_longint_unsigned;
584 #ifndef NO_TIME
585 svLogicVecVal x_time[2];
586 #endif
587 #ifndef NO_INTEGER
588 svLogicVecVal x_integer[1];
589 #endif
590 double x_real;
591 #ifndef NO_SHORTREAL
592 float x_shortreal;
593 #endif
594 void* x_chandle;
595 const char* x_string;
596 svBit x_bit;
597 svLogic x_logic;
598
599 char x_byte_t;
600 unsigned char x_byte_unsigned_t;
601 short x_shortint_t;
602 unsigned short x_shortint_unsigned_t;
603 int x_int_t;
604 unsigned x_int_unsigned_t;
605 sv_longint_t x_longint_t;
606 sv_longint_unsigned_t x_longint_unsigned_t;
607 #ifndef NO_TIME
608 svLogicVecVal x_time_t[2];
609 #endif
610 #ifndef NO_INTEGER
611 svLogicVecVal x_integer_t[1];
612 #endif
613 double x_real_t;
614 #ifndef NO_SHORTREAL
615 float x_shortreal_t;
616 #endif
617 void* x_chandle_t;
618 const char* x_string_t;
619 svBit x_bit_t;
620 svLogic x_logic_t;
621
622 svBitVecVal x_array_2_state_1[1];
623 svBitVecVal x_array_2_state_32[1];
624 svBitVecVal x_array_2_state_33[2];
625 svBitVecVal x_array_2_state_64[2];
626 svBitVecVal x_array_2_state_65[3];
627 svBitVecVal x_array_2_state_128[4];
628
629 svBitVecVal x_struct_2_state_1[1];
630 svBitVecVal x_struct_2_state_32[1];
631 svBitVecVal x_struct_2_state_33[2];
632 svBitVecVal x_struct_2_state_64[2];
633 svBitVecVal x_struct_2_state_65[3];
634 svBitVecVal x_struct_2_state_128[4];
635
636 svBitVecVal x_union_2_state_1[1];
637 svBitVecVal x_union_2_state_32[1];
638 svBitVecVal x_union_2_state_33[2];
639 svBitVecVal x_union_2_state_64[2];
640 svBitVecVal x_union_2_state_65[3];
641 svBitVecVal x_union_2_state_128[4];
642
643 svLogicVecVal x_array_4_state_1[1];
644 svLogicVecVal x_array_4_state_32[1];
645 svLogicVecVal x_array_4_state_33[2];
646 svLogicVecVal x_array_4_state_64[2];
647 svLogicVecVal x_array_4_state_65[3];
648 svLogicVecVal x_array_4_state_128[4];
649
650 svLogicVecVal x_struct_4_state_1[1];
651 svLogicVecVal x_struct_4_state_32[1];
652 svLogicVecVal x_struct_4_state_33[2];
653 svLogicVecVal x_struct_4_state_64[2];
654 svLogicVecVal x_struct_4_state_65[3];
655 svLogicVecVal x_struct_4_state_128[4];
656
657 svLogicVecVal x_union_4_state_1[1];
658 svLogicVecVal x_union_4_state_32[1];
659 svLogicVecVal x_union_4_state_33[2];
660 svLogicVecVal x_union_4_state_64[2];
661 svLogicVecVal x_union_4_state_65[3];
662 svLogicVecVal x_union_4_state_128[4];
663
664 // Basic types as per IEEE 1800-2017 35.5.6
665 e_byte(&x_byte);
666 if (x_byte != 10 + n) stop();
667
668 e_byte_unsigned(&x_byte_unsigned);
669 if (x_byte_unsigned != 20 + n) stop();
670
671 e_shortint(&x_shortint);
672 if (x_shortint != 30 + n) stop();
673
674 e_shortint_unsigned(&x_shortint_unsigned);
675 if (x_shortint_unsigned != 40 + n) stop();
676
677 e_int(&x_int);
678 if (x_int != 50 + n) stop();
679
680 e_int_unsigned(&x_int_unsigned);
681 if (x_int_unsigned != 60 + n) stop();
682
683 e_longint(&x_longint);
684 if (x_longint != 70 + n) stop();
685
686 e_longint_unsigned(&x_longint_unsigned);
687 if (x_longint_unsigned != 80 + n) stop();
688
689 #ifndef NO_TIME
690 e_time(x_time);
691 if (x_time[0].aval != 90 + n || x_time[1].aval != 0) stop();
692 check_bvals(x_time, 2);
693 #endif
694
695 #ifndef NO_INTEGER
696 e_integer(x_integer);
697 if (x_integer[0].aval != 100 + n) stop();
698 check_bvals(x_integer, 1);
699 #endif
700
701 e_real(&x_real);
702 if (x_real != 1.0 * n + 0.5) stop();
703
704 #ifndef NO_SHORTREAL
705 e_shortreal(&x_shortreal);
706 if (x_shortreal != 1.0f * n + 0.25f) stop();
707 #endif
708
709 e_chandle(&x_chandle);
710 if (x_chandle != NULL) stop();
711
712 e_string(&x_string);
713 if ((n % 2) == 0) {
714 if (strcmp(x_string, "Hello") != 0) stop();
715 } else {
716 if (strcmp(x_string, "World") != 0) stop();
717 }
718
719 e_bit(&x_bit);
720 if (x_bit != (n % 2)) stop();
721
722 e_logic(&x_logic);
723 if (x_logic != !(n % 2)) stop();
724
725 // Basic types via tyepdef
726 e_byte_t(&x_byte_t);
727 if (x_byte_t != 10 + 2 * n) stop();
728
729 e_byte_unsigned_t(&x_byte_unsigned_t);
730 if (x_byte_unsigned_t != 20 + 2 * n) stop();
731
732 e_shortint_t(&x_shortint_t);
733 if (x_shortint_t != 30 + 2 * n) stop();
734
735 e_shortint_unsigned_t(&x_shortint_unsigned_t);
736 if (x_shortint_unsigned_t != 40 + 2 * n) stop();
737
738 e_int_t(&x_int_t);
739 if (x_int_t != 50 + 2 * n) stop();
740
741 e_int_unsigned_t(&x_int_unsigned_t);
742 if (x_int_unsigned_t != 60 + 2 * n) stop();
743
744 e_longint_t(&x_longint_t);
745 if (x_longint_t != 70 + 2 * n) stop();
746
747 e_longint_unsigned_t(&x_longint_unsigned_t);
748 if (x_longint_unsigned_t != 80 + 2 * n) stop();
749
750 #ifndef NO_TIME
751 e_time_t(x_time_t);
752 if (x_time_t[0].aval != 90 + 2 * n || x_time_t[1].aval != 0) stop();
753 check_bvals(x_time_t, 2);
754 #endif
755
756 #ifndef NO_INTEGER
757 e_integer_t(x_integer_t);
758 if (x_integer_t[0].aval != 100 + 2 * n) stop();
759 check_bvals(x_integer_t, 1);
760 #endif
761
762 e_real_t(&x_real_t);
763 if (x_real_t != 1.0 * (2 * n) + 0.5) stop();
764
765 #ifndef NO_SHORTREAL
766 e_shortreal_t(&x_shortreal_t);
767 if (x_shortreal_t != 1.0f * (2 * n) + 0.25f) stop();
768 #endif
769
770 e_chandle_t(&x_chandle_t);
771 if (x_chandle_t != NULL) stop();
772
773 e_string_t(&x_string_t);
774 if ((n % 2) == 0) {
775 if (strcmp(x_string_t, "Hello") != 0) stop();
776 } else {
777 if (strcmp(x_string_t, "World") != 0) stop();
778 }
779
780 e_bit_t(&x_bit_t);
781 if (x_bit_t != (n % 2)) stop();
782
783 e_logic_t(&x_logic_t);
784 if (x_logic_t != !(n % 2)) stop();
785
786 const int m = n == 0 ? 0 : n - 1;
787
788 // 2-state packed arrays
789 e_array_2_state_1(x_array_2_state_1);
790 if (x_array_2_state_1[0] != (n % 2)) stop();
791
792 e_array_2_state_32(x_array_2_state_32);
793 if (x_array_2_state_32[0] != 0xffffffff >> n) stop();
794
795 e_array_2_state_33(x_array_2_state_33);
796 if (x_array_2_state_33[1] != 1 >> n) stop();
797 if (x_array_2_state_33[0] != 0xffffffff >> m) stop();
798
799 e_array_2_state_64(x_array_2_state_64);
800 if (x_array_2_state_64[1] != 0xffffffff >> n) stop();
801 if (x_array_2_state_64[0] != 0xffffffff) stop();
802
803 e_array_2_state_65(x_array_2_state_65);
804 if (x_array_2_state_65[2] != 1 >> n) stop();
805 if (x_array_2_state_65[1] != 0xffffffff >> m) stop();
806 if (x_array_2_state_65[0] != 0xffffffff) stop();
807
808 e_array_2_state_128(x_array_2_state_128);
809 if (x_array_2_state_128[3] != 0xffffffff >> n) stop();
810 if (x_array_2_state_128[2] != 0xffffffff) stop();
811 if (x_array_2_state_128[1] != 0xffffffff) stop();
812 if (x_array_2_state_64[0] != 0xffffffff) stop();
813
814 // 2-state packed structures
815 e_struct_2_state_1(x_struct_2_state_1);
816 if (x_struct_2_state_1[0] != (n % 2)) stop();
817
818 e_struct_2_state_32(x_struct_2_state_32);
819 if (x_struct_2_state_32[0] != 0xffffffff >> n) stop();
820
821 e_struct_2_state_33(x_struct_2_state_33);
822 if (x_struct_2_state_33[1] != 1 >> n) stop();
823 if (x_struct_2_state_33[0] != 0xffffffff >> m) stop();
824
825 e_struct_2_state_64(x_struct_2_state_64);
826 if (x_struct_2_state_64[1] != 0xffffffff >> n) stop();
827 if (x_struct_2_state_64[0] != 0xffffffff) stop();
828
829 e_struct_2_state_65(x_struct_2_state_65);
830 if (x_struct_2_state_65[2] != 1 >> n) stop();
831 if (x_struct_2_state_65[1] != 0xffffffff >> m) stop();
832 if (x_struct_2_state_65[0] != 0xffffffff) stop();
833
834 e_struct_2_state_128(x_struct_2_state_128);
835 if (x_struct_2_state_128[3] != 0xffffffff >> n) stop();
836 if (x_struct_2_state_128[2] != 0xffffffff) stop();
837 if (x_struct_2_state_128[1] != 0xffffffff) stop();
838 if (x_struct_2_state_64[0] != 0xffffffff) stop();
839
840 // 2-state packed unions
841 e_union_2_state_1(x_union_2_state_1);
842 if (x_union_2_state_1[0] != (n % 2)) stop();
843
844 e_union_2_state_32(x_union_2_state_32);
845 if (x_union_2_state_32[0] != 0xffffffff >> n) stop();
846
847 e_union_2_state_33(x_union_2_state_33);
848 if (x_union_2_state_33[1] != 1 >> n) stop();
849 if (x_union_2_state_33[0] != 0xffffffff >> m) stop();
850
851 e_union_2_state_64(x_union_2_state_64);
852 if (x_union_2_state_64[1] != 0xffffffff >> n) stop();
853 if (x_union_2_state_64[0] != 0xffffffff) stop();
854
855 e_union_2_state_65(x_union_2_state_65);
856 if (x_union_2_state_65[2] != 1 >> n) stop();
857 if (x_union_2_state_65[1] != 0xffffffff >> m) stop();
858 if (x_union_2_state_65[0] != 0xffffffff) stop();
859
860 e_union_2_state_128(x_union_2_state_128);
861 if (x_union_2_state_128[3] != 0xffffffff >> n) stop();
862 if (x_union_2_state_128[2] != 0xffffffff) stop();
863 if (x_union_2_state_128[1] != 0xffffffff) stop();
864 if (x_union_2_state_64[0] != 0xffffffff) stop();
865
866 // 4-state packed arrays
867 e_array_4_state_1(x_array_4_state_1);
868 if (x_array_4_state_1[0].aval != (n % 2)) stop();
869
870 e_array_4_state_32(x_array_4_state_32);
871 if (x_array_4_state_32[0].aval != 0xffffffff >> n) stop();
872
873 e_array_4_state_33(x_array_4_state_33);
874 if (x_array_4_state_33[1].aval != 1 >> n) stop();
875 if (x_array_4_state_33[0].aval != 0xffffffff >> m) stop();
876
877 e_array_4_state_64(x_array_4_state_64);
878 if (x_array_4_state_64[1].aval != 0xffffffff >> n) stop();
879 if (x_array_4_state_64[0].aval != 0xffffffff) stop();
880
881 e_array_4_state_65(x_array_4_state_65);
882 if (x_array_4_state_65[2].aval != 1 >> n) stop();
883 if (x_array_4_state_65[1].aval != 0xffffffff >> m) stop();
884 if (x_array_4_state_65[0].aval != 0xffffffff) stop();
885
886 e_array_4_state_128(x_array_4_state_128);
887 if (x_array_4_state_128[3].aval != 0xffffffff >> n) stop();
888 if (x_array_4_state_128[2].aval != 0xffffffff) stop();
889 if (x_array_4_state_128[1].aval != 0xffffffff) stop();
890 if (x_array_4_state_64[0].aval != 0xffffffff) stop();
891
892 check_bvals(x_array_4_state_1, 1);
893 check_bvals(x_array_4_state_32, 1);
894 check_bvals(x_array_4_state_33, 2);
895 check_bvals(x_array_4_state_64, 2);
896 check_bvals(x_array_4_state_65, 3);
897 check_bvals(x_array_4_state_128, 4);
898
899 // 4-state packed structures
900 e_struct_4_state_1(x_struct_4_state_1);
901 if (x_struct_4_state_1[0].aval != (n % 2)) stop();
902
903 e_struct_4_state_32(x_struct_4_state_32);
904 if (x_struct_4_state_32[0].aval != 0xffffffff >> n) stop();
905
906 e_struct_4_state_33(x_struct_4_state_33);
907 if (x_struct_4_state_33[1].aval != 1 >> n) stop();
908 if (x_struct_4_state_33[0].aval != 0xffffffff >> m) stop();
909
910 e_struct_4_state_64(x_struct_4_state_64);
911 if (x_struct_4_state_64[1].aval != 0xffffffff >> n) stop();
912 if (x_struct_4_state_64[0].aval != 0xffffffff) stop();
913
914 e_struct_4_state_65(x_struct_4_state_65);
915 if (x_struct_4_state_65[2].aval != 1 >> n) stop();
916 if (x_struct_4_state_65[1].aval != 0xffffffff >> m) stop();
917 if (x_struct_4_state_65[0].aval != 0xffffffff) stop();
918
919 e_struct_4_state_128(x_struct_4_state_128);
920 if (x_struct_4_state_128[3].aval != 0xffffffff >> n) stop();
921 if (x_struct_4_state_128[2].aval != 0xffffffff) stop();
922 if (x_struct_4_state_128[1].aval != 0xffffffff) stop();
923 if (x_struct_4_state_64[0].aval != 0xffffffff) stop();
924
925 check_bvals(x_struct_4_state_1, 1);
926 check_bvals(x_struct_4_state_32, 1);
927 check_bvals(x_struct_4_state_33, 2);
928 check_bvals(x_struct_4_state_64, 2);
929 check_bvals(x_struct_4_state_65, 3);
930 check_bvals(x_struct_4_state_128, 4);
931
932 // 4-state packed unions
933 e_union_4_state_1(x_union_4_state_1);
934 if (x_union_4_state_1[0].aval != (n % 2)) stop();
935
936 e_union_4_state_32(x_union_4_state_32);
937 if (x_union_4_state_32[0].aval != 0xffffffff >> n) stop();
938
939 e_union_4_state_33(x_union_4_state_33);
940 if (x_union_4_state_33[1].aval != 1 >> n) stop();
941 if (x_union_4_state_33[0].aval != 0xffffffff >> m) stop();
942
943 e_union_4_state_64(x_union_4_state_64);
944 if (x_union_4_state_64[1].aval != 0xffffffff >> n) stop();
945 if (x_union_4_state_64[0].aval != 0xffffffff) stop();
946
947 e_union_4_state_65(x_union_4_state_65);
948 if (x_union_4_state_65[2].aval != 1 >> n) stop();
949 if (x_union_4_state_65[1].aval != 0xffffffff >> m) stop();
950 if (x_union_4_state_65[0].aval != 0xffffffff) stop();
951
952 e_union_4_state_128(x_union_4_state_128);
953 if (x_union_4_state_128[3].aval != 0xffffffff >> n) stop();
954 if (x_union_4_state_128[2].aval != 0xffffffff) stop();
955 if (x_union_4_state_128[1].aval != 0xffffffff) stop();
956 if (x_union_4_state_64[0].aval != 0xffffffff) stop();
957
958 check_bvals(x_union_4_state_1, 1);
959 check_bvals(x_union_4_state_32, 1);
960 check_bvals(x_union_4_state_33, 2);
961 check_bvals(x_union_4_state_64, 2);
962 check_bvals(x_union_4_state_65, 3);
963 check_bvals(x_union_4_state_128, 4);
964
965 n++;
966 }
967