Changeset 6088


Ignore:
Timestamp:
Mar 12, 2014 12:38:14 PM (6 years ago)
Author:
nlandin
Message:
  • Added tests for algorithms, functions and types.
  • Fixed some faulty indentation and added correct generation of time variable. #3319
Location:
branches/NewXMLExport/Compiler/ModelicaXMLBackEnd/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/NewXMLExport/Compiler/ModelicaXMLBackEnd/src/jastadd/ModelicaXMLGenerator.jrag

    r6081 r6088  
    9595        String indentOneStep = p.indent(indent);
    9696        String indentTwoSteps = p.indent(indentOneStep);
     97        String indentThreeSteps = p.indent(indentTwoSteps);
    9798        // assume everything is a model for now
    9899        generateOpenTag(str, "class", indent, "kind", "model");
     
    162163        // generate functions
    163164        for (FFunctionDecl function : getFFunctionDecls()) {
    164             generateOpenTag(str, "classDefinition", indent, "name", function.name());
    165             generateOpenTag(str, "class", indentOneStep, "kind", "function");
    166             p.print(function, str, indentTwoSteps);
    167             generateCloseTag(str, "class", indentOneStep);
    168             generateCloseTag(str, "class", indent);
     165            generateOpenTag(str, "classDefinition", indentOneStep, "name", function.name());
     166            generateOpenTag(str, "class", indentTwoSteps, "kind", "function");
     167            p.print(function, str, indentThreeSteps);
     168            generateCloseTag(str, "class", indentTwoSteps);
     169            generateCloseTag(str, "classDefinition", indentOneStep);
    169170        }
    170171        generateCloseTag(str, "class", indent);
     
    281282        attributes.put("name", name());
    282283        if (hasFTypePrefixInputOutput()) {
    283             attributes.put("casuality", getFTypePrefixInputOutput().toString());
     284            attributes.put("causality", getFTypePrefixInputOutput().toString());
    284285        }
    285286        generateOpenTag(str, "component", indent, attributes);
     
    298299            generateCloseTag(str, "bindingExp", indentOneStep);
    299300        }
    300         generateClosedTag(str, "component", indent);
     301        generateCloseTag(str, "component", indent);
    301302    }
    302303   
     
    443444   
    444445    public void FFunctionCall.prettyPrintXML(Printer p, CodeStream str, String indent) {
     446        String indentOneStep = p.indent(indent);
     447        String indentTwoSteps = p.indent(indentOneStep);
    445448        generateOpenTag(str, "call", indent);
    446         generateOpenTag(str, "function", indent);
     449        generateOpenTag(str, "function", indentOneStep);
    447450        if (getName().getFQName().isScalarized()) {
    448             generateClosedTag(str, "local", p.indent(indent), "name", name());
     451            generateClosedTag(str, "local", indentTwoSteps, "name", name());
    449452        } else {
    450             p.print(getName().getFQName(), str, p.indent(indent));
    451         }
    452         generateCloseTag(str, "function", indent);
     453            p.print(getName().getFQName(), str, indentTwoSteps);
     454        }
     455        generateCloseTag(str, "function", indentOneStep);
    453456        for (FExp arg : getArgs()) {
    454457            p.print(arg, str, p.indent(indent));
     
    482485    }
    483486   
    484     // builtin function time
     487    // builtin variable time
    485488    public void FTimeExp.prettyPrintXML(Printer p, CodeStream str, String indent) {
    486         generateClosedTag(str, "operator", indent, "name", "time");
     489        generateClosedTag(str, "builtin", indent, "name", "time");
    487490    }
    488491   
     
    580583   
    581584    public void FFunctionCallEquation.prettyPrintXML(Printer p, CodeStream str, String indent) {
    582         // function calls of the following type: (x, y, z) = func(a, b); is
    583         // currently generated as an equal clause, not sure if that is correct
    584         int numLeft = getNumLeft();
    585         if (numLeft > 0) {
    586             // generate left side of function call
     585        String indentOneStep = p.indent(indent);
     586        String indentTwoSteps = p.indent(indentOneStep);
     587        if (getNumLeft() > 0) {
    587588            generateOpenTag(str, "equal", indent);
    588             // should this be considered a function call?
    589             for (FFunctionCallLeft left : getLefts()) {
    590                 p.print(left, str, p.indent(indent));
    591             }
    592         }
    593         // generate right side of function call
     589            if (getNumLeft() > 1) {
     590                generateOpenTag(str, "tuple", indentOneStep);
     591                for (FFunctionCallLeft left : getLefts()) {
     592                    p.print(left, str, indentTwoSteps);
     593                }
     594                generateCloseTag(str, "tuple", indentOneStep);
     595            } else {
     596                for (FFunctionCallLeft left : getLefts()) {
     597                    p.print(left, str, indentOneStep);
     598                }
     599            }
     600        }
    594601        p.print(getCall(), str, p.indent(indent));
    595         if (numLeft > 0) {
     602        if (getNumLeft() > 0) {
    596603            generateCloseTag(str, "equal", indent);
    597604        }
     
    699706   
    700707    public void FBreakStmt.prettyPrintXML(Printer p, CodeStream str, String indent) {
    701         generateClosedTag(str, "break", p.indent(indent));
     708        generateClosedTag(str, "break", indent);
    702709    }
    703710   
    704711    public void FReturnStmt.prettyPrintXML(Printer p, CodeStream str, String indent) {
    705         generateClosedTag(str, "return", p.indent(indent));
     712        generateClosedTag(str, "return", indent);
    706713    }
    707714   
     
    779786        generateOpenTag(str, "assign", indent);
    780787        generateOpenTag(str, "to", indentOneStep);
    781         generateOpenTag(str, "tuple", indentTwoSteps);
    782         for (FFunctionCallLeft left : getLefts()) {
    783             p.print(left, str, indentThreeSteps);
    784         }
    785         generateCloseTag(str, "tuple", indentTwoSteps);
     788        if (getNumLeft() > 1) {
     789            generateOpenTag(str, "tuple", indentTwoSteps);
     790            for (FFunctionCallLeft left : getLefts()) {
     791                p.print(left, str, indentThreeSteps);
     792            }
     793            generateCloseTag(str, "tuple", indentTwoSteps);
     794        } else {
     795            for (FFunctionCallLeft left : getLefts()) {
     796                p.print(left, str, indentTwoSteps);
     797            }
     798        }
    786799        generateCloseTag(str, "to", indentOneStep);
    787800        generateOpenTag(str, "from", indentOneStep);
  • branches/NewXMLExport/Compiler/ModelicaXMLBackEnd/src/test/ModelicaXMLCodeGenTests.mo

    r6043 r6088  
    824824            generatedCode="<?xml version=\"1.0\" encoding=\"UTF-8\"?>
    825825<class kind=\"model\">
    826         <component name=\"theta\">
    827             <builtin name=\"Real\"/>
    828         </component>
    829         <component name=\"omega\">
    830             <builtin name=\"Real\"/>
    831         </component>
    832         <component name=\"L\" variability=\"parameter\">
    833             <builtin name=\"Real\"/>
    834             <bindingExpression>
    835                 <integer value=\"2\"/>
    836             </bindingExpression>
    837         </component>
    838         <component name=\"g\" variability=\"constant\">
    839             <builtin name=\"Real\"/>
    840             <bindingExpression>
    841                 <real value=\"9.81\"/>
    842             </bindingExpression>
    843         </component>
    844         <component name=\"u1\" causality=\"input\">
    845             <local name=\"Modelica.SIunits.ElectricPotential\"/>
    846         </component>
    847    
     826    <classDefinition name=\"Modelica.SIunits.ElectricPotential\">
     827        <builtin name=\"Real\"/>
     828        <modifier>
     829            <item name=\"quantity\">
     830                <string value=\"ElectricPotential\"/>
     831            </item>
     832            <item name=\"unit\">
     833                <string value=\"V\"/>
     834            </item>
     835        </modifier>
     836    </classDefinition>
     837    <component name=\"theta\">
     838        <builtin name=\"Real\"/>
     839    </component>
     840    <component name=\"omega\">
     841        <builtin name=\"Real\"/>
     842    </component>
     843    <component name=\"L\" variability=\"parameter\">
     844        <builtin name=\"Real\"/>
     845        <bindingExpression>
     846            <integer value=\"2\"/>
     847        </bindingExpression>
     848    </component>
     849    <component name=\"g\" variability=\"constant\">
     850        <builtin name=\"Real\"/>
     851        <bindingExpression>
     852            <real value=\"9.81\"/>
     853        </bindingExpression>
     854    </component>
     855    <component name=\"u1\" causality=\"input\">
     856        <local name=\"Modelica.SIunits.ElectricPotential\"/>
     857    </component>
     858
    848859    <equation kind=\"initial\">
    849860        <equal>
     
    856867        </equal>
    857868    </equation>
    858    
     869
    859870    <equation>
    860871        <equal>
     
    881892        </equal>
    882893    </equation>
     894
    883895</class>"
    884896 )})));
    885897end TestDeclarations;
    886898
     899model TestAlgorithms
     900    Real x1;
     901    Real x2;
     902    Integer index;
     903    algorithm
     904        x1 := 2;
     905        x2 := x1;
     906        index := 0;
     907        while index < 3 loop
     908            if index < 0 then
     909             break;
     910            else
     911             index := index-1;
     912            end if;
     913        end while;
     914
     915    annotation(__JModelica(UnitTesting(tests={
     916        ModelicaXMLCodeGenTestCase(
     917            name="TestAlgorithms",
     918            description="Test algorithm constructs",
     919            template="",
     920            generatedCode="<?xml version=\"1.0\" encoding=\"UTF-8\"?>
     921<class kind=\"model\">
     922    <component name=\"x1\">
     923        <builtin name=\"Real\"/>
     924    </component>
     925    <component name=\"x2\">
     926        <builtin name=\"Real\"/>
     927    </component>
     928    <component name=\"index\" variability=\"discrete\">
     929        <builtin name=\"Integer\"/>
     930    </component>
     931    <component name=\"pre(index)\" variability=\"discrete\">
     932        <builtin name=\"Integer\"/>
     933    </component>
     934   
     935    <equation kind=\"initial\">
     936        <equal>
     937            <operator name=\"pre\">
     938                <local name=\"index\"/>
     939            </operator>
     940            <integer value=\"0\"/>
     941        </equal>
     942    </equation>
     943   
     944    <equation>
     945    </equation>
     946
     947    <algorithm>
     948        <assign>
     949            <to>
     950                <local name=\"x1\"/>
     951            </to>
     952            <from>
     953                <integer value=\"2\"/>
     954            </from>
     955        </assign>
     956        <assign>
     957            <to>
     958                <local name=\"x2\"/>
     959            </to>
     960            <from>
     961                <local name=\"x1\"/>
     962            </from>
     963        </assign>
     964        <assign>
     965            <to>
     966                <local name=\"index\"/>
     967            </to>
     968            <from>
     969                <integer value=\"0\"/>
     970            </from>
     971        </assign>       
     972        <while>
     973            <cond>
     974                <call builtin=\"&lt;\">
     975                    <local name=\"index\"/>
     976                    <integer value=\"3\"/>
     977                </call>
     978            </cond>
     979            <then>
     980                <if>
     981                    <cond>
     982                        <call builtin=\"&lt;\">
     983                            <local name=\"index\"/>
     984                            <integer value=\"0\"/>
     985                        </call>
     986                    </cond>
     987                    <then>
     988                        <break/>
     989                    </then>
     990                    <else>
     991                        <assign>
     992                            <to>
     993                                <local name=\"index\"/>
     994                            </to>
     995                            <from>
     996                                <call builtin=\"-\">
     997                                    <local name=\"index\"/>
     998                                    <integer value=\"1\"/>
     999                                </call>
     1000                            </from>
     1001                        </assign>
     1002                    </else>
     1003                </if>
     1004            </then>
     1005        </while>
     1006    </algorithm>
     1007</class>
     1008"
     1009 )})));
     1010end TestAlgorithms;
     1011
     1012model TestFunctions
     1013    Real a1(start=0.1, fixed=true);
     1014    Real a2(start=0.4, fixed=true);
     1015    Real b1(start=-1.0);
     1016    Real b2(start=1.0);
     1017    function f
     1018        input Real in1;
     1019        input Real in2;
     1020        output Real out1;
     1021        output Real out2;
     1022        Real internal;
     1023    algorithm
     1024        internal := out1;
     1025        out2 := out2-internal;
     1026        out1 := out1*2.0;
     1027    end f;
     1028    equation
     1029        der(a1) = -3.14*a1-0.1-b2;
     1030        der(a2) = -2.7*a2-0.3;
     1031        (b1, b2) = f(a1, a2);
     1032
     1033    annotation(__JModelica(UnitTesting(tests={
     1034        ModelicaXMLCodeGenTestCase(
     1035            name="TestFunctions",
     1036            description="Test code generation for functions",
     1037            template="",
     1038            generatedCode="<?xml version=\"1.0\" encoding=\"UTF-8\"?>
     1039<class kind=\"model\">
     1040    <component name=\"a1\">
     1041        <builtin name=\"Real\"/>
     1042        <modifier>
     1043            <item name=\"start\">
     1044                <real value=\"0.1\"/>
     1045            </item>
     1046            <item name=\"fixed\">
     1047                <true/>
     1048            </item>
     1049        </modifier>
     1050    </component>
     1051    <component name=\"a2\">
     1052        <builtin name=\"Real\"/>
     1053        <modifier>
     1054            <item name=\"start\">
     1055                <real value=\"0.4\"/>
     1056            </item>
     1057            <item name=\"fixed\">
     1058                <true/>
     1059            </item>
     1060        </modifier>
     1061    </component>
     1062    <component name=\"b1\">
     1063        <builtin name=\"Real\"/>
     1064        <modifier>
     1065            <item name=\"start\">
     1066                <call builtin=\"-\">
     1067                    <real value=\"1.0\"/>
     1068                </call>
     1069            </item>
     1070        </modifier>
     1071    </component>
     1072    <component name=\"b2\">
     1073        <builtin name=\"Real\"/>
     1074        <modifier>
     1075            <item name=\"start\">
     1076                <real value=\"1.0\"/>
     1077            </item>
     1078        </modifier>
     1079    </component>
     1080
     1081    <equation kind=\"initial\">
     1082        <equal>
     1083            <local name=\"a1\"/>
     1084            <real value=\"0.1\"/>
     1085        </equal>
     1086        <equal>
     1087            <local name=\"a2\"/>
     1088            <real value=\"0.4\"/>
     1089        </equal>
     1090    </equation>
     1091
     1092    <equation>
     1093        <equal>
     1094            <operator name=\"der\">
     1095                <local name=\"a1\"/>
     1096            </operator>
     1097            <call builtin=\"-\">
     1098                <call builtin=\"-\">
     1099                    <call builtin=\"*\">
     1100                        <real value=\"-3.14\"/>
     1101                        <local name=\"a1\"/>
     1102                    </call>
     1103                    <real value=\"0.1\"/>
     1104                </call>
     1105                <local name=\"b2\"/>
     1106            </call>
     1107        </equal>
     1108        <equal>
     1109            <operator name=\"der\">
     1110                <local name=\"a2\"/>
     1111            </operator>
     1112            <call builtin=\"-\">
     1113                <call builtin=\"*\">
     1114                    <real value=\"-2.7\"/>
     1115                    <local name=\"a2\"/>
     1116                </call>
     1117                <real value=\"0.3\"/>
     1118            </call>
     1119        </equal>
     1120        <equal>
     1121            <tuple>
     1122            <local name=\"b1\"/>
     1123            <local name=\"b2\"/>
     1124            </tuple>
     1125            <call>
     1126                <function>
     1127                    <local name=\"ModelicaXMLCodeGenTests.TestFunctions.f\"/>
     1128                </function>
     1129                    <local name=\"a1\"/>
     1130                    <local name=\"a2\"/>
     1131            </call>
     1132        </equal>
     1133    </equation>
     1134
     1135    <classDefinition name=\"ModelicaXMLCodeGenTests.TestFunctions.f\">
     1136        <class kind=\"function\">
     1137            <component name=\"in1\" causality=\"input\">
     1138                <builtin name=\"Real\"/>
     1139            </component>
     1140            <component name=\"in2\" causality=\"input\">
     1141                <builtin name=\"Real\"/>
     1142            </component>
     1143            <component name=\"out1\" causality=\"output\">
     1144                <builtin name=\"Real\"/>
     1145            </component>
     1146            <component name=\"out2\" causality=\"output\">
     1147                <builtin name=\"Real\"/>
     1148            </component>
     1149            <component name=\"internal\">
     1150                <builtin name=\"Real\"/>
     1151            </component>
     1152            <algorithm>
     1153                <assign>
     1154                    <to>
     1155                        <local name=\"internal\"/>
     1156                    </to>
     1157                    <from>
     1158                        <local name=\"out1\"/>
     1159                    </from>
     1160                </assign>
     1161                <assign>
     1162                    <to>
     1163                        <local name=\"out2\"/>
     1164                    </to>
     1165                    <from>
     1166                        <call builtin=\"-\">
     1167                            <local name=\"out2\"/>
     1168                            <local name=\"internal\"/>
     1169                        </call>
     1170                    </from>
     1171                </assign>
     1172                <assign>
     1173                    <to>
     1174                        <local name=\"out1\"/>
     1175                    </to>
     1176                    <from>
     1177                        <call builtin=\"*\">
     1178                            <local name=\"out1\"/>
     1179                            <real value=\"2.0\"/>
     1180                        </call>
     1181                    </from>
     1182                </assign>
     1183                <return/>
     1184            </algorithm>
     1185        </class>
     1186    </classDefinition>
     1187</class>"
     1188 )})));
     1189end TestFunctions;
     1190
     1191model TestTypeImport
     1192    Voltage v;
     1193    Area a;
     1194   
     1195equation
     1196    v = 2;
     1197    a = 2;
     1198
     1199    annotation(__JModelica(UnitTesting(tests={
     1200        ModelicaXMLCodeGenTestCase(
     1201            name="TestTypeImport",
     1202            description="Test export of extended types such as Voltage",
     1203            template="",
     1204            generatedCode="<?xml version=\"1.0\" encoding=\"UTF-8\"?>
     1205<class kind=\"model\">
     1206    <classDefinition name=\"Modelica.SIunits.ElectricPotential\">
     1207        <builtin name=\"Real\"/>
     1208        <modifier>
     1209            <item name=\"quantity\">
     1210                <string value=\"ElectricPotential\"/>
     1211            </item>
     1212            <item name=\"unit\">
     1213                <string value=\"V\"/>
     1214            </item>
     1215        </modifier>
     1216    </classDefinition>
     1217    <classDefinition name=\"Modelica.SIunits.Area\">
     1218        <builtin name=\"Real\"/>
     1219        <modifier>
     1220            <item name=\"quantity\">
     1221                <string value=\"Area\"/>
     1222            </item>
     1223            <item name=\"unit\">
     1224                <string value=\"m2\"/>
     1225            </item>
     1226        </modifier>
     1227    </classDefinition>
     1228    <component name=\"v\" variability=\"constant\">
     1229        <local name=\"Modelica.SIunits.ElectricPotential\"/>
     1230        <bindingExpression>
     1231            <integer value=\"2\"/>
     1232        </bindingExpression>
     1233    </component>
     1234    <component name=\"a\" variability=\"constant\">
     1235        <local name=\"Modelica.SIunits.Area\"/>
     1236        <bindingExpression>
     1237            <integer value=\"2\"/>
     1238        </bindingExpression>
     1239    </component>
     1240
     1241</class>"
     1242 )})));
     1243end TestTypeImport;
     1244
    8871245end ModelicaXMLCodeGenTests;
Note: See TracChangeset for help on using the changeset viewer.