Changeset 12298


Ignore:
Timestamp:
Jan 28, 2019 1:55:21 PM (11 months ago)
Author:
mjohnsson
Message:

#5726 Merge from trunk

Location:
branches/dev-5726-orginal-annotation
Files:
22 edited

Legend:

Unmodified
Added
Removed
  • branches/dev-5726-orginal-annotation

  • branches/dev-5726-orginal-annotation/CHANGELOG.txt

    r12227 r12298  
    11================= Unreleased ==================
     2
     3; Feature ; Minor ; Compiler ; #5725
     4Added splitting of generated C code for initialization of global constants (improves compilation time).
     5
    26; Fixed ; Minor ; Compiler ; #5721
    37Fix c_compiler so it's case insensitive.
  • branches/dev-5726-orginal-annotation/Compiler/FmiXMLCodeGen/src/jastadd/FmiXMLCodeGenTest.jrag

    r10841 r12298  
    3838
    3939        public FmiXMLCodeGenTestCase(String filePath, String className, String description,
    40                 String[] opts, Object[] data) throws Exception {
     40                String platform, String[] opts, Object[] data) throws Exception {
    4141
    42             super(filePath, className, description, opts, data);
     42            super(filePath, className, description, platform, opts, data);
    4343        }
    4444
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenGlobals.jrag

    r11759 r12298  
    268268aspect CCodeGenGlobalVariables {
    269269
     270    public interface GlobalVariableArrayElement extends CodeSplitter.Item {
     271        void gen(CodePrinter p, CodeStream str, String indent);
     272    }
     273
    270274    public class CGenerator {
    271275        public class DAETag_C_model_init_eval_independent_globals extends DAETag {
     
    281285                String next = p.indent(indent);
    282286               
    283                 ArrayList<FGlobalVariable> globals = new ArrayList<>();
     287                final ArrayList<FGlobalVariable> globals = new ArrayList<>();
     288                final ArrayList<FExp> elements = new ArrayList<>();
     289               
    284290                for (FGlobalVariable fv : fclass.getFGlobalVariables()) {
    285                     fv.getBindingExp().genGlobalVariableInitFunc_C(p, str, indent, false);
    286291                    globals.add(fv);
     292                    fv.getBindingExp().collectExpsForGlobalVariableInitFunc_C(elements, false);
     293                }
     294               
     295                CodeSplitter oldSplitter = null;
     296                for (int i = 0; i < elements.size(); i++) {
     297                    oldSplitter = elements.get(i).genGlobalVariableInitFunc_C(p, str, indent, elements, i, oldSplitter);
    287298                }
    288299               
     
    294305                    }
    295306                    @Override
     307                    public void genAtNewFile() {
     308                        for (FExp element : elements) {
     309                            element.genGlobalVariableInitHead_C(p, str, "");
     310                        }
     311                        str.print("\n");
     312                    }
     313                    @Override
    296314                    public void gen(FGlobalVariable element) {
    297315                        element.genGlobalVariableInitCall_C(p, str, indent);
    298316                    }
    299317                };
    300                 splitter.genFuncImpls();
    301                 splitter.genFuncHeads();
    302                 str.print("int model_init_eval_independent_globals(jmi_t* jmi) {\n");
    303                 splitter.printStatusDecl();
    304                 splitter.genFuncCalls();
    305                 splitter.printStatusReturn();
    306                 str.print("}\n");
     318                splitter.setInitialSplit(oldSplitter);
     319                splitter.generate();
    307320            }
    308321        }
     
    317330    }
    318331
    319     public void FExp.genGlobalVariableInitFunc_C(CodePrinter p, CodeStream str, String indent, boolean inArray) {
     332    public void FExp.collectExpsForGlobalVariableInitFunc_C(ArrayList<FExp> list, boolean inArray) {
    320333        if (!type().isExternalObject()) {
    321334            for (FExp arg : childFExps()) {
    322                 arg.genGlobalVariableInitFunc_C(p, str, indent, isArray());
     335                arg.collectExpsForGlobalVariableInitFunc_C(list, isArray());
    323336            }
    324337            if (inArray || !isComposite()) {
     
    327340        }
    328341       
     342        list.add(this);
     343    }
     344
     345    public void CommonAccessExp.collectExpsForGlobalVariableInitFunc_C(ArrayList<FExp> list, boolean inArray) {
     346    }
     347
     348    public void FExp.genGlobalVariableInitHead_C(CodePrinter p, CodeStream str, String indent) {
    329349        String next = p.indent(indent);
    330         String returnType = isArray() ? type().nameArray_C(p) : type().nameScalar_C(p);
    331         if (!type().isExternalObject()) {
    332             returnType = returnType + "*";
    333         }
     350        String returnType = typeReturn_C(p);
     351        str.print(indent, returnType, " jmi_global_", tempName_C(), "(jmi_t* jmi);\n");
     352    }
     353
     354    public CodeSplitter FExp.genGlobalVariableInitFunc_C(CodePrinter p, CodeStream str, String indent,
     355            final ArrayList<FExp> globals, final int index, CodeSplitter oldSplitter) {
     356        String next = p.indent(indent);
     357        final String returnType = typeReturn_C(p);
     358       
     359        ArrayList<GlobalVariableArrayElement> elements = new ArrayList<>();
     360        collectArrayElementsForGenGlobalVariableInitFunc_C(elements);
     361       
     362        final CodeSplitter<GlobalVariableArrayElement> splitter =
     363                new CodeSplitter<GlobalVariableArrayElement>(p, str, next, true, "jmi_global_" + tempName_C(),
     364                myFClass().myOptions(), elements) {
     365            @Override
     366            protected void printFunctionHeader(int split) {
     367                str.print("int ", funcName, "_", split, "(jmi_t* jmi, ", returnType, " ", tempName_C(), ")");
     368            }
     369            @Override
     370            protected void genFuncCall(int split) {
     371                str.print(indent, funcName, "_", split, "(jmi, ", tempName_C(), ");\n");
     372            }
     373            @Override
     374            public void genAtNewFile() {
     375                for (int i = 0; i < index; i++) {
     376                    globals.get(i).genGlobalVariableInitHead_C(p, str, "");
     377                }
     378            }
     379            @Override
     380            public void genDecl(GlobalVariableArrayElement element) {
     381            }
     382            @Override
     383            public void gen(GlobalVariableArrayElement element) {
     384                element.gen(p, str, indent);
     385            }
     386        };
     387        splitter.setInitialSplit(oldSplitter);
     388        splitter.genFuncImpls();
     389        splitter.genFuncHeads();
    334390        str.print(indent, returnType, " jmi_global_", tempName_C(), "(jmi_t* jmi) {\n");
    335391        str.print(next, "JMI_DYNAMIC_INIT()\n");
    336        
    337392        genGlobalVariableInitFuncDecl_C(p, str, next);
    338        
    339393        str.print(next, "JMI_GLOBALS_INIT()\n");
    340        
    341394        genGlobalVariableInitFuncInit_C(p, str, next);
    342        
     395        splitter.genFuncCalls();
    343396        str.print(next, "JMI_GLOBALS_FREE()\n");
    344397        str.print(next, "JMI_DYNAMIC_FREE()\n");
    345398        str.print(next, "return ", tempName_C(), ";\n");
    346         str.print(indent, "}\n\n");
    347     }
    348 
    349     public void CommonAccessExp.genGlobalVariableInitFunc_C(CodePrinter p, CodeStream str, String indent, boolean inArray) {
    350        
    351     }
     399        str.print(indent, "}\n");
     400        return splitter;
     401    }
     402   
     403    public void FExp.collectArrayElementsForGenGlobalVariableInitFunc_C(ArrayList<GlobalVariableArrayElement> list) {
     404    }
     405   
     406    public void FArray.collectArrayElementsForGenGlobalVariableInitFunc_C(ArrayList<GlobalVariableArrayElement> list) {
     407        String name = tempName_C();
     408        String type = type().isRecord() ? C_ARRAY_RECORD : C_ARRAY_VALUE;
     409        String pre = String.format("jmi_array_%s_%d(%s, ", type, ndims(), name);
     410        for (Index i : indices()) {
     411            final String cellName = pre + i.toUnclosedString() + ")";
     412            final FExp cellExp = fArrayCell(i, 0);
     413            list.add(new GlobalVariableArrayElement() {
     414                public void gen(CodePrinter p, CodeStream str, String indent) {
     415                    cellExp.genGlobalVariableInitCall_C(p, str, indent, cellName, true);
     416                }
     417                public int numScalars_C() {
     418                    return cellExp.numScalarsGlobals_C();
     419                }
     420            });
     421        }
     422    }
     423
     424    syn int FExp.numScalarsGlobals_C() = isLiteralZero() ? 0 : 1;
     425    eq FRecordConstructor.numScalarsGlobals_C() = getRecord().recordType().getComponents().getNumChild();
    352426
    353427    public void FExp.genGlobalVariableInitFuncDecl_C(CodePrinter p, CodeStream str, String indent) {
     
    401475        type().size().printDimensions_C(p, str, indent, this);
    402476        str.print(")\n");
    403        
    404         String name = tempName_C();
    405         String type = type().isRecord() ? C_ARRAY_RECORD : C_ARRAY_VALUE;
    406         String pre = String.format("jmi_array_%s_%d(%s, ", type, ndims(), name);
    407         for (Index i : indices()) {
    408             String cellName = pre + i.toUnclosedString() + ")";
    409             FExp cellExp = fArrayCell(i, 0);
    410             cellExp.genGlobalVariableInitCall_C(p, str, indent, cellName, true);
    411         }
    412        
    413477    }
    414478
    415479    public void FExp.genGlobalVariableInitCall_C(CodePrinter p, CodeStream str, String indent, String name, boolean expand) {
    416         if (!isLiteralZero()) {;
     480        if (!isLiteralZero()) {
    417481            str.print(indent, name, " = ");
    418482            p.print(this, str, indent);
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenTypes.jrag

    r11814 r12298  
    2323    eq FFunctionArray.typeReturn_C(CodePrinter p)            = type_C(p);
    2424
     25
     26    syn String FExp.typeReturn_C(CodePrinter p) {
     27        String type = isArray() ? type().nameArray_C(p) : type().nameScalar_C(p);
     28        if (!type().isExternalObject()) {
     29            type = type + "*";
     30        }
     31        return type;
     32    }
    2533
    2634    syn String FType.type_C(CodePrinter p) = isArray() ? arrayType_C(p) : scalarType_C(p);
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaCBackEnd/src/jastadd/CodeGen/CodeSplitter.jrag

    r11759 r12298  
    2323        }
    2424       
    25         private int itemLimit;
    26         private int chunkLimit;
    27         private int splitCount = 0;
    28         private String funcName;
    29         protected CodeStream str;
    30         protected CodePrinter p;
    31         protected String indent;
    32         protected boolean allowDirect;
     25        protected final int itemLimit;
     26        protected final int chunkLimit;
     27        protected final String funcName;
     28        protected final CodeStream str;
     29        protected final CodePrinter p;
     30        protected final String indent;
     31        protected final boolean allowDirect;
    3332       
    3433        private ArrayList<ArrayList<T>> elements = new ArrayList<ArrayList<T>>();
     34        private int itemSplitCount = 0;
     35        private int chunkSplitCount = 0;
    3536       
    3637        public CodeSplitter(CodePrinter p, CodeStream str, String indent,
     
    7374        public void add(T element) {
    7475            int n = element.numScalars_C();
    75             if (elements.size() == 0 || splitCount + n > itemLimit) {
     76            if (elements.size() == 0 || itemSplitCount + n > itemLimit) {
    7677                elements.add(new ArrayList<T>());
    77                 splitCount = 0;
    78             }
    79             splitCount += n;
     78                itemSplitCount = 0;
     79            }
     80            itemSplitCount += n;
    8081            elements.get(elements.size() - 1).add(element);
     82        }
     83       
     84        public void setInitialSplit(CodeSplitter other) {
     85            if (other != null) {
     86                chunkSplitCount = other.chunkSplitCount;
     87            }
    8188        }
    8289       
     
    97104        }
    98105       
     106        protected void printFunctionHeader(int split) {
     107            str.print("int ", funcName, "_", split, "(jmi_t* jmi)");
     108        }
     109       
    99110        public void genFuncHeads() {
    100111            for (int split = 0; split < numSplits(); split++) {
    101                 str.print("int ", funcName, "_", split, "(jmi_t* jmi);\n");
     112                printFunctionHeader(split);
     113                str.print(";\n");
    102114            }
    103115            str.print("\n");
     
    105117       
    106118        public void genFuncImpls() {
    107             for (int split = 0; split < numSplits(); split++) {
    108                 if (split > 0 && split % chunkLimit == 0) {
     119            for (int split = 0; split < numSplits(); split++, chunkSplitCount++) {
     120                if (chunkSplitCount > 0 && chunkSplitCount % chunkLimit == 0) {
    109121                    str.splitFile();
     122                    genAtNewFile();
    110123                }
    111                 str.print("int ", funcName, "_", split, "(jmi_t* jmi) {\n");
    112                 printStatusDecl();
    113                 int n = Math.min(itemLimit, elements.size() - split * itemLimit);
    114                 gen(elements.get(split));
    115                 printStatusReturn();
    116                 str.print("}\n\n");
    117             }
     124                genFuncImpl(elements.get(split), split);
     125            }
     126
     127            if (chunkSplitCount > 0 && chunkSplitCount % chunkLimit == 0) {
     128                str.splitFile();
     129                genAtNewFile();
     130            }
     131            chunkSplitCount++;
     132        }
     133       
     134        protected void genFuncImpl(ArrayList<T> element, int split) {
     135            printFunctionHeader(split);
     136            str.print(" {\n");
     137            printStatusDecl();
     138            gen(element);
     139            printStatusReturn();
     140            str.print("}\n\n");
    118141        }
    119142       
     
    126149            }
    127150            for (int split = 0; split < n; split++) {
    128                 str.print(indent, "ef |= ", funcName, "_", split, "(jmi);\n");
    129             }
     151                genFuncCall(split);
     152            }
     153        }
     154       
     155        protected void genFuncCall(int split) {
     156            str.print(indent, "ef |= ", funcName, "_", split, "(jmi);\n");
    130157        }
    131158       
     
    147174        }
    148175       
     176        public void genAtNewFile() {}
    149177        public abstract void genDecl(T element);
    150178        public void genPre(T element) {}
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaCBackEnd/src/jastadd/test-framework/CTestAnnotationizer.jrag

    r10841 r12298  
    3030         */
    3131        public CCodeGenTestCase(String filePath, String className, String description,
    32                 String[] opts, Object[] data) throws Exception {
     32                String platform, String[] opts, Object[] data) throws Exception {
    3333
    34             super(filePath, className, description, opts, data);
     34            super(filePath, className, description, platform, opts, data);
    3535        }
    3636
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaCBackEnd/templates/FMIBase/init_independent.c

    r11759 r12298  
    2020$C_model_init_eval_independent_start$
    2121
     22int model_init_eval_independent_globals(jmi_t* jmi);
     23int model_init_eval_independent_start(jmi_t* jmi);
     24
    2225int model_init_eval_independent(jmi_t* jmi) {
    2326    model_init_eval_independent_globals(jmi);
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaCBackEnd/test/modelica/SplitCodeTests.mo

    r11759 r12298  
    478478}
    479479
     480/*** SPLIT FILE ***/
     481
    480482int model_ode_derivatives_0(jmi_t* jmi);
    481483int model_ode_derivatives_1(jmi_t* jmi);
     
    782784end SplitCodeTestStartValueZero;
    783785
     786model SplitCodeTestGlobals1
     787    record R
     788        Real[4] a;
     789    end R;
     790   
     791    constant R[2] c = {R(1:4), R(5:8)};
     792   
     793    function f
     794        input Real x;
     795        input Integer i;
     796        output Real y = x + c[i].a[i];
     797    algorithm
     798        annotation(Inline=false);
     799    end f;
     800
     801    Real y = f(time, 1);
     802
     803annotation(__JModelica(UnitTesting(tests={
     804    CCodeGenTestCase(
     805        name="SplitCodeTestGlobals1",
     806        description="Test code splitting of globals, splitting files between functions",
     807        cc_split_function_limit=2,
     808        template="$C_model_init_eval_independent_globals$",
     809        generatedCode="
     810jmi_array_t* jmi_global_tmp_1(jmi_t* jmi) {
     811    JMI_DYNAMIC_INIT()
     812    JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_1, 4, 1)
     813    JMI_GLOBALS_INIT()
     814    JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_1, 4, 1, 4)
     815    jmi_array_val_1(tmp_1, 1) = AD_WRAP_LITERAL(1);
     816    jmi_array_val_1(tmp_1, 2) = AD_WRAP_LITERAL(2);
     817    jmi_array_val_1(tmp_1, 3) = AD_WRAP_LITERAL(3);
     818    jmi_array_val_1(tmp_1, 4) = AD_WRAP_LITERAL(4);
     819    JMI_GLOBALS_FREE()
     820    JMI_DYNAMIC_FREE()
     821    return tmp_1;
     822}
     823
     824jmi_array_t* jmi_global_tmp_2(jmi_t* jmi) {
     825    JMI_DYNAMIC_INIT()
     826    JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_2, 4, 1)
     827    JMI_GLOBALS_INIT()
     828    JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_2, 4, 1, 4)
     829    jmi_array_val_1(tmp_2, 1) = AD_WRAP_LITERAL(5);
     830    jmi_array_val_1(tmp_2, 2) = AD_WRAP_LITERAL(6);
     831    jmi_array_val_1(tmp_2, 3) = AD_WRAP_LITERAL(7);
     832    jmi_array_val_1(tmp_2, 4) = AD_WRAP_LITERAL(8);
     833    JMI_GLOBALS_FREE()
     834    JMI_DYNAMIC_FREE()
     835    return tmp_2;
     836}
     837
     838/*** SPLIT FILE ***/
     839
     840jmi_array_t* jmi_global_tmp_1(jmi_t* jmi);
     841jmi_array_t* jmi_global_tmp_2(jmi_t* jmi);
     842
     843R_0_ra* jmi_global_tmp_3(jmi_t* jmi) {
     844    JMI_DYNAMIC_INIT()
     845    JMI_ARR(DYNA, R_0_r, R_0_ra, tmp_3, 2, 1)
     846    JMI_GLOBALS_INIT()
     847    JMI_ARRAY_INIT_1(DYNA, R_0_r, R_0_ra, tmp_3, 2, 1, 2)
     848    jmi_array_rec_1(tmp_3, 1)->a = jmi_global_tmp_1(jmi);
     849    jmi_array_rec_1(tmp_3, 2)->a = jmi_global_tmp_2(jmi);
     850    JMI_GLOBALS_FREE()
     851    JMI_DYNAMIC_FREE()
     852    return tmp_3;
     853}
     854
     855int model_init_eval_independent_globals_0(jmi_t* jmi) {
     856    int ef = 0;
     857    JMI_DYNAMIC_INIT()
     858    JMI_GLOBAL(SplitCodeTests_SplitCodeTestGlobals1_c) = jmi_global_tmp_3(jmi);
     859    JMI_DYNAMIC_FREE()
     860    return ef;
     861}
     862
     863/*** SPLIT FILE ***/
     864
     865jmi_array_t* jmi_global_tmp_1(jmi_t* jmi);
     866jmi_array_t* jmi_global_tmp_2(jmi_t* jmi);
     867R_0_ra* jmi_global_tmp_3(jmi_t* jmi);
     868
     869int model_init_eval_independent_globals_0(jmi_t* jmi);
     870
     871int model_init_eval_independent_globals(jmi_t* jmi) {
     872    int ef = 0;
     873    JMI_DYNAMIC_INIT()
     874    ef |= model_init_eval_independent_globals_0(jmi);
     875    JMI_DYNAMIC_FREE()
     876    return ef;
     877}
     878
     879")})));
     880end SplitCodeTestGlobals1;
     881
     882model SplitCodeTestGlobals2
     883    record R
     884        Real[4] a;
     885    end R;
     886   
     887    constant R[1] c = {R(1:4)};
     888   
     889    function f
     890        input Real x;
     891        input Integer i;
     892        output Real y = x + c[i].a[i];
     893    algorithm
     894        annotation(Inline=false);
     895    end f;
     896
     897    Real y = f(time, 1);
     898
     899annotation(__JModelica(UnitTesting(tests={
     900    CCodeGenTestCase(
     901        name="SplitCodeTestGlobals2",
     902        description="Test code splitting of globals, splitting arrays into multiple functions",
     903        cc_split_function_limit=2,
     904        cc_split_element_limit=2,
     905        template="$C_model_init_eval_independent_globals$",
     906        generatedCode="
     907int jmi_global_tmp_1_0(jmi_t* jmi, jmi_array_t* tmp_1) {
     908    int ef = 0;
     909    JMI_DYNAMIC_INIT()
     910    jmi_array_val_1(tmp_1, 1) = AD_WRAP_LITERAL(1);
     911    jmi_array_val_1(tmp_1, 2) = AD_WRAP_LITERAL(2);
     912    JMI_DYNAMIC_FREE()
     913    return ef;
     914}
     915
     916int jmi_global_tmp_1_1(jmi_t* jmi, jmi_array_t* tmp_1) {
     917    int ef = 0;
     918    JMI_DYNAMIC_INIT()
     919    jmi_array_val_1(tmp_1, 3) = AD_WRAP_LITERAL(3);
     920    jmi_array_val_1(tmp_1, 4) = AD_WRAP_LITERAL(4);
     921    JMI_DYNAMIC_FREE()
     922    return ef;
     923}
     924
     925/*** SPLIT FILE ***/
     926
     927int jmi_global_tmp_1_0(jmi_t* jmi, jmi_array_t* tmp_1);
     928int jmi_global_tmp_1_1(jmi_t* jmi, jmi_array_t* tmp_1);
     929
     930jmi_array_t* jmi_global_tmp_1(jmi_t* jmi) {
     931    JMI_DYNAMIC_INIT()
     932    JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_1, 4, 1)
     933    JMI_GLOBALS_INIT()
     934    JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_1, 4, 1, 4)
     935    jmi_global_tmp_1_0(jmi, tmp_1);
     936    jmi_global_tmp_1_1(jmi, tmp_1);
     937    JMI_GLOBALS_FREE()
     938    JMI_DYNAMIC_FREE()
     939    return tmp_1;
     940}
     941
     942R_0_ra* jmi_global_tmp_2(jmi_t* jmi) {
     943    JMI_DYNAMIC_INIT()
     944    JMI_ARR(DYNA, R_0_r, R_0_ra, tmp_2, 1, 1)
     945    JMI_GLOBALS_INIT()
     946    JMI_ARRAY_INIT_1(DYNA, R_0_r, R_0_ra, tmp_2, 1, 1, 1)
     947    jmi_array_rec_1(tmp_2, 1)->a = jmi_global_tmp_1(jmi);
     948    JMI_GLOBALS_FREE()
     949    JMI_DYNAMIC_FREE()
     950    return tmp_2;
     951}
     952
     953/*** SPLIT FILE ***/
     954
     955jmi_array_t* jmi_global_tmp_1(jmi_t* jmi);
     956R_0_ra* jmi_global_tmp_2(jmi_t* jmi);
     957
     958int model_init_eval_independent_globals_0(jmi_t* jmi) {
     959    int ef = 0;
     960    JMI_DYNAMIC_INIT()
     961    JMI_GLOBAL(SplitCodeTests_SplitCodeTestGlobals2_c) = jmi_global_tmp_2(jmi);
     962    JMI_DYNAMIC_FREE()
     963    return ef;
     964}
     965
     966int model_init_eval_independent_globals_0(jmi_t* jmi);
     967
     968int model_init_eval_independent_globals(jmi_t* jmi) {
     969    int ef = 0;
     970    JMI_DYNAMIC_INIT()
     971    ef |= model_init_eval_independent_globals_0(jmi);
     972    JMI_DYNAMIC_FREE()
     973    return ef;
     974}
     975
     976")})));
     977end SplitCodeTestGlobals2;
     978
     979model SplitCodeTestGlobals3
     980   
     981    constant Real[4] c = 0:3;
     982   
     983    function f
     984        input Real x;
     985        input Integer i;
     986        output Real y = x + c[i];
     987    algorithm
     988        annotation(Inline=false);
     989    end f;
     990
     991    Real y = f(time, 1);
     992
     993annotation(__JModelica(UnitTesting(tests={
     994    CCodeGenTestCase(
     995        name="SplitCodeTestGlobals3",
     996        description="Test code splitting of globals, splitting array with a zero",
     997        cc_split_element_limit=1,
     998        template="$C_model_init_eval_independent_globals$",
     999        generatedCode="
     1000int jmi_global_tmp_1_0(jmi_t* jmi, jmi_array_t* tmp_1) {
     1001    int ef = 0;
     1002    JMI_DYNAMIC_INIT()
     1003    jmi_array_val_1(tmp_1, 2) = 1;
     1004    JMI_DYNAMIC_FREE()
     1005    return ef;
     1006}
     1007
     1008int jmi_global_tmp_1_1(jmi_t* jmi, jmi_array_t* tmp_1) {
     1009    int ef = 0;
     1010    JMI_DYNAMIC_INIT()
     1011    jmi_array_val_1(tmp_1, 3) = 2;
     1012    JMI_DYNAMIC_FREE()
     1013    return ef;
     1014}
     1015
     1016int jmi_global_tmp_1_2(jmi_t* jmi, jmi_array_t* tmp_1) {
     1017    int ef = 0;
     1018    JMI_DYNAMIC_INIT()
     1019    jmi_array_val_1(tmp_1, 4) = 3;
     1020    JMI_DYNAMIC_FREE()
     1021    return ef;
     1022}
     1023
     1024int jmi_global_tmp_1_0(jmi_t* jmi, jmi_array_t* tmp_1);
     1025int jmi_global_tmp_1_1(jmi_t* jmi, jmi_array_t* tmp_1);
     1026int jmi_global_tmp_1_2(jmi_t* jmi, jmi_array_t* tmp_1);
     1027
     1028jmi_array_t* jmi_global_tmp_1(jmi_t* jmi) {
     1029    JMI_DYNAMIC_INIT()
     1030    JMI_ARR(DYNA, jmi_real_t, jmi_array_t, tmp_1, 4, 1)
     1031    JMI_GLOBALS_INIT()
     1032    JMI_ARRAY_INIT_1(DYNA, jmi_real_t, jmi_array_t, tmp_1, 4, 1, 4)
     1033    jmi_global_tmp_1_0(jmi, tmp_1);
     1034    jmi_global_tmp_1_1(jmi, tmp_1);
     1035    jmi_global_tmp_1_2(jmi, tmp_1);
     1036    JMI_GLOBALS_FREE()
     1037    JMI_DYNAMIC_FREE()
     1038    return tmp_1;
     1039}
     1040int model_init_eval_independent_globals_0(jmi_t* jmi) {
     1041    int ef = 0;
     1042    JMI_DYNAMIC_INIT()
     1043    JMI_GLOBAL(SplitCodeTests_SplitCodeTestGlobals3_c) = jmi_global_tmp_1(jmi);
     1044    JMI_DYNAMIC_FREE()
     1045    return ef;
     1046}
     1047
     1048int model_init_eval_independent_globals_0(jmi_t* jmi);
     1049
     1050int model_init_eval_independent_globals(jmi_t* jmi) {
     1051    int ef = 0;
     1052    JMI_DYNAMIC_INIT()
     1053    ef |= model_init_eval_independent_globals_0(jmi);
     1054    JMI_DYNAMIC_FREE()
     1055    return ef;
     1056}
     1057")})));
     1058end SplitCodeTestGlobals3;
     1059
    7841060end SplitCodeTests;
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaCompiler

    • Property svn:ignore
      •  

        old new  
        33doc
        44junit*.properties
         5build
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaFMUXBackEnd/src/jastadd/test-framework/XMLTestAnnotationizer.jrag

    r10841 r12298  
    3030         */
    3131        public XMLCodeGenTestCase(String filePath, String className, String description,
    32                 String[] opts, Object[] data) throws Exception {
     32                String platform, String[] opts, Object[] data) throws Exception {
    3333
    34             super(filePath, className, description, opts, data);
     34            super(filePath, className, description, platform, opts, data);
    3535        }
    3636
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaFrontEnd/src/jastadd/util/Annotations.jrag

    r12297 r12298  
    7676    eq InstComponentDecl.annotation(InstContext instContext) = mySrcAnnotatable().annotation(instContext);
    7777
     78    eq InstExtends.annotation(InstContext instContext)      = getSrcExtendsClause().annotation(instContext);
     79    eq SrcExtendsClause.annotation(InstContext instContext) = annotationOfChild(getSrcAnnotationOpt(), instContext);
     80   
    7881    public class FFunctionDecl     implements FAttributeListAnnotationNode.FAttributeList {}
    7982    public class FVariable         implements FAttributeListAnnotationNode.FAttributeList {}
     
    180183    }
    181184    public void InstNode.addAnnotationToEvaluator(ArrayList<AnnotationNode> list, InstNode evaluator) {
    182         if (annotationExpEvaluator().equals(evaluator) && annotation().exists()) {
     185        if (annotation().exists()) {
    183186            list.add(annotation());
    184187        }
     
    200203    eq InstFullClassDecl.annotations() {
    201204        ArrayList<AnnotationNode> list = super.annotations();
    202         this.addAnnotationToEvaluator(list, this);
     205        addAnnotationToEvaluator(list, this);
    203206        getInstExternalOpt().addAnnotationToEvaluator(list, this);
    204207        return list;
    205208    }
    206    
     209    eq InstComponentDecl.annotations() {
     210        ArrayList<AnnotationNode> list = super.annotations();
     211        myInstClass().addAnnotationToEvaluator(list, this);
     212        return list;
     213    }
     214    eq InstExtends.annotations() {
     215        ArrayList<AnnotationNode> list = super.annotations();
     216        addAnnotationToEvaluator(list, this);
     217        myInstClass().addAnnotationToEvaluator(list, this);
     218        return list;
     219    }
     220    eq InstAbstractShortClassDecl.annotations() {
     221        ArrayList<AnnotationNode> list = new ArrayList<>();
     222        addAnnotationToEvaluator(list, this);
     223        myTargetInstClassDecl().addAnnotationToEvaluator(list, this);
     224        return list;
     225    }
     226
    207227    syn ArrayList<SrcExp> InstNode.annotationExps() {
    208228        ArrayList<SrcExp> exps = new ArrayList<>();
     
    419439        InstLookupResult<InstClassDecl>     lookupInstClass(SrcExp exp);
    420440        InstLookupResult<InstComponentDecl> lookupInstComponent(SrcExp exp);
    421         FExp dynamicFExp(FExp exp);
    422441    }
    423442
     
    458477
    459478            public InstLookupResult<InstComponentDecl> lookupInstComponent(SrcExp exp) {
    460                 return null;
    461             }
    462            
    463             public FExp dynamicFExp(FExp exp) {
    464479                return null;
    465480            }
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaFrontEnd/src/jastadd/util/SrcAnnotations.jrag

    r12094 r12298  
    4545    }
    4646    public SrcAnnotationNode InstComponentDecl.srcAnnotation(String ... path) {
    47         return SrcAnnotationNode.createFor(srcAnnotationProvider(), new SrcAnnotationNode.InstEvaluator(this), path);
     47        return SrcAnnotationNode.createFor(srcAnnotationProvider(), new SrcAnnotationNode.InstEvaluator(containingInstNode()), path);
    4848    }
    4949
     
    172172            @Override
    173173            public ConstValue evaluate(SrcExp evaluable) {
    174                 FExp fexp = context.dynamicFExp(evaluable.instantiate());
    175                 return fexp.evaluateValue();
     174                return context.ceval(evaluable);
    176175            }
    177176           
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/junit/TestTreeRunner.java

    r10946 r12298  
    132132        } else {
    133133            Description d = caseDesc.get(test.getName());
    134             note.fireTestStarted(d);
    135             try {
    136                 ((GenericTestCase) test).testMe(spec.asserter());
    137             } catch (Throwable e) {
    138                 note.fireTestFailure(new Failure(d, e));
    139                 if(outputFailing) {
    140                     try(PrintWriter pw = new PrintWriter(new FileOutputStream(new File(outputFailingFile), appendMode))) {
    141                         pw.println(testFile.getAbsolutePath()+","+modelNames.get(test.getName()));
    142                         appendMode = true;
    143                     } catch (FileNotFoundException e1) {
    144                         e1.printStackTrace();
     134            if(((GenericTestCase) test).shouldBeIgnored()) {
     135                note.fireTestIgnored(d);
     136            } else {
     137                note.fireTestStarted(d);
     138                try {
     139                    ((GenericTestCase) test).testMe(spec.asserter());
     140                } catch (Throwable e) {
     141                    note.fireTestFailure(new Failure(d, e));
     142                    if(outputFailing) {
     143                        try(PrintWriter pw = new PrintWriter(new FileOutputStream(new File(outputFailingFile), appendMode))) {
     144                            pw.println(testFile.getAbsolutePath()+","+modelNames.get(test.getName()));
     145                            appendMode = true;
     146                        } catch (FileNotFoundException e1) {
     147                            e1.printStackTrace();
     148                        }
    145149                    }
    146150                }
     151                note.fireTestFinished(d);
    147152            }
    148             note.fireTestFinished(d);
    149153        }
    150154    }
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/util/TestAnnotationizer.java

    r10846 r12298  
    8181        Lang inputlang = Lang.none;
    8282        Lang lang = Lang.none;
     83        String platform = null;
    8384        String opts = null;
    8485        String checkType = null;
     
    9495            } else if (arg.startsWith("-d=")) {
    9596                data = value;
     97            } else if (arg.startsWith("-P=")) {
     98                platform = value;
    9699            } else if (arg.startsWith("-p=")) {
    97100                opts = value;
     
    198201                }
    199202               
    200                 doAnnotation(optimica, filePath, testType, modelName, description, opts, data, checkType, libs, write);
     203                doAnnotation(optimica, filePath, testType, modelName, description, platform, opts, data, checkType, libs, write);
    201204            }
    202205           
     
    266269
    267270    private static void doAnnotation(boolean optimica, String filePath,
    268             String testType, String modelName, String description, String optStr,
     271            String testType, String modelName, String description, String platform, String optStr,
    269272            String data, String checkType, String libStr, boolean write) throws Exception {
    270273        String[] opts = (optStr == null) ? new String[0] : optStr.split(",");
    271274        String[] libs = (libStr == null) ? new String[0] : libStr.split(",");
    272275        Method m = getHelperClass(optimica ? OPTIMICA : MODELICA).getMethod("doAnnotation",
    273                 String.class, String.class, String.class, String.class, String[].class, String.class,
     276                String.class, String.class, String.class, String.class, String.class, String[].class, String.class,
    274277                String.class, String[].class, boolean.class);
    275         m.invoke(null, filePath, testType, modelName, description, opts, data, checkType, libs, write);
     278        m.invoke(null, filePath, testType, modelName, description, platform, opts, data, checkType, libs, write);
    276279    }
    277280
  • branches/dev-5726-orginal-annotation/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/util/test/GenericTestCase.java

    r7909 r12298  
    1818public interface GenericTestCase extends GenericTestTreeNode {
    1919
     20    /**
     21     * Returns {@code true} if this test should be ignored.
     22     */
     23    public boolean shouldBeIgnored();
    2024    public void testMe(Assert a);
    2125
  • branches/dev-5726-orginal-annotation/Compiler/OptimicaCompiler

    • Property svn:ignore
      •  

        old new  
        33doc
        44junit*.properties
         5build
  • branches/dev-5726-orginal-annotation/Compiler/TestFramework/src/jastadd/TestAnnotationizer.jrag

    r11728 r12298  
    7373     */
    7474    public static void doAnnotation(String filePath, String testType, String modelName, String description,
    75             String[] opts, String data, String checkType, String[] libs, boolean write) throws Exception {
     75            String platform, String[] opts, String data, String checkType, String[] libs, boolean write) throws Exception {
    7676
    7777        try {
    7878            Class cl = getTestCase(testType);
    7979            Constructor constructor =
    80                     cl.getConstructor(String.class, String.class, String.class, String[].class, Object[].class);
     80                    cl.getConstructor(String.class, String.class, String.class, String.class, String[].class, Object[].class);
    8181
    8282            TestAnnotationizerHelper ta =
    83                     (TestAnnotationizerHelper) constructor.newInstance(filePath, modelName, description, opts, new Object[] { data });
     83                    (TestAnnotationizerHelper) constructor.newInstance(filePath, modelName, description, platform, opts, new Object[] { data });
    8484
    8585            ta.setCheckType(checkType);
     
    255255    protected SourceRoot root;
    256256    protected Object[] data;
     257    protected String platform;
    257258    protected String[] opts;
    258259    protected String[] libs;
     
    270271     * @param className    the name of the test model
    271272     * @param description  the text to put in the "description" field of the test annotation
     273     * @param platform     see {@link #doAnnotation(String, String, String, String, String[], String, String, String[], boolean)}
    272274     * @param opts         comma-separated list of compiler options to override defaults for
    273275     * @param data         any extra data to send to the delegate object
    274276     */
    275277    public TestAnnotationizerHelper(String filePath, String className, String description,
    276             String[] opts, Object[] data) throws Exception {
     278            String platform, String[] opts, Object[] data) throws Exception {
    277279
    278280        this.filePath = filePath;
    279281        this.className = className;
    280282        this.description = prepare(description);
     283        this.platform = platform;
    281284        this.opts = opts;
    282285        this.data = data;
     
    301304        AnnotationNode a = cd.annotation("__JModelica/UnitTesting/tests").iterator().next();
    302305        this.description = annotationString(a.forPath("description"), false);
     306        this.platform = annotationString(a.forPath("platform"), false);
    303307        this.data = getData(a, dataNames(), false);
    304308        setCheckType(annotationString(a.forPath("checkType"), false));
     
    605609        out.println(indent + "        name=\"" + testName + "\",");
    606610        out.println(indent + "        description=\"" + description + "\",");
     611        if (platform != null)             
     612            out.println(indent + "        platform=\"" + platform + "\",");
    607613        if (hasModelicaLibraries())
    608614            out.println(indent + "        modelicaLibraries=\"" + getModelicaLibrariesString() + "\",");
     
    755761         */
    756762        public CodeGenTestCase(String filePath, String className, String description,
    757                 String[] opts, Object[] data) throws Exception {
    758 
    759             super(filePath, className, description, opts, data);
     763                String platform, String[] opts, Object[] data) throws Exception {
     764
     765            super(filePath, className, description, platform, opts, data);
    760766        }
    761767
     
    820826         */
    821827        public GenericCodeGenTestCase(String filePath, String className, String description,
    822                 String[] opts, Object[] data) throws Exception {
    823 
    824             super(filePath, className, description, opts, data);
     828                String platform, String[] opts, Object[] data) throws Exception {
     829
     830            super(filePath, className, description, platform, opts, data);
    825831        }
    826832
     
    869875         */
    870876        public FlatteningTestCase(String filePath, String className, String description,
    871                 String[] opts, Object[] data) throws Exception {
    872 
    873             super(filePath, className, description, opts, data);
     877                String platform, String[] opts, Object[] data) throws Exception {
     878
     879            super(filePath, className, description, platform, opts, data);
    874880        }
    875881
     
    916922         */
    917923        public TransformCanonicalTestCase(String filePath, String className, String description,
    918                 String[] opts, Object[] data) throws Exception {
    919 
    920             super(filePath, className, description, opts, data);
     924                String platform, String[] opts, Object[] data) throws Exception {
     925
     926            super(filePath, className, description, platform, opts, data);
    921927        }
    922928
     
    955961         */
    956962        public ErrorTestCaseHelper(String filePath, String className, String description,
    957                 String[] opts, Object[] data) throws Exception {
    958 
    959             super(filePath, className, description, opts, data);
     963                String platform, String[] opts, Object[] data) throws Exception {
     964
     965            super(filePath, className, description, platform, opts, data);
    960966        }
    961967
     
    10231029         */
    10241030        public WarningTestCase(String filePath, String className, String description,
    1025                 String[] opts, Object[] data) throws Exception {
    1026 
    1027             super(filePath, className, description, opts, data);
     1031                String platform, String[] opts, Object[] data) throws Exception {
     1032
     1033            super(filePath, className, description, platform, opts, data);
    10281034        }
    10291035
     
    10691075         */
    10701076        public ComplianceErrorTestCase(String filePath, String className, String description,
    1071                 String[] opts, Object[] data) throws Exception {
    1072 
    1073             super(filePath, className, description, opts, data);
     1077                String platform, String[] opts, Object[] data) throws Exception {
     1078
     1079            super(filePath, className, description, platform, opts, data);
    10741080        }
    10751081
     
    11121118         */
    11131119        public MethodTestCase(String filePath, String className, String description,
    1114                 String[] opts, Object[] data) throws Exception {
    1115 
    1116             super(filePath, className, description, opts, data);
     1120                String platform, String[] opts, Object[] data) throws Exception {
     1121
     1122            super(filePath, className, description, platform, opts, data);
    11171123        }
    11181124
     
    11751181         */
    11761182        public FClassMethodTestCase(String filePath, String className, String description,
    1177                 String[] opts, Object[] data) throws Exception {
    1178 
    1179             super(filePath, className, description, opts, data);
     1183                String platform, String[] opts, Object[] data) throws Exception {
     1184
     1185            super(filePath, className, description, platform, opts, data);
    11801186        }
    11811187
     
    12101216         * Compiles the model.
    12111217         */
    1212         public InstClassMethodTestCase(String filePath, String className, String description, String[] opts,
     1218        public InstClassMethodTestCase(String filePath, String className, String description, String platform, String[] opts,
    12131219                Object[] data) throws Exception {
    12141220
    1215             super(filePath, className, description, opts, data);
     1221            super(filePath, className, description, platform, opts, data);
    12161222        }
    12171223
     
    12461252         */
    12471253        public SourceMethodTestCase(String filePath, String className, String description,
    1248                 String[] opts, Object[] data) throws Exception {
    1249 
    1250             super(filePath, className, description, opts, data);
     1254                String platform, String[] opts, Object[] data) throws Exception {
     1255
     1256            super(filePath, className, description, platform, opts, data);
    12511257        }
    12521258
     
    12851291         */
    12861292        public EvalTestCase(String filePath, String className, String description,
    1287                 String[] opts, Object[] data) throws Exception {
    1288 
    1289             super(filePath, className, description, opts, data);
     1293                String platform, String[] opts, Object[] data) throws Exception {
     1294
     1295            super(filePath, className, description, platform, opts, data);
    12901296        }
    12911297
     
    13851391
    13861392        public TimeTestCase(String filePath, String className, String description,
    1387                 String[] opts, Object[] data) throws Exception {
    1388 
    1389             super(filePath, className, description, opts, data);
     1393                String platform, String[] opts, Object[] data) throws Exception {
     1394
     1395            super(filePath, className, description, platform, opts, data);
    13901396        }
    13911397
     
    14501456         */
    14511457        public OptionTestCase(String filePath, String className,
    1452                 String description, String[] opts, Object[] data) throws Exception {
    1453 
    1454             super(filePath, className, description, opts, data);
     1458                String description, String platform, String[] opts, Object[] data) throws Exception {
     1459
     1460            super(filePath, className, description, platform, opts, data);
    14551461        }
    14561462
  • branches/dev-5726-orginal-annotation/Compiler/TestFramework/src/jastadd/TestCase.jrag

    r11347 r12298  
    1717import java.io.File;
    1818import java.util.Iterator;
     19import java.util.Set;
    1920import java.util.regex.Matcher;
    2021import java.util.Collection;
     22import java.util.Collections;
    2123import java.util.ArrayList;
    2224import java.util.Arrays;
     
    5557    private String name = null;
    5658    private String description = null;
     59    private String platform = null;
    5760    private String sourceFileName = null;
    5861    private String className = null;
     
    229232
    230233    /**
     234     * platform is an optional annotation that allows to specify for which platforms the test should be run or skipped.
     235     * see {@code org.jmodelica.util.Arguments#tooltip()} for possible platforms.
     236     *
     237     * Assume that the system platform is win64.
     238     * Example 1 (only excluded platforms):
     239     *   annotation(
     240     *     platform="!linux64")
     241     * Here, win64 is included, because it is not listed as an excluded platform.
     242     *
     243     * Example 2 (both included and excluded platforms):
     244     *   annotation(
     245     *     platform="win32 !linux64")
     246     * Here, win64 is excluded, because the list of platforms includes included platforms,
     247     * and win64 is not listed as an included platform.
     248     *
     249     * Example 3 (no platform annotation):
     250     *   annotation(
     251     *     )
     252     * When the platform annotation is omitted, win64 is included, because it is not listed as an excluded platform.
     253     * @return the platform
     254     */
     255    public String getPlatform() {
     256        return platform;
     257    }
     258
     259    /**
     260     * @param platform the platform to set
     261     */
     262    public void setPlatform(String platform) {
     263        this.platform = platform;
     264    }
     265
     266    /**
    231267     * @return the sourceFileName
    232268     */
     
    466502    }
    467503   
     504    public boolean shouldBeIgnored() {
     505        String platforms = getPlatform();
     506        PlatformSet platformSet = PlatformSet.parse(platforms);
     507        String systemPlatform = EnvironmentUtils.getSystemPlatform();
     508        return platformSet.isPlatformExcluded(systemPlatform);
     509    }
     510
     511    public static class PlatformSet {
     512        private static PlatformSet EMPTY_PLATFORMSET = new PlatformSet(Collections.<String>emptySet(), Collections.<String>emptySet());
     513        private Set<String> includedPlatforms;
     514        private Set<String> excludedPlatforms;
     515        private PlatformSet(Set<String> includedPlatforms, Set<String> excludedPlatforms) {
     516            this.includedPlatforms = includedPlatforms;
     517            this.excludedPlatforms = excludedPlatforms;
     518        }
     519        /**
     520         * parses a string of the form "win32 !linux64" and returns a PlatformSet.
     521         * See {@code TestCase.getPlatform()} for usage.
     522         */
     523        public static PlatformSet parse(String string) {
     524            if(string == null || string.equals("")) {
     525                return EMPTY_PLATFORMSET;
     526            }
     527            Set<String> includedPlatforms = new HashSet<>();
     528            Set<String> excludedPlatforms = new HashSet<>();
     529            String[] words = string.split(" ");
     530            for(String word : words) {
     531                if(word.startsWith("!")) {
     532                    excludedPlatforms.add(word.substring(1));
     533                } else {
     534                    includedPlatforms.add(word);
     535                }
     536            }
     537            return new PlatformSet(includedPlatforms, excludedPlatforms);
     538        }
     539       
     540       boolean isPlatformExcluded(String platform) {
     541           return excludedPlatforms.contains(platform) || !includedPlatforms.isEmpty() && !includedPlatforms.contains(platform);
     542       }
     543    }
     544
    468545    public void testMe(Assert a) {
    469546        try {
  • branches/dev-5726-orginal-annotation/Compiler/UsersGuide/doc/ReleaseNotes.xml

    r12160 r12298  
    1010          xmlns:db="http://docbook.org/ns/docbook">
    1111  <title>Release Notes</title>
     12   
     13    <section>
     14    <title>Release notes for JModelica.org version 2.8</title>   
     15        <para>For this release there are some minor performance and debug improvements</para>
     16    </section>
     17   
    1218    <section>
    1319    <title>Release notes for JModelica.org version 2.6.1</title>   
  • branches/dev-5726-orginal-annotation/Compiler/build-base.xml

    r11506 r12298  
    4040    <property name="test_output" value="${target}/doc/junit-reports" />
    4141    <property name="class_output" value="${target}/bin" />
     42    <property name="build_class_output" value="${target}/build/bin" />
    4243    <property name="jar_output" value="${target}/bin" />
    4344
     
    8889    <property name="ast_output" value="${java_output_intermediate}/${ast_package_dir}" />
    8990    <propertyregex property="parser_package_dir" input="${parser_package}" defaultValue="${parser_package}" regexp="\." replace="/" global="true" />
    90     <property name="parser_output" value="${java_output_intermediate}/${parser_package_dir}" />
     91    <property name="parsers.output" value="${java_output_intermediate}/${parser_package_dir}" />
     92    <property name="parsers.builddir" value="${target}/build/${sub_package}/parsers" />
     93    <property name="scanners.output" value="${java_output_intermediate}" />
     94    <property name="scanners.builddir" value="${target}/build/${sub_package}/scanners" />
    9195    <propertyregex property="test_package_dir" input="${test_package}" defaultValue="${test_package}" regexp="\." replace="/" global="true" />
    9296    <property name="test_package_output" value="${junit_output}/${test_package_dir}" />
     
    520524        <attribute name="gen-extra" default="NOT SET"/>
    521525        <sequential>
    522             <mkdir dir="${class_output}" />
     526            <mkdir dir="${build_class_output}" />
    523527            <for list="${modules}" param="module">
    524528                <sequential>
     
    527531                        <then>
    528532                            <javac  classpath="${beaver-rt_jar}"
    529                                     sourcepath="${java_output_intermediate}:${java_dirs}"
     533                                    srcdir="${java_dirs}:${@{module}.java_path}"
    530534                                    compiler="${java_compiler}"
    531535                                    source="${java_version}"
     
    534538                                    encoding="UTF8"
    535539                                    debug="false"
    536                                     destdir="${class_output}"
     540                                    destdir="${build_class_output}"
    537541                                    includeantruntime="false"
    538542                                    excludes="${test_helper_java_patterns}" >
    539                                 <src path="${@{module}.java_path}" />
    540                                 <src path="${java_output_intermediate}" />
    541543                                <include name="${@{module}.@{gen-extra}.javafile}.java" />
    542544                            </javac>
     
    697699                            -->
    698700                            <mkdir dir="${@{module}.@{gen-extra}.gen_path}" />
    699                             <java classpath="${class_output}:${beaver-rt_jar}"
     701                            <java classpath="${build_class_output}:${beaver-rt_jar}"
    700702                                    classname="${@{module}.@{generate}}" failonerror="true">
    701703                                <arg value="${@{module}.@{gen-extra}.gen_path}" />
     
    815817   
    816818    <!-- generate all parsers -->
    817     <target name="parser">
     819    <target name="parser-build">
    818820        <for list="${modules}" param="module">
    819821            <sequential>
     
    842844                                </if>
    843845                                <!-- check if files are up to date -->
    844                                 <uptodate property="@{module}.@{parser}.uptodate" targetfile="${parser_output}/@{parser}.java">
     846                                <uptodate property="@{module}.@{parser}.uptodate" targetfile="${parsers.builddir}/@{parser}.java">
    845847                                    <srcresources>
    846848                                        <fileset file="${parser_main_path}" />
     
    856858                                            <isset property="@{module}.@{parser}.extend" />
    857859                                            <then>
    858                                                 <concat destfile="${parser_output}/@{parser}.parser">
     860                                                <concat destfile="${parsers.builddir}/@{parser}.parser">
    859861                                                    <fileset file="${parser_main_path}" />
    860862                                                    <fileset file="${parser_tail_path}" />
     
    862864                                            </then>
    863865                                            <else>
    864                                                 <copy file="${parser_main_path}" tofile="${parser_output}/@{parser}.parser" overwrite="true" />
     866                                                <copy file="${parser_main_path}" tofile="${parsers.builddir}/@{parser}.parser" overwrite="true" />
    865867                                            </else>
    866868                                        </if>
    867869                                        <!-- write package names into parser specification -->
    868                                         <replace file="${parser_output}/@{parser}.parser">
     870                                        <replace file="${parsers.builddir}/@{parser}.parser">
    869871                                            <replacefilter token="$PARSER_PACKAGE$" value="${parser_package}" />
    870872                                            <replacefilter token="$AST_PACKAGE$" value="${ast_package}" />
     
    872874                                        <!-- translate to beaver syntax -->
    873875                                        <java classpath="${jastadd_dir}/JastAddParser.jar:${beaver-rt_jar}" classname="Main">
    874                                             <arg value="${parser_output}/@{parser}.parser"/>
    875                                             <arg value="${parser_output}/@{parser}.raw.beaver"/>
     876                                            <arg value="${parsers.builddir}/@{parser}.parser"/>
     877                                            <arg value="${parsers.builddir}/@{parser}.raw.beaver"/>
    876878                                        </java>
    877879                                        <!-- add extra beaver code and generate parser -->
    878                                         <concat destfile="${parser_output}/@{parser}.beaver">
     880                                        <concat destfile="${parsers.builddir}/@{parser}.beaver">
    879881                                            <fileset file="${parser_header_path}" />
    880                                             <fileset file="${parser_output}/@{parser}.raw.beaver" />
     882                                            <fileset file="${parsers.builddir}/@{parser}.raw.beaver" />
    881883                                        </concat>
    882                                         <beaver file="${parser_output}/@{parser}.beaver" terminalNames="yes" compress="no" useSwitch="yes" />
     884                                        <beaver file="${parsers.builddir}/@{parser}.beaver" terminalNames="yes" compress="no" useSwitch="yes" />
    883885                                    </then>
    884886                                </if>
     
    889891            </sequential>
    890892        </for>
    891         <!-- clean up intermediate files -->
    892         <if>
    893             <available file="${parser_output}" type="dir" />
    894             <then>
    895                 <delete deleteonexit="true">
    896                     <fileset dir="${parser_output}">
    897                         <include name="*.parser" />
    898                         <include name="*.beaver" />
    899                     </fileset>
    900                 </delete>
    901             </then>
    902         </if>
     893    </target>
     894
     895    <target name="parser" depends="parser-build">
     896        <for list="${modules}" param="module">
     897            <sequential>
     898                <if>
     899                    <isset property="@{module}.parsers"/>
     900                    <then>
     901                        <for list="${@{module}.parsers}" param="parser">
     902                            <sequential>
     903                                <copy file="${parsers.builddir}/@{parser}.java" tofile="${parsers.output}/@{parser}.java" overwrite="true" />
     904                            </sequential>
     905                        </for>
     906                    </then>
     907                </if>
     908            </sequential>
     909        </for>
    903910    </target>
    904911
    905912    <!-- generate all scanners -->
    906     <target name="scanner">
     913    <target name="scanner-build">
    907914        <for list="${modules}" param="module">
    908915            <sequential>
     
    914921                                <uptodate property="@{module}.@{scanner}.uptodate"
    915922                                        srcfile="${@{module}.path}/src/parser/${@{module}.@{scanner}}"
    916                                         targetfile="${parser_output}/@{scanner}.java" />
     923                                        targetfile="${scanners.builddir}/@{scanner}.java" />
    917924                                <if>
    918                                     <isset property="@{module}.@{scanner}.package" />
     925                                    <not><isset property="@{module}.@{scanner}.package" /></not>
    919926                                    <then>
    920                                         <var name="scanners.package" value="${@{module}.@{scanner}.package}" />
    921                                         <propertyregex property="scanners.package_dir" input="${scanners.package}" defaultValue="${scanners.package}" regexp="\." replace="/" global="true" override="true" />
    922                                         <var name="scanners.output" value="${java_output_intermediate}/${scanners.package_dir}" />
    923                                         <mkdir dir="${scanners.output}" />
     927                                        <var name="@{module}.@{scanner}.package" value="${parser_package}" />
    924928                                    </then>
    925                                     <else>
    926                                         <var name="scanners.package" value="${parser_package}" />
    927                                         <var name="scanners.output" value="${parser_output}" />
    928                                     </else>
    929929                                </if>
    930                                 <var name="scanners.file" value="${scanners.output}/@{scanner}.flex" />
     930                                <propertyregex property="scanners.package_dir" input="${@{module}.@{scanner}.package}" defaultValue="${@{module}.@{scanner}.package}" regexp="\." replace="/" global="true" override="true" />
     931                                <var name="@{module}.@{scanner}.output" value="${java_output_intermediate}/${scanners.package_dir}" />
     932                                <var name="scanners.file" value="${scanners.builddir}/@{scanner}.flex" />
    931933                                <if>
    932934                                    <not><isset property="@{module}.@{scanner}.uptodate" /></not>
     
    934936                                        <copy file="${@{module}.path}/src/parser/${@{module}.@{scanner}}" tofile="${scanners.file}" overwrite="true" />
    935937                                        <replace file="${scanners.file}">
    936                                             <replacefilter token="$PARSER_PACKAGE$" value="${scanners.package}" />
     938                                            <replacefilter token="$PARSER_PACKAGE$" value="${@{module}.@{scanner}.package}" />
    937939                                            <replacefilter token="$AST_PACKAGE$" value="${ast_package}" />
    938940                                        </replace>
    939                                         <jflex file="${scanners.file}" outdir="${scanners.output}" nobak="yes" />
    940                                         <!-- clean up intermediate file
    941                                         <echo>
    942                                             scanners.file=${scanners.file}
    943                                             scanners.output=${scanners.output}
    944                                             scanners.package=${scanners.package}
    945                                         </echo> -->
    946                                         <delete deleteonexit="true" file="${scanners.file}" />
     941                                        <jflex file="${scanners.file}" nobak="yes" />
    947942                                    </then>
    948943                                </if>
     944                            </sequential>
     945                        </for>
     946                    </then>
     947                </if>
     948            </sequential>
     949        </for>
     950    </target>
     951
     952    <target name="scanner" depends="scanner-build">
     953        <for list="${modules}" param="module">
     954            <sequential>
     955                <if>
     956                    <isset property="@{module}.scanners"/>
     957                    <then>
     958                        <for list="${@{module}.scanners}" param="scanner">
     959                            <sequential>
     960                                <copy file="${scanners.builddir}/@{scanner}.java" tofile="${@{module}.@{scanner}.output}/@{scanner}.java" overwrite="true" />
    949961                            </sequential>
    950962                        </for>
     
    10831095    <target name="clean-bin" description="Deletes all binary files.">
    10841096        <delete dir="${class_output}" />
     1097        <delete dir="${build_class_output}" />
    10851098        <delete dir="${test_class_output}" />
    10861099        <delete dir="${jar_output}" />
     
    10881101
    10891102    <!-- cleans all generated java files -->
    1090     <target name="clean-gen" depends="clean-ast,clean-test,clean-extra" description="Deletes all generated Java files." />
     1103    <target name="clean-gen" depends="clean-ast,clean-test,clean-extra" description="Deletes all generated Java files." >
     1104        <delete dir="${target}/build" />
     1105    </target>
    10911106
    10921107    <!-- cleans all generated java files in the compiler -->
  • branches/dev-5726-orginal-annotation/build_environment/platforms/centos/install_test_dependencies.sh

    r12161 r12298  
    99yum install -y tmux vim
    1010pip install --upgrade setuptools
    11 pip install scipy lxml
     11pip install 'numpy==1.14'
     12pip install 'scipy==0.19.0'
     13pip install lxml
    1214sed -i "/^backend/c\\backend:Agg" $(python -c "import matplotlib;print(matplotlib.matplotlib_fname())")
    1315
Note: See TracChangeset for help on using the changeset viewer.