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