Changeset 11548


Ignore:
Timestamp:
Sep 2, 2018 3:31:54 PM (15 months ago)
Author:
Jonathan Kämpe
Message:

#5670 Splitting generated code for global constants into component based functions to avoid megafunctions. Fixed bug where scalar record global constants caused segfaults.

Location:
trunk/Compiler/ModelicaCBackEnd
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenGlobals.jrag

    r11546 r11548  
    3939                    block.genSetupNodeDecls_C(p, str, indent);
    4040                }
    41                 for (FVariable fv : fclass.getFGlobalVariables()) {
     41                for (FGlobalVariable fv : fclass.getFGlobalVariables()) {
    4242                    fv.genGlobalVariableDecl_C(p, str, indent);
    4343                }
     
    281281                String next = p.indent(indent);
    282282               
    283                 ArrayList<FVariable> globals = new ArrayList<FVariable>();
    284                 for (FVariable fv : fclass.getFGlobalVariables()) {
     283                ArrayList<FGlobalVariable> globals = new ArrayList<>();
     284                for (FGlobalVariable fv : fclass.getFGlobalVariables()) {
     285                    fv.getBindingExp().genGlobalVariableInit_C(p, str, indent);
    285286                    globals.add(fv);
    286287                }
    287288               
    288                 CodeSplitter<FVariable> splitter = new CodeSplitter<FVariable>(p, str, next, false,
     289                CodeSplitter<FGlobalVariable> splitter = new CodeSplitter<FGlobalVariable>(p, str, next, false,
    289290                        "jmi_set_globals_start_", fclass.myOptions(), globals) {
    290291                    @Override
    291                     public void genDecl(FVariable element) {
    292                         element.genGlobalVariableInitDecl_C(p, str, indent);
     292                    public void genDecl(FGlobalVariable element) {
     293                       
    293294                    }
    294295                    @Override
    295                     public void gen(FVariable element) {
     296                    public void gen(FGlobalVariable element) {
    296297                        element.genGlobalVariableInit_C(p, str, indent);
    297                     }
    298                     @Override
    299                     public void genPre() {
    300                         str.print(indent, "JMI_GLOBALS_INIT()\n");
    301                     }
    302                     @Override
    303                     public void genPost() {
    304                         str.print(indent, "JMI_GLOBALS_FREE()\n");
    305298                    }
    306299                };
     
    316309    }
    317310
    318     public void FVariable.genGlobalVariableDecl_C(CodePrinter p, CodeStream str, String indent) {
     311    public void FGlobalVariable.genGlobalVariableDecl_C(CodePrinter p, CodeStream str, String indent) {
    319312        str.print(indent, type().type_C(p), " ", nameUnderscore(), ";\n");
    320313    }
    321314
    322     public void FVariable.genGlobalVariableInitDecl_C(CodePrinter p, CodeStream str, String indent) {
     315    public void FGlobalVariable.genGlobalVariableInit_C(CodePrinter p, CodeStream str, String indent) {
     316        getBindingExp().genGlobalVariableInitScalar_C(p, str, indent, FExp.global_C(nameUnderscore()), false);
     317    }
     318
     319    public void ASTNode.genGlobalVariableInit_C(CodePrinter p, CodeStream str, String indent) {
     320        genGlobalVariableInitChildren_C(p, str, indent);
     321    }
     322   
     323    public void ASTNode.genGlobalVariableInitChildren_C(CodePrinter p, CodeStream str, String indent) {
     324        for (ASTNode n : this) {
     325            n.genGlobalVariableInit_C(p, str, indent);
     326        }
     327    }
     328   
     329    public void FRecordConstructor.genGlobalVariableInit_C(CodePrinter p, CodeStream str, String indent) {
     330        super.genGlobalVariableInit_C(p, str, indent);
     331       
     332        String next = p.indent(indent);
     333        str.print(indent, type().nameArray_C(p), "* jmi_global_", tempName_C(), "(jmi_t* jmi) {\n");
     334        str.print(next, "JMI_DYNAMIC_INIT()\n");
     335        str.print(next, "JMI_GLOBALS_INIT()\n");
     336       
     337        String typeName = type().nameScalar_C(p, false);
     338        str.print(next, typeName, "* ", tempName_C(), ";\n");
     339        str.print(next, tempName_C(), " = jmi_dynamic_function_pool_alloc(&dyn_mem, 1*sizeof(", typeName, "), TRUE);\n");
     340       
     341        genGlobalVariableInitScalar_C(p, str, next, tempName_C(), true);
     342       
     343        str.print(next, "JMI_GLOBALS_FREE()\n");
     344        str.print(next, "JMI_DYNAMIC_FREE()\n");
     345        str.print(next, "return ", tempName_C(), ";\n");
     346        str.print(indent, "}\n\n");
     347    }
     348   
     349    public void FArray.genGlobalVariableInit_C(CodePrinter p, CodeStream str, String indent) {
     350        for (Index i : indices()) {
     351            fArrayCell(i, 0).genGlobalVariableInitChildren_C(p, str, indent);
     352        }
     353       
     354        String next = p.indent(indent);
     355        str.print(indent, type().nameArray_C(p), "* jmi_global_", tempName_C(), "(jmi_t* jmi) {\n");
     356        str.print(next, "JMI_DYNAMIC_INIT()\n");
     357        str.print(next, "JMI_GLOBALS_INIT()\n");
     358       
     359        str.print(next, "JMI_ARR(",
     360                "DYNA", ", ",
     361                type().nameScalar_C(p, false), ", ",
     362                type().nameArray_C(p, false), ", ",
     363                tempName_C(), ", ");
     364        type().size().printNumElements_C(p, str, next, this);
     365        str.print(", ");
     366        str.print(type().ndims());
     367        str.print(")\n");
     368       
     369        str.print(next, "JMI_ARRAY_INIT_", ndims(), "(",
     370                "DYNA", ", ",
     371                type().nameScalar_C(p, false), ", ",
     372                type().nameArray_C(p, false), ", ",
     373                tempName_C(), ", ");
     374        type().size().printNumElements_C(p, str, next, this);
     375        str.print(", ");
     376        str.print(type().ndims());
     377        str.print(", ");
     378        type().size().printDimensions_C(p, str, next, this);
     379        str.print(")\n");
     380       
     381        String name = tempName_C();
     382        String type = type().isRecord() ? C_ARRAY_RECORD : C_ARRAY_VALUE;
     383        String pre = String.format("jmi_array_%s_%d(%s, ", type, ndims(), name);
     384        for (Index i : indices()) {
     385            String cellName = pre + i.toUnclosedString() + ")";
     386            FExp cellExp = fArrayCell(i, 0);
     387            cellExp.genGlobalVariableInitScalar_C(p, str, next, cellName, true);
     388        }
     389       
     390        str.print(next, "JMI_GLOBALS_FREE()\n");
     391        str.print(next, "JMI_DYNAMIC_FREE()\n");
     392        str.print(next, "return ", tempName_C(), ";\n");
     393        str.print(indent, "}\n\n");
     394    }
     395   
     396    public void FExp.genGlobalVariableInitScalar_C(CodePrinter p, CodeStream str, String indent, String name, boolean expand) {
    323397        if (isComposite()) {
    324             p.print(getBindingExp(), indent, type(), p.createDeclPrinter(str).forceDynamic());
    325         }
    326     }
    327 
    328     public void FVariable.genGlobalVariableInit_C(CodePrinter p, CodeStream str, String indent) {
    329         if (isComposite()) {
    330             p.print(getBindingExp(), indent, type(), p.createInitPrinter(str).forceDynamic());
    331             p.printTempInputAssigns(str, indent, getBindingExp());
    332         }
    333        
    334         str.print(indent, FExp.global_C(nameUnderscore()), " = ");
    335         p.printIOExec(getBindingExp(), str, indent);
    336         str.print(";\n");
    337     }
    338 
     398            str.print(indent, name, " = ");
     399            str.print("jmi_global_", tempName_C(), "(jmi)");
     400            str.print(";\n");
     401        } else if (!isLiteralZero()) {
     402            str.print(indent, name, " = ");
     403            p.print(this, str, indent);
     404            str.print(";\n");
     405        }
     406    }
     407
     408    public void FRecordConstructor.genGlobalVariableInitScalar_C(CodePrinter p, CodeStream str, String indent, String name, boolean expand) {
     409        if (expand) {
     410            for (FRecordComponentType comp : getRecord().recordType().getComponents()) {
     411                String compName = name + "->" + comp.getName();
     412                FExp compExp = component(comp.getName());
     413                compExp.genGlobalVariableInitScalar_C(p, str, indent, compName, false);
     414            }
     415        } else {
     416            super.genGlobalVariableInitScalar_C(p, str, indent, name, expand);
     417        }
     418    }
    339419}
  • trunk/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenGlobalsTests.mo

    r11547 r11548  
    14211421    jmi_array_t* CCodeGenGlobalsTests_GlobalVariables_GlobalConstantScalar1_f2_d;
    14221422
     1423jmi_array_t* jmi_global_tmp_1(jmi_t* jmi) {
     1424    JMI_DYNAMIC_INIT()
     1425    JMI_GLOBALS_INIT()
     1426    JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_1, 1, 1)
     1427    JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_1, 1, 1, 1)
     1428    jmi_array_val_1(tmp_1, 1) = 3;
     1429    JMI_GLOBALS_FREE()
     1430    JMI_DYNAMIC_FREE()
     1431    return tmp_1;
     1432}
     1433
     1434jmi_array_t* jmi_global_tmp_2(jmi_t* jmi) {
     1435    JMI_DYNAMIC_INIT()
     1436    JMI_GLOBALS_INIT()
     1437    JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_2, 1, 1)
     1438    JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_2, 1, 1, 1)
     1439    jmi_array_val_1(tmp_2, 1) = 3;
     1440    JMI_GLOBALS_FREE()
     1441    JMI_DYNAMIC_FREE()
     1442    return tmp_2;
     1443}
     1444
    14231445int jmi_set_globals_start_0(jmi_t* jmi) {
    14241446    int ef = 0;
    14251447    JMI_DYNAMIC_INIT()
    1426     JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_1, 1, 1)
    1427     JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_2, 1, 1)
    1428     JMI_GLOBALS_INIT()
    14291448    JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantScalar1_f1_c) = 3;
    1430     JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_1, 1, 1, 1)
    1431     jmi_array_ref_1(tmp_1, 1) = 3;
    1432     JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantScalar1_f1_d) = tmp_1;
     1449    JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantScalar1_f1_d) = jmi_global_tmp_1(jmi);
    14331450    JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantScalar1_f2_c) = 3;
    1434     JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_2, 1, 1, 1)
    1435     jmi_array_ref_1(tmp_2, 1) = 3;
    1436     JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantScalar1_f2_d) = tmp_2;
    1437     JMI_GLOBALS_FREE()
     1451    JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantScalar1_f2_d) = jmi_global_tmp_2(jmi);
    14381452    JMI_DYNAMIC_FREE()
    14391453    return ef;
     
    14911505model GlobalConstantArray1
    14921506   
    1493     constant Real[:] c = {4,5};
     1507    constant Real[:] c = {4,0,5};
    14941508   
    14951509    function f
     
    15151529    jmi_array_t* CCodeGenGlobalsTests_GlobalVariables_GlobalConstantArray1_c;
    15161530
     1531jmi_array_t* jmi_global_tmp_1(jmi_t* jmi) {
     1532    JMI_DYNAMIC_INIT()
     1533    JMI_GLOBALS_INIT()
     1534    JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_1, 3, 1)
     1535    JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_1, 3, 1, 3)
     1536    jmi_array_val_1(tmp_1, 1) = 4;
     1537    jmi_array_val_1(tmp_1, 3) = 5;
     1538    JMI_GLOBALS_FREE()
     1539    JMI_DYNAMIC_FREE()
     1540    return tmp_1;
     1541}
     1542
    15171543int jmi_set_globals_start_0(jmi_t* jmi) {
    15181544    int ef = 0;
    15191545    JMI_DYNAMIC_INIT()
    1520     JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_1, 2, 1)
    1521     JMI_GLOBALS_INIT()
    1522     JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_1, 2, 1, 2)
    1523     jmi_array_ref_1(tmp_1, 1) = 4;
    1524     jmi_array_ref_1(tmp_1, 2) = 5;
    1525     JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantArray1_c) = tmp_1;
    1526     JMI_GLOBALS_FREE()
     1546    JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantArray1_c) = jmi_global_tmp_1(jmi);
    15271547    JMI_DYNAMIC_FREE()
    15281548    return ef;
     
    15561576end GlobalConstantArray1;
    15571577
     1578model GlobalConstantRecordScalar1
     1579    record R1
     1580        Real[:] a;
     1581    end R1;
     1582   
     1583    record R2
     1584        R1 r1;
     1585    end R2;
     1586   
     1587    function f
     1588        input Real x;
     1589        input Integer i;
     1590        constant R2 r2 = R2(R1(1:2));
     1591        output Real y = x + r2.r1.a[i];
     1592    algorithm
     1593    annotation(Inline=false);
     1594    end f;
     1595   
     1596    Real y = f(time, 2);
     1597   
     1598annotation(__JModelica(UnitTesting(tests={
     1599    CCodeGenTestCase(
     1600        name="GlobalConstantRecordScalar1",
     1601        description="",
     1602        variability_propagation=false,
     1603        template="
     1604$C_records$
     1605$C_global_temps$
     1606$C_set_globals_start$
     1607$C_functions$
     1608",
     1609        generatedCode="
     1610typedef struct R1_0_r_ R1_0_r;
     1611struct R1_0_r_ {
     1612    jmi_array_t* a;
     1613};
     1614JMI_ARRAY_TYPE(R1_0_r, R1_0_ra)
     1615
     1616
     1617typedef struct R2_1_r_ R2_1_r;
     1618struct R2_1_r_ {
     1619    R1_0_r* r1;
     1620};
     1621JMI_ARRAY_TYPE(R2_1_r, R2_1_ra)
     1622
     1623
     1624
     1625    R2_1_r* CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordScalar1_f_r2;
     1626
     1627jmi_array_t* jmi_global_tmp_1(jmi_t* jmi) {
     1628    JMI_DYNAMIC_INIT()
     1629    JMI_GLOBALS_INIT()
     1630    JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_1, 2, 1)
     1631    JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_1, 2, 1, 2)
     1632    jmi_array_val_1(tmp_1, 1) = AD_WRAP_LITERAL(1);
     1633    jmi_array_val_1(tmp_1, 2) = AD_WRAP_LITERAL(2);
     1634    JMI_GLOBALS_FREE()
     1635    JMI_DYNAMIC_FREE()
     1636    return tmp_1;
     1637}
     1638
     1639R1_0_ra* jmi_global_tmp_2(jmi_t* jmi) {
     1640    JMI_DYNAMIC_INIT()
     1641    JMI_GLOBALS_INIT()
     1642    R1_0_r* tmp_2;
     1643    tmp_2 = jmi_dynamic_function_pool_alloc(&dyn_mem, 1*sizeof(R1_0_r), TRUE);
     1644    tmp_2->a = jmi_global_tmp_1(jmi);
     1645    JMI_GLOBALS_FREE()
     1646    JMI_DYNAMIC_FREE()
     1647    return tmp_2;
     1648}
     1649
     1650R2_1_ra* jmi_global_tmp_3(jmi_t* jmi) {
     1651    JMI_DYNAMIC_INIT()
     1652    JMI_GLOBALS_INIT()
     1653    R2_1_r* tmp_3;
     1654    tmp_3 = jmi_dynamic_function_pool_alloc(&dyn_mem, 1*sizeof(R2_1_r), TRUE);
     1655    tmp_3->r1 = jmi_global_tmp_2(jmi);
     1656    JMI_GLOBALS_FREE()
     1657    JMI_DYNAMIC_FREE()
     1658    return tmp_3;
     1659}
     1660
     1661int jmi_set_globals_start_0(jmi_t* jmi) {
     1662    int ef = 0;
     1663    JMI_DYNAMIC_INIT()
     1664    JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordScalar1_f_r2) = jmi_global_tmp_3(jmi);
     1665    JMI_DYNAMIC_FREE()
     1666    return ef;
     1667}
     1668
     1669int jmi_set_globals_start_0(jmi_t* jmi);
     1670
     1671int jmi_set_globals_start(jmi_t* jmi) {
     1672    int ef = 0;
     1673    JMI_DYNAMIC_INIT()
     1674    ef |= jmi_set_globals_start_0(jmi);
     1675    JMI_DYNAMIC_FREE()
     1676    return ef;
     1677}
     1678
     1679void func_CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordScalar1_f_def0(jmi_real_t x_v, jmi_real_t i_v, jmi_real_t* y_o) {
     1680    JMI_DYNAMIC_INIT()
     1681    JMI_DEF(REA, y_v)
     1682    y_v = x_v + jmi_array_val_1(JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordScalar1_f_r2)->r1->a, i_v);
     1683    JMI_RET(GEN, y_o, y_v)
     1684    JMI_DYNAMIC_FREE()
     1685    return;
     1686}
     1687
     1688jmi_real_t func_CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordScalar1_f_exp0(jmi_real_t x_v, jmi_real_t i_v) {
     1689    JMI_DEF(REA, y_v)
     1690    func_CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordScalar1_f_def0(x_v, i_v, &y_v);
     1691    return y_v;
     1692}
     1693")})));
     1694end GlobalConstantRecordScalar1;
     1695
    15581696model GlobalConstantRecordArray1
    15591697    record R
     
    15641702        input Real x;
    15651703        input Integer i;
    1566         constant R[:] c = {R(1:2), R(3:4)};
     1704        constant R[:] c = {R(1.0:2.0), R(3.0:4.0)};
    15671705        output Real y = c[i].a[i] + x;
    15681706        algorithm
     
    15851723    R_0_ra* CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordArray1_f_c;
    15861724
     1725jmi_array_t* jmi_global_tmp_1(jmi_t* jmi) {
     1726    JMI_DYNAMIC_INIT()
     1727    JMI_GLOBALS_INIT()
     1728    JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_1, 2, 1)
     1729    JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_1, 2, 1, 2)
     1730    jmi_array_val_1(tmp_1, 1) = 1.0;
     1731    jmi_array_val_1(tmp_1, 2) = 2.0;
     1732    JMI_GLOBALS_FREE()
     1733    JMI_DYNAMIC_FREE()
     1734    return tmp_1;
     1735}
     1736
     1737jmi_array_t* jmi_global_tmp_2(jmi_t* jmi) {
     1738    JMI_DYNAMIC_INIT()
     1739    JMI_GLOBALS_INIT()
     1740    JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_2, 2, 1)
     1741    JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_2, 2, 1, 2)
     1742    jmi_array_val_1(tmp_2, 1) = 3.0;
     1743    jmi_array_val_1(tmp_2, 2) = 4.0;
     1744    JMI_GLOBALS_FREE()
     1745    JMI_DYNAMIC_FREE()
     1746    return tmp_2;
     1747}
     1748
     1749R_0_ra* jmi_global_tmp_3(jmi_t* jmi) {
     1750    JMI_DYNAMIC_INIT()
     1751    JMI_GLOBALS_INIT()
     1752    JMI_ARR(DYNA, R_0_r, R_0_ra, tmp_3, 2, 1)
     1753    JMI_ARRAY_INIT_1(DYNA, R_0_r, R_0_ra, tmp_3, 2, 1, 2)
     1754    jmi_array_rec_1(tmp_3, 1)->a = jmi_global_tmp_1(jmi);
     1755    jmi_array_rec_1(tmp_3, 2)->a = jmi_global_tmp_2(jmi);
     1756    JMI_GLOBALS_FREE()
     1757    JMI_DYNAMIC_FREE()
     1758    return tmp_3;
     1759}
     1760
    15871761int jmi_set_globals_start_0(jmi_t* jmi) {
    15881762    int ef = 0;
    15891763    JMI_DYNAMIC_INIT()
    1590     JMI_ARR(DYNA, R_0_r, R_0_ra, tmp_1, 2, 1)
    1591     JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_2, 2, 1)
    1592     JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_3, 2, 1)
    1593     JMI_GLOBALS_INIT()
    1594     JMI_ARRAY_INIT_1(DYNA, R_0_r, R_0_ra, tmp_1, 2, 1, 2)
    1595     JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_2, 2, 1, 2)
    1596     jmi_array_rec_1(tmp_1, 1)->a = tmp_2;
    1597     JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_3, 2, 1, 2)
    1598     jmi_array_rec_1(tmp_1, 2)->a = tmp_3;
    1599     jmi_array_ref_1(jmi_array_rec_1(tmp_1, 1)->a, 1) = AD_WRAP_LITERAL(1);
    1600     jmi_array_ref_1(jmi_array_rec_1(tmp_1, 1)->a, 2) = AD_WRAP_LITERAL(2);
    1601     jmi_array_ref_1(jmi_array_rec_1(tmp_1, 2)->a, 1) = AD_WRAP_LITERAL(3);
    1602     jmi_array_ref_1(jmi_array_rec_1(tmp_1, 2)->a, 2) = AD_WRAP_LITERAL(4);
    1603     JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordArray1_f_c) = tmp_1;
    1604     JMI_GLOBALS_FREE()
     1764    JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordArray1_f_c) = jmi_global_tmp_3(jmi);
    16051765    JMI_DYNAMIC_FREE()
    16061766    return ef;
     
    16301790    func_CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordArray1_f_def0(x_v, i_v, &y_v);
    16311791    return y_v;
     1792}")})));
     1793end GlobalConstantRecordArray1;
     1794
     1795model GlobalConstantRecordArray2
     1796    record R1
     1797        Real[:] a;
     1798    end R1;
     1799   
     1800    record R2
     1801        R1 r1;
     1802    end R2;
     1803   
     1804    record R3
     1805        R2 r2;
     1806    end R3;
     1807   
     1808    function f
     1809        input Real x;
     1810        input Integer i;
     1811        constant R3[:] c = {R3(R2(R1(1.0:2.0))),R3(R2(R1(3.0:4.0)))};
     1812        output Real y = c[i].r2.r1.a[i] + x;
     1813        algorithm
     1814    annotation(Inline=false);
     1815    end f;
     1816   
     1817    Real y = f(time, 2);
     1818   
     1819annotation(__JModelica(UnitTesting(tests={
     1820    CCodeGenTestCase(
     1821        name="GlobalConstantRecordArray2",
     1822        description="",
     1823        variability_propagation=false,
     1824        template="
     1825$C_global_temps$
     1826$C_set_globals_start$
     1827$C_functions$
     1828",
     1829        generatedCode="
     1830    R3_2_ra* CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordArray2_f_c;
     1831
     1832jmi_array_t* jmi_global_tmp_1(jmi_t* jmi) {
     1833    JMI_DYNAMIC_INIT()
     1834    JMI_GLOBALS_INIT()
     1835    JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_1, 2, 1)
     1836    JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_1, 2, 1, 2)
     1837    jmi_array_val_1(tmp_1, 1) = 1.0;
     1838    jmi_array_val_1(tmp_1, 2) = 2.0;
     1839    JMI_GLOBALS_FREE()
     1840    JMI_DYNAMIC_FREE()
     1841    return tmp_1;
     1842}
     1843
     1844R1_0_ra* jmi_global_tmp_2(jmi_t* jmi) {
     1845    JMI_DYNAMIC_INIT()
     1846    JMI_GLOBALS_INIT()
     1847    R1_0_r* tmp_2;
     1848    tmp_2 = jmi_dynamic_function_pool_alloc(&dyn_mem, 1*sizeof(R1_0_r), TRUE);
     1849    tmp_2->a = jmi_global_tmp_1(jmi);
     1850    JMI_GLOBALS_FREE()
     1851    JMI_DYNAMIC_FREE()
     1852    return tmp_2;
     1853}
     1854
     1855R2_1_ra* jmi_global_tmp_3(jmi_t* jmi) {
     1856    JMI_DYNAMIC_INIT()
     1857    JMI_GLOBALS_INIT()
     1858    R2_1_r* tmp_3;
     1859    tmp_3 = jmi_dynamic_function_pool_alloc(&dyn_mem, 1*sizeof(R2_1_r), TRUE);
     1860    tmp_3->r1 = jmi_global_tmp_2(jmi);
     1861    JMI_GLOBALS_FREE()
     1862    JMI_DYNAMIC_FREE()
     1863    return tmp_3;
     1864}
     1865
     1866jmi_array_t* jmi_global_tmp_4(jmi_t* jmi) {
     1867    JMI_DYNAMIC_INIT()
     1868    JMI_GLOBALS_INIT()
     1869    JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_4, 2, 1)
     1870    JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_4, 2, 1, 2)
     1871    jmi_array_val_1(tmp_4, 1) = 3.0;
     1872    jmi_array_val_1(tmp_4, 2) = 4.0;
     1873    JMI_GLOBALS_FREE()
     1874    JMI_DYNAMIC_FREE()
     1875    return tmp_4;
     1876}
     1877
     1878R1_0_ra* jmi_global_tmp_5(jmi_t* jmi) {
     1879    JMI_DYNAMIC_INIT()
     1880    JMI_GLOBALS_INIT()
     1881    R1_0_r* tmp_5;
     1882    tmp_5 = jmi_dynamic_function_pool_alloc(&dyn_mem, 1*sizeof(R1_0_r), TRUE);
     1883    tmp_5->a = jmi_global_tmp_4(jmi);
     1884    JMI_GLOBALS_FREE()
     1885    JMI_DYNAMIC_FREE()
     1886    return tmp_5;
     1887}
     1888
     1889R2_1_ra* jmi_global_tmp_6(jmi_t* jmi) {
     1890    JMI_DYNAMIC_INIT()
     1891    JMI_GLOBALS_INIT()
     1892    R2_1_r* tmp_6;
     1893    tmp_6 = jmi_dynamic_function_pool_alloc(&dyn_mem, 1*sizeof(R2_1_r), TRUE);
     1894    tmp_6->r1 = jmi_global_tmp_5(jmi);
     1895    JMI_GLOBALS_FREE()
     1896    JMI_DYNAMIC_FREE()
     1897    return tmp_6;
     1898}
     1899
     1900R3_2_ra* jmi_global_tmp_7(jmi_t* jmi) {
     1901    JMI_DYNAMIC_INIT()
     1902    JMI_GLOBALS_INIT()
     1903    JMI_ARR(DYNA, R3_2_r, R3_2_ra, tmp_7, 2, 1)
     1904    JMI_ARRAY_INIT_1(DYNA, R3_2_r, R3_2_ra, tmp_7, 2, 1, 2)
     1905    jmi_array_rec_1(tmp_7, 1)->r2 = jmi_global_tmp_3(jmi);
     1906    jmi_array_rec_1(tmp_7, 2)->r2 = jmi_global_tmp_6(jmi);
     1907    JMI_GLOBALS_FREE()
     1908    JMI_DYNAMIC_FREE()
     1909    return tmp_7;
     1910}
     1911
     1912int jmi_set_globals_start_0(jmi_t* jmi) {
     1913    int ef = 0;
     1914    JMI_DYNAMIC_INIT()
     1915    JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordArray2_f_c) = jmi_global_tmp_7(jmi);
     1916    JMI_DYNAMIC_FREE()
     1917    return ef;
     1918}
     1919
     1920int jmi_set_globals_start_0(jmi_t* jmi);
     1921
     1922int jmi_set_globals_start(jmi_t* jmi) {
     1923    int ef = 0;
     1924    JMI_DYNAMIC_INIT()
     1925    ef |= jmi_set_globals_start_0(jmi);
     1926    JMI_DYNAMIC_FREE()
     1927    return ef;
     1928}
     1929
     1930void func_CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordArray2_f_def0(jmi_real_t x_v, jmi_real_t i_v, jmi_real_t* y_o) {
     1931    JMI_DYNAMIC_INIT()
     1932    JMI_DEF(REA, y_v)
     1933    y_v = jmi_array_val_1(jmi_array_rec_1(JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordArray2_f_c), i_v)->r2->r1->a, i_v) + x_v;
     1934    JMI_RET(GEN, y_o, y_v)
     1935    JMI_DYNAMIC_FREE()
     1936    return;
     1937}
     1938
     1939jmi_real_t func_CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordArray2_f_exp0(jmi_real_t x_v, jmi_real_t i_v) {
     1940    JMI_DEF(REA, y_v)
     1941    func_CCodeGenGlobalsTests_GlobalVariables_GlobalConstantRecordArray2_f_def0(x_v, i_v, &y_v);
     1942    return y_v;
    16321943}
    16331944")})));
    1634 end GlobalConstantRecordArray1;
     1945end GlobalConstantRecordArray2;
     1946
    16351947
    16361948model GlobalConstantForPowInt1
     
    16841996end GlobalConstantForPowInt1;
    16851997
    1686 
    16871998end GlobalVariables;
    16881999
Note: See TracChangeset for help on using the changeset viewer.