source: branches/dev-5819/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenExternalCevalTests.mo @ 13800

Last change on this file since 13800 was 13800, checked in by randersson, 8 weeks ago

#5819 Merged trunk into branch

File size: 40.6 KB
Line 
1/*
2    Copyright (C) 2009 Modelon AB
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, version 3 of the License.
7
8    This program is distributed in the hope that it will be useful,
9    but WITHOUT ANY WARRANTY; without even the implied warranty of
10    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11    GNU General Public License for more details.
12
13    You should have received a copy of the GNU General Public License
14    along with this program.  If not, see <http://www.gnu.org/licenses/>.
15*/
16
17
18package CCodeGenExternalCevalTests
19
20model ExtDynFcn1
21        type E = enumeration(A,B);
22    function f
23        input Real a1;
24        input Integer a2;
25        input Boolean a3;
26        input String a4;
27        input E a5;
28        output Real b1;
29        output Integer b2;
30        output Boolean b3;
31        output String b4;
32        output E b5;
33        external;
34    end f;
35   
36    Real x1;
37    Integer x2;
38    Boolean x3;
39    String x4;
40    E x5;
41equation
42    (x1,x2,x3,x4,x5) = f(1,2,true,"s",E.A);
43
44    annotation(__JModelica(UnitTesting(tests={
45        FClassMethodTestCase(
46            name="ExtDynFcn1",
47            methodName="externalCTypes",
48            description="Test that the different primitive types generates the correct C mapping",
49            external_constant_evaluation_dynamic=true,
50            methodResult="
51f
52void
53d,i,i,s,i,*d,*i,*i,*s,*i,
54")})));
55end ExtDynFcn1;
56
57model ExtDynFcn2
58type E = enumeration(A,B);
59function f
60    input Real[:] a1;
61    input Integer[:] a2;
62    input Boolean[:] a3;
63    input String[:] a4;
64    input E[:] a5;
65    output Real[size(a1,1)] b1;
66    output Integer[size(a2,1)] b2;
67    output Boolean[size(a3,1)] b3;
68    output String[size(a4,1)] b4;
69    output E[size(a5,1)] b5;
70    external;
71end f;
72    Real[1] x1;
73    Integer[1] x2;
74    Boolean[1] x3;
75    String[1] x4;
76    E[1] x5;
77equation
78        (x1,x2,x3,x4,x5) = f({1},{2},{true},{"s"},{E.A});
79
80    annotation(__JModelica(UnitTesting(tests={
81        FClassMethodTestCase(
82            name="ExtDynFcn2",
83            methodName="externalCTypes",
84            description="Test that the different primitive types (arrays of) generates the correct C mapping",
85            external_constant_evaluation_dynamic=true,
86            methodResult="
87f
88void
89dv,i,iv,i,iv,i,sv,i,iv,i,*dv,i,*iv,i,*iv,i,*sv,i,*iv,i,
90")})));
91end ExtDynFcn2;
92
93model ExtDynFcn3
94    type E = enumeration(A,B);
95    record R
96        Real a1;
97        Integer a2;
98        Boolean a3;
99        String a4;
100        E a5;
101        R2 r2;
102    end R;
103    record R2
104        Real x;
105    end R2;
106   
107    function f
108        input R a;
109        output R b;
110        external f(a,b);
111    end f;
112   
113    R r = f(R(1,2,true,"s",E.A, R2(3)));
114
115    annotation(__JModelica(UnitTesting(tests={
116        FClassMethodTestCase(
117            name="ExtDynFcn3",
118            methodName="externalCTypes",
119            description="Test that records generates the correct C mapping",
120            external_constant_evaluation_dynamic=true,
121            methodResult="
122f
123void
124R[d,i,i,s,i,R[d,],],*R[d,i,i,s,i,R[d,],],
125")})));
126end ExtDynFcn3;
127
128
129model Scalar
130    type E = enumeration(A,B);
131    function f
132        input Real a1;
133        input Integer a2;
134        input Boolean a3;
135        input String a4;
136        input E a5;
137        output Real b1;
138        output Integer b2;
139        output Boolean b3;
140        output String b4;
141        output E b5;
142        external;
143    end f;
144   
145    Real x1;
146    Integer x2;
147    Boolean x3;
148    String x4;
149    E x5;
150equation
151    (x1,x2,x3,x4,x5) = f(1,2,true,"s",E.A);
152
153annotation(__JModelica(UnitTesting(tests={
154    CCodeGenTestCase(
155        name="Scalar",
156        description="Test code gen for external C functions evaluation. Scalars.",
157        variability_propagation=false,
158        inline_functions="none",
159        template="
160$ECE_external_includes$
161$ECE_record_definitions$
162$ECE_decl$
163---
164$ECE_setup_decl$
165---
166$ECE_setup_init$
167---
168$ECE_setup_free$
169---
170$ECE_calc_decl$
171---
172$ECE_calc_init$
173---
174$ECE_calc$
175---
176$ECE_calc_free$
177---
178$ECE_free$
179",
180        generatedCode="
181
182
183
184---
185
186---
187
188---
189
190---
191        JMI_DEF(REA, a1_v)
192        JMI_DEF(INT, a2_v)
193        JMI_DEF(BOO, a3_v)
194        JMI_DEF(STR, a4_v)
195        JMI_DEF(ENU, a5_v)
196        JMI_DEF(REA, b1_v)
197        JMI_DEF(INT, b2_v)
198        JMI_DEF(BOO, b3_v)
199        JMI_DEF(STR, b4_v)
200        JMI_DEF(ENU, b5_v)
201        JMI_DEF(INT_EXT, tmp_1)
202        JMI_DEF(BOO_EXT, tmp_2)
203        JMI_DEF(ENU_EXT, tmp_3)
204        JMI_DEF(INT_EXT, tmp_4)
205        JMI_DEF(BOO_EXT, tmp_5)
206        JMI_DEF(ENU_EXT, tmp_6)
207        extern void f(double, int, int, const char*, int, double*, int*, int*, const char**, int*);
208
209---
210        JMCEVAL_parse(Real, a1_v);
211        JMCEVAL_parse(Integer, a2_v);
212        JMCEVAL_parse(Boolean, a3_v);
213        JMCEVAL_parse(String, a4_v);
214        JMCEVAL_parse(Enum, a5_v);
215        JMCEVAL_parse(Real, b1_v);
216        JMCEVAL_parse(Integer, b2_v);
217        JMCEVAL_parse(Boolean, b3_v);
218        JMCEVAL_parse(String, b4_v);
219        JMCEVAL_parse(Enum, b5_v);
220
221---
222            tmp_1 = (int)a2_v;
223            tmp_2 = (int)a3_v;
224            tmp_3 = (int)a5_v;
225            tmp_4 = (int)b2_v;
226            tmp_5 = (int)b3_v;
227            tmp_6 = (int)b5_v;
228            f(a1_v, tmp_1, tmp_2, a4_v, tmp_3, &b1_v, &tmp_4, &tmp_5, &b4_v, &tmp_6);
229            b2_v = tmp_4;
230            b3_v = tmp_5;
231            b5_v = tmp_6;
232            JMCEVAL_check(\"DONE\");
233            JMCEVAL_print(Real, b1_v);
234            JMCEVAL_print(Integer, b2_v);
235            JMCEVAL_print(Boolean, b3_v);
236            JMCEVAL_print(String, b4_v);
237            JMCEVAL_print(Enum, b5_v);
238
239
240---
241
242---
243")})));
244end Scalar;
245
246model Array
247type E = enumeration(A,B);
248function f
249    input Real[:] a1;
250    input Integer[:] a2;
251    input Boolean[:] a3;
252    input String[:] a4;
253    input E[:] a5;
254    output Real[size(a1,1)] b1;
255    output Integer[size(a2,1)] b2;
256    output Boolean[size(a3,1)] b3;
257    output String[size(a4,1)] b4;
258    output E[size(a5,1)] b5;
259    external;
260end f;
261    Real[1] x1;
262    Integer[1] x2;
263    Boolean[1] x3;
264    String[1] x4;
265    E[1] x5;
266equation
267        (x1,x2,x3,x4,x5) = f({1},{2},{true},{"s"},{E.A});
268
269annotation(__JModelica(UnitTesting(tests={
270    CCodeGenTestCase(
271        name="Array",
272        description="Test code gen for external C functions evaluation. Arrays.",
273        variability_propagation=false,
274        inline_functions="none",
275        template="
276$ECE_external_includes$
277$ECE_record_definitions$
278$ECE_decl$
279---
280$ECE_setup_decl$
281---
282$ECE_setup_init$
283---
284$ECE_setup_free$
285---
286$ECE_calc_decl$
287---
288$ECE_calc_init$
289---
290$ECE_calc$
291---
292$ECE_calc_free$
293---
294$ECE_free$
295",
296        generatedCode="
297---
298
299---
300
301---
302
303---
304        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, a1_a, -1, 1)
305        JMI_DEF(INT, f_arg1)
306        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, a2_a, -1, 1)
307        JMI_DEF(INT, f_arg3)
308        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, a3_a, -1, 1)
309        JMI_DEF(INT, f_arg5)
310        JMI_ARR(HEAP, jmi_string_t, jmi_string_array_t, a4_a, -1, 1)
311        JMI_DEF(INT, f_arg7)
312        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, a5_a, -1, 1)
313        JMI_DEF(INT, f_arg9)
314        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, b1_a, -1, 1)
315        JMI_DEF(INT, f_arg11)
316        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, b2_a, -1, 1)
317        JMI_DEF(INT, f_arg13)
318        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, b3_a, -1, 1)
319        JMI_DEF(INT, f_arg15)
320        JMI_ARR(HEAP, jmi_string_t, jmi_string_array_t, b4_a, -1, 1)
321        JMI_DEF(INT, f_arg17)
322        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, b5_a, -1, 1)
323        JMI_DEF(INT, f_arg19)
324        JMI_DEF(INT_EXT, tmp_1)
325        JMI_ARR(HEAP, jmi_int_t, jmi_int_array_t, tmp_2, -1, 1)
326        JMI_DEF(INT_EXT, tmp_3)
327        JMI_ARR(HEAP, jmi_int_t, jmi_int_array_t, tmp_4, -1, 1)
328        JMI_DEF(INT_EXT, tmp_5)
329        JMI_DEF(INT_EXT, tmp_6)
330        JMI_ARR(HEAP, jmi_int_t, jmi_int_array_t, tmp_7, -1, 1)
331        JMI_DEF(INT_EXT, tmp_8)
332        JMI_DEF(INT_EXT, tmp_9)
333        JMI_ARR(HEAP, jmi_int_t, jmi_int_array_t, tmp_10, -1, 1)
334        JMI_DEF(INT_EXT, tmp_11)
335        JMI_ARR(HEAP, jmi_int_t, jmi_int_array_t, tmp_12, -1, 1)
336        JMI_DEF(INT_EXT, tmp_13)
337        JMI_DEF(INT_EXT, tmp_14)
338        JMI_ARR(HEAP, jmi_int_t, jmi_int_array_t, tmp_15, -1, 1)
339        JMI_DEF(INT_EXT, tmp_16)
340        extern void f(double*, size_t, int*, size_t, int*, size_t, const char**, size_t, int*, size_t, double*, size_t, int*, size_t, int*, size_t, const char**, size_t, int*, size_t);
341
342---
343        JMCEVAL_parseArrayDims(1);
344        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, a1_a, d[0], 1, d[0])
345        JMCEVAL_parseArray(Real, a1_a);
346        JMCEVAL_parse(Integer, f_arg1);
347        JMCEVAL_parseArrayDims(1);
348        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, a2_a, d[0], 1, d[0])
349        JMCEVAL_parseArray(Integer, a2_a);
350        JMCEVAL_parse(Integer, f_arg3);
351        JMCEVAL_parseArrayDims(1);
352        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, a3_a, d[0], 1, d[0])
353        JMCEVAL_parseArray(Boolean, a3_a);
354        JMCEVAL_parse(Integer, f_arg5);
355        JMCEVAL_parseArrayDims(1);
356        JMI_ARRAY_INIT_1(HEAP, jmi_string_t, jmi_string_array_t, a4_a, d[0], 1, d[0])
357        JMCEVAL_parseArray(String, a4_a);
358        JMCEVAL_parse(Integer, f_arg7);
359        JMCEVAL_parseArrayDims(1);
360        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, a5_a, d[0], 1, d[0])
361        JMCEVAL_parseArray(Enum, a5_a);
362        JMCEVAL_parse(Integer, f_arg9);
363        JMCEVAL_parseArrayDims(1);
364        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, b1_a, d[0], 1, d[0])
365        JMCEVAL_parseArray(Real, b1_a);
366        JMCEVAL_parse(Integer, f_arg11);
367        JMCEVAL_parseArrayDims(1);
368        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, b2_a, d[0], 1, d[0])
369        JMCEVAL_parseArray(Integer, b2_a);
370        JMCEVAL_parse(Integer, f_arg13);
371        JMCEVAL_parseArrayDims(1);
372        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, b3_a, d[0], 1, d[0])
373        JMCEVAL_parseArray(Boolean, b3_a);
374        JMCEVAL_parse(Integer, f_arg15);
375        JMCEVAL_parseArrayDims(1);
376        JMI_ARRAY_INIT_1(HEAP, jmi_string_t, jmi_string_array_t, b4_a, d[0], 1, d[0])
377        JMCEVAL_parseArray(String, b4_a);
378        JMCEVAL_parse(Integer, f_arg17);
379        JMCEVAL_parseArrayDims(1);
380        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, b5_a, d[0], 1, d[0])
381        JMCEVAL_parseArray(Enum, b5_a);
382        JMCEVAL_parse(Integer, f_arg19);
383
384---
385            tmp_1 = (int)f_arg1;
386            JMI_ARRAY_INIT_1(HEAP, jmi_int_t, jmi_int_array_t, tmp_2, jmi_array_size(a2_a, 0), 1, jmi_array_size(a2_a, 0))
387            jmi_copy_matrix_to_int(a2_a, a2_a->var, tmp_2->var);
388            tmp_3 = (int)f_arg3;
389            JMI_ARRAY_INIT_1(HEAP, jmi_int_t, jmi_int_array_t, tmp_4, jmi_array_size(a3_a, 0), 1, jmi_array_size(a3_a, 0))
390            jmi_copy_matrix_to_int(a3_a, a3_a->var, tmp_4->var);
391            tmp_5 = (int)f_arg5;
392            tmp_6 = (int)f_arg7;
393            JMI_ARRAY_INIT_1(HEAP, jmi_int_t, jmi_int_array_t, tmp_7, jmi_array_size(a5_a, 0), 1, jmi_array_size(a5_a, 0))
394            jmi_copy_matrix_to_int(a5_a, a5_a->var, tmp_7->var);
395            tmp_8 = (int)f_arg9;
396            tmp_9 = (int)f_arg11;
397            JMI_ARRAY_INIT_1(HEAP, jmi_int_t, jmi_int_array_t, tmp_10, jmi_array_size(b2_a, 0), 1, jmi_array_size(b2_a, 0))
398            jmi_copy_matrix_to_int(b2_a, b2_a->var, tmp_10->var);
399            tmp_11 = (int)f_arg13;
400            JMI_ARRAY_INIT_1(HEAP, jmi_int_t, jmi_int_array_t, tmp_12, jmi_array_size(b3_a, 0), 1, jmi_array_size(b3_a, 0))
401            jmi_copy_matrix_to_int(b3_a, b3_a->var, tmp_12->var);
402            tmp_13 = (int)f_arg15;
403            tmp_14 = (int)f_arg17;
404            JMI_ARRAY_INIT_1(HEAP, jmi_int_t, jmi_int_array_t, tmp_15, jmi_array_size(b5_a, 0), 1, jmi_array_size(b5_a, 0))
405            jmi_copy_matrix_to_int(b5_a, b5_a->var, tmp_15->var);
406            tmp_16 = (int)f_arg19;
407            f(a1_a->var, (size_t) tmp_1, tmp_2->var, (size_t) tmp_3, tmp_4->var, (size_t) tmp_5, a4_a->var, (size_t) tmp_6, tmp_7->var, (size_t) tmp_8, b1_a->var, (size_t) tmp_9, tmp_10->var, (size_t) tmp_11, tmp_12->var, (size_t) tmp_13, b4_a->var, (size_t) tmp_14, tmp_15->var, (size_t) tmp_16);
408            jmi_copy_matrix_from_int(b2_a, tmp_10->var, b2_a->var);
409            jmi_copy_matrix_from_int(b3_a, tmp_12->var, b3_a->var);
410            jmi_copy_matrix_from_int(b5_a, tmp_15->var, b5_a->var);
411            JMCEVAL_check(\"DONE\");
412            JMCEVAL_printArray(Real, b1_a);
413            JMCEVAL_printArray(Integer, b2_a);
414            JMCEVAL_printArray(Boolean, b3_a);
415            JMCEVAL_printArray(String, b4_a);
416            JMCEVAL_printArray(Enum, b5_a);
417
418
419---
420
421---
422")})));
423end Array;
424
425package Os
426    class Obj1
427        extends ExternalObject;
428        function constructor
429            input Real x;
430            input Integer y;
431            input Boolean b;
432            input String s;
433            output Obj1 o1;
434            external "C" o1 = my_constructor1(x,y,b,s)
435                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
436        end constructor;
437        function destructor
438            input Obj1 o1;
439            external "C"
440                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
441        end destructor;
442    end Obj1;
443    end Os;
444model ExtObj1
445    class Obj2
446        extends ExternalObject;
447        function constructor
448            input Real[:] x;
449            input Integer[2] y;
450            input Boolean[:] b;
451            input String[:] s;
452            output Obj2 o2;
453            external "C" my_constructor2(x,y,o2,b,s,size(x,1),3.14)
454                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
455        end constructor;
456        function destructor
457            input Obj2 o2;
458            external "C"
459                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
460        end destructor;
461    end Obj2;
462    class Obj3
463        extends ExternalObject;
464        function constructor
465            input Os.Obj1 o1;
466            input Obj2[:] o2;
467            output Obj3 o3;
468            external "C" my_constructor3(o1,o2,o3)
469                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
470        end constructor;
471        function destructor
472            input Obj3 o3;
473            external "C"
474                annotation(Library="extObjects", Include="#include \"extObjects.h\"");
475        end destructor;
476    end Obj3;
477    function use2
478        input  Obj2 o2;
479        output Real x;
480        external annotation(Library="extObjects", Include="#include \"extObjects.h\"");
481    end use2;
482    function use3
483        input  Obj3 o3;
484        output Real x;
485        external annotation(Library="extObjects", Include="#include \"extObjects.h\"");
486    end use3;
487    Os.Obj1 o1 = Os.Obj1(3.13, 3, true, "A message");
488    Obj2 o2 = Obj2({3.13,3.14}, {3,4}, {false, true}, {"A message 1", "A message 2"});
489    Obj3 o3 = Obj3(o1,{o2,o2});
490    Real x = use2(o2);
491
492annotation(__JModelica(UnitTesting(tests={
493    CCodeGenTestCase(
494        name="ExtObj1",
495        description="Test code gen for external C functions evaluation. External objects.",
496        variability_propagation=false,
497        inline_functions="none",
498        template="
499$ECE_external_includes$
500$ECE_record_definitions$
501$ECE_decl$
502---
503$ECE_setup_decl$
504---
505$ECE_setup_init$
506---
507$ECE_setup_free$
508---
509$ECE_calc_decl$
510---
511$ECE_calc_init$
512---
513$ECE_calc$
514---
515$ECE_calc_free$
516---
517$ECE_free$
518",
519        generatedCode="
520#include \"extObjects.h\"
521
522
523        JMI_DEF(EXO, o2_v)
524
525---
526        JMI_ARR(HEAP, jmi_int_t, jmi_int_array_t, tmp_2, -1, 1)
527        JMI_ARR(HEAP, jmi_int_t, jmi_int_array_t, tmp_3, -1, 1)
528        JMI_DEF(INT_EXT, tmp_4)
529        JMI_DEF(REA_EXT, tmp_5)
530        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, tmp_6_arg0, -1, 1)
531        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, tmp_6_arg1, -1, 1)
532        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, tmp_6_arg3, -1, 1)
533        JMI_ARR(HEAP, jmi_string_t, jmi_string_array_t, tmp_6_arg4, -1, 1)
534        JMI_DEF(INT, tmp_6_arg5)
535        JMI_DEF(REA, tmp_6_arg6)
536
537---
538        JMCEVAL_parseArrayDims(1);
539        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, tmp_6_arg0, d[0], 1, d[0])
540        JMCEVAL_parseArray(Real, tmp_6_arg0);
541        JMCEVAL_parseArrayDims(1);
542        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, tmp_6_arg1, d[0], 1, d[0])
543        JMCEVAL_parseArray(Integer, tmp_6_arg1);
544        JMCEVAL_parseArrayDims(1);
545        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, tmp_6_arg3, d[0], 1, d[0])
546        JMCEVAL_parseArray(Boolean, tmp_6_arg3);
547        JMCEVAL_parseArrayDims(1);
548        JMI_ARRAY_INIT_1(HEAP, jmi_string_t, jmi_string_array_t, tmp_6_arg4, d[0], 1, d[0])
549        JMCEVAL_parseArray(String, tmp_6_arg4);
550        JMCEVAL_parse(Integer, tmp_6_arg5);
551        JMCEVAL_parse(Real, tmp_6_arg6);
552        JMI_ARRAY_INIT_1(HEAP, jmi_int_t, jmi_int_array_t, tmp_2, jmi_array_size(tmp_6_arg1, 0), 1, jmi_array_size(tmp_6_arg1, 0))
553        jmi_copy_matrix_to_int(tmp_6_arg1, tmp_6_arg1->var, tmp_2->var);
554        JMI_ARRAY_INIT_1(HEAP, jmi_int_t, jmi_int_array_t, tmp_3, jmi_array_size(tmp_6_arg3, 0), 1, jmi_array_size(tmp_6_arg3, 0))
555        jmi_copy_matrix_to_int(tmp_6_arg3, tmp_6_arg3->var, tmp_3->var);
556        tmp_4 = (int)tmp_6_arg5;
557        tmp_5 = (double)tmp_6_arg6;
558        my_constructor2(tmp_6_arg0->var, tmp_2->var, &o2_v, tmp_3->var, tmp_6_arg4->var, (size_t) tmp_4, tmp_5);
559
560---
561
562---
563        JMI_DEF(REA, x_v)
564
565---
566        JMCEVAL_parse(Real, x_v);
567
568---
569            x_v = use2(o2_v);
570            JMCEVAL_check(\"DONE\");
571            JMCEVAL_print(Real, x_v);
572
573
574---
575
576---
577        destructor(o2_v);
578")})));
579end ExtObj1;
580
581model ExtObj2
582    extends ExtObj1(x=use3(o3));
583
584annotation(__JModelica(UnitTesting(tests={
585    CCodeGenTestCase(
586        name="ExtObj2",
587        description="Test code gen for external C functions evaluation. External objects.",
588        variability_propagation=false,
589        inline_functions="none",
590        template="
591$ECE_external_includes$
592$ECE_record_definitions$
593$ECE_decl$
594---
595$ECE_setup_decl$
596---
597$ECE_setup_init$
598---
599$ECE_setup_free$
600---
601$ECE_calc_decl$
602---
603$ECE_calc_init$
604---
605$ECE_calc$
606---
607$ECE_calc_free$
608---
609$ECE_free$
610",
611        generatedCode="
612#include \"extObjects.h\"
613
614
615        JMI_DEF(EXO, o3_v)
616
617---
618        JMI_DEF(EXO, tmp_2_arg0)
619        JMI_DEF(INT_EXT, tmp_4)
620        JMI_DEF(BOO_EXT, tmp_5)
621        JMI_DEF(REA, tmp_6_arg1)
622        JMI_DEF(INT, tmp_6_arg2)
623        JMI_DEF(BOO, tmp_6_arg3)
624        JMI_DEF(STR, tmp_6_arg4)
625        JMI_ARR(HEAP, jmi_extobj_t, jmi_extobj_array_t, tmp_2_arg1, -1, 1)
626        JMI_DEF(REA, tmp_7)
627        JMI_DEF(REA, tmp_7_max)
628        JMI_ARR(HEAP, jmi_int_t, jmi_int_array_t, tmp_9, -1, 1)
629        JMI_ARR(HEAP, jmi_int_t, jmi_int_array_t, tmp_10, -1, 1)
630        JMI_DEF(INT_EXT, tmp_11)
631        JMI_DEF(REA_EXT, tmp_12)
632        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, tmp_13_arg0, -1, 1)
633        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, tmp_13_arg1, -1, 1)
634        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, tmp_13_arg3, -1, 1)
635        JMI_ARR(HEAP, jmi_string_t, jmi_string_array_t, tmp_13_arg4, -1, 1)
636        JMI_DEF(INT, tmp_13_arg5)
637        JMI_DEF(REA, tmp_13_arg6)
638
639---
640        JMCEVAL_parse(Real, tmp_6_arg1);
641        JMCEVAL_parse(Integer, tmp_6_arg2);
642        JMCEVAL_parse(Boolean, tmp_6_arg3);
643        JMCEVAL_parse(String, tmp_6_arg4);
644        tmp_4 = (int)tmp_6_arg2;
645        tmp_5 = (int)tmp_6_arg3;
646        tmp_2_arg0 = my_constructor1(tmp_6_arg1, tmp_4, tmp_5, tmp_6_arg4);
647        JMCEVAL_parseArrayDims(1);
648        JMI_ARRAY_INIT_1(HEAP, jmi_extobj_t, jmi_extobj_array_t, tmp_2_arg1, d[0], 1, d[0])
649        tmp_7_max = d[0] + 1;
650        for (tmp_7 = 1; tmp_7 < tmp_7_max; tmp_7++) {
651            JMCEVAL_parseArrayDims(1);
652            JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, tmp_13_arg0, d[0], 1, d[0])
653            JMCEVAL_parseArray(Real, tmp_13_arg0);
654            JMCEVAL_parseArrayDims(1);
655            JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, tmp_13_arg1, d[0], 1, d[0])
656            JMCEVAL_parseArray(Integer, tmp_13_arg1);
657            JMCEVAL_parseArrayDims(1);
658            JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, tmp_13_arg3, d[0], 1, d[0])
659            JMCEVAL_parseArray(Boolean, tmp_13_arg3);
660            JMCEVAL_parseArrayDims(1);
661            JMI_ARRAY_INIT_1(HEAP, jmi_string_t, jmi_string_array_t, tmp_13_arg4, d[0], 1, d[0])
662            JMCEVAL_parseArray(String, tmp_13_arg4);
663            JMCEVAL_parse(Integer, tmp_13_arg5);
664            JMCEVAL_parse(Real, tmp_13_arg6);
665            JMI_ARRAY_INIT_1(HEAP, jmi_int_t, jmi_int_array_t, tmp_9, jmi_array_size(tmp_13_arg1, 0), 1, jmi_array_size(tmp_13_arg1, 0))
666            jmi_copy_matrix_to_int(tmp_13_arg1, tmp_13_arg1->var, tmp_9->var);
667            JMI_ARRAY_INIT_1(HEAP, jmi_int_t, jmi_int_array_t, tmp_10, jmi_array_size(tmp_13_arg3, 0), 1, jmi_array_size(tmp_13_arg3, 0))
668            jmi_copy_matrix_to_int(tmp_13_arg3, tmp_13_arg3->var, tmp_10->var);
669            tmp_11 = (int)tmp_13_arg5;
670            tmp_12 = (double)tmp_13_arg6;
671            my_constructor2(tmp_13_arg0->var, tmp_9->var, &jmi_array_ref_1(tmp_2_arg1, tmp_7), tmp_10->var, tmp_13_arg4->var, (size_t) tmp_11, tmp_12);
672        }
673        my_constructor3(tmp_2_arg0, tmp_2_arg1->var, &o3_v);
674
675---
676        destructor(tmp_2_arg0);
677        for (tmp_7 = 1; tmp_7 < tmp_7_max; tmp_7++) {
678            destructor(jmi_array_ref_1(tmp_2_arg1, tmp_7));
679        }
680
681---
682        JMI_DEF(REA, x_v)
683
684---
685        JMCEVAL_parse(Real, x_v);
686
687---
688            x_v = use3(o3_v);
689            JMCEVAL_check(\"DONE\");
690            JMCEVAL_print(Real, x_v);
691
692
693---
694
695---
696        destructor(o3_v);
697")})));
698end ExtObj2;
699
700model ExtObj3
701    function use1
702        input  Os.Obj1 o1;
703        output Real x;
704        external annotation(Library="extObjectsUse", Include="#include \"extObjectsUse.h\"");
705    end use1;
706
707    Os.Obj1 o1 = Os.Obj1(3.13, 3, true, "A message");
708    Real x = use1(o1);
709
710    annotation(__JModelica(UnitTesting(tests={
711        CCodeGenTestCase(
712            name="ExtObj3",
713            description="Test code gen for external C functions evaluation. External objects.",
714            variability_propagation=false,
715            inline_functions="none",
716            template="
717$ECE_external_includes$
718",
719            generatedCode="
720#include \"extObjects.h\"
721#include \"extObjectsUse.h\"
722")})));
723end ExtObj3;
724
725model ExtObj4
726    function use1
727        input  Os.Obj1 o1;
728        output Real x;
729        external annotation(Library="extObjectsUse", Include="#include \"extObjectsUse.h\"",
730            LibraryDirectory="modelica://Library2", IncludeDirectory="Include2");
731    end use1;
732
733    Os.Obj1 o1 = Os.Obj1(3.13, 3, true, "A message");
734    Real x = use1(o1);
735
736    annotation(__JModelica(UnitTesting(tests={
737        FClassMethodTestCase(
738            name="ExtObj4",
739            methodName="externalDependencies",
740            description="",
741            methodResult="
742destructor
743#include \"extObjects.h\"
744Include
745extObjects
746Library
747
748my_constructor1
749#include \"extObjects.h\"
750Include
751extObjects
752Library
753
754use1
755#include \"extObjects.h\"
756#include \"extObjectsUse.h\"
757Include
758Include2
759extObjects
760extObjectsUse
761Library
762Library2
763")})));
764end ExtObj4;
765
766model ExtObj5
767    class Obj2
768        extends ExternalObject;
769        function constructor
770            input Real[:] x;
771            input Integer[2] y;
772            input Boolean[:] b;
773            input String[:] s;
774            output Obj2 o2;
775            external "C" my_constructor2(x,y,o2,b,s)
776                annotation(Library="extObjects2", Include="#include \"extObjects2.h\"");
777        end constructor;
778        function destructor
779            input Obj2 o2;
780            external "C"
781                annotation(Library="extObjects2b", Include="#include \"extObjects2b.h\"",
782                    LibraryDirectory="Library2b", IncludeDirectory="Include2b");
783        end destructor;
784    end Obj2;
785    class Obj3
786        extends ExternalObject;
787        function constructor
788            input Os.Obj1 o1;
789            input Obj2[:] o2;
790            output Obj3 o3;
791            external "C" my_constructor3(o1,o2,o3)
792                annotation(Library="extObjects3", Include="#include \"extObjects3.h\"");
793        end constructor;
794        function destructor
795            input Obj3 o3;
796            external "C"
797                annotation(Library="extObjects3b", Include="#include \"extObjects3b.h\"");
798        end destructor;
799    end Obj3;
800    function use3
801        input  Obj3 o3;
802        output Real x;
803        external annotation(Library="extObjects4", Include="#include \"extObjects4.h\"");
804    end use3;
805    Os.Obj1 o1 = Os.Obj1(3.13, 3, true, "A message");
806    Obj2 o2 = Obj2({3.13,3.14}, {3,4}, {false, true}, {"A message 1", "A message 2"});
807    Obj3 o3 = Obj3(o1,{o2,o2});
808    Real x = use3(o3);
809
810    annotation(__JModelica(UnitTesting(tests={
811        FClassMethodTestCase(
812            name="ExtObj5",
813            methodName="externalDependencies",
814            description="",
815            methodResult="
816destructor
817#include \"extObjects.h\"
818Include
819extObjects
820Library
821
822my_constructor1
823#include \"extObjects.h\"
824Include
825extObjects
826Library
827
828destructor
829#include \"extObjects2.h\"
830#include \"extObjects2b.h\"
831Include
832Include2b
833extObjects2
834extObjects2b
835Library
836Library2b
837
838my_constructor2
839#include \"extObjects2b.h\"
840#include \"extObjects2.h\"
841Include2b
842Include
843extObjects2b
844extObjects2
845Library2b
846Library
847
848destructor
849#include \"extObjects.h\"
850#include \"extObjects2b.h\"
851#include \"extObjects2.h\"
852#include \"extObjects3.h\"
853#include \"extObjects3b.h\"
854Include
855Include2b
856extObjects
857extObjects2b
858extObjects2
859extObjects3
860extObjects3b
861Library
862Library2b
863
864my_constructor3
865#include \"extObjects.h\"
866#include \"extObjects2b.h\"
867#include \"extObjects2.h\"
868#include \"extObjects3b.h\"
869#include \"extObjects3.h\"
870Include
871Include2b
872extObjects
873extObjects2b
874extObjects2
875extObjects3b
876extObjects3
877Library
878Library2b
879
880use3
881#include \"extObjects.h\"
882#include \"extObjects2b.h\"
883#include \"extObjects2.h\"
884#include \"extObjects3b.h\"
885#include \"extObjects3.h\"
886#include \"extObjects4.h\"
887Include
888Include2b
889extObjects
890extObjects2b
891extObjects2
892extObjects3b
893extObjects3
894extObjects4
895Library
896Library2b
897")})));
898end ExtObj5;
899
900model ExtDynObj1
901    function use1
902        input  Os.Obj1 o1;
903        output Real x;
904        external annotation(Library="extObjectsUse", Include="#include \"extObjectsUse.h\"",
905            LibraryDirectory="modelica://Library2", IncludeDirectory="Include2");
906    end use1;
907
908    Os.Obj1 o1 = Os.Obj1(3.13, 3, true, "A message");
909    Real x = use1(o1);
910
911    annotation(__JModelica(UnitTesting(tests={
912        FClassMethodTestCase(
913            name="ExtDynObj1",
914            methodName="externalCTypes",
915            description="Verifies that external objects are not handled by the dynamic evaluator",
916            methodResult="
917")})));
918end ExtDynObj1;
919
920
921model Dgelsx
922    function dgelsx
923      "Computes the minimum-norm solution to a real linear least squares problem with rank deficient A"
924      input Real A[:, :];
925      input Real B[size(A, 1), :];
926      input Real rcond=0.0 "Reciprocal condition number to estimate rank";
927      output Real X[max(size(A, 1), size(A, 2)), size(B, 2)]=cat(
928                1,
929                B,
930                zeros(max(nrow, ncol) - nrow, nrhs))
931        "Solution is in first size(A,2) rows";
932      output Integer info;
933      output Integer rank "Effective rank of A";
934    protected
935      Integer nrow=size(A, 1);
936      Integer ncol=size(A, 2);
937      Integer nx=max(nrow, ncol);
938      Integer nrhs=size(B, 2);
939      Integer lwork=max(min(nrow, ncol) + 3*ncol, 2*min(nrow, ncol) + nrhs);
940      Real work[max(min(size(A, 1), size(A, 2)) + 3*size(A, 2), 2*min(size(A, 1),
941        size(A, 2)) + size(B, 2))];
942      Real Awork[size(A, 1), size(A, 2)]=A;
943      Integer jpvt[size(A, 2)]=zeros(ncol);
944    external"FORTRAN 77" dgelsx(
945              size(A, 1),
946              ncol,
947              nrhs,
948              Awork,
949              nrow,
950              X,
951              nx,
952              jpvt,
953              rcond,
954              rank,
955              work,
956              lwork,
957              info);
958    end dgelsx;
959   
960    Real[2,1] out;
961    Real a;
962    Real b;
963  equation
964    (out,a,b) = dgelsx({{1},{2}},{{1},{2}},1);
965
966    annotation(__JModelica(UnitTesting(tests={
967        CCodeGenTestCase(
968            name="Dgelsx",
969            description="Test code gen ceval of external functions.",
970            variability_propagation=false,
971            inline_functions="none",
972            template="
973$ECE_external_includes$
974$ECE_record_definitions$
975$ECE_decl$
976---
977$ECE_setup_decl$
978---
979$ECE_setup_init$
980---
981$ECE_setup_free$
982---
983$ECE_calc_decl$
984---
985$ECE_calc_init$
986---
987$ECE_calc$
988---
989$ECE_calc_free$
990---
991$ECE_free$
992",
993            generatedCode="
994---
995
996---
997
998---
999
1000---
1001        JMI_DEF(INT, dgelsx_arg0)
1002        JMI_DEF(INT, ncol_v)
1003        JMI_DEF(INT, nrhs_v)
1004        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, Awork_a, -1, 2)
1005        JMI_DEF(INT, nrow_v)
1006        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, X_a, -1, 2)
1007        JMI_DEF(INT, nx_v)
1008        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, jpvt_a, -1, 1)
1009        JMI_DEF(REA, rcond_v)
1010        JMI_DEF(INT, rank_v)
1011        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, work_a, -1, 1)
1012        JMI_DEF(INT, lwork_v)
1013        JMI_DEF(INT, info_v)
1014        JMI_DEF(INT_EXT, tmp_1)
1015        JMI_DEF(INT_EXT, tmp_2)
1016        JMI_DEF(INT_EXT, tmp_3)
1017        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, tmp_4, -1, 2)
1018        JMI_DEF(INT_EXT, tmp_5)
1019        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, tmp_6, -1, 2)
1020        JMI_DEF(INT_EXT, tmp_7)
1021        JMI_ARR(HEAP, jmi_int_t, jmi_int_array_t, tmp_8, -1, 1)
1022        JMI_DEF(INT_EXT, tmp_9)
1023        JMI_DEF(INT_EXT, tmp_10)
1024        JMI_DEF(INT_EXT, tmp_11)
1025        extern void dgelsx_(int*, int*, int*, double*, int*, double*, int*, int*, double*, int*, double*, int*, int*);
1026
1027---
1028        JMCEVAL_parse(Integer, dgelsx_arg0);
1029        JMCEVAL_parse(Integer, ncol_v);
1030        JMCEVAL_parse(Integer, nrhs_v);
1031        JMCEVAL_parseArrayDims(2);
1032        JMI_ARRAY_INIT_2(HEAP, jmi_real_t, jmi_array_t, Awork_a, d[0]*d[1], 2, d[0], d[1])
1033        JMCEVAL_parseArray(Real, Awork_a);
1034        JMCEVAL_parse(Integer, nrow_v);
1035        JMCEVAL_parseArrayDims(2);
1036        JMI_ARRAY_INIT_2(HEAP, jmi_real_t, jmi_array_t, X_a, d[0]*d[1], 2, d[0], d[1])
1037        JMCEVAL_parseArray(Real, X_a);
1038        JMCEVAL_parse(Integer, nx_v);
1039        JMCEVAL_parseArrayDims(1);
1040        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, jpvt_a, d[0], 1, d[0])
1041        JMCEVAL_parseArray(Integer, jpvt_a);
1042        JMCEVAL_parse(Real, rcond_v);
1043        JMCEVAL_parse(Integer, rank_v);
1044        JMCEVAL_parseArrayDims(1);
1045        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, work_a, d[0], 1, d[0])
1046        JMCEVAL_parseArray(Real, work_a);
1047        JMCEVAL_parse(Integer, lwork_v);
1048        JMCEVAL_parse(Integer, info_v);
1049
1050---
1051            tmp_1 = (int)dgelsx_arg0;
1052            tmp_2 = (int)ncol_v;
1053            tmp_3 = (int)nrhs_v;
1054            JMI_ARRAY_INIT_2(HEAP, jmi_real_t, jmi_array_t, tmp_4, jmi_array_size(Awork_a, 0) * jmi_array_size(Awork_a, 1), 2, jmi_array_size(Awork_a, 0), jmi_array_size(Awork_a, 1))
1055            jmi_matrix_to_fortran_real(Awork_a, Awork_a->var, tmp_4->var);
1056            tmp_5 = (int)nrow_v;
1057            JMI_ARRAY_INIT_2(HEAP, jmi_real_t, jmi_array_t, tmp_6, jmi_array_size(X_a, 0) * jmi_array_size(X_a, 1), 2, jmi_array_size(X_a, 0), jmi_array_size(X_a, 1))
1058            jmi_matrix_to_fortran_real(X_a, X_a->var, tmp_6->var);
1059            tmp_7 = (int)nx_v;
1060            JMI_ARRAY_INIT_1(HEAP, jmi_int_t, jmi_int_array_t, tmp_8, jmi_array_size(jpvt_a, 0), 1, jmi_array_size(jpvt_a, 0))
1061            jmi_matrix_to_fortran_int(jpvt_a, jpvt_a->var, tmp_8->var);
1062            tmp_9 = (int)rank_v;
1063            tmp_10 = (int)lwork_v;
1064            tmp_11 = (int)info_v;
1065            dgelsx_(&tmp_1, &tmp_2, &tmp_3, tmp_4->var, &tmp_5, tmp_6->var, &tmp_7, tmp_8->var, &rcond_v, &tmp_9, work_a->var, &tmp_10, &tmp_11);
1066            jmi_matrix_from_fortran_real(X_a, tmp_6->var, X_a->var);
1067            rank_v = tmp_9;
1068            info_v = tmp_11;
1069            JMCEVAL_check(\"DONE\");
1070            JMCEVAL_printArray(Real, X_a);
1071            JMCEVAL_print(Integer, rank_v);
1072            JMCEVAL_print(Integer, info_v);
1073
1074
1075---
1076
1077---
1078")})));
1079end Dgelsx;
1080
1081model Record
1082    record R
1083        Real a1;
1084        Integer a2;
1085        Boolean a3;
1086        String a4;
1087        E a5;
1088        R2 r2;
1089    end R;
1090    record R2
1091        Real x;
1092    end R2;
1093   
1094    type E = enumeration(A,B);
1095    function f
1096        input R a;
1097        output R b;
1098        external f(a,b);
1099    end f;
1100   
1101    R r = f(R(1,2,true,"s",E.A, R2(3)));
1102    annotation(__JModelica(UnitTesting(tests={
1103        CCodeGenTestCase(
1104           name="ExternalFunction_CEval_Record",
1105            description="Test code gen for external C functions evaluation. Record.",
1106            template="
1107$ECE_external_includes$
1108$ECE_record_definitions$
1109$ECE_decl$
1110---
1111$ECE_setup_decl$
1112---
1113$ECE_setup_init$
1114---
1115$ECE_setup_free$
1116---
1117$ECE_calc_decl$
1118---
1119$ECE_calc_init$
1120---
1121$ECE_calc$
1122---
1123$ECE_calc_free$
1124---
1125$ECE_free$
1126",
1127            generatedCode="
1128    typedef struct R2_0_r_ R2_0_r;
1129    struct R2_0_r_ {
1130        jmi_real_t x;
1131    };
1132    JMI_ARRAY_TYPE(R2_0_r, R2_0_ra)
1133
1134    typedef struct R2_0_r_ext_ R2_0_r_ext;
1135    struct R2_0_r_ext_ {
1136        jmi_real_t x;
1137    };
1138
1139    typedef struct R_1_r_ R_1_r;
1140    struct R_1_r_ {
1141        jmi_real_t a1;
1142        jmi_real_t a2;
1143        jmi_real_t a3;
1144        jmi_string_t a4;
1145        jmi_real_t a5;
1146        R2_0_r* r2;
1147    };
1148    JMI_ARRAY_TYPE(R_1_r, R_1_ra)
1149
1150    typedef struct R_1_r_ext_ R_1_r_ext;
1151    struct R_1_r_ext_ {
1152        jmi_real_t a1;
1153        jmi_int_t a2;
1154        jmi_int_t a3;
1155        jmi_string_t a4;
1156        jmi_int_t a5;
1157        R2_0_r_ext r2;
1158    };
1159
1160
1161
1162---
1163
1164---
1165
1166---
1167
1168---
1169        JMI_RECORD_STATIC(R_1_r, a_v)
1170        JMI_RECORD_STATIC(R2_0_r, tmp_1)
1171        JMI_RECORD_STATIC(R_1_r, b_v)
1172        JMI_RECORD_STATIC(R2_0_r, tmp_2)
1173        JMI_RECORD_STATIC(R_1_r_ext, tmp_3)
1174        JMI_RECORD_STATIC(R_1_r_ext, tmp_4)
1175        extern void f(R_1_r*, R_1_r**);
1176
1177---
1178        JMCEVAL_parse(Real, a_v->a1);
1179        JMCEVAL_parse(Integer, a_v->a2);
1180        JMCEVAL_parse(Boolean, a_v->a3);
1181        JMCEVAL_parse(String, a_v->a4);
1182        JMCEVAL_parse(Enum, a_v->a5);
1183        JMCEVAL_parse(Real, tmp_1->x);
1184        a_v->r2 = tmp_1;
1185        JMCEVAL_parse(Real, b_v->a1);
1186        JMCEVAL_parse(Integer, b_v->a2);
1187        JMCEVAL_parse(Boolean, b_v->a3);
1188        JMCEVAL_parse(String, b_v->a4);
1189        JMCEVAL_parse(Enum, b_v->a5);
1190        JMCEVAL_parse(Real, tmp_2->x);
1191        b_v->r2 = tmp_2;
1192
1193---
1194            tmp_3->a1 = (double)a_v->a1;
1195            tmp_3->a2 = (int)a_v->a2;
1196            tmp_3->a3 = (int)a_v->a3;
1197            JMI_ASG(STR, tmp_3->a4, a_v->a4)
1198            tmp_3->a5 = (int)a_v->a5;
1199            tmp_3->r2.x = (double)a_v->r2->x;
1200            tmp_4->a1 = (double)b_v->a1;
1201            tmp_4->a2 = (int)b_v->a2;
1202            tmp_4->a3 = (int)b_v->a3;
1203            JMI_ASG(STR, tmp_4->a4, b_v->a4)
1204            tmp_4->a5 = (int)b_v->a5;
1205            tmp_4->r2.x = (double)b_v->r2->x;
1206            f(tmp_3, tmp_4);
1207            b_v->a1 = tmp_4->a1;
1208            b_v->a2 = tmp_4->a2;
1209            b_v->a3 = tmp_4->a3;
1210            JMI_ASG(STR, tmp_4->a4, b_v->a4)
1211            b_v->a5 = tmp_4->a5;
1212            b_v->r2->x = tmp_4->r2.x;
1213            JMCEVAL_check(\"DONE\");
1214            JMCEVAL_print(Real, b_v->a1);
1215            JMCEVAL_print(Integer, b_v->a2);
1216            JMCEVAL_print(Boolean, b_v->a3);
1217            JMCEVAL_print(String, b_v->a4);
1218            JMCEVAL_print(Enum, b_v->a5);
1219            JMCEVAL_print(Real, b_v->r2->x);
1220
1221
1222---
1223
1224---
1225
1226")})));
1227end Record;
1228
1229model RecordExternalObject
1230    record R1
1231        R2 r2;
1232    end R1;
1233    record R2
1234        Real x;
1235    end R2;
1236   
1237    model EO
1238        extends ExternalObject;
1239        function constructor
1240            input R1 r1;
1241            output EO eo_c;
1242            external;
1243        end constructor;
1244        function destructor
1245            input EO eo_d;
1246            external;
1247        end destructor;
1248    end EO;
1249   
1250    function f
1251        input EO eo_1_f;
1252        input EO eo_2_f;
1253        output Real y;
1254        external;
1255    end f;
1256   
1257    parameter EO eo_m = EO(R1(R2(3)));
1258    Real y = f(eo_m, eo_m);
1259   
1260    annotation(__JModelica(UnitTesting(tests={
1261        CCodeGenTestCase(
1262           name="ExternalFunction_CEval_RecordExternalObject",
1263            description="Test code gen for external C functions evaluation. Record.",
1264            template="
1265$ECE_external_includes$
1266$ECE_record_definitions$
1267$ECE_decl$
1268---
1269$ECE_setup_decl$
1270---
1271$ECE_setup_init$
1272---
1273$ECE_setup_free$
1274---
1275$ECE_calc_decl$
1276---
1277$ECE_calc_init$
1278---
1279$ECE_calc$
1280---
1281$ECE_calc_free$
1282---
1283$ECE_free$
1284",
1285            generatedCode="
1286    typedef struct R2_0_r_ R2_0_r;
1287    struct R2_0_r_ {
1288        jmi_real_t x;
1289    };
1290    JMI_ARRAY_TYPE(R2_0_r, R2_0_ra)
1291
1292    typedef struct R2_0_r_ext_ R2_0_r_ext;
1293    struct R2_0_r_ext_ {
1294        jmi_real_t x;
1295    };
1296
1297    typedef struct R1_1_r_ R1_1_r;
1298    struct R1_1_r_ {
1299        R2_0_r* r2;
1300    };
1301    JMI_ARRAY_TYPE(R1_1_r, R1_1_ra)
1302
1303    typedef struct R1_1_r_ext_ R1_1_r_ext;
1304    struct R1_1_r_ext_ {
1305        R2_0_r_ext r2;
1306    };
1307
1308
1309        JMI_DEF(EXO, eo_1_f_v)
1310        JMI_DEF(EXO, eo_2_f_v)
1311
1312---
1313        JMI_RECORD_STATIC(R1_1_r_ext, tmp_2)
1314        extern void* constructor(R1_1_r*);
1315        JMI_RECORD_STATIC(R1_1_r, tmp_3_arg1)
1316        JMI_RECORD_STATIC(R2_0_r, tmp_4)
1317        JMI_RECORD_STATIC(R1_1_r_ext, tmp_2)
1318        extern void* constructor(R1_1_r*);
1319        JMI_RECORD_STATIC(R1_1_r, tmp_6_arg1)
1320        JMI_RECORD_STATIC(R2_0_r, tmp_7)
1321
1322---
1323        JMCEVAL_parse(Real, tmp_4->x);
1324        tmp_3_arg1->r2 = tmp_4;
1325        tmp_2->r2.x = (double)tmp_3_arg1->r2->x;
1326        eo_1_f_v = constructor(tmp_2);
1327        JMCEVAL_parse(Real, tmp_7->x);
1328        tmp_6_arg1->r2 = tmp_7;
1329        tmp_2->r2.x = (double)tmp_6_arg1->r2->x;
1330        eo_2_f_v = constructor(tmp_2);
1331
1332---
1333
1334---
1335        JMI_DEF(REA, y_v)
1336        extern double f(void*, void*);
1337
1338---
1339        JMCEVAL_parse(Real, y_v);
1340
1341---
1342            y_v = f(eo_1_f_v, eo_2_f_v);
1343            JMCEVAL_check(\"DONE\");
1344            JMCEVAL_print(Real, y_v);
1345
1346
1347---
1348
1349---
1350        destructor(eo_1_f_v);
1351        destructor(eo_2_f_v);
1352
1353")})));
1354end RecordExternalObject;
1355
1356model PackageConstant1
1357type E = enumeration(A,B);
1358function f
1359    input Real[:] a;
1360    output Real[size(a,1)] b;
1361    constant Real[:] c = {2};
1362    external "C" f(a,b,c);
1363end f;
1364    Real[1] x1 = f({1});
1365
1366    annotation(__JModelica(UnitTesting(tests={
1367        CCodeGenTestCase(
1368            name="PackageConstant1",
1369            description="",
1370            variability_propagation=false,
1371            inline_functions="none",
1372            template="
1373$ECE_external_includes$
1374$ECE_record_definitions$
1375$ECE_decl$
1376---
1377$ECE_setup_decl$
1378---
1379$ECE_setup_init$
1380---
1381$ECE_setup_free$
1382---
1383$ECE_calc_decl$
1384---
1385$ECE_calc_init$
1386---
1387$ECE_calc$
1388---
1389$ECE_calc_free$
1390---
1391$ECE_free$
1392",
1393            generatedCode="
1394---
1395
1396---
1397
1398---
1399
1400---
1401        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, a_a, -1, 1)
1402        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, b_a, -1, 1)
1403        JMI_ARR(HEAP, jmi_real_t, jmi_array_t, f_arg2, -1, 1)
1404        extern void f(double*, double*, double*);
1405
1406---
1407        JMCEVAL_parseArrayDims(1);
1408        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, a_a, d[0], 1, d[0])
1409        JMCEVAL_parseArray(Real, a_a);
1410        JMCEVAL_parseArrayDims(1);
1411        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, b_a, d[0], 1, d[0])
1412        JMCEVAL_parseArray(Real, b_a);
1413        JMCEVAL_parseArrayDims(1);
1414        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, f_arg2, d[0], 1, d[0])
1415        JMCEVAL_parseArray(Real, f_arg2);
1416
1417---
1418            f(a_a->var, b_a->var, f_arg2->var);
1419            JMCEVAL_check(\"DONE\");
1420            JMCEVAL_printArray(Real, b_a);
1421
1422
1423---
1424
1425---
1426")})));
1427end PackageConstant1;
1428
1429end CCodeGenExternalCevalTests;
Note: See TracBrowser for help on using the repository browser.