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

Last change on this file since 13600 was 13600, checked in by randersson, 2 months ago

#5819 Merged JM trunk into branch.

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