Changeset 14024


Ignore:
Timestamp:
Nov 12, 2019 10:54:15 AM (3 weeks ago)
Author:
randersson
Message:

#5792 Merged r13882-r14004 from trunk to stable

Location:
branches/stable
Files:
70 edited
3 copied

Legend:

Unmodified
Added
Removed
  • branches/stable

  • branches/stable/.classpath

    r12981 r14024  
    3030    <classpathentry kind="src" path="Compiler/ModelicaCompiler/src/resources"/>
    3131    <classpathentry kind="src" path="Compiler/ModelicaCompiler/src/java"/>
    32     <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER">
     32    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
    3333        <attributes>
    3434            <attribute name="module" value="true"/>
  • branches/stable/.settings/org.eclipse.jdt.core.prefs

    r13504 r14024  
    99org.eclipse.jdt.core.compiler.annotation.nullable.secondary=
    1010org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
     11org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
     12org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
     13org.eclipse.jdt.core.compiler.compliance=1.8
    1114org.eclipse.jdt.core.compiler.doc.comment.support=enabled
    1215org.eclipse.jdt.core.compiler.problem.APILeak=warning
    1316org.eclipse.jdt.core.compiler.problem.annotationSuperInterface=warning
     17org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
    1418org.eclipse.jdt.core.compiler.problem.autoboxing=ignore
    1519org.eclipse.jdt.core.compiler.problem.comparingIdentical=error
     
    2024org.eclipse.jdt.core.compiler.problem.discouragedReference=warning
    2125org.eclipse.jdt.core.compiler.problem.emptyStatement=error
     26org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
    2227org.eclipse.jdt.core.compiler.problem.explicitlyClosedAutoCloseable=warning
    2328org.eclipse.jdt.core.compiler.problem.fallthroughCase=error
     
    114119org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
    115120org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
     121org.eclipse.jdt.core.compiler.source=1.8
  • branches/stable/CHANGELOG.txt

    r13892 r14024  
    11================= Unreleased ==================
     2; Feature ; Minor ; Runtime ; #5868
     3Added a compiler flag 'mathematical_domain_checks' which determines if
     4domain checks is to be performed for all mathematical functions.
     5
     6# Change ; Minor ; Compiler; #5870
     7Debug log now contains checksums of all generated c-files.
     8
    29# Fixed ; Minor ; Compiler; #5864
    310Fixed bug where partial variability propagation lead to unbalanced equation systems.
     
    2027
    2128# Fixed ; Minor ; Compiler; #5835
    22 Format string argument to the String function is now useable.
     29Format string argument to the String function is now respected during constant evaluations.
    2330
    2431# Change ; Minor ; Compiler; #5830
  • branches/stable/Compiler/GenericCodeGen/src/jastadd/ExternalCEvalTag.jrag

    r11541 r14024  
    5050    }
    5151   
    52     /* Used when unit testing. Temp names will accumulate over all tests */
    53     private static final Map<String,String> unitTempMap = new HashMap<String,String>();
    54    
    5552    public  void generate(CodeStream str) {
    5653        if (ext == null) {
     
    5855            for (FExternalStmt ext : fClass.myExternals()) {
    5956                if (!ext.isConstructorStmt() && !ext.isDestructorStmt()) {
    60                     generate_wrap(str, ext, unitCgc, unitTempMap);
     57                    generate_wrap(str, ext, unitCgc, fClass.root().getUtilInterface().unitTempMap);
    6158                }
    6259            }
  • branches/stable/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenExpressions.jrag

    r13892 r14024  
    1717import java.util.Arrays;
    1818import org.jmodelica.common.ccodegen.CFuncParamDirection;
     19import org.jmodelica.util.values.CFormatSpecifier;
     20import org.jmodelica.util.collections.TransformerIterable;
    1921
    2022aspect CCodeGenExpressions {
     
    3436    @Override
    3537    public void FAbsExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    36         str.print("jmi_abs(");
     38        str.print("JMI_ABS_EQUATION(");
    3739        p.print(getFExp(), str, indent);
     40        str.print(")");
     41    }
     42   
     43    @Override
     44    public void FSignExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
     45        str.print("JMI_SIGN_EQUATION(");
     46        p.print(getFExp(), str, indent);
     47        str.print(")");
     48    }
     49   
     50    @Override
     51    public void FMinMaxExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
     52        str.print("JMI_" + builtInName().toUpperCase() + "_EQUATION(");
     53        p.print(getX(), str, indent);
     54        str.print(", ");
     55        p.print(getY(), str, indent);
    3856        str.print(")");
    3957    }
     
    103121    public void FDivFuncExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    104122        str.print("((long)");
    105         if (inFunction()) {
    106             str.format("jmi_divide_function(\"%s\", ", containingFFunctionDecl().name());
    107         } else {
    108             str.print("jmi_divide_equation(jmi, ");
    109         }
    110         p.print(getX(),str,indent);
    111         str.print(",");
    112         p.print(getY(),str,indent);
    113         str.print(",");
    114         str.print("\""+prettyPrint("")+"\")");
     123        prettyPrintGuarded(p.ExecStep, str, indent, getX(), getY());
    115124        str.print(")");
    116125    }
     
    263272
    264273    @Override
    265     public void FMinMaxExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    266         str.print("jmi_" + builtInName() + "(");
    267         p.print(getX(), str, indent);
    268         str.print(", ");
    269         p.print(getY(), str, indent);
    270         str.print(")");
    271     }
    272 
    273     @Override
    274274    public void FNoEventExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    275275        str.print('(');
     
    310310
    311311    @Override
    312     public void FSignExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    313         str.print("jmi_sign(");
    314         p.print(getFExp(), str, indent);
    315         str.print(")");
    316     }
    317 
    318     @Override
    319312    public void FSizeExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    320313        size().printSize_C(p, str, indent, getFExp(), dimension());
     
    425418    protected void RuntimeCallComputation.prettyPrintHead(CodePrinter.ExecuteCodePrinter p, CodeStream str, String indent, FExp ctx, FExp[] inputs, FExp[] outputs) {
    426419        boolean func = ctx.inFunction();
    427         str.print("jmi_");
    428         str.print(p.guardedFunctionName(ctx));
    429         str.print(func ? "_function(" : "_equation(");
     420        str.print(("jmi_" + p.guardedFunctionName(ctx) + (func ? "_function(" : "_equation(")).toUpperCase());
    430421        str.print(func ? "\"" + ctx.containingFFunctionDecl().name() + "\", ": "jmi, ");
    431422        p.codePrinter().print(this, str, indent, CFuncParamDirection.INPUT, Arrays.asList(inputs));
     
    458449    eq FDotDivExp.guardedFunctionName_C()           = "divide";
    459450    eq FDotPowExp.guardedFunctionName_C()           = "pow";
     451    eq FDivFuncExp.guardedFunctionName_C()          = "divide";
    460452    eq FBuiltInFunctionCall.guardedFunctionName_C() = builtInName();
    461453
     
    522514        }
    523515    }
    524 
    525     @Override
    526     public void FExpExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
     516   
     517    @Override
     518    public void FMathematicalFunctionCall.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    527519        prettyPrintGuarded(p.ExecStep, str, indent, getFExp());
    528520    }
    529 
    530     @Override
    531     public void  FLogExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    532         prettyPrintGuarded(p.ExecStep, str, indent, getFExp());
    533     }
    534 
    535     @Override
    536     public void  FLog10Exp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    537         prettyPrintGuarded(p.ExecStep, str, indent, getFExp());
    538     }
    539 
    540     @Override
    541     public void  FSinhExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    542         prettyPrintGuarded(p.ExecStep, str, indent, getFExp());
    543     }
    544 
    545     @Override
    546     public void  FCoshExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    547         prettyPrintGuarded(p.ExecStep, str, indent, getFExp());
    548     }
    549 
    550     @Override
    551     public void  FTanExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    552         prettyPrintGuarded(p.ExecStep, str, indent, getFExp());
    553     }
    554 
     521   
    555522    @Override
    556523    public void FAtan2Exp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
     
    792759        genStringFormat_C(p, str, indent);
    793760        str.print(", ");
    794         genStringParts_C(p, str, indent);
     761        genStringParts_C(p, str, indent, null);
    795762        str.println(");");
    796763    }
     
    856823    @Override
    857824    public void FStringExp.genVarDecls_C(CodePrinter p, CodeStream str, String indent) {
    858         super.genVarDecls_C(p, str, indent);
     825        for (ASTNode ch : childrenToGenFor_C()) {
     826            ch.genVarDecls_C(p, str, indent);
     827        }
    859828        genTopStringDecl(p, str, indent);
    860829    }
     
    862831    @Override
    863832    public void FStringExp.genTempVars_C(CodePrinter p, CodeStream str, String indent) {
    864         super.genTempVars_C(p, str, indent);
     833        for (ASTNode ch : childrenToGenFor_C()) {
     834            p.printPreSteps(ch, str, indent);
     835        }
    865836        genTopStringInit(p, str, indent);
    866837    }
     
    873844    @Override
    874845    public void FStringExp.genTempFree_C(CodePrinter p, CodeStream str, String indent) {
    875         super.genTempFree_C(p, str, indent);
     846        for (ASTNode ch : childrenToGenFor_C()) {
     847            ch.genTempFree_C(p, str, indent);
     848        }
     849    }
     850
     851    private Iterable<ASTNode> FStringExp.childrenToGenFor_C() {
     852        // We want to generate for NTA CFormat but not for child Format.
     853        return new TransformerIterable<ASTNode, ASTNode>(this) {
     854            private ASTNode fmt = getFormatOpt();
     855            protected ASTNode transform(ASTNode a) throws SkipException {
     856                return (a == fmt) ? getCFormatOpt() : a;
     857            }
     858        };
    876859    }
    877860
     
    947930    public void FStringExp.genStringFormat_C(CodePrinter p, CodeStream str, String indent) {
    948931        if (hasFormat()) {
    949             p.print(getFormat(), str, indent);
     932            p.print(getCFormat(), str, indent);
    950933        } else {
    951934            if (hasLeftJustified()) {
     
    987970        if (getValue().type().isReal())
    988971            str.print(".*");
    989         str.print(getValue().type().formatSpecifier());
     972        str.print(getValue().type().formatConversion());
    990973        str.print("\"");
    991974    }
    992975
    993     public void FExp.genStringParts_C(CodePrinter p, CodeStream str, String indent) {
     976    public void FExp.genStringParts_C(
     977            CodePrinter p, CodeStream str, String indent, CFormatSpecifier format) {
    994978        // TODO: This method should dispatch to the type!
    995979        FType t = type();
     
    1004988            str.print(", JMI_TRUE, \"true\", \"false\")");
    1005989        } else {
    1006             if (t.isInteger())
    1007                 str.print("(int) ");
     990            if (format != null) {
     991                if (format.expectedType.isUnsigned()) {
     992                    str.print("(unsigned int) ");
     993                } else if (format.expectedType.isInteger()) {
     994                    str.print("(int) ");
     995                }
     996            } else {
     997                if (t.isInteger()) {
     998                    str.print("(int) ");
     999                }
     1000            }
    10081001            p.print(this, str, indent);
    10091002        }
     
    10111004
    10121005    @Override
    1013     public void FStringExp.genStringParts_C(CodePrinter p, CodeStream str, String indent) {
    1014         getValue().genStringParts_C(p, str, indent);
     1006    public void FStringExp.genStringParts_C(
     1007            CodePrinter p, CodeStream str, String indent, CFormatSpecifier format) {
     1008        try {
     1009            // This depends on non-parameters being evaluatable.
     1010            format = formatSpecifier();
     1011        } catch (ConstantEvaluationException e) {
     1012            // Assume that we don't have a format that converts real -> integer,
     1013            // and just go by the type.
     1014            format = null;
     1015        }
     1016        getValue().genStringParts_C(p, str, indent, format);
    10151017    }
    10161018
  • branches/stable/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenGlobals.jrag

    r13099 r14024  
    545545            String strName = v.type().name() + ".destructor";
    546546            FCallable c = getName().lookupFCallable(strName);
    547             str.print(indent, c.funcNameUnderscore(C_SUFFIX_DEF), "(", FExp.global_C(v.nameUnderscore()), ");\n");
     547            str.print(indent, "if (", FExp.global_C(v.nameUnderscore()), " != NULL) {\n");
     548            str.print(p.indent(indent), c.funcNameUnderscore(C_SUFFIX_DEF), "(", FExp.global_C(v.nameUnderscore()), ");\n");
     549            str.print(p.indent(indent), FExp.global_C(v.nameUnderscore()), " = NULL;\n");
     550            str.print(indent, "}");
    548551        }
    549552    }
  • branches/stable/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CGenerator.jrag

    r13892 r14024  
    310310   
    311311    }
    312 
     312   
     313    /**
     314     * C: defines for the C code
     315     */
     316    public class DAETag_C_defines extends DAETag {
     317       
     318        public DAETag_C_defines(AbstractGenerator myGenerator, FClass fclass) {
     319            super("C_defines", myGenerator, fclass);
     320        }
     321       
     322        public void generate(CodeStream genPrinter) {
     323            if (fclass.myOptions().mathematical_domain_checks.getValue()) {
     324                genPrinter.print("#define MATHEMATICAL_DOMAIN_CHECKS");
     325            }
     326        }
     327    }
    313328    /**
    314329     * C: macros for C variable aliases
  • branches/stable/Compiler/ModelicaCBackEnd/templates/FMIBase/base.c

    r12878 r14024  
    179179    /* Initialize globals struct */
    180180    (*jmi)->globals = calloc(1, sizeof(jmi_globals_t));
    181 
     181   
     182    /* Log specific runtime information */
     183    jmi_log_node((*jmi)->log, logInfo, "JMIRuntime", MATHEMATICAL_DOMAIN_CHECKS_MSG);
     184   
    182185    return 0;
    183186}
    184187
    185 int jmi_destruct_external_objs(jmi_t* jmi) {
     188int model_destruct_external_objects(jmi_t* jmi) {
    186189$C_destruct_external_object$
    187190    return 0;
  • branches/stable/Compiler/ModelicaCBackEnd/templates/FMIBase/base.h

    r12878 r14024  
    1313    <http://www.ibm.com/developerworks/library/os-cpl.html/>.
    1414*/
     15
     16$C_defines$
    1517
    1618#include <stdio.h>
  • branches/stable/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenAlgorithmTests.mo

    r13357 r14024  
    16801680    int ef = 0;
    16811681    JMI_DYNAMIC_INIT()
    1682     _x_0 = sin(_time * 10.0);
     1682    _x_0 = JMI_SIN_EQUATION(jmi, _time * 10.0, \"sin(time * 10)\");
    16831683    if (jmi->atInitial || jmi->atEvent) {
    16841684        _sw(1) = jmi_turn_switch(jmi, _x_0 - (0.7), _sw(1), JMI_REL_LT);
     
    17021702    int ef = 0;
    17031703    JMI_DYNAMIC_INIT()
    1704     _x_0 = sin(_time * 10.0);
     1704    _x_0 = JMI_SIN_EQUATION(jmi, _time * 10.0, \"sin(time * 10)\");
    17051705    if (jmi->atInitial || jmi->atEvent) {
    17061706        _sw(0) = jmi_turn_switch(jmi, _x_0 - (0.7), _sw(0), JMI_REL_GEQ);
     
    24122412        _x_2 = (tmp_3);
    24132413        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    2414             (*res)[0] = jmi_divide_equation(jmi, _x_2, 2, \"x / 2\") - (_y_3);
     2414            (*res)[0] = JMI_DIVIDE_EQUATION(jmi, _x_2, 2, \"x / 2\") - (_y_3);
    24152415        }
    24162416    }
  • branches/stable/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenArrayTests.mo

    r13892 r14024  
    4949    }
    5050    temp_1_v = temp_2_v;
    51     y_v = sqrt(temp_1_v);
     51    y_v = JMI_SQRT_FUNCTION(\"CCodeGenArrayTests.VectorLength1.f\", temp_1_v, \"sqrt(temp_1)\");
    5252    JMI_RET(GEN, y_o, y_v)
    5353    JMI_DYNAMIC_FREE()
  • branches/stable/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenDynamicStatesTests.mo

    r13168 r14024  
    3333        annotation(__JModelica(UnitTesting(tests={
    3434            CCodeGenTestCase(
    35                 name="DynamicStates_ThreeDSOneEq",
     35                name="ThreeDSOneEq",
    3636                description="Test code gen for dynamic state model with three states in one equation",
    3737                dynamic_states=true,
     
    8383        _a3_2 = __ds_1_s1_5;
    8484        _a1_0 = __ds_1_s2_6;
    85         _a2_1 = jmi_divide_equation(jmi, 1, (_a1_0 * _a3_2), \"1 / (ds(1, a1) * ds(1, a3))\");
     85        _a2_1 = JMI_DIVIDE_EQUATION(jmi, 1, (_a1_0 * _a3_2), \"1 / (ds(1, a1) * ds(1, a3))\");
    8686        __ds_1_a1_4 = _a2_1;
    8787    } else if (jmi_dynamic_state_check_is_state(jmi, 0, 5, 4)) {
    8888        _a2_1 = __ds_1_s1_5;
    8989        _a1_0 = __ds_1_s2_6;
    90         _a3_2 = jmi_divide_equation(jmi, 1, (_a1_0 * _a2_1), \"1 / (ds(1, a1) * ds(1, a2))\");
     90        _a3_2 = JMI_DIVIDE_EQUATION(jmi, 1, (_a1_0 * _a2_1), \"1 / (ds(1, a1) * ds(1, a2))\");
    9191        __ds_1_a1_4 = _a3_2;
    9292    } else if (jmi_dynamic_state_check_is_state(jmi, 0, 5, 6)) {
    9393        _a2_1 = __ds_1_s1_5;
    9494        _a3_2 = __ds_1_s2_6;
    95         _a1_0 = jmi_divide_equation(jmi, 1, (_a2_1 * _a3_2), \"1 / (ds(1, a2) * ds(1, a3))\");
     95        _a1_0 = JMI_DIVIDE_EQUATION(jmi, 1, (_a2_1 * _a3_2), \"1 / (ds(1, a2) * ds(1, a3))\");
    9696        __ds_1_a1_4 = _a1_0;
    9797    }
     
    423423        annotation(__JModelica(UnitTesting(tests={
    424424            CCodeGenTestCase(
    425                 name="DynamicStates_Pendulum",
     425                name="Pendulum",
    426426                description="Test code gen for dynamic state related parts of the pendulum model",
    427427                dynamic_states=true,
     
    501501        __der_y_10 = __ds_1_s1_12;
    502502        _der_y_18 = __der_y_10;
    503         _der_x_17 = jmi_divide_equation(jmi, (- 2 * _y_3 * _der_y_18), (2 * _x_2), \"(- 2 * ds(2, y) * dynDer(y)) / (2 * ds(2, x))\");
     503        _der_x_17 = JMI_DIVIDE_EQUATION(jmi, (- 2 * _y_3 * _der_y_18), (2 * _x_2), \"(- 2 * ds(2, y) * dynDer(y)) / (2 * ds(2, x))\");
    504504        __der_x_9 = _der_x_17;
    505505        __ds_1_a1_11 = __der_x_9;
     
    507507        __der_x_9 = __ds_1_s1_12;
    508508        _der_x_17 = __der_x_9;
    509         _der_y_18 = jmi_divide_equation(jmi, (- 2 * _x_2 * _der_x_17), (2 * _y_3), \"(- 2 * ds(2, x) * dynDer(x)) / (2 * ds(2, y))\");
     509        _der_y_18 = JMI_DIVIDE_EQUATION(jmi, (- 2 * _x_2 * _der_x_17), (2 * _y_3), \"(- 2 * ds(2, x) * dynDer(x)) / (2 * ds(2, y))\");
    510510        __der_y_10 = _der_y_18;
    511511        __ds_1_a1_11 = __der_y_10;
     
    538538        x[0] = 7;
    539539    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    540         (*res)[0] = jmi_max(jmi_max(1.0, 1.0), jmi_abs(_L_0));
     540        (*res)[0] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(1.0, 1.0), JMI_ABS_EQUATION(_L_0));
    541541    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    542542        x[0] = _y_3;
     
    561561        x[0] = 6;
    562562    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    563         (*res)[0] = jmi_max(jmi_max(1.0, 1.0), jmi_abs(_L_0));
     563        (*res)[0] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(1.0, 1.0), JMI_ABS_EQUATION(_L_0));
    564564    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    565565        x[0] = _x_2;
     
    11511151        name="PreBlock1",
    11521152        description="Dynamic state block inside pre block",
    1153         template="
    1154 $C_dae_blocks_residual_functions$
    1155 ",
    1156     generatedCode="
     1153        template="$C_dae_blocks_residual_functions$",
     1154        generatedCode="
    11571155static int dae_block_1(jmi_t* jmi, jmi_real_t* x, jmi_real_t* residual, int evaluation_mode) {
    11581156    /***** Block: 1.2 *****/
     
    12361234        if (jmi_dynamic_state_check_is_state(jmi, 0, 4)) {
    12371235            _a1_0 = __ds_1_s1_7;
    1238             _a2_1 = jmi_divide_equation(jmi, COND_EXP_EQ(LOG_EXP_AND(_b2_3, LOG_EXP_NOT(pre_b2_3)), JMI_TRUE, 1.0, _time), _a1_0, \"(if b2 and not pre(b2) then 1 else time) / ds(1, a1)\");
     1236            _a2_1 = JMI_DIVIDE_EQUATION(jmi, COND_EXP_EQ(LOG_EXP_AND(_b2_3, LOG_EXP_NOT(pre_b2_3)), JMI_TRUE, 1.0, _time), _a1_0, \"(if b2 and not pre(b2) then 1 else time) / ds(1, a1)\");
    12391237            __ds_1_a1_6 = _a2_1;
    12401238        } else if (jmi_dynamic_state_check_is_state(jmi, 0, 5)) {
    12411239            _a2_1 = __ds_1_s1_7;
    1242             _a1_0 = jmi_divide_equation(jmi, COND_EXP_EQ(LOG_EXP_AND(_b2_3, LOG_EXP_NOT(pre_b2_3)), JMI_TRUE, 1.0, _time), _a2_1, \"(if b2 and not pre(b2) then 1 else time) / ds(1, a2)\");
     1240            _a1_0 = JMI_DIVIDE_EQUATION(jmi, COND_EXP_EQ(LOG_EXP_AND(_b2_3, LOG_EXP_NOT(pre_b2_3)), JMI_TRUE, 1.0, _time), _a2_1, \"(if b2 and not pre(b2) then 1 else time) / ds(1, a2)\");
    12431241            __ds_1_a1_6 = _a1_0;
    12441242        }
     
    12501248    return ef;
    12511249}
     1250
    12521251")})));
    12531252end PreBlock1;
  • branches/stable/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenGlobalsTests.mo

    r13575 r14024  
    10491049    i_0ie = floor((2) - (1));
    10501050    for (i_0i = 1; i_0in <= i_0ie; i_0i = 1 + (++i_0in)) {
    1051         y_v = jmi_pow_function(\"CCodeGenGlobalsTests.GlobalVariables.GlobalConstantForPowInt1.f\", y_v, jmi_array_val_1(JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantForPowInt1_f_c), i_0i), \"y ^ global(CCodeGenGlobalsTests.GlobalVariables.GlobalConstantForPowInt1.f.c[i])\");
     1051        y_v = JMI_POW_FUNCTION(\"CCodeGenGlobalsTests.GlobalVariables.GlobalConstantForPowInt1.f\", y_v, jmi_array_val_1(JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantForPowInt1_f_c), i_0i), \"y ^ global(CCodeGenGlobalsTests.GlobalVariables.GlobalConstantForPowInt1.f.c[i])\");
    10521052    }
    10531053    JMI_RET(GEN, y_o, y_v)
     
    13771377    jmi_extobj_t CCodeGenGlobalsTests_GlobalVariables_GlobalConstantExternalObject1_P_eo1;
    13781378
     1379
    13791380jmi_extobj_t jmi_global_tmp_1(jmi_t* jmi) {
    13801381    JMI_DYNAMIC_INIT()
     
    13891390    return tmp_1;
    13901391}
    1391 
    13921392int model_init_eval_independent_globals_0(jmi_t* jmi) {
    13931393    int ef = 0;
     
    14501450
    14511451
    1452     func_CCodeGenGlobalsTests_GlobalVariables_GlobalConstantExternalObject1_P_EO_destructor_def1(JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantExternalObject1_P_eo));
     1452    if (JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantExternalObject1_P_eo) != NULL) {
     1453        func_CCodeGenGlobalsTests_GlobalVariables_GlobalConstantExternalObject1_P_EO_destructor_def1(JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantExternalObject1_P_eo));
     1454        JMI_GLOBAL(CCodeGenGlobalsTests_GlobalVariables_GlobalConstantExternalObject1_P_eo) = NULL;
     1455    }
    14531456")})));
    14541457end GlobalConstantExternalObject1;
  • branches/stable/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenJacobianTests.mo

    r13097 r14024  
    100100        x[1] = 3;
    101101    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    102         (*res)[0] = jmi_max(jmi_abs(_b_2_4), jmi_max(1.0, jmi_abs(2.0)));
     102        (*res)[0] = JMI_MAX_EQUATION(JMI_ABS_EQUATION(_b_2_4), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(2.0)));
    103103    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    104104        x[0] = _x_3_2;
     
    109109            _x_3_2 = x[0];
    110110        }
    111         _x_2_1 = jmi_divide_equation(jmi, (- _b_3_5 + _x_3_2), -2, \"(- b[3] + x[3]) / -2\");
    112         _x_1_0 = jmi_divide_equation(jmi, (- _b_1_3 + _x_2_1), -2, \"(- b[1] + x[2]) / -2\");
     111        _x_2_1 = JMI_DIVIDE_EQUATION(jmi, (- _b_3_5 + _x_3_2), -2, \"(- b[3] + x[3]) / -2\");
     112        _x_1_0 = JMI_DIVIDE_EQUATION(jmi, (- _b_1_3 + _x_2_1), -2, \"(- b[1] + x[2]) / -2\");
    113113        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    114114            (*res)[0] = _x_1_0 + 2 * _x_3_2 - (_b_2_4);
     
    302302        x[1] = 8;
    303303    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    304         (*res)[0] = jmi_max(jmi_abs(_b_3_5), jmi_max(jmi_abs(2.0), 1.0));
     304        (*res)[0] = JMI_MAX_EQUATION(JMI_ABS_EQUATION(_b_3_5), JMI_MAX_EQUATION(JMI_ABS_EQUATION(2.0), 1.0));
    305305    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    306306        x[0] = _x_3_2;
     
    501501        x[1] = 3;
    502502    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    503         (*res)[0] = jmi_max(jmi_abs(_b_2_4), jmi_max(1.0, jmi_abs(2.0)));
     503        (*res)[0] = JMI_MAX_EQUATION(JMI_ABS_EQUATION(_b_2_4), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(2.0)));
    504504    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    505505        x[0] = _x_3_2;
     
    529529            _x_3_2 = x[0];
    530530        }
    531         _x_2_1 = jmi_divide_equation(jmi, (- _b_3_5 + _x_3_2), -2, \"(- b[3] + x[3]) / -2\");
    532         _x_1_0 = jmi_divide_equation(jmi, (- _b_1_3 + _x_2_1), -2, \"(- b[1] + x[2]) / -2\");
     531        _x_2_1 = JMI_DIVIDE_EQUATION(jmi, (- _b_3_5 + _x_3_2), -2, \"(- b[3] + x[3]) / -2\");
     532        _x_1_0 = JMI_DIVIDE_EQUATION(jmi, (- _b_1_3 + _x_2_1), -2, \"(- b[1] + x[2]) / -2\");
    533533        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    534534            (*res)[0] = _x_1_0 + 2 * _x_3_2 - (_b_2_4);
     
    575575        x[1] = 3;
    576576    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    577         (*res)[0] = jmi_max(jmi_abs(_b_2_4), jmi_max(1.0, jmi_abs(2.0)));
     577        (*res)[0] = JMI_MAX_EQUATION(JMI_ABS_EQUATION(_b_2_4), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(2.0)));
    578578    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    579579        x[0] = _x_3_2;
     
    584584            _x_3_2 = x[0];
    585585        }
    586         _x_2_1 = jmi_divide_equation(jmi, (- _b_3_5 + _x_3_2), -2, \"(- b[3] + x[3]) / -2\");
    587         _x_1_0 = jmi_divide_equation(jmi, (- _b_1_3 + _x_2_1), -2, \"(- b[1] + x[2]) / -2\");
     586        _x_2_1 = JMI_DIVIDE_EQUATION(jmi, (- _b_3_5 + _x_3_2), -2, \"(- b[3] + x[3]) / -2\");
     587        _x_1_0 = JMI_DIVIDE_EQUATION(jmi, (- _b_1_3 + _x_2_1), -2, \"(- b[1] + x[2]) / -2\");
    588588        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    589589            (*res)[0] = _x_1_0 + 2 * _x_3_2 - (_b_2_4);
     
    777777        x[0] = jmi->offs_sw + 0;
    778778    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    779         (*res)[0] = jmi_max(jmi_abs(_b_1_3), jmi_max(jmi_max(jmi_abs(2.0), 1.0), jmi_max(1.0, 1.0)));
     779        (*res)[0] = JMI_MAX_EQUATION(JMI_ABS_EQUATION(_b_1_3), JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_ABS_EQUATION(2.0), 1.0), JMI_MAX_EQUATION(1.0, 1.0)));
    780780    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    781781        x[0] = _x_1_0;
     
    805805            _x_1_0 = x[0];
    806806        }
    807         _x_3_2 = jmi_divide_equation(jmi, (- _b_2_4 + _x_1_0), -2, \"(- b[2] + x[1]) / -2\");
    808         _x_2_1 = jmi_divide_equation(jmi, (- _b_3_5 + _x_3_2), -2, \"(- b[3] + x[3]) / -2\");
     807        _x_3_2 = JMI_DIVIDE_EQUATION(jmi, (- _b_2_4 + _x_1_0), -2, \"(- b[2] + x[1]) / -2\");
     808        _x_2_1 = JMI_DIVIDE_EQUATION(jmi, (- _b_3_5 + _x_3_2), -2, \"(- b[3] + x[3]) / -2\");
    809809        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    810810            if (evaluation_mode & JMI_BLOCK_EVALUATE_NON_REALS) {
  • branches/stable/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenTests.mo

    r13168 r14024  
    1717
    1818package CCodeGenTests
     19
     20model DomainChecks1
     21    Real x1 = abs(time);
     22    Real x2 = cos(time);
     23    Real x3 = sin(time);
     24    Real x4 = tan(time);
     25    Real x5 = acos(time);
     26    Real x6 = asin(time);
     27    Real x7 = atan(time);
     28    Real x8 = log(time);
     29    Real x9 = log10(time);
     30    Real x10= exp(time);
     31    Real x11= time^10;
     32    Real x12= sqrt(time);
     33    Real x13= sinh(time);
     34    Real x14= cosh(time);
     35    Real x15= tanh(time);
     36    Real x16= atan2(time, 2*time);
     37    Real x17= time / x16;
     38    Real x18= sign(time);
     39    Real x19= max(time, x16);
     40    Real x20= min(time, x16);
     41    Real x21= div(time, 2*time);
     42
     43    function operators
     44        input Real t;
     45        output Real[16] o;
     46    algorithm
     47        o[1] := cos(t);
     48        o[2] := sin(t);
     49        o[3] := acos(t);
     50        o[4] := asin(t);
     51        o[5] := atan(t);
     52        o[6] := log(t);
     53        o[7] := log10(t);
     54        o[8] := exp(t);
     55        o[9] := t^10;
     56        o[10]:= sqrt(time);
     57        o[11]:= cosh(time);
     58        o[12]:= sinh(time);
     59        o[13]:= tanh(time);
     60        o[14]:= atan2(time, 2*time);
     61        o[15]:= t / o[1];
     62        o[16]:= div(time, 2*time);
     63    end operators;
     64   
     65    Real o[16] = operators(time);
     66   
     67annotation(__JModelica(UnitTesting(tests={
     68    CCodeGenTestCase(
     69        name="DomainChecks1",
     70        description="Test of domain check generation",
     71        mathematical_domain_checks=true,
     72        inline_functions="none",
     73        template="
     74$C_ode_derivatives$
     75$C_functions$
     76",
     77        generatedCode="
     78
     79int model_ode_derivatives_base(jmi_t* jmi) {
     80    int ef = 0;
     81    JMI_DYNAMIC_INIT()
     82    JMI_ARR(STACK, jmi_real_t, jmi_array_t, tmp_1, 16, 1)
     83    _x1_0 = JMI_ABS_EQUATION(_time);
     84    _x2_1 = JMI_COS_EQUATION(jmi, _time, \"cos(time)\");
     85    _x3_2 = JMI_SIN_EQUATION(jmi, _time, \"sin(time)\");
     86    _x4_3 = JMI_TAN_EQUATION(jmi, _time, \"tan(time)\");
     87    _x5_4 = JMI_ACOS_EQUATION(jmi, _time, \"acos(time)\");
     88    _x6_5 = JMI_ASIN_EQUATION(jmi, _time, \"asin(time)\");
     89    _x7_6 = JMI_ATAN_EQUATION(jmi, _time, \"atan(time)\");
     90    _x8_7 = JMI_LOG_EQUATION(jmi, _time, \"log(time)\");
     91    _x9_8 = JMI_LOG10_EQUATION(jmi, _time, \"log10(time)\");
     92    _x10_9 = JMI_EXP_EQUATION(jmi, _time, \"exp(time)\");
     93    _x11_10 = JMI_POW_EQUATION(jmi, _time, 10, \"time ^ 10\");
     94    _x12_11 = JMI_SQRT_EQUATION(jmi, _time, \"sqrt(time)\");
     95    _x13_12 = JMI_SINH_EQUATION(jmi, _time, \"sinh(time)\");
     96    _x14_13 = JMI_COSH_EQUATION(jmi, _time, \"cosh(time)\");
     97    _x15_14 = JMI_TANH_EQUATION(jmi, _time, \"tanh(time)\");
     98    _x16_15 = JMI_ATAN2_EQUATION(jmi, _time, 2.0 * _time, \"atan2(time, 2 * time)\");
     99    _x17_16 = JMI_DIVIDE_EQUATION(jmi, _time, _x16_15, \"time / x16\");
     100    _x18_17 = JMI_SIGN_EQUATION(_time);
     101    _x19_18 = JMI_MAX_EQUATION(_time, _x16_15);
     102    _x20_19 = JMI_MIN_EQUATION(_time, _x16_15);
     103    if (jmi->atInitial || jmi->atEvent) {
     104        _sw(0) = jmi_turn_switch(jmi, ((long)JMI_DIVIDE_EQUATION(jmi, _time, 2.0 * _time, \"div(time, 2 * time)\")) - (pre_temp_2_37), _sw(0), JMI_REL_LT);
     105    }
     106    if (jmi->atInitial || jmi->atEvent) {
     107        _sw(1) = jmi_turn_switch(jmi, ((long)JMI_DIVIDE_EQUATION(jmi, _time, 2.0 * _time, \"div(time, 2 * time)\")) - (pre_temp_2_37 + 1.0), _sw(1), JMI_REL_GEQ);
     108    }
     109    _temp_2_37 = COND_EXP_EQ(LOG_EXP_OR(LOG_EXP_OR(_sw(0), _sw(1)), _atInitial), JMI_TRUE, ((long)JMI_DIVIDE_EQUATION(jmi, _time, 2.0 * _time, \"div(time, 2 * time)\")), pre_temp_2_37);
     110    pre_temp_2_37 = _temp_2_37;
     111    _x21_20 = _temp_2_37;
     112    JMI_ARRAY_INIT_1(STACK, jmi_real_t, jmi_array_t, tmp_1, 16, 1, 16)
     113    func_CCodeGenTests_DomainChecks1_operators_def0(_time, tmp_1);
     114    memcpy(&_o_1_21, &jmi_array_val_1(tmp_1, 1), 16 * sizeof(jmi_real_t));
     115    JMI_DYNAMIC_FREE()
     116    return ef;
     117}
     118
     119void func_CCodeGenTests_DomainChecks1_operators_def0(jmi_real_t t_v, jmi_array_t* o_a) {
     120    JMI_DYNAMIC_INIT()
     121    JMI_ARR(STACK, jmi_real_t, jmi_array_t, o_an, 16, 1)
     122    if (o_a == NULL) {
     123        JMI_ARRAY_INIT_1(STACK, jmi_real_t, jmi_array_t, o_an, 16, 1, 16)
     124        o_a = o_an;
     125    }
     126    jmi_array_ref_1(o_a, 1) = JMI_COS_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", t_v, \"cos(t)\");
     127    jmi_array_ref_1(o_a, 2) = JMI_SIN_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", t_v, \"sin(t)\");
     128    jmi_array_ref_1(o_a, 3) = JMI_ACOS_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", t_v, \"acos(t)\");
     129    jmi_array_ref_1(o_a, 4) = JMI_ASIN_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", t_v, \"asin(t)\");
     130    jmi_array_ref_1(o_a, 5) = JMI_ATAN_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", t_v, \"atan(t)\");
     131    jmi_array_ref_1(o_a, 6) = JMI_LOG_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", t_v, \"log(t)\");
     132    jmi_array_ref_1(o_a, 7) = JMI_LOG10_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", t_v, \"log10(t)\");
     133    jmi_array_ref_1(o_a, 8) = JMI_EXP_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", t_v, \"exp(t)\");
     134    jmi_array_ref_1(o_a, 9) = JMI_POW_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", t_v, 10, \"t ^ 10\");
     135    jmi_array_ref_1(o_a, 10) = JMI_SQRT_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", _time, \"sqrt(time)\");
     136    jmi_array_ref_1(o_a, 11) = JMI_COSH_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", _time, \"cosh(time)\");
     137    jmi_array_ref_1(o_a, 12) = JMI_SINH_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", _time, \"sinh(time)\");
     138    jmi_array_ref_1(o_a, 13) = JMI_TANH_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", _time, \"tanh(time)\");
     139    jmi_array_ref_1(o_a, 14) = JMI_ATAN2_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", _time, 2.0 * _time, \"atan2(time, 2 * time)\");
     140    jmi_array_ref_1(o_a, 15) = JMI_DIVIDE_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", t_v, jmi_array_val_1(o_a, 1), \"t / o[1]\");
     141    jmi_array_ref_1(o_a, 16) = ((long)JMI_DIVIDE_FUNCTION(\"CCodeGenTests.DomainChecks1.operators\", _time, 2.0 * _time, \"div(time, 2 * time)\"));
     142    JMI_DYNAMIC_FREE()
     143    return;
     144}
     145
     146")})));
     147end DomainChecks1;
     148
     149model DomainChecks2
     150    Real x1 = abs(time);
     151
     152annotation(__JModelica(UnitTesting(tests={
     153    CCodeGenTestCase(
     154        name="DomainChecks2",
     155        description="Test of domain check generation",
     156        mathematical_domain_checks=false,
     157        inline_functions="none",
     158        template="$C_defines$",
     159        generatedCode="")})));
     160end DomainChecks2;
     161
     162model DomainChecks3
     163    Real x1 = abs(time);
     164
     165annotation(__JModelica(UnitTesting(tests={
     166    CCodeGenTestCase(
     167        name="DomainChecks3",
     168        description="Test of domain check generation",
     169        mathematical_domain_checks=true,
     170        inline_functions="none",
     171        template="$C_defines$",
     172        generatedCode="#define MATHEMATICAL_DOMAIN_CHECKS
     173")})));
     174end DomainChecks3;
    19175
    20176model CCodeGenTest1
     
    145301        generatedCode="
    146302    (*res)[0] = _y_1 - (_der_x_2);
    147     (*res)[1] = (COND_EXP_EQ(COND_EXP_LE(_time, jmi_divide_equation(jmi, 3.141592653589793, 2.0, \"3.141592653589793 / 2\"), JMI_TRUE, JMI_FALSE), JMI_TRUE, sin(_time), _x_0)) - (_der_x_2);
     303    (*res)[1] = (COND_EXP_EQ(COND_EXP_LE(_time, JMI_DIVIDE_EQUATION(jmi, 3.141592653589793, 2.0, \"3.141592653589793 / 2\"), JMI_TRUE, JMI_FALSE), JMI_TRUE, JMI_SIN_EQUATION(jmi, _time, \"sin(time)\"), _x_0)) - (_der_x_2);
    148304")})));
    149305end CCodeGenTest4;
     
    377533  der(x) = (x-0.3)^0.3 + (x-0.3)^3;
    378534
    379     annotation(__JModelica(UnitTesting(tests={
    380         CCodeGenTestCase(
    381             name="CCodeGenTest12",
    382             description="C code generation: test that x^2 is represented by x*x in the generated code.",
    383             variability_propagation=false,
    384             generate_ode=false,
    385             generate_dae=true,
    386             template="$C_DAE_equation_residuals$",
    387             generatedCode="
    388     (*res)[0] = jmi_pow_equation(jmi, (_x_0 - 0.3),0.3,\"(x - 0.3) ^ 0.3\") + (1.0 * ((_x_0 - 0.3)) * ((_x_0 - 0.3)) * ((_x_0 - 0.3))) - (_der_x_1);
     535annotation(__JModelica(UnitTesting(tests={
     536    CCodeGenTestCase(
     537        name="CCodeGenTest12",
     538        description="C code generation: test that x^2 is represented by x*x in the generated code.",
     539        variability_propagation=false,
     540        generate_ode=false,
     541        generate_dae=true,
     542        template="$C_DAE_equation_residuals$",
     543        generatedCode="
     544    (*res)[0] = JMI_POW_EQUATION(jmi, (_x_0 - 0.3), 0.3, \"(x - 0.3) ^ 0.3\") + (1.0 * ((_x_0 - 0.3)) * ((_x_0 - 0.3)) * ((_x_0 - 0.3))) - (_der_x_1);
    389545")})));
    390546end CCodeGenTest12;
     
    704860    Real x = time / f("a", time);
    705861
    706     annotation(__JModelica(UnitTesting(tests={
    707         CCodeGenTestCase(
    708             name="CCodeGenTest19",
    709             description="Check that quotes in divisions are escaped in the string representation",
    710             template="$C_ode_derivatives$",
    711             generatedCode="
     862annotation(__JModelica(UnitTesting(tests={
     863    CCodeGenTestCase(
     864        name="CCodeGenTest19",
     865        description="Check that quotes in divisions are escaped in the string representation",
     866        template="$C_ode_derivatives$",
     867        generatedCode="
    712868
    713869int model_ode_derivatives_base(jmi_t* jmi) {
    714870    int ef = 0;
    715871    JMI_DYNAMIC_INIT()
    716     _x_0 = jmi_divide_equation(jmi, _time,func_CCodeGenTests_CCodeGenTest19_f_exp0(\"a\", _time),\"time / CCodeGenTests.CCodeGenTest19.f(\\\"a\\\", time)\");
     872    _x_0 = JMI_DIVIDE_EQUATION(jmi, _time, func_CCodeGenTests_CCodeGenTest19_f_exp0(\"a\", _time), \"time / CCodeGenTests.CCodeGenTest19.f(\\\"a\\\", time)\");
    717873    JMI_DYNAMIC_FREE()
    718874    return ef;
     
    9681124    int ef = 0;
    9691125    JMI_DYNAMIC_INIT()
    970     _der_x_1 = jmi_divide_equation(jmi, _x_0, 1234, \"x / 1234\");
     1126    _der_x_1 = JMI_DIVIDE_EQUATION(jmi, _x_0, 1234, \"x / 1234\");
    9711127    JMI_DYNAMIC_FREE()
    9721128    return ef;
     
    10791235    StringCompare("      medium", String(enumVar, minimumLength=12, leftJustified=false));
    10801236
    1081     StringCompare("42",           String(intVar, format="%d"));
    1082     StringCompare("3.1400000",    String(realVar, format="%f"));
     1237    StringCompare("42",           String(intVar, format="d"));
     1238    StringCompare("3.1400000",    String(realVar, format="f"));
    10831239
    10841240annotation(__JModelica(UnitTesting(tests={
     
    12531409    _a_c3_f_7 = - _b_c6_f_19;
    12541410    _a_c2_f_4 = - _a_c1_f_1 - _a_c3_f_7;
    1255     __stream_s_1_21 = jmi_max(_a_c2_f_4, 0.0) + jmi_max(_a_c3_f_7, 0.0);
    1256     __stream_alpha_1_22 = (COND_EXP_EQ(COND_EXP_GT(__stream_s_1_21, jmi_in_stream_eps(jmi) * 0.1, JMI_TRUE, JMI_FALSE), JMI_TRUE, 1.0, COND_EXP_EQ(COND_EXP_GT(__stream_s_1_21, 0.0, JMI_TRUE, JMI_FALSE), JMI_TRUE, jmi_divide_equation(jmi, __stream_s_1_21, (jmi_in_stream_eps(jmi) * 0.1), \"_stream_s_1 / (_inStreamEpsilon * 0.1)\") * (jmi_divide_equation(jmi, __stream_s_1_21, (jmi_in_stream_eps(jmi) * 0.1), \"_stream_s_1 / (_inStreamEpsilon * 0.1)\") * (3.0 - 2.0 * __stream_s_1_21)), 0.0)));
    1257     __stream_positiveMax_1_23 = __stream_alpha_1_22 * jmi_max(_a_c2_f_4, 0.0) + (1 - __stream_alpha_1_22) * (jmi_in_stream_eps(jmi) * 0.1);
     1411    __stream_s_1_21 = JMI_MAX_EQUATION(_a_c2_f_4, 0.0) + JMI_MAX_EQUATION(_a_c3_f_7, 0.0);
     1412    __stream_alpha_1_22 = (COND_EXP_EQ(COND_EXP_GT(__stream_s_1_21, jmi_in_stream_eps(jmi) * 0.1, JMI_TRUE, JMI_FALSE), JMI_TRUE, 1.0, COND_EXP_EQ(COND_EXP_GT(__stream_s_1_21, 0.0, JMI_TRUE, JMI_FALSE), JMI_TRUE, JMI_DIVIDE_EQUATION(jmi, __stream_s_1_21, (jmi_in_stream_eps(jmi) * 0.1), \"_stream_s_1 / (_inStreamEpsilon * 0.1)\") * (JMI_DIVIDE_EQUATION(jmi, __stream_s_1_21, (jmi_in_stream_eps(jmi) * 0.1), \"_stream_s_1 / (_inStreamEpsilon * 0.1)\") * (3.0 - 2.0 * __stream_s_1_21)), 0.0)));
     1413    __stream_positiveMax_1_23 = __stream_alpha_1_22 * JMI_MAX_EQUATION(_a_c2_f_4, 0.0) + (1 - __stream_alpha_1_22) * (jmi_in_stream_eps(jmi) * 0.1);
    12581414    _b_c5_s_17 = 5;
    1259     __stream_positiveMax_2_24 = __stream_alpha_1_22 * jmi_max(_a_c3_f_7, 0.0) + (1 - __stream_alpha_1_22) * (jmi_in_stream_eps(jmi) * 0.1);
     1415    __stream_positiveMax_2_24 = __stream_alpha_1_22 * JMI_MAX_EQUATION(_a_c3_f_7, 0.0) + (1 - __stream_alpha_1_22) * (jmi_in_stream_eps(jmi) * 0.1);
    12601416    _b_c6_s_20 = 6;
    1261     _a_c1_s_2 = jmi_divide_equation(jmi, (__stream_positiveMax_1_23 * _b_c5_s_17 + __stream_positiveMax_2_24 * _b_c6_s_20), (__stream_positiveMax_1_23 + __stream_positiveMax_2_24), \"(_stream_positiveMax_1 * b.c5.s + _stream_positiveMax_2 * b.c6.s) / (_stream_positiveMax_1 + _stream_positiveMax_2)\");
     1417    _a_c1_s_2 = JMI_DIVIDE_EQUATION(jmi, (__stream_positiveMax_1_23 * _b_c5_s_17 + __stream_positiveMax_2_24 * _b_c6_s_20), (__stream_positiveMax_1_23 + __stream_positiveMax_2_24), \"(_stream_positiveMax_1 * b.c5.s + _stream_positiveMax_2 * b.c6.s) / (_stream_positiveMax_1 + _stream_positiveMax_2)\");
    12621418    _a_c2_p_3 = _a_c1_p_0;
    1263     __stream_s_2_25 = jmi_max(_a_c1_f_1, 0.0) + jmi_max(_a_c3_f_7, 0.0);
    1264     __stream_alpha_2_26 = (COND_EXP_EQ(COND_EXP_GT(__stream_s_2_25, jmi_in_stream_eps(jmi) * 0.1, JMI_TRUE, JMI_FALSE), JMI_TRUE, 1.0, COND_EXP_EQ(COND_EXP_GT(__stream_s_2_25, 0.0, JMI_TRUE, JMI_FALSE), JMI_TRUE, jmi_divide_equation(jmi, __stream_s_2_25, (jmi_in_stream_eps(jmi) * 0.1), \"_stream_s_2 / (_inStreamEpsilon * 0.1)\") * (jmi_divide_equation(jmi, __stream_s_2_25, (jmi_in_stream_eps(jmi) * 0.1), \"_stream_s_2 / (_inStreamEpsilon * 0.1)\") * (3.0 - 2.0 * __stream_s_2_25)), 0.0)));
    1265     __stream_positiveMax_3_27 = __stream_alpha_2_26 * jmi_max(_a_c1_f_1, 0.0) + (1 - __stream_alpha_2_26) * (jmi_in_stream_eps(jmi) * 0.1);
     1419    __stream_s_2_25 = JMI_MAX_EQUATION(_a_c1_f_1, 0.0) + JMI_MAX_EQUATION(_a_c3_f_7, 0.0);
     1420    __stream_alpha_2_26 = (COND_EXP_EQ(COND_EXP_GT(__stream_s_2_25, jmi_in_stream_eps(jmi) * 0.1, JMI_TRUE, JMI_FALSE), JMI_TRUE, 1.0, COND_EXP_EQ(COND_EXP_GT(__stream_s_2_25, 0.0, JMI_TRUE, JMI_FALSE), JMI_TRUE, JMI_DIVIDE_EQUATION(jmi, __stream_s_2_25, (jmi_in_stream_eps(jmi) * 0.1), \"_stream_s_2 / (_inStreamEpsilon * 0.1)\") * (JMI_DIVIDE_EQUATION(jmi, __stream_s_2_25, (jmi_in_stream_eps(jmi) * 0.1), \"_stream_s_2 / (_inStreamEpsilon * 0.1)\") * (3.0 - 2.0 * __stream_s_2_25)), 0.0)));
     1421    __stream_positiveMax_3_27 = __stream_alpha_2_26 * JMI_MAX_EQUATION(_a_c1_f_1, 0.0) + (1 - __stream_alpha_2_26) * (jmi_in_stream_eps(jmi) * 0.1);
    12661422    _b_c4_s_14 = 4;
    1267     __stream_positiveMax_4_28 = __stream_alpha_2_26 * jmi_max(_a_c3_f_7, 0.0) + (1 - __stream_alpha_2_26) * (jmi_in_stream_eps(jmi) * 0.1);
    1268     _a_c2_s_5 = jmi_divide_equation(jmi, (__stream_positiveMax_3_27 * _b_c4_s_14 + __stream_positiveMax_4_28 * _b_c6_s_20), (__stream_positiveMax_3_27 + __stream_positiveMax_4_28), \"(_stream_positiveMax_3 * b.c4.s + _stream_positiveMax_4 * b.c6.s) / (_stream_positiveMax_3 + _stream_positiveMax_4)\");
     1423    __stream_positiveMax_4_28 = __stream_alpha_2_26 * JMI_MAX_EQUATION(_a_c3_f_7, 0.0) + (1 - __stream_alpha_2_26) * (jmi_in_stream_eps(jmi) * 0.1);
     1424    _a_c2_s_5 = JMI_DIVIDE_EQUATION(jmi, (__stream_positiveMax_3_27 * _b_c4_s_14 + __stream_positiveMax_4_28 * _b_c6_s_20), (__stream_positiveMax_3_27 + __stream_positiveMax_4_28), \"(_stream_positiveMax_3 * b.c4.s + _stream_positiveMax_4 * b.c6.s) / (_stream_positiveMax_3 + _stream_positiveMax_4)\");
    12691425    _a_c3_p_6 = _a_c2_p_3;
    1270     __stream_s_3_29 = jmi_max(_a_c1_f_1, 0.0) + jmi_max(_a_c2_f_4, 0.0);
    1271     __stream_alpha_3_30 = (COND_EXP_EQ(COND_EXP_GT(__stream_s_3_29, jmi_in_stream_eps(jmi) * 0.1, JMI_TRUE, JMI_FALSE), JMI_TRUE, 1.0, COND_EXP_EQ(COND_EXP_GT(__stream_s_3_29, 0.0, JMI_TRUE, JMI_FALSE), JMI_TRUE, jmi_divide_equation(jmi, __stream_s_3_29, (jmi_in_stream_eps(jmi) * 0.1), \"_stream_s_3 / (_inStreamEpsilon * 0.1)\") * (jmi_divide_equation(jmi, __stream_s_3_29, (jmi_in_stream_eps(jmi) * 0.1), \"_stream_s_3 / (_inStreamEpsilon * 0.1)\") * (3.0 - 2.0 * __stream_s_3_29)), 0.0)));
    1272     __stream_positiveMax_5_31 = __stream_alpha_3_30 * jmi_max(_a_c1_f_1, 0.0) + (1 - __stream_alpha_3_30) * (jmi_in_stream_eps(jmi) * 0.1);
    1273     __stream_positiveMax_6_32 = __stream_alpha_3_30 * jmi_max(_a_c2_f_4, 0.0) + (1 - __stream_alpha_3_30) * (jmi_in_stream_eps(jmi) * 0.1);
    1274     _a_c3_s_8 = jmi_divide_equation(jmi, (__stream_positiveMax_5_31 * _b_c4_s_14 + __stream_positiveMax_6_32 * _b_c5_s_17), (__stream_positiveMax_5_31 + __stream_positiveMax_6_32), \"(_stream_positiveMax_5 * b.c4.s + _stream_positiveMax_6 * b.c5.s) / (_stream_positiveMax_5 + _stream_positiveMax_6)\");
     1426    __stream_s_3_29 = JMI_MAX_EQUATION(_a_c1_f_1, 0.0) + JMI_MAX_EQUATION(_a_c2_f_4, 0.0);
     1427    __stream_alpha_3_30 = (COND_EXP_EQ(COND_EXP_GT(__stream_s_3_29, jmi_in_stream_eps(jmi) * 0.1, JMI_TRUE, JMI_FALSE), JMI_TRUE, 1.0, COND_EXP_EQ(COND_EXP_GT(__stream_s_3_29, 0.0, JMI_TRUE, JMI_FALSE), JMI_TRUE, JMI_DIVIDE_EQUATION(jmi, __stream_s_3_29, (jmi_in_stream_eps(jmi) * 0.1), \"_stream_s_3 / (_inStreamEpsilon * 0.1)\") * (JMI_DIVIDE_EQUATION(jmi, __stream_s_3_29, (jmi_in_stream_eps(jmi) * 0.1), \"_stream_s_3 / (_inStreamEpsilon * 0.1)\") * (3.0 - 2.0 * __stream_s_3_29)), 0.0)));
     1428    __stream_positiveMax_5_31 = __stream_alpha_3_30 * JMI_MAX_EQUATION(_a_c1_f_1, 0.0) + (1 - __stream_alpha_3_30) * (jmi_in_stream_eps(jmi) * 0.1);
     1429    __stream_positiveMax_6_32 = __stream_alpha_3_30 * JMI_MAX_EQUATION(_a_c2_f_4, 0.0) + (1 - __stream_alpha_3_30) * (jmi_in_stream_eps(jmi) * 0.1);
     1430    _a_c3_s_8 = JMI_DIVIDE_EQUATION(jmi, (__stream_positiveMax_5_31 * _b_c4_s_14 + __stream_positiveMax_6_32 * _b_c5_s_17), (__stream_positiveMax_5_31 + __stream_positiveMax_6_32), \"(_stream_positiveMax_5 * b.c4.s + _stream_positiveMax_6 * b.c5.s) / (_stream_positiveMax_5 + _stream_positiveMax_6)\");
    12751431    _a_x1_9 = _b_c4_s_14;
    12761432    _a_x2_10 = _b_c5_s_17;
     
    18201976        template="$C_DAE_equation_residuals$",
    18211977        generatedCode="
    1822     (*res)[0] = jmi_divide_equation(jmi, _y_1_1_4 * _y_1_1_4, jmi_pow_equation(jmi, (_y_1_1_4 + _y_1_1_4 - 2), _y_1_1_4, \"(y[1,1] .+ y[1,1] .- 2) .^ y[1,1]\"), \"y[1,1] .* y[1,1] ./ (y[1,1] .+ y[1,1] .- 2) .^ y[1,1]\") - (_x_1_1_0);
    1823     (*res)[1] = jmi_divide_equation(jmi, _y_1_2_5 * _y_1_2_5, jmi_pow_equation(jmi, (_y_1_2_5 + _y_1_2_5 - 2), _y_1_2_5, \"(y[1,2] .+ y[1,2] .- 2) .^ y[1,2]\"), \"y[1,2] .* y[1,2] ./ (y[1,2] .+ y[1,2] .- 2) .^ y[1,2]\") - (_x_1_2_1);
    1824     (*res)[2] = jmi_divide_equation(jmi, _y_2_1_6 * _y_2_1_6, jmi_pow_equation(jmi, (_y_2_1_6 + _y_2_1_6 - 2), _y_2_1_6, \"(y[2,1] .+ y[2,1] .- 2) .^ y[2,1]\"), \"y[2,1] .* y[2,1] ./ (y[2,1] .+ y[2,1] .- 2) .^ y[2,1]\") - (_x_2_1_2);
    1825     (*res)[3] = jmi_divide_equation(jmi, _y_2_2_7 * _y_2_2_7, jmi_pow_equation(jmi, (_y_2_2_7 + _y_2_2_7 - 2), _y_2_2_7, \"(y[2,2] .+ y[2,2] .- 2) .^ y[2,2]\"), \"y[2,2] .* y[2,2] ./ (y[2,2] .+ y[2,2] .- 2) .^ y[2,2]\") - (_x_2_2_3);
     1978    (*res)[0] = JMI_DIVIDE_EQUATION(jmi, _y_1_1_4 * _y_1_1_4, JMI_POW_EQUATION(jmi, (_y_1_1_4 + _y_1_1_4 - 2), _y_1_1_4, \"(y[1,1] .+ y[1,1] .- 2) .^ y[1,1]\"), \"y[1,1] .* y[1,1] ./ (y[1,1] .+ y[1,1] .- 2) .^ y[1,1]\") - (_x_1_1_0);
     1979    (*res)[1] = JMI_DIVIDE_EQUATION(jmi, _y_1_2_5 * _y_1_2_5, JMI_POW_EQUATION(jmi, (_y_1_2_5 + _y_1_2_5 - 2), _y_1_2_5, \"(y[1,2] .+ y[1,2] .- 2) .^ y[1,2]\"), \"y[1,2] .* y[1,2] ./ (y[1,2] .+ y[1,2] .- 2) .^ y[1,2]\") - (_x_1_2_1);
     1980    (*res)[2] = JMI_DIVIDE_EQUATION(jmi, _y_2_1_6 * _y_2_1_6, JMI_POW_EQUATION(jmi, (_y_2_1_6 + _y_2_1_6 - 2), _y_2_1_6, \"(y[2,1] .+ y[2,1] .- 2) .^ y[2,1]\"), \"y[2,1] .* y[2,1] ./ (y[2,1] .+ y[2,1] .- 2) .^ y[2,1]\") - (_x_2_1_2);
     1981    (*res)[3] = JMI_DIVIDE_EQUATION(jmi, _y_2_2_7 * _y_2_2_7, JMI_POW_EQUATION(jmi, (_y_2_2_7 + _y_2_2_7 - 2), _y_2_2_7, \"(y[2,2] .+ y[2,2] .- 2) .^ y[2,2]\"), \"y[2,2] .* y[2,2] ./ (y[2,2] .+ y[2,2] .- 2) .^ y[2,2]\") - (_x_2_2_3);
    18261982    (*res)[4] = 1 - (_y_1_1_4);
    18271983    (*res)[5] = 2 - (_y_1_2_5);
     
    18391995    Real y = exp(time) + f(time);
    18401996   
    1841     annotation(__JModelica(UnitTesting(tests={
    1842         CCodeGenTestCase(
    1843             name="CCodeGenExpOp",
    1844             description="C code generation of exp operator",
    1845             inline_functions="none",
    1846             template="
     1997annotation(__JModelica(UnitTesting(tests={
     1998    CCodeGenTestCase(
     1999        name="CCodeGenExpOp",
     2000        description="C code generation of exp operator",
     2001        inline_functions="none",
     2002        template="
    18472003$C_ode_derivatives$
    18482004$C_functions$
    18492005",
    1850             generatedCode="
     2006        generatedCode="
    18512007
    18522008int model_ode_derivatives_base(jmi_t* jmi) {
    18532009    int ef = 0;
    18542010    JMI_DYNAMIC_INIT()
    1855     _y_0 = jmi_exp_equation(jmi, _time,\"exp(time)\") + func_CCodeGenTests_CCodeGenExpOp_f_exp0(_time);
     2011    _y_0 = JMI_EXP_EQUATION(jmi, _time, \"exp(time)\") + func_CCodeGenTests_CCodeGenExpOp_f_exp0(_time);
    18562012    JMI_DYNAMIC_FREE()
    18572013    return ef;
     
    18612017    JMI_DYNAMIC_INIT()
    18622018    JMI_DEF(REA, y_v)
    1863     y_v = jmi_exp_function(\"CCodeGenTests.CCodeGenExpOp.f\", x_v,\"exp(x)\");
     2019    y_v = JMI_EXP_FUNCTION(\"CCodeGenTests.CCodeGenExpOp.f\", x_v, \"exp(x)\");
    18642020    JMI_RET(GEN, y_o, y_v)
    18652021    JMI_DYNAMIC_FREE()
     
    18842040    Real y = log(time) + f(time);
    18852041   
    1886     annotation(__JModelica(UnitTesting(tests={
    1887         CCodeGenTestCase(
    1888             name="CCodeGenLogOp",
    1889             description="C code generation of log operator",
    1890             inline_functions="none",
    1891             template="
     2042annotation(__JModelica(UnitTesting(tests={
     2043    CCodeGenTestCase(
     2044        name="CCodeGenLogOp",
     2045        description="C code generation of log operator",
     2046        inline_functions="none",
     2047        template="
    18922048$C_ode_derivatives$
    18932049$C_functions$
    18942050",
    1895             generatedCode="
     2051        generatedCode="
    18962052
    18972053int model_ode_derivatives_base(jmi_t* jmi) {
    18982054    int ef = 0;
    18992055    JMI_DYNAMIC_INIT()
    1900     _y_0 = jmi_log_equation(jmi, _time,\"log(time)\") + func_CCodeGenTests_CCodeGenLogOp_f_exp0(_time);
     2056    _y_0 = JMI_LOG_EQUATION(jmi, _time, \"log(time)\") + func_CCodeGenTests_CCodeGenLogOp_f_exp0(_time);
    19012057    JMI_DYNAMIC_FREE()
    19022058    return ef;
     
    19062062    JMI_DYNAMIC_INIT()
    19072063    JMI_DEF(REA, y_v)
    1908     y_v = jmi_log_function(\"CCodeGenTests.CCodeGenLogOp.f\", x_v,\"log(x)\");
     2064    y_v = JMI_LOG_FUNCTION(\"CCodeGenTests.CCodeGenLogOp.f\", x_v, \"log(x)\");
    19092065    JMI_RET(GEN, y_o, y_v)
    19102066    JMI_DYNAMIC_FREE()
     
    19292085    Real y = log10(time) + f(time);
    19302086   
    1931     annotation(__JModelica(UnitTesting(tests={
    1932         CCodeGenTestCase(
    1933             name="CCodeGenLog10Op",
    1934             description="C code generation of log10 operator",
    1935             inline_functions="none",
    1936             template="
     2087annotation(__JModelica(UnitTesting(tests={
     2088    CCodeGenTestCase(
     2089        name="CCodeGenLog10Op",
     2090        description="C code generation of log10 operator",
     2091        inline_functions="none",
     2092        template="
    19372093$C_ode_derivatives$
    19382094$C_functions$
    19392095",
    1940             generatedCode="
     2096        generatedCode="
    19412097
    19422098int model_ode_derivatives_base(jmi_t* jmi) {
    19432099    int ef = 0;
    19442100    JMI_DYNAMIC_INIT()
    1945     _y_0 = jmi_log10_equation(jmi, _time,\"log10(time)\") + func_CCodeGenTests_CCodeGenLog10Op_f_exp0(_time);
     2101    _y_0 = JMI_LOG10_EQUATION(jmi, _time, \"log10(time)\") + func_CCodeGenTests_CCodeGenLog10Op_f_exp0(_time);
    19462102    JMI_DYNAMIC_FREE()
    19472103    return ef;
     
    19512107    JMI_DYNAMIC_INIT()
    19522108    JMI_DEF(REA, y_v)
    1953     y_v = jmi_log10_function(\"CCodeGenTests.CCodeGenLog10Op.f\", x_v,\"log10(x)\");
     2109    y_v = JMI_LOG10_FUNCTION(\"CCodeGenTests.CCodeGenLog10Op.f\", x_v, \"log10(x)\");
    19542110    JMI_RET(GEN, y_o, y_v)
    19552111    JMI_DYNAMIC_FREE()
     
    19742130    Real y = sinh(time) + f(time);
    19752131   
    1976     annotation(__JModelica(UnitTesting(tests={
    1977         CCodeGenTestCase(
    1978             name="CCodeGenSinhOp",
    1979             description="C code generation of sinh operator",
    1980             inline_functions="none",
    1981             template="
     2132annotation(__JModelica(UnitTesting(tests={
     2133    CCodeGenTestCase(
     2134        name="CCodeGenSinhOp",
     2135        description="C code generation of sinh operator",
     2136        inline_functions="none",
     2137        template="
    19822138$C_ode_derivatives$
    19832139$C_functions$
    19842140",
    1985             generatedCode="
     2141        generatedCode="
    19862142
    19872143int model_ode_derivatives_base(jmi_t* jmi) {
    19882144    int ef = 0;
    19892145    JMI_DYNAMIC_INIT()
    1990     _y_0 = jmi_sinh_equation(jmi, _time,\"sinh(time)\") + func_CCodeGenTests_CCodeGenSinhOp_f_exp0(_time);
     2146    _y_0 = JMI_SINH_EQUATION(jmi, _time, \"sinh(time)\") + func_CCodeGenTests_CCodeGenSinhOp_f_exp0(_time);
    19912147    JMI_DYNAMIC_FREE()
    19922148    return ef;
     
    19962152    JMI_DYNAMIC_INIT()
    19972153    JMI_DEF(REA, y_v)
    1998     y_v = jmi_sinh_function(\"CCodeGenTests.CCodeGenSinhOp.f\", x_v,\"sinh(x)\");
     2154    y_v = JMI_SINH_FUNCTION(\"CCodeGenTests.CCodeGenSinhOp.f\", x_v, \"sinh(x)\");
    19992155    JMI_RET(GEN, y_o, y_v)
    20002156    JMI_DYNAMIC_FREE()
     
    20192175    Real y = cosh(time) + f(time);
    20202176   
    2021     annotation(__JModelica(UnitTesting(tests={
    2022         CCodeGenTestCase(
    2023             name="CCodeGenCoshOp",
    2024             description="C code generation of cosh operator",
    2025             inline_functions="none",
    2026             template="
     2177annotation(__JModelica(UnitTesting(tests={
     2178    CCodeGenTestCase(
     2179        name="CCodeGenCoshOp",
     2180        description="C code generation of cosh operator",
     2181        inline_functions="none",
     2182        template="
    20272183$C_ode_derivatives$
    20282184$C_functions$
    20292185",
    2030             generatedCode="
     2186        generatedCode="
    20312187
    20322188int model_ode_derivatives_base(jmi_t* jmi) {
    20332189    int ef = 0;
    20342190    JMI_DYNAMIC_INIT()
    2035     _y_0 = jmi_cosh_equation(jmi, _time,\"cosh(time)\") + func_CCodeGenTests_CCodeGenCoshOp_f_exp0(_time);
     2191    _y_0 = JMI_COSH_EQUATION(jmi, _time, \"cosh(time)\") + func_CCodeGenTests_CCodeGenCoshOp_f_exp0(_time);
    20362192    JMI_DYNAMIC_FREE()
    20372193    return ef;
     
    20412197    JMI_DYNAMIC_INIT()
    20422198    JMI_DEF(REA, y_v)
    2043     y_v = jmi_cosh_function(\"CCodeGenTests.CCodeGenCoshOp.f\", x_v,\"cosh(x)\");
     2199    y_v = JMI_COSH_FUNCTION(\"CCodeGenTests.CCodeGenCoshOp.f\", x_v, \"cosh(x)\");
    20442200    JMI_RET(GEN, y_o, y_v)
    20452201    JMI_DYNAMIC_FREE()
     
    20642220    Real y = tan(time) + f(time);
    20652221   
    2066     annotation(__JModelica(UnitTesting(tests={
    2067         CCodeGenTestCase(
    2068             name="CCodeGenTanOp",
    2069             description="C code generation of tan operator",
    2070             inline_functions="none",
    2071             template="
     2222annotation(__JModelica(UnitTesting(tests={
     2223    CCodeGenTestCase(
     2224        name="CCodeGenTanOp",
     2225        description="C code generation of tan operator",
     2226        inline_functions="none",
     2227        template="
    20722228$C_ode_derivatives$
    20732229$C_functions$
    20742230",
    2075             generatedCode="
     2231        generatedCode="
    20762232
    20772233int model_ode_derivatives_base(jmi_t* jmi) {
    20782234    int ef = 0;
    20792235    JMI_DYNAMIC_INIT()
    2080     _y_0 = jmi_tan_equation(jmi, _time,\"tan(time)\") + func_CCodeGenTests_CCodeGenTanOp_f_exp0(_time);
     2236    _y_0 = JMI_TAN_EQUATION(jmi, _time, \"tan(time)\") + func_CCodeGenTests_CCodeGenTanOp_f_exp0(_time);
    20812237    JMI_DYNAMIC_FREE()
    20822238    return ef;
     
    20862242    JMI_DYNAMIC_INIT()
    20872243    JMI_DEF(REA, y_v)
    2088     y_v = jmi_tan_function(\"CCodeGenTests.CCodeGenTanOp.f\", x_v,\"tan(x)\");
     2244    y_v = JMI_TAN_FUNCTION(\"CCodeGenTests.CCodeGenTanOp.f\", x_v, \"tan(x)\");
    20892245    JMI_RET(GEN, y_o, y_v)
    20902246    JMI_DYNAMIC_FREE()
     
    21232279    int ef = 0;
    21242280    JMI_DYNAMIC_INIT()
    2125     _y_0 = jmi_atan2_equation(jmi, _time, _time + 1.0, \"atan2(time, time + 1)\") + func_CCodeGenTests_CCodeGenATan2Op_f_exp0(_time);
     2281    _y_0 = JMI_ATAN2_EQUATION(jmi, _time, _time + 1.0, \"atan2(time, time + 1)\") + func_CCodeGenTests_CCodeGenATan2Op_f_exp0(_time);
    21262282    JMI_DYNAMIC_FREE()
    21272283    return ef;
     
    21312287    JMI_DYNAMIC_INIT()
    21322288    JMI_DEF(REA, y_v)
    2133     y_v = jmi_atan2_function(\"CCodeGenTests.CCodeGenATan2Op.f\", x_v, x_v + 1.0, \"atan2(x, x + 1)\");
     2289    y_v = JMI_ATAN2_FUNCTION(\"CCodeGenTests.CCodeGenATan2Op.f\", x_v, x_v + 1.0, \"atan2(x, x + 1)\");
    21342290    JMI_RET(GEN, y_o, y_v)
    21352291    JMI_DYNAMIC_FREE()
     
    21672323    (*res)[2] = 3 - (_x_2_1_2);
    21682324    (*res)[3] = 4 - (_x_2_2_3);
    2169     (*res)[4] = jmi_min(jmi_min(_x_1_1_0, _x_1_2_1), jmi_min(_x_2_1_2, _x_2_2_3)) - (_y1_4);
    2170     (*res)[5] = jmi_min(1.0, 2.0) - (_y2_5);
    2171     (*res)[6] = jmi_max(jmi_max(_x_1_1_0, _x_1_2_1), jmi_max(_x_2_1_2, _x_2_2_3)) - (_y3_6);
    2172     (*res)[7] = jmi_max(1.0, 2.0) - (_y4_7);
     2325    (*res)[4] = JMI_MIN_EQUATION(JMI_MIN_EQUATION(_x_1_1_0, _x_1_2_1), JMI_MIN_EQUATION(_x_2_1_2, _x_2_2_3)) - (_y1_4);
     2326    (*res)[5] = JMI_MIN_EQUATION(1.0, 2.0) - (_y2_5);
     2327    (*res)[6] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(_x_1_1_0, _x_1_2_1), JMI_MAX_EQUATION(_x_2_1_2, _x_2_2_3)) - (_y3_6);
     2328    (*res)[7] = JMI_MAX_EQUATION(1.0, 2.0) - (_y4_7);
    21732329")})));
    21742330end CCodeGenMinMax;
     
    34693625    {a, b[1],b[2],c,b[3],d} = F({e, f[1], f[2], g, f[3], h});
    34703626   
    3471     annotation(__JModelica(UnitTesting(tests={
    3472         CCodeGenTestCase(
    3473             name="CFunctionTest23",
    3474             description="memcpy for parts of array (both of input and output)",
    3475             template="$C_ode_derivatives$",
    3476             generatedCode="
     3627annotation(__JModelica(UnitTesting(tests={
     3628    CCodeGenTestCase(
     3629        name="CFunctionTest23",
     3630        description="memcpy for parts of array (both of input and output)",
     3631        template="$C_ode_derivatives$",
     3632        generatedCode="
    34773633
    34783634int model_ode_derivatives_base(jmi_t* jmi) {
     
    34823638    JMI_ARR(STACK, jmi_real_t, jmi_array_t, tmp_2, 6, 1)
    34833639    _e_3 = _time;
    3484     _f_1_7 = sin(_time - 0.5);
    3485     _f_2_8 = sin(_time);
    3486     _g_10 = cos(_time);
    3487     _f_3_9 = sin(_time + 0.5);
    3488     _h_11 = - cos(_time);
     3640    _f_1_7 = JMI_SIN_EQUATION(jmi, _time - 0.5, \"sin(time - 0.5)\");
     3641    _f_2_8 = JMI_SIN_EQUATION(jmi, _time, \"sin(time)\");
     3642    _g_10 = JMI_COS_EQUATION(jmi, _time, \"cos(time)\");
     3643    _f_3_9 = JMI_SIN_EQUATION(jmi, _time + 0.5, \"sin(time + 0.5)\");
     3644    _h_11 = - JMI_COS_EQUATION(jmi, _time, \"cos(time)\");
    34893645    JMI_ARRAY_INIT_1(STACK, jmi_real_t, jmi_array_t, tmp_1, 6, 1, 6)
    34903646    JMI_ARRAY_INIT_1(STACK, jmi_real_t, jmi_array_t, tmp_2, 6, 1, 6)
     
    35903746        temp_2_v = temp_2_v + jmi_array_val_1(x_a, i1_2i);
    35913747    }
    3592     n_v = floor(jmi_divide_function(\"CCodeGenTests.FuncWithArray.g\", temp_1_v, temp_2_v, \"temp_1 / temp_2\"));
     3748    n_v = floor(JMI_DIVIDE_FUNCTION(\"CCodeGenTests.FuncWithArray.g\", temp_1_v, temp_2_v, \"temp_1 / temp_2\"));
    35933749    JMI_RET(GEN, n_o, n_v)
    35943750    JMI_DYNAMIC_FREE()
     
    39324088    int i_1ii;
    39334089    x_v = 0;
    3934     JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, temp_1_a, jmi_max(n_v, 0.0), 1, jmi_max(n_v, 0.0))
     4090    JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, temp_1_a, JMI_MAX_EQUATION(n_v, 0.0), 1, JMI_MAX_EQUATION(n_v, 0.0))
    39354091    i1_0in = 0;
    3936     i1_0ie = floor((jmi_max(n_v, 0.0)) - (1));
     4092    i1_0ie = floor((JMI_MAX_EQUATION(n_v, 0.0)) - (1));
    39374093    for (i1_0i = 1; i1_0in <= i1_0ie; i1_0i = 1 + (++i1_0in)) {
    39384094        jmi_array_ref_1(temp_1_a, i1_0i) = (1.0 * (i1_0i) * (i1_0i));
     
    44544610    jmi_int_t i1_2in;
    44554611    out_v = 1.0;
    4456     if (COND_EXP_EQ(jmi_max(floor(2.0 - (i_v + 1.0)) + 1.0, 0.0), 2.0, JMI_TRUE, JMI_FALSE) == JMI_FALSE) {
     4612    if (COND_EXP_EQ(JMI_MAX_EQUATION(floor(2.0 - (i_v + 1.0)) + 1.0, 0.0), 2.0, JMI_TRUE, JMI_FALSE) == JMI_FALSE) {
    44574613        jmi_assert_failed(\"Mismatching sizes in CCodeGenTests.CArrayInput6.f1\", JMI_ASSERT_ERROR);
    44584614    }
    4459     JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, temp_1_a, jmi_max(floor(2.0 - (i_v + 1.0)) + 1.0, 0.0), 1, jmi_max(floor(2.0 - (i_v + 1.0)) + 1.0, 0.0))
     4615    JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, temp_1_a, JMI_MAX_EQUATION(floor(2.0 - (i_v + 1.0)) + 1.0, 0.0), 1, JMI_MAX_EQUATION(floor(2.0 - (i_v + 1.0)) + 1.0, 0.0))
    44604616    i1_0in = 0;
    4461     i1_0ie = floor((jmi_max(floor(2.0 - (i_v + 1.0)) + 1.0, 0.0)) - (1));
     4617    i1_0ie = floor((JMI_MAX_EQUATION(floor(2.0 - (i_v + 1.0)) + 1.0, 0.0)) - (1));
    44624618    for (i1_0i = 1; i1_0in <= i1_0ie; i1_0i = 1 + (++i1_0in)) {
    44634619        jmi_array_ref_1(temp_1_a, i1_0i) = i_v + 1 + (i1_0i - 1);
    44644620    }
    44654621    if (COND_EXP_LT(func_CCodeGenTests_CArrayInput6_f2_exp1(temp_1_a), 4, JMI_TRUE, JMI_FALSE)) {
    4466         if (COND_EXP_EQ(jmi_max(floor(6.0 - (i_v + 5.0)) + 1.0, 0.0), 2.0, JMI_TRUE, JMI_FALSE) == JMI_FALSE) {
     4622        if (COND_EXP_EQ(JMI_MAX_EQUATION(floor(6.0 - (i_v + 5.0)) + 1.0, 0.0), 2.0, JMI_TRUE, JMI_FALSE) == JMI_FALSE) {
    44674623            jmi_assert_failed(\"Mismatching sizes in CCodeGenTests.CArrayInput6.f1\", JMI_ASSERT_ERROR);
    44684624        }
    4469         JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, temp_2_a, jmi_max(floor(6.0 - (i_v + 5.0)) + 1.0, 0.0), 1, jmi_max(floor(6.0 - (i_v + 5.0)) + 1.0, 0.0))
     4625        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, temp_2_a, JMI_MAX_EQUATION(floor(6.0 - (i_v + 5.0)) + 1.0, 0.0), 1, JMI_MAX_EQUATION(floor(6.0 - (i_v + 5.0)) + 1.0, 0.0))
    44704626        i1_1in = 0;
    4471         i1_1ie = floor((jmi_max(floor(6.0 - (i_v + 5.0)) + 1.0, 0.0)) - (1));
     4627        i1_1ie = floor((JMI_MAX_EQUATION(floor(6.0 - (i_v + 5.0)) + 1.0, 0.0)) - (1));
    44724628        for (i1_1i = 1; i1_1in <= i1_1ie; i1_1i = 1 + (++i1_1in)) {
    44734629            jmi_array_ref_1(temp_2_a, i1_1i) = i_v + 5 + (i1_1i - 1);
     
    44754631        out_v = func_CCodeGenTests_CArrayInput6_f2_exp1(temp_2_a);
    44764632    } else {
    4477         if (COND_EXP_EQ(jmi_max(floor(8.0 - (i_v + 7.0)) + 1.0, 0.0), 2.0, JMI_TRUE, JMI_FALSE) == JMI_FALSE) {
     4633        if (COND_EXP_EQ(JMI_MAX_EQUATION(floor(8.0 - (i_v + 7.0)) + 1.0, 0.0), 2.0, JMI_TRUE, JMI_FALSE) == JMI_FALSE) {
    44784634            jmi_assert_failed(\"Mismatching sizes in CCodeGenTests.CArrayInput6.f1\", JMI_ASSERT_ERROR);
    44794635        }
    4480         JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, temp_3_a, jmi_max(floor(8.0 - (i_v + 7.0)) + 1.0, 0.0), 1, jmi_max(floor(8.0 - (i_v + 7.0)) + 1.0, 0.0))
     4636        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, temp_3_a, JMI_MAX_EQUATION(floor(8.0 - (i_v + 7.0)) + 1.0, 0.0), 1, JMI_MAX_EQUATION(floor(8.0 - (i_v + 7.0)) + 1.0, 0.0))
    44814637        i1_2in = 0;
    4482         i1_2ie = floor((jmi_max(floor(8.0 - (i_v + 7.0)) + 1.0, 0.0)) - (1));
     4638        i1_2ie = floor((JMI_MAX_EQUATION(floor(8.0 - (i_v + 7.0)) + 1.0, 0.0)) - (1));
    44834639        for (i1_2i = 1; i1_2in <= i1_2ie; i1_2i = 1 + (++i1_2in)) {
    44844640            jmi_array_ref_1(temp_3_a, i1_2i) = i_v + 7 + (i1_2i - 1);
     
    51465302 Real y = -2;
    51475303
    5148     annotation(__JModelica(UnitTesting(tests={
    5149         CCodeGenTestCase(
    5150             name="CAbsTest1",
    5151             description="C code generation for abs() operator",
    5152             variability_propagation=false,
    5153             generate_ode=false,
    5154             generate_dae=true,
    5155             template="$C_DAE_equation_residuals$",
    5156             generatedCode="
    5157     (*res)[0] = jmi_abs(_y_1) - (_x_0);
     5304annotation(__JModelica(UnitTesting(tests={
     5305    CCodeGenTestCase(
     5306        name="CAbsTest1",
     5307        description="C code generation for abs() operator",
     5308        variability_propagation=false,
     5309        generate_ode=false,
     5310        generate_dae=true,
     5311        template="$C_DAE_equation_residuals$",
     5312        generatedCode="
     5313    (*res)[0] = JMI_ABS_EQUATION(_y_1) - (_x_0);
    51585314    (*res)[1] = -2 - (_y_1);
    51595315")})));
     
    57515907    i_0ie = floor((m_v) - (1));
    57525908    for (i_0i = 1; i_0in <= i_0ie; i_0i = 1 + (++i_0in)) {
    5753         JMI_ARRAY_INIT_1(HEAP, R1_1_r, R1_1_ra, temp_1_a, jmi_max(m_v, 0.0), 1, jmi_max(m_v, 0.0))
     5909        JMI_ARRAY_INIT_1(HEAP, R1_1_r, R1_1_ra, temp_1_a, JMI_MAX_EQUATION(m_v, 0.0), 1, JMI_MAX_EQUATION(m_v, 0.0))
    57545910        i1_1in = 0;
    5755         i1_1ie = floor((jmi_max(m_v, 0.0)) - (1));
     5911        i1_1ie = floor((JMI_MAX_EQUATION(m_v, 0.0)) - (1));
    57565912        for (i1_1i = 1; i1_1in <= i1_1ie; i1_1i = 1 + (++i1_1in)) {
    57575913            JMI_ARRAY_INIT_1(STACK, R2_0_r, R2_0_ra, temp_2_a, 1, 1, 1)
     
    57935949    return;
    57945950}
     5951
    57955952")})));
    57965953end CUnknownArray7;
     
    60676224    i_0ie = floor((jmi_array_size(x_a, 0)) - (1));
    60686225    for (i_0i = 1; i_0in <= i_0ie; i_0i = 1 + (++i_0in)) {
    6069         JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, temp_1_a, (jmi_array_size(x_a, 0) + jmi_max(i_0i, 0.0)), 1, jmi_array_size(x_a, 0) + jmi_max(i_0i, 0.0))
     6226        JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, temp_1_a, (jmi_array_size(x_a, 0) + JMI_MAX_EQUATION(i_0i, 0.0)), 1, jmi_array_size(x_a, 0) + JMI_MAX_EQUATION(i_0i, 0.0))
    60706227        i1_1in = 0;
    60716228        i1_1ie = floor((jmi_array_size(x_a, 0)) - (1));
     
    60746231        }
    60756232        i1_2in = 0;
    6076         i1_2ie = floor((jmi_max(i_0i, 0.0)) - (1));
     6233        i1_2ie = floor((JMI_MAX_EQUATION(i_0i, 0.0)) - (1));
    60776234        for (i1_2i = 1; i1_2in <= i1_2ie; i1_2i = 1 + (++i1_2in)) {
    60786235            jmi_array_ref_1(temp_1_a, i1_2i + jmi_array_size(x_a, 0)) = i1_2i;
     
    74177574        template="$C_DAE_equation_residuals$",
    74187575        generatedCode="
    7419     (*res)[0] = jmi_pow_equation(jmi, 10, 10, \"10 ^ 10\") - (_x_0);
     7576    (*res)[0] = JMI_POW_EQUATION(jmi, 10, 10, \"10 ^ 10\") - (_x_0);
    74207577")})));
    74217578end CIntegerExp4;
     
    74347591        template="$C_DAE_equation_residuals$",
    74357592        generatedCode="
    7436     (*res)[0] = jmi_pow_equation(jmi, 10, -10, \"10 ^ -10\") - (_x_0);
     7593    (*res)[0] = JMI_POW_EQUATION(jmi, 10, -10, \"10 ^ -10\") - (_x_0);
    74377594")})));
    74387595end CIntegerExp5;
     
    78107967        generatedCode="
    78117968    jmi_real_t nSamp;
    7812     if (SURELY_LT_ZERO(COND_EXP_EQ(LOG_EXP_NOT(_atInitial), JMI_TRUE, _time - (pre__sampleItr_1_4 * jmi_divide_equation(jmi, 2, 3, \"(2 / 3)\")), 1.0))) {
    7813         jmi_min_time_event(nextTimeEvent, 1, 0, pre__sampleItr_1_4 * jmi_divide_equation(jmi, 2, 3, \"(2 / 3)\"));
    7814     }
    7815     if (SURELY_LT_ZERO(_time - ((pre__sampleItr_1_4 + 1.0) * jmi_divide_equation(jmi, 2.0, 3.0, \"(2 / 3)\")))) {
    7816         jmi_min_time_event(nextTimeEvent, 1, 0, (pre__sampleItr_1_4 + 1.0) * jmi_divide_equation(jmi, 2.0, 3.0, \"(2 / 3)\"));
    7817     }
    7818     if (SURELY_LT_ZERO(COND_EXP_EQ(LOG_EXP_NOT(_atInitial), JMI_TRUE, _time - (pre__sampleItr_2_6 * jmi_divide_equation(jmi, 1, 3, \"(1 / 3)\")), 1.0))) {
    7819         jmi_min_time_event(nextTimeEvent, 1, 0, pre__sampleItr_2_6 * jmi_divide_equation(jmi, 1, 3, \"(1 / 3)\"));
    7820     }
    7821     if (SURELY_LT_ZERO(_time - ((pre__sampleItr_2_6 + 1.0) * jmi_divide_equation(jmi, 1.0, 3.0, \"(1 / 3)\")))) {
    7822         jmi_min_time_event(nextTimeEvent, 1, 0, (pre__sampleItr_2_6 + 1.0) * jmi_divide_equation(jmi, 1.0, 3.0, \"(1 / 3)\"));
     7969    if (SURELY_LT_ZERO(COND_EXP_EQ(LOG_EXP_NOT(_atInitial), JMI_TRUE, _time - (pre__sampleItr_1_4 * JMI_DIVIDE_EQUATION(jmi, 2, 3, \"(2 / 3)\")), 1.0))) {
     7970        jmi_min_time_event(nextTimeEvent, 1, 0, pre__sampleItr_1_4 * JMI_DIVIDE_EQUATION(jmi, 2, 3, \"(2 / 3)\"));
     7971    }
     7972    if (SURELY_LT_ZERO(_time - ((pre__sampleItr_1_4 + 1.0) * JMI_DIVIDE_EQUATION(jmi, 2.0, 3.0, \"(2 / 3)\")))) {
     7973        jmi_min_time_event(nextTimeEvent, 1, 0, (pre__sampleItr_1_4 + 1.0) * JMI_DIVIDE_EQUATION(jmi, 2.0, 3.0, \"(2 / 3)\"));
     7974    }
     7975    if (SURELY_LT_ZERO(COND_EXP_EQ(LOG_EXP_NOT(_atInitial), JMI_TRUE, _time - (pre__sampleItr_2_6 * JMI_DIVIDE_EQUATION(jmi, 1, 3, \"(1 / 3)\")), 1.0))) {
     7976        jmi_min_time_event(nextTimeEvent, 1, 0, pre__sampleItr_2_6 * JMI_DIVIDE_EQUATION(jmi, 1, 3, \"(1 / 3)\"));
     7977    }
     7978    if (SURELY_LT_ZERO(_time - ((pre__sampleItr_2_6 + 1.0) * JMI_DIVIDE_EQUATION(jmi, 1.0, 3.0, \"(1 / 3)\")))) {
     7979        jmi_min_time_event(nextTimeEvent, 1, 0, (pre__sampleItr_2_6 + 1.0) * JMI_DIVIDE_EQUATION(jmi, 1.0, 3.0, \"(1 / 3)\"));
    78237980    }
    78247981 
     
    78297986    _der_dummy_13 = 0;
    78307987    if (jmi->atInitial || jmi->atEvent) {
    7831         _sw(3) = jmi_turn_switch_time(jmi, _time - ((pre__sampleItr_2_6 + 1.0) * jmi_divide_equation(jmi, 1.0, 3.0, \"(1 / 3)\")), _sw(3), JMI_REL_LT);
     7988        _sw(3) = jmi_turn_switch_time(jmi, _time - ((pre__sampleItr_2_6 + 1.0) * JMI_DIVIDE_EQUATION(jmi, 1.0, 3.0, \"(1 / 3)\")), _sw(3), JMI_REL_LT);
    78327989    }
    78337990    if (jmi->atInitial || jmi->atEvent) {
    7834         _sw(2) = jmi_turn_switch_time(jmi, _time - (pre__sampleItr_2_6 * jmi_divide_equation(jmi, 1, 3, \"(1 / 3)\")), _sw(2), JMI_REL_GEQ);
     7991        _sw(2) = jmi_turn_switch_time(jmi, _time - (pre__sampleItr_2_6 * JMI_DIVIDE_EQUATION(jmi, 1, 3, \"(1 / 3)\")), _sw(2), JMI_REL_GEQ);
    78357992    }
    78367993    ef |= jmi_solve_block_residual(jmi->dae_block_residuals[0]);
    78377994    if (jmi->atInitial || jmi->atEvent) {
    7838         _sw(1) = jmi_turn_switch_time(jmi, _time - ((pre__sampleItr_1_4 + 1.0) * jmi_divide_equation(jmi, 2.0, 3.0, \"(2 / 3)\")), _sw(1), JMI_REL_LT);
     7995        _sw(1) = jmi_turn_switch_time(jmi, _time - ((pre__sampleItr_1_4 + 1.0) * JMI_DIVIDE_EQUATION(jmi, 2.0, 3.0, \"(2 / 3)\")), _sw(1), JMI_REL_LT);
    78397996    }
    78407997    if (jmi->atInitial || jmi->atEvent) {
    7841         _sw(0) = jmi_turn_switch_time(jmi, _time - (pre__sampleItr_1_4 * jmi_divide_equation(jmi, 2, 3, \"(2 / 3)\")), _sw(0), JMI_REL_GEQ);
     7998        _sw(0) = jmi_turn_switch_time(jmi, _time - (pre__sampleItr_1_4 * JMI_DIVIDE_EQUATION(jmi, 2, 3, \"(2 / 3)\")), _sw(0), JMI_REL_GEQ);
    78427999    }
    78438000    ef |= jmi_solve_block_residual(jmi->dae_block_residuals[1]);
     
    78548011        _sw_init(0) = jmi_turn_switch_time(jmi, _time - (0.0), _sw_init(0), JMI_REL_LT);
    78558012    }
    7856     __sampleItr_1_4 = COND_EXP_EQ(_sw_init(0), JMI_TRUE, 0.0, ceil(jmi_divide_equation(jmi, _time, jmi_divide_equation(jmi, 2.0, 3.0, \"(2 / 3)\"), \"time / (2 / 3)\")));
     8013    __sampleItr_1_4 = COND_EXP_EQ(_sw_init(0), JMI_TRUE, 0.0, ceil(JMI_DIVIDE_EQUATION(jmi, _time, JMI_DIVIDE_EQUATION(jmi, 2.0, 3.0, \"(2 / 3)\"), \"time / (2 / 3)\")));
    78578014    pre__sampleItr_1_4 = __sampleItr_1_4;
    78588015    if (jmi->atInitial || jmi->atEvent) {
    7859         _sw(0) = jmi_turn_switch_time(jmi, _time - (pre__sampleItr_1_4 * jmi_divide_equation(jmi, 2, 3, \"(2 / 3)\")), _sw(0), JMI_REL_GEQ);
     8016        _sw(0) = jmi_turn_switch_time(jmi, _time - (pre__sampleItr_1_4 * JMI_DIVIDE_EQUATION(jmi, 2, 3, \"(2 / 3)\")), _sw(0), JMI_REL_GEQ);
    78608017    }
    78618018    _temp_1_3 = LOG_EXP_AND(LOG_EXP_NOT(_atInitial), _sw(0));
    78628019    if (jmi->atInitial || jmi->atEvent) {
    7863         _sw(1) = jmi_turn_switch_time(jmi, _time - ((pre__sampleItr_1_4 + 1.0) * jmi_divide_equation(jmi, 2.0, 3.0, \"(2 / 3)\")), _sw(1), JMI_REL_LT);
     8020        _sw(1) = jmi_turn_switch_time(jmi, _time - ((pre__sampleItr_1_4 + 1.0) * JMI_DIVIDE_EQUATION(jmi, 2.0, 3.0, \"(2 / 3)\")), _sw(1), JMI_REL_LT);
    78648021    }
    78658022    if (_sw(1) == JMI_FALSE) {
     
    78698026        _sw_init(0) = jmi_turn_switch_time(jmi, _time - (0.0), _sw_init(0), JMI_REL_LT);
    78708027    }
    7871     __sampleItr_2_6 = COND_EXP_EQ(_sw_init(0), JMI_TRUE, 0.0, ceil(jmi_divide_equation(jmi, _time, jmi_divide_equation(jmi, 1.0, 3.0, \"(1 / 3)\"), \"time / (1 / 3)\")));
     8028    __sampleItr_2_6 = COND_EXP_EQ(_sw_init(0), JMI_TRUE, 0.0, ceil(JMI_DIVIDE_EQUATION(jmi, _time, JMI_DIVIDE_EQUATION(jmi, 1.0, 3.0, \"(1 / 3)\"), \"time / (1 / 3)\")));
    78728029    pre__sampleItr_2_6 = __sampleItr_2_6;
    78738030    if (jmi->atInitial || jmi->atEvent) {
    7874         _sw(2) = jmi_turn_switch_time(jmi, _time - (pre__sampleItr_2_6 * jmi_divide_equation(jmi, 1, 3, \"(1 / 3)\")), _sw(2), JMI_REL_GEQ);
     8031        _sw(2) = jmi_turn_switch_time(jmi, _time - (pre__sampleItr_2_6 * JMI_DIVIDE_EQUATION(jmi, 1, 3, \"(1 / 3)\")), _sw(2), JMI_REL_GEQ);
    78758032    }
    78768033    _temp_2_5 = LOG_EXP_AND(LOG_EXP_NOT(_atInitial), _sw(2));
    78778034    if (jmi->atInitial || jmi->atEvent) {
    7878         _sw(3) = jmi_turn_switch_time(jmi, _time - ((pre__sampleItr_2_6 + 1.0) * jmi_divide_equation(jmi, 1.0, 3.0, \"(1 / 3)\")), _sw(3), JMI_REL_LT);
     8035        _sw(3) = jmi_turn_switch_time(jmi, _time - ((pre__sampleItr_2_6 + 1.0) * JMI_DIVIDE_EQUATION(jmi, 1.0, 3.0, \"(1 / 3)\")), _sw(3), JMI_REL_LT);
    78798036    }
    78808037    if (_sw(3) == JMI_FALSE) {
     
    79108067        }
    79118068        if (evaluation_mode & JMI_BLOCK_EVALUATE_NON_REALS) {
    7912             _sw(3) = jmi_turn_switch_time(jmi, _time - ((pre__sampleItr_2_6 + 1.0) * jmi_divide_equation(jmi, 1.0, 3.0, \"(1 / 3)\")), _sw(3), JMI_REL_LT);
     8069            _sw(3) = jmi_turn_switch_time(jmi, _time - ((pre__sampleItr_2_6 + 1.0) * JMI_DIVIDE_EQUATION(jmi, 1.0, 3.0, \"(1 / 3)\")), _sw(3), JMI_REL_LT);
    79138070        }
    79148071        if (_sw(3) == JMI_FALSE) {
     
    79178074        if (evaluation_mode & JMI_BLOCK_EVALUATE_NON_REALS) {
    79188075            if (evaluation_mode & JMI_BLOCK_EVALUATE_NON_REALS) {
    7919                 _sw(2) = jmi_turn_switch_time(jmi, _time - (pre__sampleItr_2_6 * jmi_divide_equation(jmi, 1, 3, \"(1 / 3)\")), _sw(2), JMI_REL_GEQ);
     8076                _sw(2) = jmi_turn_switch_time(jmi, _time - (pre__sampleItr_2_6 * JMI_DIVIDE_EQUATION(jmi, 1, 3, \"(1 / 3)\")), _sw(2), JMI_REL_GEQ);
    79208077            }
    79218078            _temp_2_5 = LOG_EXP_AND(LOG_EXP_NOT(_atInitial), _sw(2));
     
    79508107        }
    79518108        if (evaluation_mode & JMI_BLOCK_EVALUATE_NON_REALS) {
    7952             _sw(1) = jmi_turn_switch_time(jmi, _time - ((pre__sampleItr_1_4 + 1.0) * jmi_divide_equation(jmi, 2.0, 3.0, \"(2 / 3)\")), _sw(1), JMI_REL_LT);
     8109            _sw(1) = jmi_turn_switch_time(jmi, _time - ((pre__sampleItr_1_4 + 1.0) * JMI_DIVIDE_EQUATION(jmi, 2.0, 3.0, \"(2 / 3)\")), _sw(1), JMI_REL_LT);
    79538110        }
    79548111        if (_sw(1) == JMI_FALSE) {
     
    79578114        if (evaluation_mode & JMI_BLOCK_EVALUATE_NON_REALS) {
    79588115            if (evaluation_mode & JMI_BLOCK_EVALUATE_NON_REALS) {
    7959                 _sw(0) = jmi_turn_switch_time(jmi, _time - (pre__sampleItr_1_4 * jmi_divide_equation(jmi, 2, 3, \"(2 / 3)\")), _sw(0), JMI_REL_GEQ);
     8116                _sw(0) = jmi_turn_switch_time(jmi, _time - (pre__sampleItr_1_4 * JMI_DIVIDE_EQUATION(jmi, 2, 3, \"(2 / 3)\")), _sw(0), JMI_REL_GEQ);
    79608117            }
    79618118            _temp_1_3 = LOG_EXP_AND(LOG_EXP_NOT(_atInitial), _sw(0));
     
    80458202        _sw_init(0) = jmi_turn_switch_time(jmi, _time - (0.0), _sw_init(0), JMI_REL_LT);
    80468203    }
    8047     __sampleItr_1_12 = COND_EXP_EQ(_sw_init(0), JMI_TRUE, 0.0, ceil(jmi_divide_equation(jmi, _time, _h_11, \"time / h\")));
     8204    __sampleItr_1_12 = COND_EXP_EQ(_sw_init(0), JMI_TRUE, 0.0, ceil(JMI_DIVIDE_EQUATION(jmi, _time, _h_11, \"time / h\")));
    80488205    pre__sampleItr_1_12 = __sampleItr_1_12;
    80498206    if (jmi->atInitial || jmi->atEvent) {
     
    81188275    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    81198276        (*res)[0] = 1;
    8120         (*res)[1] = jmi_max(1.0, jmi_max(jmi_abs(_a_c_8), jmi_abs(_b_c_9)));
     8277        (*res)[1] = JMI_MAX_EQUATION(1.0, JMI_MAX_EQUATION(JMI_ABS_EQUATION(_a_c_8), JMI_ABS_EQUATION(_b_c_9)));
    81218278    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    81228279        x[0] = pre_x_c_3;
     
    82658422        _sw_init(0) = jmi_turn_switch_time(jmi, _time - (0.0), _sw_init(0), JMI_REL_LT);
    82668423    }
    8267     __sampleItr_1_13 = COND_EXP_EQ(_sw_init(0), JMI_TRUE, 0.0, ceil(jmi_divide_equation(jmi, _time, _h_11, \"time / h\")));
     8424    __sampleItr_1_13 = COND_EXP_EQ(_sw_init(0), JMI_TRUE, 0.0, ceil(JMI_DIVIDE_EQUATION(jmi, _time, _h_11, \"time / h\")));
    82688425    pre__sampleItr_1_13 = __sampleItr_1_13;
    82698426    if (jmi->atInitial || jmi->atEvent) {
     
    85258682        }
    85268683        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    8527             (*res)[0] = COND_EXP_EQ(LOG_EXP_AND(_temp_1_6, LOG_EXP_NOT(pre_temp_1_6)), JMI_TRUE, sin(_x_0) + 3.0, pre_x_0) - (_x_0);
     8684            (*res)[0] = COND_EXP_EQ(LOG_EXP_AND(_temp_1_6, LOG_EXP_NOT(pre_temp_1_6)), JMI_TRUE, JMI_SIN_EQUATION(jmi, _x_0, \"sin(x)\") + 3.0, pre_x_0) - (_x_0);
    85288685        }
    85298686    }
     
    92149371    JMI_DEF(REA, tmp_6)
    92159372    if (_sw(0)) {
    9216         func_CCodeGenTests_dummyFunc_def0(jmi_divide_equation(jmi, _time * _time * _time, 2.0, \"time * time * time / 2\"), &tmp_1, &tmp_2);
     9373        func_CCodeGenTests_dummyFunc_def0(JMI_DIVIDE_EQUATION(jmi, _time * _time * _time, 2.0, \"time * time * time / 2\"), &tmp_1, &tmp_2);
    92179374        _x_0 = (tmp_1);
    92189375        _y_1 = (tmp_2);
     
    989310050        }
    989410051        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    9895             (*res)[0] = _z1_2 + 2 - (sin(_z1_2) * 3);
     10052            (*res)[0] = _z1_2 + 2 - (JMI_SIN_EQUATION(jmi, _z1_2, \"sin(z1)\") * 3);
    989610053        }
    989710054    }
     
    991710074        }
    991810075        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    9919             (*res)[0] = _z1_2 + 2 - (sin(_z1_2) * 3);
     10076            (*res)[0] = _z1_2 + 2 - (JMI_SIN_EQUATION(jmi, _z1_2, \"sin(z1)\") * 3);
    992010077        }
    992110078    }
     
    1005910216        (*res)[0] = 1;
    1006010217        (*res)[1] = 1;
    10061         (*res)[2] = jmi_max(1.0, jmi_max(jmi_max(jmi_abs(_f0_1), jmi_abs(_f1_2)), jmi_max(jmi_max(jmi_abs(_f0_1), jmi_abs(_f1_2)), jmi_abs(_f0_1))));
    10062         (*res)[3] = jmi_max(jmi_abs(_m_0), jmi_max(1.0, 1.0));
     10218        (*res)[2] = JMI_MAX_EQUATION(1.0, JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_ABS_EQUATION(_f0_1), JMI_ABS_EQUATION(_f1_2)), JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_ABS_EQUATION(_f0_1), JMI_ABS_EQUATION(_f1_2)), JMI_ABS_EQUATION(_f0_1))));
     10219        (*res)[3] = JMI_MAX_EQUATION(JMI_ABS_EQUATION(_m_0), JMI_MAX_EQUATION(1.0, 1.0));
    1006310220    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1006410221        x[0] = _a_4;
     
    1014110298        (*res)[0] = 1;
    1014210299        (*res)[1] = 1;
    10143         (*res)[2] = jmi_max(1.0, jmi_max(jmi_max(jmi_abs(_f0_1), jmi_abs(_f1_2)), jmi_max(jmi_max(jmi_abs(_f0_1), jmi_abs(_f1_2)), jmi_abs(_f0_1))));
    10144         (*res)[3] = jmi_max(jmi_abs(_m_0), jmi_max(1.0, 1.0));
     10300        (*res)[2] = JMI_MAX_EQUATION(1.0, JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_ABS_EQUATION(_f0_1), JMI_ABS_EQUATION(_f1_2)), JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_ABS_EQUATION(_f0_1), JMI_ABS_EQUATION(_f1_2)), JMI_ABS_EQUATION(_f0_1))));
     10301        (*res)[3] = JMI_MAX_EQUATION(JMI_ABS_EQUATION(_m_0), JMI_MAX_EQUATION(1.0, 1.0));
    1014510302    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1014610303        x[0] = _a_4;
     
    1019410351    JMI_DYNAMIC_INIT()
    1019510352    _der_dummy_15 = 1;
    10196     _u_6 = 2 * sin(_time);
     10353    _u_6 = 2 * JMI_SIN_EQUATION(jmi, _time, \"sin(time)\");
    1019710354    if (jmi->atInitial || jmi->atEvent) {
    1019810355        _sw(2) = jmi_turn_switch(jmi, _v_3 - (0.0), _sw(2), JMI_REL_GT);
     
    1021110368    JMI_DYNAMIC_INIT()
    1021210369    _der_dummy_15 = 1;
    10213     _u_6 = 2 * sin(_time);
     10370    _u_6 = 2 * JMI_SIN_EQUATION(jmi, _time, \"sin(time)\");
    1021410371    pre_mode_10 = 2;
    1021510372    _v_3 = 0.0;
     
    1056610723        x[1] = 7;
    1056710724    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    10568         (*res)[0] = jmi_max(jmi_max(jmi_abs(_p_12) * jmi_abs(_A_2_1_2), jmi_abs(_p_12) * jmi_abs(_A_2_2_3)), 1.0);
    10569         (*res)[1] = jmi_max(jmi_max(jmi_abs(_p_12) * jmi_abs(_A_1_1_0), jmi_abs(_p_12) * jmi_abs(_A_1_2_1)), 1.0);
     10725        (*res)[0] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_ABS_EQUATION(_p_12) * JMI_ABS_EQUATION(_A_2_1_2), JMI_ABS_EQUATION(_p_12) * JMI_ABS_EQUATION(_A_2_2_3)), 1.0);
     10726        (*res)[1] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_ABS_EQUATION(_p_12) * JMI_ABS_EQUATION(_A_1_1_0), JMI_ABS_EQUATION(_p_12) * JMI_ABS_EQUATION(_A_1_2_1)), 1.0);
    1057010727    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1057110728        x[0] = _y_2_7;
     
    1063010787        x[1] = 9;
    1063110788    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    10632         (*res)[0] = jmi_max(jmi_max(jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_2_1_2), jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_2_2_3)), jmi_max(1.0, jmi_abs(2.0)));
    10633         (*res)[1] = jmi_max(jmi_max(jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_1_1_0), jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_1_2_1)), jmi_max(1.0, jmi_abs(2.0)));
     10789        (*res)[0] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_2_1_2), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_2_2_3)), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(2.0)));
     10790        (*res)[1] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_1_1_0), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_1_2_1)), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(2.0)));
    1063410791    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1063510792        x[0] = _z_2_9;
     
    1066410821        x[1] = 11;
    1066510822    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    10666         (*res)[0] = jmi_max(jmi_max(jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_2_1_2), jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_2_2_3)), jmi_max(1.0, jmi_abs(3.0)));
    10667         (*res)[1] = jmi_max(jmi_max(jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_1_1_0), jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_1_2_1)), jmi_max(1.0, jmi_abs(3.0)));
     10823        (*res)[0] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_2_1_2), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_2_2_3)), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(3.0)));
     10824        (*res)[1] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_1_1_0), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_1_2_1)), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(3.0)));
    1066810825    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1066910826        x[0] = _w_2_11;
     
    1073310890        x[1] = 7;
    1073410891    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    10735         (*res)[0] = jmi_max(jmi_max(jmi_abs(_p_12) * jmi_abs(_A_2_1_2), jmi_abs(_p_12) * jmi_abs(_A_2_2_3)), 1.0);
    10736         (*res)[1] = jmi_max(jmi_max(jmi_abs(_p_12) * jmi_abs(_A_1_1_0), jmi_abs(_p_12) * jmi_abs(_A_1_2_1)), 1.0);
     10892        (*res)[0] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_ABS_EQUATION(_p_12) * JMI_ABS_EQUATION(_A_2_1_2), JMI_ABS_EQUATION(_p_12) * JMI_ABS_EQUATION(_A_2_2_3)), 1.0);
     10893        (*res)[1] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_ABS_EQUATION(_p_12) * JMI_ABS_EQUATION(_A_1_1_0), JMI_ABS_EQUATION(_p_12) * JMI_ABS_EQUATION(_A_1_2_1)), 1.0);
    1073710894    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1073810895        x[0] = _y_2_7;
     
    1076710924        x[1] = 9;
    1076810925    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    10769         (*res)[0] = jmi_max(jmi_max(jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_2_1_2), jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_2_2_3)), jmi_max(1.0, jmi_abs(2.0)));
    10770         (*res)[1] = jmi_max(jmi_max(jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_1_1_0), jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_1_2_1)), jmi_max(1.0, jmi_abs(2.0)));
     10926        (*res)[0] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_2_1_2), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_2_2_3)), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(2.0)));
     10927        (*res)[1] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_1_1_0), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_1_2_1)), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(2.0)));
    1077110928    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1077210929        x[0] = _z_2_9;
     
    1080110958        x[1] = 11;
    1080210959    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    10803         (*res)[0] = jmi_max(jmi_max(jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_2_1_2), jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_2_2_3)), jmi_max(1.0, jmi_abs(3.0)));
    10804         (*res)[1] = jmi_max(jmi_max(jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_1_1_0), jmi_max(1.0, jmi_abs(1.0)) * jmi_abs(_A_1_2_1)), jmi_max(1.0, jmi_abs(3.0)));
     10960        (*res)[0] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_2_1_2), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_2_2_3)), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(3.0)));
     10961        (*res)[1] = JMI_MAX_EQUATION(JMI_MAX_EQUATION(JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_1_1_0), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(1.0)) * JMI_ABS_EQUATION(_A_1_2_1)), JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(3.0)));
    1080510962    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1080610963        x[0] = _w_2_11;
     
    1089611053        }
    1089711054        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    10898             (*res)[0] = sin(_b_1) * COND_EXP_EQ(_d_2, JMI_TRUE, 1.0, 2.0) - (_a_0);
     11055            (*res)[0] = JMI_SIN_EQUATION(jmi, _b_1, \"sin(b)\") * COND_EXP_EQ(_d_2, JMI_TRUE, 1.0, 2.0) - (_a_0);
    1089911056            (*res)[1] = 1 - _b_1 - (_a_0);
    1090011057        }
     
    1093711094        }
    1093811095        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    10939             (*res)[0] = sin(_b_1) * COND_EXP_EQ(_d_2, JMI_TRUE, 1.0, 2.0) - (_a_0);
     11096            (*res)[0] = JMI_SIN_EQUATION(jmi, _b_1, \"sin(b)\") * COND_EXP_EQ(_d_2, JMI_TRUE, 1.0, 2.0) - (_a_0);
    1094011097            (*res)[1] = 1 - _b_1 - (_a_0);
    1094111098        }
     
    1196812125        JMI_RECORD_STATIC(R_0_r, tmp_2)
    1196912126        tmp_2->y = _p_y_0;
    11970         (*res)[0] = jmi_max(jmi_abs(func_CCodeGenTests_BlockTest22_f_exp0(tmp_2)), 1.0);
     12127        (*res)[0] = JMI_MAX_EQUATION(JMI_ABS_EQUATION(func_CCodeGenTests_BlockTest22_f_exp0(tmp_2)), 1.0);
    1197112128    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1197212129        x[0] = _x_1;
     
    1207012227        name="BlockTest25",
    1207112228        description="Nominal with global constant in record",
     12229        variability_propagation=false,
    1207212230        template="$C_dae_blocks_residual_functions$",
    12073         variability_propagation=false,
    1207412231        generatedCode="
    1207512232static int dae_block_0(jmi_t* jmi, jmi_real_t* x, jmi_real_t* residual, int evaluation_mode) {
     
    1208112238        x[0] = 1;
    1208212239    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    12083         (*res)[0] = jmi_max(1.0, jmi_max(jmi_abs(jmi_array_rec_1(JMI_GLOBAL(CCodeGenTests_BlockTest25_f_p), _i_0)->y), 1.0));
     12240        (*res)[0] = JMI_MAX_EQUATION(1.0, JMI_MAX_EQUATION(JMI_ABS_EQUATION(jmi_array_rec_1(JMI_GLOBAL(CCodeGenTests_BlockTest25_f_p), _i_0)->y), 1.0));
    1208412241    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1208512242        x[0] = _x_1;
     
    1209512252    return ef;
    1209612253}
     12254
    1209712255")})));
    1209812256end BlockTest25;
     
    1213412292        }
    1213512293        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    12136             (*res)[0] = asin(_b_1) - (_a_0);
     12294            (*res)[0] = JMI_ASIN_EQUATION(jmi, _b_1, \"asin(b)\") - (_a_0);
    1213712295        }
    1213812296    }
     
    1285613014        x[2] = 7;
    1285713015    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    12858         (*res)[0] = jmi_max(1.0, jmi_abs(_R3_10));
    12859         (*res)[1] = jmi_max(1.0, jmi_abs(_R2_9));
     13016        (*res)[0] = JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(_R3_10));
     13017        (*res)[1] = JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(_R2_9));
    1286013018    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1286113019        x[0] = _i2_5;
     
    1297613134        x[1] = jmi->offs_sw + 1;
    1297713135    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    12978         (*res)[0] = jmi_max(jmi_abs(_m_0), jmi_max(1.0, 1.0));
     13136        (*res)[0] = JMI_MAX_EQUATION(JMI_ABS_EQUATION(_m_0), JMI_MAX_EQUATION(1.0, 1.0));
    1297913137    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1298013138        x[0] = _sa_7;
     
    1306313221        x[1] = jmi->offs_sw + 0;
    1306413222    } else if (evaluation_mode == JMI_BLOCK_EQUATION_NOMINAL_AUTO) {
    13065         (*res)[0] = jmi_max(jmi_abs(_m_0), jmi_max(1.0, 1.0));
     13223        (*res)[0] = JMI_MAX_EQUATION(JMI_ABS_EQUATION(_m_0), JMI_MAX_EQUATION(1.0, 1.0));
    1306613224    } else if (evaluation_mode == JMI_BLOCK_INITIALIZE) {
    1306713225        x[0] = _sa_7;
     
    1370113859        }
    1370213860    }
    13703     lda_v = jmi_max(1.0, jmi_array_size(A_a, 0));
    13704     ldb_v = jmi_max(1.0, jmi_array_size(b_a, 0));
     13861    lda_v = JMI_MAX_EQUATION(1.0, jmi_array_size(A_a, 0));
     13862    ldb_v = JMI_MAX_EQUATION(1.0, jmi_array_size(b_a, 0));
    1370513863    JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, ipiv_a, jmi_array_size(A_a, 0), 1, jmi_array_size(A_a, 0))
    1370613864    tmp_1 = (int)1;
     
    1381013968        }
    1381113969    }
    13812     lda_v = jmi_max(1.0, jmi_array_size(A_a, 0));
    13813     ldb_v = jmi_max(1.0, jmi_array_size(B_a, 0));
     13970    lda_v = JMI_MAX_EQUATION(1.0, jmi_array_size(A_a, 0));
     13971    ldb_v = JMI_MAX_EQUATION(1.0, jmi_array_size(B_a, 0));
    1381413972    JMI_ARRAY_INIT_1(HEAP, jmi_real_t, jmi_array_t, ipiv_a, jmi_array_size(A_a, 0), 1, jmi_array_size(A_a, 0))
    1381513973    JMI_ARRAY_INIT_2(HEAP, jmi_real_t, jmi_array_t, tmp_1, jmi_array_size(Awork_a, 0) * jmi_array_size(Awork_a, 1), 2, jmi_array_size(Awork_a, 0), jmi_array_size(Awork_a, 1))
     
    1438614544    }
    1438714545    if (jmi->atInitial || jmi->atEvent) {
    14388         _sw(0) = jmi_turn_switch(jmi, jmi_divide_equation(jmi, (pre_j_17 + 1.0), 4.0, \"(pre(j) + 1) / 4\") - (pre_temp_2_20), _sw(0), JMI_REL_LT);
     14546        _sw(0) = jmi_turn_switch(jmi, JMI_DIVIDE_EQUATION(jmi, (pre_j_17 + 1.0), 4.0, \"(pre(j) + 1) / 4\") - (pre_temp_2_20), _sw(0), JMI_REL_LT);
    1438914547    }
    1439014548    if (jmi->atInitial || jmi->atEvent) {
    14391         _sw(1) = jmi_turn_switch(jmi, jmi_divide_equation(jmi, (pre_j_17 + 1.0), 4.0, \"(pre(j) + 1) / 4\") - (pre_temp_2_20 + 1.0), _sw(1), JMI_REL_GEQ);
     14549        _sw(1) = jmi_turn_switch(jmi, JMI_DIVIDE_EQUATION(jmi, (pre_j_17 + 1.0), 4.0, \"(pre(j) + 1) / 4\") - (pre_temp_2_20 + 1.0), _sw(1), JMI_REL_GEQ);
    1439214550    }
    1439314551    ef |= jmi_solve_block_residual(jmi->dae_block_residuals[0]);
     
    1443514593    }
    1443614594    if (jmi->atInitial || jmi->atEvent) {
    14437         _sw(0) = jmi_turn_switch(jmi, jmi_divide_equation(jmi, (pre_j_16 + 1.0), 4.0, \"(pre(j) + 1) / 4\") - (pre_temp_2_20), _sw(0), JMI_REL_LT);
     14595        _sw(0) = jmi_turn_switch(jmi, JMI_DIVIDE_EQUATION(jmi, (pre_j_16 + 1.0), 4.0, \"(pre(j) + 1) / 4\") - (pre_temp_2_20), _sw(0), JMI_REL_LT);
    1443814596    }
    1443914597    if (jmi->atInitial || jmi->atEvent) {
    14440         _sw(1) = jmi_turn_switch(jmi, jmi_divide_equation(jmi, (pre_j_16 + 1.0), 4.0, \"(pre(j) + 1) / 4\") - (pre_temp_2_20 + 1.0), _sw(1), JMI_REL_GEQ);
     14598        _sw(1) = jmi_turn_switch(jmi, JMI_DIVIDE_EQUATION(jmi, (pre_j_16 + 1.0), 4.0, \"(pre(j) + 1) / 4\") - (pre_temp_2_20 + 1.0), _sw(1), JMI_REL_GEQ);
    1444114599    }
    1444214600    ef |= jmi_solve_block_residual(jmi->dae_block_residuals[0]);
     
    1513115289        jmi_array_ref_1(tmp_1, 1) = 0.1;
    1513215290        jmi_array_ref_1(tmp_1, 2) = 0.5;
    15133         _sw(0) = jmi_turn_switch(jmi, (_time + _p_0 - (_x_1)) / jmi_max(jmi_max(1.0, jmi_abs(_p_0)), jmi_abs(func_CCodeGenTests_TestRelationalOp10_f_exp0(tmp_1))), _sw(0), JMI_REL_GT);
     15291        _sw(0) = jmi_turn_switch(jmi, (_time + _p_0 - (_x_1)) / JMI_MAX_EQUATION(JMI_MAX_EQUATION(1.0, JMI_ABS_EQUATION(_p_0)), JMI_ABS_EQUATION(func_CCodeGenTests_TestRelationalOp10_f_exp0(tmp_1))), _sw(0), JMI_REL_GT);
    1513415292    }
    1513515293    _b1_2 = _sw(0);
     
    1528815446    b = cos(time);
    1528915447   
    15290     annotation(__JModelica(UnitTesting(tests={
    15291         CCodeGenTestCase(
    15292             name="TestRelationalOp14",
    15293             description="Test inline bug which caused exception during code gen (related to switch index)",
    15294             template="
     15448annotation(__JModelica(UnitTesting(tests={
     15449    CCodeGenTestCase(
     15450        name="TestRelationalOp14",
     15451        description="Test inline bug which caused exception during code gen (related to switch index)",
     15452        template="
    1529515453$C_ode_time_events$
    1529615454$C_ode_derivatives$
    1529715455",
    15298             generatedCode="
    15299 
     15456        generatedCode="
    1530015457    jmi_real_t nSamp;
    1530115458
    1530215459
    15303 
    15304 
    1530515460int model_ode_derivatives_base(jmi_t* jmi) {
    1530615461    int ef = 0;
    1530715462    JMI_DYNAMIC_INIT()
    15308     _b_1 = cos(_time);
     15463    _b_1 = JMI_COS_EQUATION(jmi, _time, \"cos(time)\");
    1530915464    if (jmi->atInitial || jmi->atEvent) {
    1531015465        _sw(0) = jmi_turn_switch(jmi, _b_1 - (0.0), _sw(0), JMI_REL_GT);
     
    1532815483    Real c = if b > 0.0 then b else -b;
    1532915484   
    15330     annotation(__JModelica(UnitTesting(tests={
    15331         CCodeGenTestCase(
    15332             name="TestRelationalOp14B",
    15333             description="Test inline bug which caused exception during code gen (related to switch index)",
    15334             template="
     15485annotation(__JModelica(UnitTesting(tests={
     15486    CCodeGenTestCase(
     15487        name="TestRelationalOp14B",
     15488        description="Test inline bug which caused exception during code gen (related to switch index)",
     15489        template="
    1533515490$C_ode_time_events$
    1533615491$C_ode_derivatives$
    1533715492",
    15338             generatedCode="
     15493        generatedCode="
    1533915494    jmi_real_t nSamp;
    1534015495
     
    1534315498    int ef = 0;
    1534415499    JMI_DYNAMIC_INIT()
    15345     _b_1 = cos(_time);
     15500    _b_1 = JMI_COS_EQUATION(jmi, _time, \"cos(time)\");
    1534615501    if (jmi->atInitial || jmi->atEvent) {
    1534715502        _sw(0) = jmi_turn_switch(jmi, _b_1 - (0.0), _sw(0), JMI_REL_GT);
     
    1537815533    JMI_DYNAMIC_INIT()
    1537915534    if (jmi->atInitial || jmi->atEvent) {
    15380         _sw(0) = jmi_turn_switch(jmi, sin(_time) - (0.0), _sw(0), JMI_REL_GT);
     15535        _sw(0) = jmi_turn_switch(jmi, JMI_SIN_EQUATION(jmi, _time, \"sin(time)\") - (0.0), _sw(0), JMI_REL_GT);
    1538115536    }
    1538215537    if (jmi->atInitial || jmi->atEvent) {
    15383         _sw(1) = jmi_turn_switch(jmi, cos(_time) - (0.0), _sw(1), JMI_REL_GT);
     15538        _sw(1) = jmi_turn_switch(jmi, JMI_COS_EQUATION(jmi, _time, \"cos(time)\") - (0.0), _sw(1), JMI_REL_GT);
    1538415539    }
    1538515540    _a_0 = COND_EXP_EQ(LOG_EXP_AND(_sw(0), _sw(1)), JMI_TRUE, 1.0, _time);
    1538615541    if (jmi->atInitial || jmi->atEvent) {
    15387         _sw(0) = jmi_turn_switch(jmi, sin(_time) - (0.0), _sw(0), JMI_REL_GT);
     15542        _sw(0) = jmi_turn_switch(jmi, JMI_SIN_EQUATION(jmi, _time, \"sin(time)\") - (0.0), _sw(0), JMI_REL_GT);
    1538815543    }
    1538915544    if (jmi->atInitial || jmi->atEvent) {
    15390         _sw(2) = jmi_turn_switch(jmi, cos(_time) - (0.0), _sw(2), JMI_REL_GT);
     15545        _sw(2) = jmi_turn_switch(jmi, JMI_COS_EQUATION(jmi, _time, \"cos(time)\") - (0.0), _sw(2), JMI_REL_GT);
    1539115546    }
    1539215547    _b_1 = COND_EXP_EQ(LOG_EXP_AND(_sw(0), _sw(2)), JMI_TRUE, _time, 1.0);
     
    1539715552    int ef = 0;
    1539815553    JMI_DYNAMIC_INIT()
    15399     (*res)[0] = sin(_time) - (0.0);
    15400     (*res)[1] = COND_EXP_EQ(_sw(0), JMI_TRUE, cos(_time) - (0.0), 1.0);
    15401     (*res)[2] = COND_EXP_EQ(_sw(0), JMI_TRUE, cos(_time) - (0.0), 1.0);
     15554    (*res)[0] = JMI_SIN_EQUATION(jmi, _time, \"sin(time)\") - (0.0);
     15555    (*res)[1] = COND_EXP_EQ(_sw(0), JMI_TRUE, JMI_COS_EQUATION(jmi, _time, \"cos(time)\") - (0.0), 1.0);
     15556    (*res)[2] = COND_EXP_EQ(_sw(0), JMI_TRUE, JMI_COS_EQUATION(jmi, _time, \"cos(time)\") - (0.0), 1.0);
    1540215557    JMI_DYNAMIC_FREE()
    1540315558    return ef;
     
    1542515580    JMI_DYNAMIC_INIT()
    1542615581    if (jmi->atInitial || jmi->atEvent) {
    15427         _sw(0) = jmi_turn_switch(jmi, sin(_time) - (0.0), _sw(0), JMI_REL_GT);
     15582        _sw(0) = jmi_turn_switch(jmi, JMI_SIN_EQUATION(jmi, _time, \"sin(time)\") - (0.0), _sw(0), JMI_REL_GT);
    1542815583    }
    1542915584    if (jmi->atInitial || jmi->atEvent) {
    15430         _sw(1) = jmi_turn_switch(jmi, cos(_time) - (0.0), _sw(1), JMI_REL_GT);
     15585        _sw(1) = jmi_turn_switch(jmi, JMI_COS_EQUATION(jmi, _time, \"cos(time)\") - (0.0), _sw(1), JMI_REL_GT);
    1543115586    }
    1543215587    if (jmi->atInitial || jmi->atEvent) {
    15433         _sw(2) = jmi_turn_switch(jmi, cos(_time + 0.5) - (0.0), _sw(2), JMI_REL_GT);
     15588        _sw(2) = jmi_turn_switch(jmi, JMI_COS_EQUATION(jmi, _time + 0.5, \"cos(time + 0.5)\") - (0.0), _sw(2), JMI_REL_GT);
    1543415589    }
    1543515590    _a_0 = COND_EXP_EQ(LOG_EXP_AND(LOG_EXP_AND(_sw(0), _sw(1)), _sw(2)), JMI_TRUE, 1.0, _time);
    1543615591    if (jmi->atInitial || jmi->atEvent) {
    15437         _sw(0) = jmi_turn_switch(jmi, sin(_time) - (0.0), _sw(0), JMI_REL_GT);
     15592        _sw(0) = jmi_turn_switch(jmi, JMI_SIN_EQUATION(jmi, _time, \"sin(time)\") - (0.0), _sw(0), JMI_REL_GT);
    1543815593    }
    1543915594    if (jmi->atInitial || jmi->atEvent) {
    15440         _sw(3) = jmi_turn_switch(jmi, cos(_time) - (0.0), _sw(3), JMI_REL_GT);
     15595        _sw(3) = jmi_turn_switch(jmi, JMI_COS_EQUATION(jmi, _time, \"cos(time)\") - (0.0), _sw(3), JMI_REL_GT);
    1544115596    }
    1544215597    if (jmi->atInitial || jmi->atEvent) {
    15443         _sw(4) = jmi_turn_switch(jmi, cos(_time + 0.5) - (0.0), _sw(4), JMI_REL_GT);
     15598        _sw(4) = jmi_turn_switch(jmi, JMI_COS_EQUATION(jmi, _time + 0.5, \"cos(time + 0.5)\") - (0.0), _sw(4), JMI_REL_GT);
    1544415599    }
    1544515600    _b_1 = COND_EXP_EQ(LOG_EXP_AND(LOG_EXP_AND(_sw(0), _sw(3)), _sw(4)), JMI_TRUE, _time, 1.0);
     
    1545015605    int ef = 0;
    1545115606    JMI_DYNAMIC_INIT()
    15452     (*res)[0] = sin(_time) - (0.0);
    15453     (*res)[1] = COND_EXP_EQ(_sw(0), JMI_TRUE, cos(_time) - (0.0), 1.0);
    15454     (*res)[2] = COND_EXP_EQ(LOG_EXP_AND(_sw(0), _sw(1)), JMI_TRUE, cos(_time + 0.5) - (0.0), 1.0);
    15455     (*res)[3] = COND_EXP_EQ(_sw(0), JMI_TRUE, cos(_time) - (0.0), 1.0);
    15456     (*res)[4] = COND_EXP_EQ(LOG_EXP_AND(_sw(0), _sw(3)), JMI_TRUE, cos(_time + 0.5) - (0.0), 1.0);
     15607    (*res)[0] = JMI_SIN_EQUATION(jmi, _time, \"sin(time)\") - (0.0);
     15608    (*res)[1] = COND_EXP_EQ(_sw(0), JMI_TRUE, JMI_COS_EQUATION(jmi, _time, \"cos(time)\") - (0.0), 1.0);
     15609    (*res)[2] = COND_EXP_EQ(LOG_EXP_AND(_sw(0), _sw(1)), JMI_TRUE, JMI_COS_EQUATION(jmi, _time + 0.5, \"cos(time + 0.5)\") - (0.0), 1.0);
     15610    (*res)[3] = COND_EXP_EQ(_sw(0), JMI_TRUE, JMI_COS_EQUATION(jmi, _time, \"cos(time)\") - (0.0), 1.0);
     15611    (*res)[4] = COND_EXP_EQ(LOG_EXP_AND(_sw(0), _sw(3)), JMI_TRUE, JMI_COS_EQUATION(jmi, _time + 0.5, \"cos(time + 0.5)\") - (0.0), 1.0);
    1545715612    JMI_DYNAMIC_FREE()
    1545815613    return ef;
     
    1547115626    end when;
    1547215627
    15473     annotation(__JModelica(UnitTesting(tests={
    15474         CCodeGenTestCase(
    15475             name="TestRelationalOp17",
    15476             description="Ensure that switches in DAE isn't eliminated for switch in initDAE'",
    15477             template="
     15628annotation(__JModelica(UnitTesting(tests={
     15629    CCodeGenTestCase(
     15630        name="TestRelationalOp17",
     15631        description="Ensure that switches in DAE isn't eliminated for switch in initDAE'",
     15632        template="
    1547815633$C_ode_derivatives$
    1547915634$C_DAE_event_indicator_residuals$
    1548015635$C_DAE_initial_event_indicator_residuals$
    1548115636",
    15482             generatedCode="
     15637        generatedCode="
     15638
    1548315639int model_ode_derivatives_base(jmi_t* jmi) {
    1548415640    int ef = 0;
    1548515641    JMI_DYNAMIC_INIT()
    15486     _x_0 = sin(_time);
     15642    _x_0 = JMI_SIN_EQUATION(jmi, _time, \"sin(time)\");
    1548715643    if (jmi->atInitial || jmi->atEvent) {
    1548815644        _sw(1) = jmi_turn_switch(jmi, _x_0 - (-0.5), _sw(1), JMI_REL_LT);
     
    1601916175        input Integer i;
    1602016176        input Boolean b;
    16021         input String fmt;
    1602216177        output Real y;
    1602316178        String s;
     
    1602916184        + String(x, significantDigits=i, leftJustified=b)
    1603016185        + String(x)
    16031         + String(x, format=fmt)
    1603216186       
    1603316187        + String(i, minimumLength=2, leftJustified=b)
    1603416188        + String(i, minimumLength=i, leftJustified=true)
    1603516189        + String(i, minimumLength=i, leftJustified=b)
    16036         + String(i, format=fmt)
    1603716190       
    1603816191        + String(b, minimumLength=2, leftJustified=b)
     
    1604116194    end f;
    1604216195   
    16043     Real y = f(-time, 3, true, "%g");
     16196    Real y = f(-time, 3, true);
    1604416197
    1604516198annotation(__JModelica(UnitTesting(tests={
     
    1605116204        template="$C_functions$",
    1605216205        generatedCode="
    16053 void func_CCodeGenTests_StringOperations9_f_def0(jmi_real_t x_v, jmi_real_t i_v, jmi_real_t b_v, jmi_string_t fmt_v, jmi_real_t* y_o) {
     16206void func_CCodeGenTests_StringOperations9_f_def0(jmi_real_t x_v, jmi_real_t i_v, jmi_real_t b_v, jmi_real_t* y_o) {
    1605416207    JMI_DYNAMIC_INIT()
    1605516208    JMI_DEF(REA, y_v)
     
    1605716210    JMI_DEF_STR_DYNA(tmp_1)
    1605816211    JMI_INI(STR, s_v)
    16059     JMI_INI_STR_DYNA(tmp_1, jmi_max(7 + 1.0, i_v) + jmi_max(7 + i_v, 2.0) + jmi_max(7 + i_v, i_v) + jmi_max(7 + i_v, i_v) + 7 + i_v + 7 + 6 + 16 + jmi_max(10, 2.0) + jmi_max(10, i_v) + jmi_max(10, i_v) + 16 + jmi_max(5, 2.0) + jmi_max(5, i_v) + jmi_max(5, i_v))
     16212    JMI_INI_STR_DYNA(tmp_1, jmi_max(7 + 1.0, i_v) + jmi_max(7 + i_v, 2.0) + jmi_max(7 + i_v, i_v) + jmi_max(7 + i_v, i_v) + 7 + i_v + 7 + 6 + jmi_max(10, 2.0) + jmi_max(10, i_v) + jmi_max(10, i_v) + jmi_max(5, 2.0) + jmi_max(5, i_v) + jmi_max(5, i_v))
    1606016213    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), COND_EXP_EQ(b_v, JMI_TRUE, \"%-*.*g\", \"%*.*g\"), (int) i_v, (int) 1.0, x_v);
    1606116214    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), COND_EXP_EQ(b_v, JMI_TRUE, \"%-*.*g\", \"%*.*g\"), (int) 2.0, (int) i_v, x_v);
     
    1606416217    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), COND_EXP_EQ(b_v, JMI_TRUE, \"%-.*g\", \"%.*g\"), (int) i_v, x_v);
    1606516218    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), \"%-.*g\", (int) 6, x_v);
    16066     snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), fmt_v, x_v);
    1606716219    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), COND_EXP_EQ(b_v, JMI_TRUE, \"%-*d\", \"%*d\"), (int) 2.0, (int) i_v);
    1606816220    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), COND_EXP_EQ(JMI_TRUE, JMI_TRUE, \"%-*d\", \"%*d\"), (int) i_v, (int) i_v);
    1606916221    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), COND_EXP_EQ(b_v, JMI_TRUE, \"%-*d\", \"%*d\"), (int) i_v, (int) i_v);
    16070     snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), fmt_v, (int) i_v);
    1607116222    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), COND_EXP_EQ(b_v, JMI_TRUE, \"%-*s\", \"%*s\"), (int) 2.0, COND_EXP_EQ(b_v, JMI_TRUE, \"true\", \"false\"));
    1607216223    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), COND_EXP_EQ(JMI_TRUE, JMI_TRUE, \"%-*s\", \"%*s\"), (int) i_v, COND_EXP_EQ(b_v, JMI_TRUE, \"true\", \"false\"));
     
    1607816229}
    1607916230
    16080 jmi_real_t func_CCodeGenTests_StringOperations9_f_exp0(jmi_real_t x_v, jmi_real_t i_v, jmi_real_t b_v, jmi_string_t fmt_v) {
     16231jmi_real_t func_CCodeGenTests_StringOperations9_f_exp0(jmi_real_t x_v, jmi_real_t i_v, jmi_real_t b_v) {
    1608116232    JMI_DEF(REA, y_v)
    16082     func_CCodeGenTests_StringOperations9_f_def0(x_v, i_v, b_v, fmt_v, &y_v);
     16233    func_CCodeGenTests_StringOperations9_f_def0(x_v, i_v, b_v, &y_v);
    1608316234    return y_v;
    1608416235}
     
    1621016361    JMI_ARRAY_INIT_1(HEAP, jmi_string_t, jmi_string_array_t, s_a, n_v, 1, n_v)
    1621116362    y_v = x_v;
    16212     JMI_ARRAY_INIT_1(HEAP, jmi_string_t, jmi_string_array_t, temp_1_a, jmi_max(n_v, 0.0), 1, jmi_max(n_v, 0.0))
     16363    JMI_ARRAY_INIT_1(HEAP, jmi_string_t, jmi_string_array_t, temp_1_a, JMI_MAX_EQUATION(n_v, 0.0), 1, JMI_MAX_EQUATION(n_v, 0.0))
    1621316364    i1_0in = 0;
    16214     i1_0ie = floor((jmi_max(n_v, 0.0)) - (1));
     16365    i1_0ie = floor((JMI_MAX_EQUATION(n_v, 0.0)) - (1));
    1621516366    for (i1_0i = 1; i1_0in <= i1_0ie; i1_0i = 1 + (++i1_0in)) {
    1621616367        JMI_ASG(STR, jmi_array_ref_1(temp_1_a, i1_0i), \"str\")
     
    1625316404")})));
    1625416405end StringOperations11;
     16406
     16407
     16408model StringOperations12
     16409    type E = enumeration(Alice, Bob, Eve);
     16410
     16411    function f
     16412        input Integer x;
     16413        input E e;
     16414        output Real y;
     16415    protected
     16416        String s;
     16417    algorithm
     16418        s := String(x, format="7u") +
     16419             String(x, format="-3d") +
     16420             String(e);
     16421        y := x + .5;
     16422    end f;
     16423   
     16424    Real y = f(integer(time), if time < 1 then E.Alice else E.Eve);
     16425
     16426annotation(__JModelica(UnitTesting(tests={
     16427    CCodeGenTestCase(
     16428        name="StringOperations12",
     16429        description="Check that integer-typed format strings generate the correct casts",
     16430        template="$C_functions$",
     16431        generatedCode="
     16432void func_CCodeGenTests_StringOperations12_f_def0(jmi_real_t x_v, jmi_real_t e_v, jmi_real_t* y_o) {
     16433    JMI_DYNAMIC_INIT()
     16434    JMI_DEF(REA, y_v)
     16435    JMI_DEF(STR, s_v)
     16436    JMI_DEF_STR_STAT(tmp_1, 37)
     16437    JMI_INI(STR, s_v)
     16438    JMI_INI_STR_STAT(tmp_1)
     16439    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), \"%7u\", (unsigned int) x_v);
     16440    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), \"%-3d\", (int) x_v);
     16441    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), \"%-s\", E_0_e[(int) e_v]);
     16442    JMI_ASG(STR, s_v, tmp_1)
     16443    y_v = x_v + 0.5;
     16444    JMI_RET(GEN, y_o, y_v)
     16445    JMI_DYNAMIC_FREE()
     16446    return;
     16447}
     16448
     16449jmi_real_t func_CCodeGenTests_StringOperations12_f_exp0(jmi_real_t x_v, jmi_real_t e_v) {
     16450    JMI_DEF(REA, y_v)
     16451    func_CCodeGenTests_StringOperations12_f_def0(x_v, e_v, &y_v);
     16452    return y_v;
     16453}
     16454
     16455")})));
     16456end StringOperations12;
     16457
     16458
     16459model StringOperations13
     16460    function f
     16461        input Real x;
     16462        output Real y;
     16463    protected
     16464        String s;
     16465    algorithm
     16466        s := String(x, format="%g");
     16467        y := x + .5;
     16468    end f;
     16469   
     16470    Real y = f(time);
     16471
     16472annotation(__JModelica(UnitTesting(tests={
     16473    CCodeGenTestCase(
     16474        name="StringOperations13",
     16475        description="Check that we handle case where initial '%' of format specifier is included in format argument of String()",
     16476        template="$C_functions$",
     16477        generatedCode="
     16478void func_CCodeGenTests_StringOperations13_f_def0(jmi_real_t x_v, jmi_real_t* y_o) {
     16479    JMI_DYNAMIC_INIT()
     16480    JMI_DEF(REA, y_v)
     16481    JMI_DEF(STR, s_v)
     16482    JMI_DEF_STR_STAT(tmp_1, 16)
     16483    JMI_INI(STR, s_v)
     16484    JMI_INI_STR_STAT(tmp_1)
     16485    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), \"%g\", x_v);
     16486    JMI_ASG(STR, s_v, tmp_1)
     16487    y_v = x_v + 0.5;
     16488    JMI_RET(GEN, y_o, y_v)
     16489    JMI_DYNAMIC_FREE()
     16490    return;
     16491}
     16492
     16493jmi_real_t func_CCodeGenTests_StringOperations13_f_exp0(jmi_real_t x_v) {
     16494    JMI_DEF(REA, y_v)
     16495    func_CCodeGenTests_StringOperations13_f_def0(x_v, &y_v);
     16496    return y_v;
     16497}
     16498
     16499")})));
     16500end StringOperations13;
     16501
     16502
     16503model StringOperations14
     16504    function f
     16505        input Real x;
     16506        output String s;
     16507    protected
     16508        parameter String fmt = "g";
     16509    algorithm
     16510        s := String(x, format = fmt);
     16511    end f;
     16512   
     16513    String s = f(time);
     16514
     16515annotation(__JModelica(UnitTesting(tests={
     16516    CCodeGenTestCase(
     16517        name="StringOperations14",
     16518        description="Check that a format string that fails to evaluate does not lead to a crash",
     16519        template="$C_functions$",
     16520        generatedCode="
     16521void func_CCodeGenTests_StringOperations14_f_def0(jmi_real_t x_v, jmi_string_t* s_o) {
     16522    JMI_DYNAMIC_INIT()
     16523    JMI_DEF(STR, s_v)
     16524    JMI_DEF(STR, fmt_v)
     16525    JMI_DEF_STR_DYNA(tmp_1)
     16526    JMI_DEF_STR_STAT(tmp_2, 16)
     16527    JMI_INI(STR, s_v)
     16528    JMI_INI(STR, fmt_v)
     16529    JMI_ASG(STR, fmt_v, \"g\")
     16530    JMI_INI_STR_DYNA(tmp_1, 1 + JMI_LEN(fmt_v))
     16531    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), \"%s\", \"%\");
     16532    snprintf(JMI_STR_END(tmp_1), JMI_STR_LEFT(tmp_1), \"%s\", fmt_v);
     16533    JMI_INI_STR_STAT(tmp_2)
     16534    snprintf(JMI_STR_END(tmp_2), JMI_STR_LEFT(tmp_2), tmp_1, x_v);
     16535    JMI_ASG(STR, s_v, tmp_2)
     16536    JMI_RET(STR, s_o, s_v)
     16537    JMI_DYNAMIC_FREE()
     16538    return;
     16539}
     16540
     16541jmi_string_t func_CCodeGenTests_StringOperations14_f_exp0(jmi_real_t x_v) {
     16542    JMI_DEF(STR, s_v)
     16543    func_CCodeGenTests_StringOperations14_f_def0(x_v, &s_v);
     16544    return s_v;
     16545}
     16546
     16547")})));
     16548end StringOperations14;
     16549
    1625516550
    1625616551package TestTerminate
     
    1759017885    Real y = abs(time + 0.5);
    1759117886
    17592     annotation(__JModelica(UnitTesting(tests={
    17593         CCodeGenTestCase(
    17594             name="SwitchesAsNoEvent1",
    17595             description="Test so that no switches are generated when generate_event_switches is set to false.",
    17596             generate_event_switches=false,
    17597             template="
     17887annotation(__JModelica(UnitTesting(tests={
     17888    CCodeGenTestCase(
     17889        name="SwitchesAsNoEvent1",
     17890        description="Test so that no switches are generated when generate_event_switches is set to false.",
     17891        generate_event_switches=false,
     17892        template="
    1759817893$C_DAE_initial_relations$
    1759917894$C_DAE_relations$
    1760017895$C_ode_derivatives$
    1760117896",
    17602             generatedCode="
     17897        generatedCode="
    1760317898static const int N_initial_relations = 0;
    1760417899static const int DAE_initial_relations[] = { -1 };
     
    1761117906    _x_0 = COND_EXP_GT(_time, 0.5, JMI_TRUE, JMI_FALSE);
    1761217907    pre_x_0 = _x_0;
    17613     _y_1 = jmi_abs(_time + 0.5);
     17908    _y_1 = JMI_ABS_EQUATION(_time + 0.5);
    1761417909    JMI_DYNAMIC_FREE()
    1761517910    return ef;
     
    1762417919    x = time / (sum(a_really_long_variable_name));
    1762517920
    17626     annotation(__JModelica(UnitTesting(tests={
    17627         CCodeGenTestCase(
    17628             name="TruncDivString1",
    17629             description="Test code gen for active switch indexes in block.",
    17630             eliminate_linear_equations=false,
    17631             template="$C_ode_derivatives$",
    17632             generatedCode="
     17921annotation(__JModelica(UnitTesting(tests={
     17922    CCodeGenTestCase(
     17923        name="TruncDivString1",
     17924        description="Test code gen for active switch indexes in block.",
     17925        eliminate_linear_equations=false,
     17926        template="$C_ode_derivatives$",
     17927        generatedCode="
    1763317928
    1763417929int model_ode_derivatives_base(jmi_t* jmi) {
     
    1766017955    _a_really_long_variable_name_5_4_23 = _time;
    1766117956    _a_really_long_variable_name_5_5_24 = _time;
    17662     _x_25 = jmi_divide_equation(jmi, _time,(_a_really_long_variable_name_1_1_0 + _a_really_long_variable_name_1_2_1 + (_a_really_long_variable_name_1_3_2 + _a_really_long_variable_name_1_4_3) + (_a_really_long_variable_name_1_5_4 + _a_really_long_variable_name_2_1_5 + _a_really_long_variable_name_2_2_6) + (_a_really_long_variable_name_2_3_7 + _a_really_long_variable_name_2_4_8 + _a_really_long_variable_name_2_5_9 + (_a_really_long_variable_name_3_1_10 + _a_really_long_variable_name_3_2_11 + _a_really_long_variable_name_3_3_12)) + (_a_really_long_variable_name_3_4_13 + _a_really_long_variable_name_3_5_14 + _a_really_long_variable_name_4_1_15 + (_a_really_long_variable_name_4_2_16 + _a_really_long_variable_name_4_3_17 + _a_really_long_variable_name_4_4_18) + (_a_really_long_variable_name_4_5_19 + _a_really_long_variable_name_5_1_20 + _a_really_long_variable_name_5_2_21 + (_a_really_long_variable_name_5_3_22 + _a_really_long_variable_name_5_4_23 + _a_really_long_variable_name_5_5_24)))),\"(truncated) time / (a_really_long_variable_name[1,1] + a_really_long_variable_name[1,2] + (a_really_long_variable_name[1,3] + a_really_long_variable_name[1,4]) + (a_really_long_variable_name[1,5] + a_really_long_variable_name[2,1] + a_really_long_variable_name[2,2]) + (a_really_long_variable_name[2,3] + a_really_long_variable_name[2,4] + a_really_long_variable_name[2,5] + (a_really_long_variable_name[3,1] + a_really_long_variable_name[3,2] + a_really_long_variable_name[3,3])) + (a_really_long_variable...\");
     17957    _x_25 = JMI_DIVIDE_EQUATION(jmi, _time, (_a_really_long_variable_name_1_1_0 + _a_really_long_variable_name_1_2_1 + (_a_really_long_variable_name_1_3_2 + _a_really_long_variable_name_1_4_3) + (_a_really_long_variable_name_1_5_4 + _a_really_long_variable_name_2_1_5 + _a_really_long_variable_name_2_2_6) + (_a_really_long_variable_name_2_3_7 + _a_really_long_variable_name_2_4_8 + _a_really_long_variable_name_2_5_9 + (_a_really_long_variable_name_3_1_10 + _a_really_long_variable_name_3_2_11 + _a_really_long_variable_name_3_3_12)) + (_a_really_long_variable_name_3_4_13 + _a_really_long_variable_name_3_5_14 + _a_really_long_variable_name_4_1_15 + (_a_really_long_variable_name_4_2_16 + _a_really_long_variable_name_4_3_17 + _a_really_long_variable_name_4_4_18) + (_a_really_long_variable_name_4_5_19 + _a_really_long_variable_name_5_1_20 + _a_really_long_variable_name_5_2_21 + (_a_really_long_variable_name_5_3_22 + _a_really_long_variable_name_5_4_23 + _a_really_long_variable_name_5_5_24)))), \"(truncated) time / (a_really_long_variable_name[1,1] + a_really_long_variable_name[1,2] + (a_really_long_variable_name[1,3] + a_really_long_variable_name[1,4]) + (a_really_long_variable_name[1,5] + a_really_long_variable_name[2,1] + a_really_long_variable_name[2,2]) + (a_really_long_variable_name[2,3] + a_really_long_variable_name[2,4] + a_really_long_variable_name[2,5] + (a_really_long_variable_name[3,1] + a_really_long_variable_name[3,2] + a_really_long_variable_name[3,3])) + (a_really_long_variable...\");
    1766317958    JMI_DYNAMIC_FREE()
    1766417959    return ef;
     
    1997920274    int ef = 0;
    1998020275    JMI_DYNAMIC_INIT()
    19981     _tmp_2 = sin(_time * 100.0);
     20276    _tmp_2 = JMI_SIN_EQUATION(jmi, _time * 100.0, \"sin(time * 100)\");
    1998220277    if (jmi->atInitial || jmi->atEvent) {
    1998320278        _sw(0) = jmi_turn_switch(jmi, __eventIndicator_1_3, _sw(0), JMI_REL_GEQ);
     
    2000320298    }
    2000420299    ef |= jmi_solve_block_residual(jmi->dae_block_residuals[0]);
    20005     _tmp_2 = sin(_time * 100.0);
     20300    _tmp_2 = JMI_SIN_EQUATION(jmi, _time * 100.0, \"sin(time * 100)\");
    2000620301    __eventIndicator_2_4 = jmi_delay_first_event_indicator_exp(jmi, 0, _tmp_2);
    2000720302    __eventIndicator_3_5 = jmi_delay_second_event_indicator_exp(jmi, 0, _tmp_2);
  • branches/stable/Compiler/ModelicaCompiler/module.options

    r13771 r14024  
    465465
    466466********************************************************************************
     467BOOLEAN mathematical_domain_checks compiler uncommon true
     468
     469"If enabled, all mathematical operators will be checked for its correct domain
     470and provide log messages when an operator is evaluated outside its correct
     471domain."
     472
     473********************************************************************************
  • branches/stable/Compiler/ModelicaCompiler/src/jastadd/ModelicaCompiler.jrag

    r13892 r14024  
    530530     * @param count  it node counts should also be generated
    531531     */
    532     protected void dumpMemoryUseFile(ASTNode root, String type, boolean count) throws FileNotFoundException {
    533         dumpMemoryUseFile(root, type, type, count);
     532    protected void dumpMemoryUseFile(ASTNode root, UtilInterface util, String type, boolean count) throws FileNotFoundException {
     533        dumpMemoryUseFile(root, util, type, type, count);
    534534    }
    535535
     
    544544     * @param count  it node counts should also be generated
    545545     */
    546     protected void dumpMemoryUseFile(ASTNode root, String type, String name, boolean count)
     546    protected void dumpMemoryUseFile(ASTNode root, UtilInterface util, String type, String name, boolean count)
    547547            throws FileNotFoundException {
    548548        if (dumpMemoryUse) {
     
    553553            time = Math.round((System.currentTimeMillis() - time) / 1000.0);
    554554            if (count)
    555                 root.buildNodeCount();
     555                root.buildNodeCount(util.getBuildNodeCountMap());
    556556            log.debug(" Dumped tree in " + time + "s");
    557557        }
     
    560560    /**
    561561     * Save a dump of the node class counts of an AST (or several).
    562      *
     562     * This only seems to work when using an older jdk version.
     563     * We have verified that it works with jdk 8 but it doesn't seem to work properly with jdk 11.
    563564     * The dump will be saved in a file named <code>"node_count.txt"</code>.
    564565     */
    565     protected void dumpNodeCountFile()
     566    protected void dumpNodeCountFile(Root root)
    566567            throws IOException {
    567568        if (dumpMemoryUse) {
    568569            String file = "node_count.txt";
    569570            log.debug("Dumping node counts to '" + file + "'...");
    570             ASTNode.dumpNodeCount(file);
     571            root.dumpNodeCount(file, root.getUtilInterface());
    571572        }
    572573    }
     
    10861087        // build source tree
    10871088        SourceRoot sr = parseModelFromPaths(paths);
    1088         dumpMemoryUseFile(sr, "source", false);
     1089        dumpMemoryUseFile(sr, sr.getUtilInterface(), "source", false);
    10891090
    10901091        if (options.getBooleanOption("generate_html_diagnostics")) {
     
    10951096        InstClassDecl icl = instantiateModel(sr, cl, target);
    10961097       
    1097         dumpMemoryUseFile(sr, "source and instance", "instance", true);
     1098        dumpMemoryUseFile(sr, sr.getUtilInterface(), "source and instance", "instance", true);
    10981099       
    10991100        return icl;
     
    12221223        log.info("Flattening model...");
    12231224        icd.flattenInstClassDecl(fc);
    1224         dumpMemoryUseFile(fc, "flat", true);
    1225         dumpNodeCountFile();
     1225        dumpMemoryUseFile(fc, fc.root().getUtilInterface(), "flat", true);
     1226        dumpNodeCountFile(icd.root());
    12261227        icd = null;
    12271228        ASTNode.endStep("flatten()");
     
    12841285        ASTNode.endStep("prettyPrintFlat()");
    12851286       
    1286         dumpMemoryUseFile(fc, "transformed", false);
     1287        dumpMemoryUseFile(fc, fc.root().getUtilInterface(), "transformed", false);
    12871288       
    12881289        if (options.getBooleanOption("write_iteration_variables_to_file")) {
     
    13701371        fc.guidManager().setSourceFile(new File(outDir, "modelDescription.xml"));
    13711372        fc.guidManager().processDependentFiles();
    1372        
     1373        log.debug("Checksum for generated files");
     1374        fc.guidManager().writeFileMD5(log);
    13731375        log.debug("... code generated.");
    13741376        ASTNode.endStep("generateCode()");
     
    20612063            if (target.getCodeGenFlag()) {
    20622064                generateCode(fc, target);
    2063                 dumpMemoryUseFile(fc, "generated", false);
     2065                dumpMemoryUseFile(fc, util, "generated", false);
    20642066            }
    20652067           
     
    21772179            SplitFilesCodeStream stream = new SplitFilesCodeStream(outFile, debugGen, header);
    21782180            gen.generate(tmpl, stream, header);
     2181           
    21792182            for (File file : stream.files()) {
    21802183                log.debug("Generated file '" + file + "'.");
    21812184                if (fc != null) {
     2185                    try {
     2186                        fc.guidManager().createFileMD5(new FileReader(file), file.getName(), log);
     2187                    } catch (FileNotFoundException e) {
     2188                        throw e;
     2189                    } catch (IOException e) {
     2190                        // Should not happen
     2191                    }
    21822192                    fc.guidManager().addDependentFile(file);
    21832193                }
     
    22332243        if (target.getMakeFileFlag() != null) {
    22342244                ASTNode.beginStep("compileCCode()");
    2235                 String cFileName = fc.nameUnderscore();
     2245                String cFileName = cFileName(fc);
    22362246                CCompilerDelegator ccompiler = getCCompiler();
    22372247                CCompilerArguments ccArgs = new CCompilerArguments(cFileName, fc.myOptions(), target, fc.externalLibraries(), fc.externalLibraryDirectories(),
     
    22432253        hookCodeCompiled();
    22442254     }
     2255
     2256    private String ModelicaCompiler.cFileName(FClass fc) {
     2257        return fc.nameUnderscore(); // Hook to facilitate extensions.
     2258    }
    22452259
    22462260    /**
     
    24842498   
    24852499    private static ArrayList<TemplateContributor> CONTRIBUTORS;
    2486     private static LinkedHashSet<String> XML_TEMPLATES;
    2487     private static LinkedHashSet<String> C_HEADER_TEMPLATES;
    2488     private static LinkedHashSet<String> C_SOURCE_TEMPLATES;   
     2500    private LinkedHashSet<String> XML_TEMPLATES;
     2501    private LinkedHashSet<String> C_HEADER_TEMPLATES;
     2502    private LinkedHashSet<String> C_SOURCE_TEMPLATES;   
    24892503   
    24902504    public abstract static class TemplateContributor {
     
    25922606   
    25932607    private static ArrayList<ModuleContributor> CONTRIBUTORS = new ArrayList<>();
    2594     private static HashMap<Module, String> libraryNames = new HashMap<>();
     2608    private HashMap<Module, String> libraryNames = new HashMap<>();
    25952609   
    25962610    public abstract static class ModuleContributor {
  • branches/stable/Compiler/ModelicaCompiler/src/jastadd/UtilInterface.jrag

    r13771 r14024  
     1
    12aspect UtilInterface {
    23   
     
    5859            public void tearDown() {}
    5960        }
    60        
     61
    6162        private static LinkedList<Registrant> registrants = new LinkedList<>();
    6263        private static Registrant addRegistrant(Registrant registrant) {
     
    174175        }
    175176    }
     177
     178    /* Used when unit testing. */
     179    public final Map<String, String> UtilInterface.unitTempMap = new HashMap<>();
    176180}
  • branches/stable/Compiler/ModelicaFlatTree/src/jastadd/ConstantEvaluation/ConstantEvaluation.jrag

    r13771 r14024  
    2222import java.util.Map;
    2323import java.util.Set;
     24import java.util.IllegalFormatException;
    2425
    2526import org.jmodelica.util.BinaryOperation;
     
    3233import org.jmodelica.util.values.ConstantEvaluationNotReadyException;
    3334import org.jmodelica.util.values.FunctionEvaluationException;
     35import org.jmodelica.util.values.CFormatSpecifier;
    3436
    3537
     
    28462848       
    28472849        CValue cval = getValue().ceval(evaluator);
    2848         boolean isReal = getValue().type().isReal();
    2849         if (isReal) {
     2850        final CFormatSpecifier format = formatSpecifier(evaluator);
     2851       
     2852        if (!format.isValid()) {
     2853            throw new ConstantEvaluationException(format.errorMessage());
     2854        }
     2855       
     2856        // Do any necessary type conversions.
     2857        if (format.expectedType.isReal()) {
    28502858            cval = cval.convertReal();
     2859        } else if (format.expectedType.isInteger()) {
     2860            cval = cval.convertInteger();
    28512861        }
    28522862        Object value = cval.objectValue();
    2853         final String format = formatString(evaluator);
    2854         char formatChar = format.charAt(format.length() - 1);
    2855        
    2856         // Modelica allows Integer to Real conversion for formatting but not the other direction
    2857         boolean mustBeInteger = formatChar == 'd' || formatChar == 'i' || formatChar == 'o' ||
    2858             formatChar == 'x' || formatChar == 'X' || formatChar == 'u' || formatChar == 'c';
    2859         if (mustBeInteger && isReal) {
    2860             throw new ConstantEvaluationException(cval, "format the resulting value. The format '"+ format + "' requires value of Integer type but Real value is provided. ");
    2861         }
    2862 
    2863         if (getValue().type().isInteger()) {
    2864             // Java formatter do not convert types
    2865             final boolean convertToFloat = formatChar == 'e' || formatChar == 'E' ||
    2866                     formatChar == 'f' || formatChar == 'g' || formatChar == 'G';
    2867             if (convertToFloat) {
    2868                 return new CValueString(String.format((Locale) null, format, cval.realValue()));
    2869             }
    2870             if (formatChar == 'u') {
    2871                 String formatCorrect = format.substring(0, format.length()-1) + "s";
    2872                 long unsigned = ((long) cval.intValue()) & 0xffffffffL; // Java 8 Integer.toUnsignedLong
    2873                 return new CValueString(String.format((Locale) null, formatCorrect, unsigned));
    2874             }
    2875 
    2876             if (formatChar == 'i') {
    2877                 String formatCorrect = format.substring(0, format.length()-1) + "d";
    2878                 return new CValueString(String.format((Locale) null, formatCorrect, cval.intValue()));
    2879             }
     2863        if (format.expectedType.isUnsigned()) {
     2864            // Convert to the closest Java equivalent to an unsigned int.
     2865            // TODO: When we no longer need to support Java 7, use Integer.toUnsignedLong instead.
     2866            value = Long.valueOf(((Integer) value).longValue() & 0xffffffffL);
    28802867        }
    28812868       
    28822869        try {
    2883             return new CValueString(String.format((Locale) null, format, value));
    2884         } catch (java.util.IllegalFormatException e) {
    2885             throw new ConstantEvaluationException(cval,
    2886                     "format the resulting value. " + format + " is not a supported valid format string");
     2870            return new CValueString(String.format((Locale) null, format.javaFormat, value));
     2871        } catch (IllegalFormatException e) {
     2872            throw new ConstantEvaluationException("The format string \"" + format.format +
     2873                    "\" and the value " + value + " do not match in the string conversion: " + this, e);
    28872874        }
    28882875    }
     
    28972884    }
    28982885
    2899     syn String FStringExp.formatString(VariableEvaluator evaluator) {
    2900         StringBuilder buf = new StringBuilder("%");
     2886    syn CFormatSpecifier FStringExp.formatSpecifier() = formatSpecifier(defaultVariableEvaluator());
     2887
     2888    syn CFormatSpecifier FStringExp.formatSpecifier(VariableEvaluator evaluator) {
    29012889        if (hasFormat()) {
    2902             buf.append(getFormat().ceval(evaluator).stringValue());
     2890            return CFormatSpecifier.parseFormat(getFormat().ceval(evaluator).stringValue());
    29032891        } else {
    2904             int minLength = minimumLength(evaluator);
    2905             if (minLength > 0) {
    2906                 if (leftJustified(evaluator)) {
    2907                     buf.append('-');
    2908                 }
    2909                 buf.append(minLength);
    2910             }
    2911             if (getValue().type().isReal()) {
    2912                 buf.append('.');
    2913                 buf.append(significantDigits(evaluator));
    2914             }
    2915             buf.append(getValue().type().formatSpecifier());
    2916         }
    2917         return buf.toString();
     2892            FType t = getValue().type();
     2893            int m = minimumLength(evaluator);
     2894            boolean l = leftJustified(evaluator);
     2895            if (t.isReal()) {
     2896                int s = significantDigits(evaluator);
     2897                return CFormatSpecifier.realFormat(l, m, s);
     2898            } else if (t.isInteger()) {
     2899                return CFormatSpecifier.integerFormat(l, m);
     2900            } else {
     2901                return CFormatSpecifier.stringFormat(l, m);
     2902            }
     2903        }
    29182904    }
    29192905
    29202906    syn int FStringExp.minimumLength(VariableEvaluator evaluator)     =
    2921         hasMinimumLength() ? getMinimumLength().ceval(evaluator).intValue() : 0;
     2907        hasMinimumLength() ? getMinimumLength().ceval(evaluator).intValue() : 1;
    29222908    syn boolean FStringExp.leftJustified(VariableEvaluator evaluator) =
    29232909        hasLeftJustified() ? getLeftJustified().ceval(evaluator).booleanValue() : true;
    29242910    syn int FStringExp.significantDigits(VariableEvaluator evaluator) =
    29252911        hasSignificantDigits() ? getSignificantDigits().ceval(evaluator).intValue() : DEFAULT_PRECISION;
    2926     syn String FType.formatSpecifier() {
     2912    syn String FType.formatConversion() {
    29272913        throw new UnsupportedOperationException();
    29282914    }
    2929     eq FRealType.formatSpecifier()    = "g";
    2930     eq FIntegerType.formatSpecifier() = "d";
    2931     eq FBooleanType.formatSpecifier() = "s";
    2932     eq FEnumType.formatSpecifier()    = "s";
    2933     eq FStringType.formatSpecifier()  = "s";
     2915    eq FRealType.formatConversion()    = "g";
     2916    eq FIntegerType.formatConversion() = "d";
     2917    eq FBooleanType.formatConversion() = "s";
     2918    eq FEnumType.formatConversion()    = "s";
     2919    eq FStringType.formatConversion()  = "s";
    29342920    public static final int FStringExp.DEFAULT_PRECISION = 6;
    29352921
  • branches/stable/Compiler/ModelicaFlatTree/src/jastadd/FlatAPI/FlatAPI.jrag

    r13661 r14024  
    44684468            return unboundCopy();
    44694469    }
     4470
     4471    /**
     4472     * The format string including the implicit leading "%", if the format argument is given.
     4473     */
     4474    syn lazy Opt<FExp> FStringExp.getCFormatOpt() {
     4475        // TODO: To save memory, this could be solved in the C code generation instead.
     4476        if (hasFormat()) {
     4477            FExp fmt = getFormat();
     4478            FExp exp = fmt.treeCopy();
     4479            boolean initialPercent = false;
     4480            try {
     4481                initialPercent = formatSpecifier().initialPercent;
     4482            } catch (ConstantEvaluationException e) {
     4483                // If we can't evaluate it here, assume there is no "%"
     4484            }
     4485            if (!initialPercent) {
     4486                exp = new FStringAddExp(new FStringLitExp("%"), exp);
     4487            }
     4488            if (fmt.variability().fixedParameterOrLess()) {
     4489                try {
     4490                    exp.parent = this;
     4491                    exp = exp.ceval().buildLiteral();
     4492                } catch (ConstantEvaluationException e) {
     4493                    // If we can't evaluate, just leave it as is
     4494                }
     4495            }
     4496            return new Opt<FExp>(exp);
     4497        } else {
     4498            return new Opt<FExp>();
     4499        }
     4500    }
    44704501}
  • branches/stable/Compiler/ModelicaFlatTree/src/jastadd/FlatAnnotations.jrag

    r13294 r14024  
    2828    public class FlatAnnotation extends GenericAnnotationNode<FlatAnnotation, FlatAnnotationProvider, FExp> {
    2929
    30         public static final FlatAnnotation AMBIGUOUS_ANNOTATION =  new FlatAnnotation(null, null, null);
    31 
     30        public static final FlatAnnotation AMBIGUOUS_ANNOTATION =  new FlatAnnotation();
     31
     32        /** Creates an unambiguous flat annotation.
     33         * See {@link GenericAnnotationNode#GenericAnnotationNode(String, AnnotationProvider, GenericAnnotationNode)}
     34         */
    3235        protected FlatAnnotation(String name, FlatAnnotationProvider node, FlatAnnotation parent) {
    3336            super(name, node, parent);
     37        }
     38
     39        /** Creates an ambiguous flat annotation.
     40         * See {@link GenericAnnotationNode#GenericAnnotationNode()}
     41         */
     42        protected FlatAnnotation() {
     43            super();
    3444        }
    3545
  • branches/stable/Compiler/ModelicaFlatTree/src/jastadd/HtmlSourcePrettyPrint.jrag

    r13246 r14024  
    11import java.io.File;
     2import java.nio.file.Path;
     3import java.nio.file.Paths;
     4import java.nio.file.InvalidPathException;
    25
    36import beaver.Symbol;
     
    276279    }
    277280   
    278     private static String BaseNode.cropAbsolutePath(String path){
    279         String p = path;
    280         String dir = System.getProperty("user.dir");
    281         try {
    282             if (p.substring(0, dir.lastIndexOf("\\")).equals(dir.substring(0, dir.lastIndexOf("\\")))) {
    283                 p = p.substring(dir.lastIndexOf("\\") + 1);
    284             }
    285         } catch (IndexOutOfBoundsException e) {}
    286         return p;
     281    private static String BaseNode.cropAbsolutePath(String path) {
     282        try {
     283            Path p = Paths.get(path);
     284            if (p.isAbsolute()) {
     285                Path cwd = Paths.get("").toAbsolutePath();
     286                if (p.startsWith(cwd)) {
     287                    p = cwd.relativize(p);
     288                }
     289            }
     290            return p.toString();
     291        } catch (InvalidPathException e) {
     292            // Incoming path is invalid, so we can't really process it
     293            return path;
     294        }
    287295    }
    288296   
  • branches/stable/Compiler/ModelicaFlatTree/src/jastadd/PrettyPrint.jrag

    r13892 r14024  
    18611861    }
    18621862
    1863     protected static final String FBuiltInFunctionCall.SEP = ", ";
    1864    
    1865     /**
    1866      * Pretty-print all arguments of function.
    1867      *
    1868      * Default implementation prints all direct FExp children (including those in Lists and Opts),
    1869      * separated by {@link #SEP}.
    1870      */
    1871     protected void FBuiltInFunctionCall.prettyPrintArguments(Printer p, CodeStream str, String indent) {
    1872         String pre = "";
    1873         for (FExp exp : myArgs()) {
    1874             str.print(pre);
    1875             p.print(exp, str, indent);
    1876             pre = SEP;
    1877         }
    1878     }
    1879    
     1863    protected static final String FBuiltInFunctionCall.SEP = ", ";
     1864
     1865    /**
     1866     * Pretty-print all arguments of function.
     1867     *
     1868     * Default implementation will in instance tree print the original arguments, and in
     1869     * flat tree print all direct FExp children (including those in Lists and Opts),
     1870     * in either case separated by {@link #SEP}.
     1871     */
     1872    protected void FBuiltInFunctionCall.prettyPrintArguments(Printer p, CodeStream str, String indent) {
     1873        String pre = "";
     1874        if (getNumOriginalArg() > 0) {
     1875            for (InstFunctionArgument arg : getOriginalArgs()) {
     1876                if (arg.isGiven()) {
     1877                    str.print(pre);
     1878                    p.print(arg, str, indent);
     1879                    pre = SEP;
     1880                }
     1881            }
     1882        } else {
     1883            for (FExp exp : myArgs()) {
     1884                str.print(pre);
     1885                p.print(exp, str, indent);
     1886                pre = SEP;
     1887            }
     1888        }
     1889    }
     1890
    18801891    protected void FInfArgsFunctionCall.prettyPrintArguments(Printer p, CodeStream str, String indent) {
    18811892        getFExps().prettyPrintWithSep(p, str, indent, SEP);
  • branches/stable/Compiler/ModelicaFlatTree/src/jastadd/ast/FlatModelica.ast

    r13661 r14024  
    16061606 * String conversion operator.
    16071607 */
    1608 FStringExp : FBuiltInFunctionCall ::= Value:FExp [MinimumLength:FExp] [LeftJustified:FExp] [SignificantDigits:FExp] [Format:FExp];
     1608FStringExp : FBuiltInFunctionCall ::= Value:FExp
     1609                                      [MinimumLength:FExp]
     1610                                      [LeftJustified:FExp]
     1611                                      [SignificantDigits:FExp]
     1612                                      [Format:FExp]
     1613                                      /[CFormat:FExp]/;
    16091614
    16101615/**
  • branches/stable/Compiler/ModelicaFlatTree/test/modelica/EvaluationTests.mo

    r13575 r14024  
    46824682
    46834683model StringConvertWithParam1
     4684    /* TODO: a constant with a binding expression depending on parameters isn't really allowed,
     4685             but we don't check it - need to find a better way to test this when that is fixed
     4686             perhaps a string param that becomes structural?
     4687     */
    46844688    parameter Integer len = 8;
    46854689    parameter Boolean left = false;
     
    46944698        flatModel="
    46954699fclass EvaluationTests.StringConvert.StringConvertWithParam1
    4696  structural parameter Integer len = 8 /* 8 */;
    4697  structural parameter Boolean left = false /* false */;
    4698  structural parameter Integer dig = 4 /* 4 */;
     4700 parameter Integer len = 8 /* 8 */;
     4701 parameter Boolean left = false /* false */;
     4702 parameter Integer dig = 4 /* 4 */;
    46994703 constant Real x = 1.23456789;
    47004704 constant String s = \"   1.23\";
     
    47054709
    47064710model StringConvertWithParam2
     4711    /* TODO: a constant with a binding expression depending on parameters isn't really allowed,
     4712             but we don't check it - need to find a better way to test this when that is fixed
     4713             perhaps a string param that becomes structural?
     4714     */
    47074715    parameter String fmtSize = "10.4";
    47084716    constant Real x = 1.23456789;
     
    47154723        flatModel="
    47164724fclass EvaluationTests.StringConvert.StringConvertWithParam2
    4717  parameter String fmtSize = \"10.4\" /* \"10.4\" */;
     4725 structural parameter String fmtSize = \"10.4\" /* \"10.4\" */;
    47184726 constant Real x = 1.23456789;
    47194727 constant String s = \"1.2346E+00\";
     
    48834891
    48844892model StringRealformatSpecifier_d
    4885     constant Real x = 1.23456789;
     4893    constant Real x = 1234.56789;
    48864894    constant String s = String(x, format = "3d");
    48874895
    48884896annotation(__JModelica(UnitTesting(tests={
    4889       ErrorTestCase(
    4890             name="StringRealformatSpecifier_d",
    4891             description="String() operator, Real, format using d specifier",
    4892             errorMessage="
    4893 Error at line 3, column 25, in file '...':
    4894   Could not evaluate binding expression for constant 's': 'String(x, \"3d\")'
    4895     Cannot format the resulting value. The format '%3d' requires value of Integer type but Real value is provided. CValueReal (1.23456789)
     4897    FlatteningTestCase(
     4898        name="StringRealformatSpecifier_d",
     4899        description="String() operator, Real, format using d specifier",
     4900        flatModel="
     4901fclass EvaluationTests.StringConvert.StringRealformatSpecifier_d
     4902 constant Real x = 1234.56789;
     4903 constant String s = \"1234\";
     4904end EvaluationTests.StringConvert.StringRealformatSpecifier_d;
    48964905")})));
    48974906end StringRealformatSpecifier_d;
     
    49144923
    49154924model StringRealformatSpecifier_i
    4916     constant Real x = 1.23456789;
     4925    constant Real x = 1234.56789;
    49174926    constant String s = String(x, format = "3i");
    49184927
    49194928annotation(__JModelica(UnitTesting(tests={
    4920     ErrorTestCase(
     4929    FlatteningTestCase(
    49214930        name="StringRealformatSpecifier_i",
    49224931        description="String() operator, Real, format using i specifier",
    4923         errorMessage="
    4924 Error at line 3, column 25, in file '...':
    4925   Could not evaluate binding expression for constant 's': 'String(x, \"3i\")'
    4926     Cannot format the resulting value. The format '%3i' requires value of Integer type but Real value is provided. CValueReal (1.23456789)
     4932        flatModel="
     4933fclass EvaluationTests.StringConvert.StringRealformatSpecifier_i
     4934 constant Real x = 1234.56789;
     4935 constant String s = \"1234\";
     4936end EvaluationTests.StringConvert.StringRealformatSpecifier_i;
    49274937")})));
    49284938end StringRealformatSpecifier_i;
     
    49454955
    49464956model StringRealformatSpecifier_o
    4947     constant Real x = 1.23456789;
     4957    constant Real x = 1234.56789;
    49484958    constant String s = String(x, format = "3o");
    49494959
    49504960annotation(__JModelica(UnitTesting(tests={
    4951     ErrorTestCase(
     4961    FlatteningTestCase(
    49524962        name="StringRealformatSpecifier_o",
    49534963        description="String() operator, Real, format using o specifier",
    4954         errorMessage="
    4955 Error at line 3, column 25, in file '...':
    4956   Could not evaluate binding expression for constant 's': 'String(x, \"3o\")'
    4957     Cannot format the resulting value. The format '%3o' requires value of Integer type but Real value is provided. CValueReal (1.23456789)
     4964        flatModel="
     4965fclass EvaluationTests.StringConvert.StringRealformatSpecifier_o
     4966 constant Real x = 1234.56789;
     4967 constant String s = \"2322\";
     4968end EvaluationTests.StringConvert.StringRealformatSpecifier_o;
    49584969")})));
    49594970end StringRealformatSpecifier_o;
     
    49764987
    49774988model StringRealformatSpecifier_x
    4978     constant Real x = 1.23456789;
     4989    constant Real x = 1234.56789;
    49794990    constant String s = String(x, format = "3x");
    49804991
    49814992annotation(__JModelica(UnitTesting(tests={
    4982     ErrorTestCase(
     4993    FlatteningTestCase(
    49834994        name="StringRealformatSpecifier_x",
    49844995        description="String() operator, Real, format using x specifier",
    4985         errorMessage="
    4986 Error at line 3, column 25, in file '...':
    4987   Could not evaluate binding expression for constant 's': 'String(x, \"3x\")'
    4988     Cannot format the resulting value. The format '%3x' requires value of Integer type but Real value is provided. CValueReal (1.23456789)
     4996        flatModel="
     4997fclass EvaluationTests.StringConvert.StringRealformatSpecifier_x
     4998 constant Real x = 1234.56789;
     4999 constant String s = \"4d2\";
     5000end EvaluationTests.StringConvert.StringRealformatSpecifier_x;
    49895001")})));
    49905002end StringRealformatSpecifier_x;
     
    50075019
    50085020model StringRealformatSpecifier_X
    5009     constant Real x = 1.23456789;
     5021    constant Real x = 1234.56789;
    50105022    constant String s = String(x, format = "3X");
    50115023
    50125024annotation(__JModelica(UnitTesting(tests={
    5013     ErrorTestCase(
     5025    FlatteningTestCase(
    50145026        name="StringRealformatSpecifier_X",
    50155027        description="String() operator, Real, format using X specifier",
    5016         errorMessage="
    5017 Error at line 3, column 25, in file '...':
    5018   Could not evaluate binding expression for constant 's': 'String(x, \"3X\")'
    5019     Cannot format the resulting value. The format '%3X' requires value of Integer type but Real value is provided. CValueReal (1.23456789)
     5028        flatModel="
     5029fclass EvaluationTests.StringConvert.StringRealformatSpecifier_X
     5030 constant Real x = 1234.56789;
     5031 constant String s = \"4D2\";
     5032end EvaluationTests.StringConvert.StringRealformatSpecifier_X;
    50205033")})));
    50215034end StringRealformatSpecifier_X;
     
    50385051
    50395052model StringRealformatSpecifier_u
    5040     constant Real x = 1.23456789;
     5053    constant Real x = -1234.56789;
    50415054    constant String s = String(x, format = "3u");
    50425055
    50435056annotation(__JModelica(UnitTesting(tests={
    5044     ErrorTestCase(
     5057    FlatteningTestCase(
    50455058        name="StringRealformatSpecifier_u",
    5046         description="String() operator, Real, format using u specifier",
    5047         errorMessage="
    5048 Error at line 3, column 25, in file '...':
    5049   Could not evaluate binding expression for constant 's': 'String(x, \"3u\")'
    5050     Cannot format the resulting value. The format '%3u' requires value of Integer type but Real value is provided. CValueReal (1.23456789)
     5059        description="String() operator,  Real, format using u specifier",
     5060        flatModel="
     5061fclass EvaluationTests.StringConvert.StringRealformatSpecifier_u
     5062 constant Real x = -1234.56789;
     5063 constant String s = \"4294966061\";
     5064end EvaluationTests.StringConvert.StringRealformatSpecifier_u;
    50515065")})));
    50525066end StringRealformatSpecifier_u;
     
    50695083
    50705084model StringRealformatSpecifier_c
    5071     constant Real x = 1.23456789;
     5085    constant Real x = 123.456789;
    50725086    constant String s = String(x, format = "3c");
    50735087
    50745088annotation(__JModelica(UnitTesting(tests={
    5075     ErrorTestCase(
     5089    FlatteningTestCase(
    50765090        name="StringRealformatSpecifier_c",
    5077         description="String() operator, Real, format using c specifier",
    5078         errorMessage="
    5079 Error at line 3, column 25, in file '...':
    5080   Could not evaluate binding expression for constant 's': 'String(x, \"3c\")'
    5081     Cannot format the resulting value. The format '%3c' requires value of Integer type but Real value is provided. CValueReal (1.23456789)
    5082 ")})));
    5083 
     5091        description="String() operator,  Real, format using c specifier",
     5092        flatModel="
     5093fclass EvaluationTests.StringConvert.StringRealformatSpecifier_c
     5094 constant Real x = 123.456789;
     5095 constant String s = \"  {\";
     5096end EvaluationTests.StringConvert.StringRealformatSpecifier_c;
     5097")})));
    50845098end StringRealformatSpecifier_c;
    50855099
     
    51005114end StringIntegerformatSpecifier_c;
    51015115
    5102 model StringIncorrectformat
    5103     constant Integer x = 1234;
    5104     constant String s = String(x, format = "*.1.3c");
     5116
     5117model StringConvertInvalidFormat1
     5118    parameter Real x = 1.23456789;
     5119    parameter String s = String(x, format = "1.2.3g");
    51055120
    51065121annotation(__JModelica(UnitTesting(tests={
    51075122    ErrorTestCase(
    5108         name="StringIncorrectformat",
    5109         description="String() operator, Real, format using c specifier",
     5123        name="StringConvert_StringConvertInvalidFormat1",
     5124        description="String() operator, Real, bad format string",
    51105125        errorMessage="
    5111 Error at line 3, column 25, in file '...':
    5112   Could not evaluate binding expression for constant 's': 'String(x, \"*.1.3c\")'
    5113     Cannot format the resulting value. %*.1.3c is not a supported valid format stringCValueInteger (1234)
    5114 ")})));
    5115 end StringIncorrectformat;
     5126Error at line 3, column 26, in file '...', INVALID_FORMAT_STRING:
     5127  Failed to parse format string \"1.2.3g\".
     5128")})));
     5129end StringConvertInvalidFormat1;
     5130
     5131
     5132model StringConvertInvalidFormat2
     5133    parameter Integer x = 1;
     5134    parameter String s = String(x, format = "ld");
     5135
     5136annotation(__JModelica(UnitTesting(tests={
     5137    ErrorTestCase(
     5138        name="StringConvert_StringConvertInvalidFormat2",
     5139        description="String() operator, Real, bad format string (different internal exception)",
     5140        errorMessage="
     5141Error at line 3, column 26, in file '...', INVALID_FORMAT_STRING:
     5142  Length modifiers are not allowed in format strings, but \"ld\" has length modifier \"l\".
     5143")})));
     5144end StringConvertInvalidFormat2;
    51165145
    51175146end StringConvert;
  • branches/stable/Compiler/ModelicaFrontEnd/src/jastadd/ast/Modelica.ast

    r13354 r14024  
    277277SrcWhileStmt           : SrcStatement ::= Test:SrcExp SrcWhileStmt:SrcStatement*;
    278278
     279SrcFunctionCallList    ::= ConvertRules:SrcFunctionCall*;
     280
    279281SrcParExp    : SrcExp ::= SrcExp;
    280282SrcIfExp     : SrcExp ::= SrcIfExp:SrcExp ThenExp:SrcExp ElseExp:SrcExp;
  • branches/stable/Compiler/ModelicaFrontEnd/src/jastadd/errorcheck/ComplianceCheck.jadd

    r11639 r14024  
    283283
    284284    public static final SimpleProblemProducer ASTNode.UNSUPPORTED_NON_FIXED_STRING_ARGUMENT =
    285             new SimpleErrorProducer("UNSUPPORTED_NON_FIXED_STRING_ARGUMENT", ProblemKind.COMPLIANCE, "%s with higher than parameter variability is not supported");
     285            new SimpleErrorProducer("UNSUPPORTED_NON_FIXED_STRING_ARGUMENT", ProblemKind.COMPLIANCE,
     286                    "Argument format of String operator is only supported as a fixed parameter expression.");
    286287
    287288    public void FStringExp.complianceCheck(ErrorCheckType checkType) {
    288289        super.complianceCheck(checkType);
    289         boolean func = inFunction();
    290         if (!func && hasMinimumLength()) {
    291             getMinimumLength().markAsStructuralParameter(checkType);
    292             if (!getMinimumLength().variability().parameterOrLess())
    293                 UNSUPPORTED_NON_FIXED_STRING_ARGUMENT.invoke(getMinimumLength(), "minimumLength");
    294         }
    295         if (!func && hasLeftJustified()) {
    296             getLeftJustified().markAsStructuralParameter(checkType);
    297            if (!getLeftJustified().variability().parameterOrLess())
    298                UNSUPPORTED_NON_FIXED_STRING_ARGUMENT.invoke(getLeftJustified(), "leftJustified");
    299         }
    300         if (!func && hasSignificantDigits()) {
    301             getSignificantDigits().markAsStructuralParameter(checkType);
    302             if (!getSignificantDigits().variability().parameterOrLess())
    303                 UNSUPPORTED_NON_FIXED_STRING_ARGUMENT.invoke(getSignificantDigits(), "significantDigits");
    304        }
     290        if (hasFormat()) {
     291            getFormat().markAsStructuralParameter(checkType);
     292            if (!getFormat().variability().parameterOrLess())
     293                UNSUPPORTED_NON_FIXED_STRING_ARGUMENT.invoke(getFormat());
     294        }
    305295    }
    306296
  • branches/stable/Compiler/ModelicaFrontEnd/src/jastadd/errorcheck/ContentsCheck.jadd

    r13103 r14024  
    2222import org.jmodelica.common.URIResolver;
    2323import org.jmodelica.common.URIResolver.URIException;
     24import org.jmodelica.util.problemHandling.SimpleErrorOrWarningProducer;
    2425
    2526aspect ContentCheck {
     
    389390            if (!ch.variability().parameterOrLess()) {
    390391                NON_PARAMETER_SAMPLE_ARGUMENTS.invoke(ch);
     392            }
     393        }
     394    }
     395   
     396    public static final SimpleErrorOrWarningProducer ASTNode.INVALID_FORMAT_STRING =
     397            new SimpleErrorOrWarningProducer("INVALID_FORMAT_STRING", ProblemKind.SEMANTIC, "%s");
     398
     399    public void FStringExp.contentCheck(ErrorCheckType checkType) {
     400        if (hasFormat()) {
     401            try {
     402                CFormatSpecifier format = formatSpecifier();
     403                if (format.hasProblem()) {
     404                    INVALID_FORMAT_STRING.invoke(this, format.hasError(), format.errorMessage());
     405                }
     406            } catch (ConstantEvaluationException e) {
     407                // If we can't evaluate it, don't do a static error check of it.
    391408            }
    392409        }
  • branches/stable/Compiler/ModelicaFrontEnd/src/jastadd/errorcheck/ErrorCheck.jrag

    r13103 r14024  
    852852                    getFArraySubscripts().collectErrors(checkType);
    853853                }
    854                 if (hasConditionalAttribute())  {
    855                     getConditionalAttribute().collectErrors(checkType);
     854                if (hasConditionalAttribute()) {
     855                    FExp cond = getConditionalAttribute();
     856                    cond.collectErrors(checkType);
     857                    if (!cond.type().isUnknown()) {
     858                        if (!cond.type().isScalar() || !cond.type().isBoolean()) {
     859                            NON_BOOLEAN_CONDITIONAL_GUARD.invoke(this);
     860                        }
     861                        if (!cond.variability().fixedParameterOrLess()) {
     862                            NON_FIXED_CONDITIONAL_GUARD.invoke(this);
     863                        } else {
     864                            cond.markAsStructuralParameter(checkType);
     865                        }
     866                    }
    856867                }
    857868                if (!isDisabled() && hasInstModification()) {
  • branches/stable/Compiler/ModelicaFrontEnd/src/jastadd/errorcheck/TypeCheck.jrag

    r13396 r14024  
    190190            new ErrorProducerUnlessDisabled("ARRAY_SIZE_MISMATCH_IN_MODIFICATION_DUE_TO_EACH", ProblemKind.SEMANTIC,
    191191                    "Array size mismatch in modification of %s, expected size is (due to 'each') %s and size of binding expression is %s");
    192     public static final SimpleProblemProducer ASTNode.NON_SCALAR_CONDITIONAL_GUARD =
    193             new SimpleErrorProducer("NON_SCALAR_CONDITIONAL_GUARD", ProblemKind.SEMANTIC,
    194                     "The guard expression of a conditional component should be a scalar expression");
    195192    public static final SimpleProblemProducer ASTNode.NON_BOOLEAN_CONDITIONAL_GUARD =
    196193            new SimpleErrorProducer("NON_BOOLEAN_CONDITIONAL_GUARD", ProblemKind.SEMANTIC,
    197                     "The guard expression of a conditional component should be a boolean expression");
     194                    "The guard expression of a conditional component should be a scalar Boolean expression");
    198195    public static final SimpleProblemProducer ASTNode.NON_FIXED_CONDITIONAL_GUARD =
    199196            new SimpleErrorProducer("NON_FIXED_CONDITIONAL_GUARD", ProblemKind.SEMANTIC,
    200                     "The guard expression of a conditional component should have parameter or constant variability");
    201 
     197                    "The guard expression of a conditional component must be a fixed parameter expression");
     198
     199    @Override
    202200    public void InstAssignable.typeCheck(ErrorCheckType checkType) {
    203201        FExp bexp = myBindingInstExp();
     
    262260                        typeCheckCell(expected, actual, bexp, unknownAllowed);
    263261                    }
    264                 }
    265             }
    266         }
    267        
    268         if (hasConditionalAttribute()) {
    269             FExp cond = getConditionalAttribute();
    270             if (!cond.type().isUnknown()) {
    271                 if (!cond.type().isScalar())
    272                     NON_SCALAR_CONDITIONAL_GUARD.invoke(this);
    273                 if (!cond.type().isBoolean())
    274                     NON_BOOLEAN_CONDITIONAL_GUARD.invoke(this);
    275                 if (!cond.variability().parameterOrLess()) {
    276                     NON_FIXED_CONDITIONAL_GUARD.invoke(this);
    277                 } else {
    278                     cond.markAsStructuralParameter(checkType);
    279262                }
    280263            }
  • branches/stable/Compiler/ModelicaFrontEnd/src/jastadd/flattening/Flattening.jrag

    r13687 r14024  
    17341734        }
    17351735        if (isConnectorVariable()) {
    1736             if (isInput()) {
    1737                 return CausalityConnectorPrefix.INPUT;
    1738             } else if (isOutput()) {
    1739                 return CausalityConnectorPrefix.OUTPUT;
    1740             } else if (isFlow()) {
    1741                 return CausalityConnectorPrefix.FLOW;
    1742             } else if (isStream()) {
    1743                 return CausalityConnectorPrefix.STREAM;
    1744             } else if (!variability().parameterOrLess()) {
    1745                 return CausalityConnectorPrefix.POTENTIAL;
    1746             } else {
    1747                 return CausalityConnectorPrefix.NONE;
    1748             }
     1736            return connectorVariablePrefix();
    17491737        } else {
    17501738            if (isInput()) {
     
    17551743                return CausalityConnectorPrefix.NONE;
    17561744            }
     1745        }
     1746    }
     1747   
     1748    /**
     1749     * Computes the {@link CausalityConnectorPrefix} this variable would have if it
     1750     * was a connector variable in a top-level connector.
     1751     */
     1752    public CausalityConnectorPrefix InstAssignable.connectorVariablePrefix() {
     1753        if (isInput()) {
     1754            return CausalityConnectorPrefix.INPUT;
     1755        } else if (isOutput()) {
     1756            return CausalityConnectorPrefix.OUTPUT;
     1757        } else if (isFlow()) {
     1758            return CausalityConnectorPrefix.FLOW;
     1759        } else if (isStream()) {
     1760            return CausalityConnectorPrefix.STREAM;
     1761        } else if (!variability().parameterOrLess()) {
     1762            return CausalityConnectorPrefix.POTENTIAL;
     1763        } else {
     1764            return CausalityConnectorPrefix.NONE;
    17571765        }
    17581766    }
  • branches/stable/Compiler/ModelicaFrontEnd/src/jastadd/instance/InnerOuter.jrag

    r10841 r14024  
    113113    eq BaseNode.getChild().isGeneratedInner()                       = false;
    114114
     115    inh boolean InstComponentDecl.isInGeneratedInner();
     116    eq InstGeneratedInner.getInstComponentDecl().isInGeneratedInner() = true;
     117    eq InstClassDecl.getChild().isInGeneratedInner()                  = false;
     118
    115119}
    116120
  • branches/stable/Compiler/ModelicaFrontEnd/src/jastadd/source/Parser.jrag

    r13404 r14024  
    181181    }
    182182
     183    public short ParserHandler.functionCallListGoal() {
     184        return org.jmodelica.modelica.parser.ModelicaParser.AltGoals.function_call_list;
     185    }
     186
    183187    public SourceRoot ParserHandler.parseFile(UtilInterface uif, LoadInfo loadInfo)
    184188            throws ParserException, beaver.Parser.Exception, FileNotFoundException, IOException {
  • branches/stable/Compiler/ModelicaFrontEnd/src/jastadd/util/SrcAnnotations.jrag

    r13294 r14024  
    106106    public class SrcAnnotationNode extends GenericAnnotationNode<SrcAnnotationNode, SrcAnnotationProvider, SrcExp> {
    107107       
    108         public static final SrcAnnotationNode AMBIGUOUS_ANNOTATION =  new SrcAnnotationNode(null, null, null,
    109                 SrcAnnotationNode.defaultEvaluator());
     108        public static final SrcAnnotationNode AMBIGUOUS_ANNOTATION =  new SrcAnnotationNode();
    110109       
    111110        private Evaluator<SrcExp> evaluator;
    112        
    113         protected SrcAnnotationNode(String name, SrcAnnotationProvider node, SrcAnnotationNode parent,
    114                 Evaluator<SrcExp> evaluator) {
     111
     112        /** Creates an ambiguous source annotation.
     113         * See {@link GenericAnnotationNode#GenericAnnotationNode()}
     114         */
     115        protected SrcAnnotationNode() {
     116            super();
     117            this.evaluator = SrcAnnotationNode.defaultEvaluator();
     118        }
     119
     120        /** Creates a unambiguous source annotation.
     121         * See {@link GenericAnnotationNode#GenericAnnotationNode(String, AnnotationProvider, GenericAnnotationNode)}
     122         */
     123        protected SrcAnnotationNode(String name, SrcAnnotationProvider node, SrcAnnotationNode parent, Evaluator<SrcExp> evaluator) {
    115124            super(name, node, parent);
    116125            this.evaluator = evaluator;
  • branches/stable/Compiler/ModelicaFrontEnd/src/jastadd/util/Util.jrag

    r13892 r14024  
    13131313   
    13141314
    1315     /**
    1316      * Check if this component is declared parameter.
    1317      */
    1318     syn boolean SrcComponentDecl.isParameter() = hasSrcTypePrefixVariability() && getSrcTypePrefixVariability().parameterVariability();
    1319    
    1320     /**
    1321      * Check if this component is declared constant.
    1322      */
    1323     syn boolean SrcComponentDecl.isConstant() = hasSrcTypePrefixVariability() && getSrcTypePrefixVariability().constantVariability();
    1324    
    1325     /**
    1326      * Check if this component clause is declared constant.
    1327      */
    1328     syn boolean SrcComponentClause.isConstant() = hasSrcTypePrefixVariability() && getSrcTypePrefixVariability().constantVariability();
    1329    
    1330     /**
    1331      * Check if this component is declared discrete.
    1332      */
    1333     syn boolean SrcComponentDecl.isDiscrete() = hasSrcTypePrefixVariability() && getSrcTypePrefixVariability().discreteVariability();
     1315    syn boolean SrcComponentDecl.isParameter() = myComponentClause().isParameter();
     1316    syn boolean SrcComponentDecl.isConstant()  = myComponentClause().isConstant();
     1317    syn boolean SrcComponentDecl.isDiscrete()  = myComponentClause().isDiscrete();
     1318   
     1319    syn boolean SrcComponentClause.isParameter() = hasSrcTypePrefixVariability() && getSrcTypePrefixVariability().parameterVariability();
     1320    syn boolean SrcComponentClause.isConstant()  = hasSrcTypePrefixVariability() && getSrcTypePrefixVariability().constantVariability();
     1321    syn boolean SrcComponentClause.isDiscrete()  = hasSrcTypePrefixVariability() && getSrcTypePrefixVariability().discreteVariability();
    13341322
    13351323    /**
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/common/GUIDManager.java

    r13771 r14024  
    55import java.io.ByteArrayOutputStream;
    66import java.io.File;
     7import java.io.FileReader;
     8import java.io.FileWriter;
    79import java.io.IOException;
    810import java.io.InputStream;
     
    1012import java.io.OutputStream;
    1113import java.io.PrintWriter;
     14import java.io.Reader;
    1215import java.math.BigInteger;
    1316import java.nio.charset.Charset;
     
    2124import java.util.List;
    2225
     26import org.jmodelica.util.logging.ModelicaLogger;
     27
    2328public class GUIDManager {
    2429
     
    8590    public void addDependentString(String input, ByteArrayOutputStream output) {
    8691        dependentFiles.add(new StringOpenable(input, output));
     92    }
     93   
     94    public ArrayList<String> filesMd5 = new ArrayList<String>();
     95
     96    public void writeFileMD5(ModelicaLogger log) {
     97        for (String fileMd5 : filesMd5) {
     98            log.debug(fileMd5);
     99        }
     100    }
     101
     102    public void createFileMD5(Reader file, String fileName, ModelicaLogger log) throws IOException {
     103        MessageDigest md5;
     104        try {
     105            md5 = MessageDigest.getInstance("MD5");
     106        } catch (NoSuchAlgorithmException e) {
     107            return;
     108        }
     109
     110        try (final BufferedReader reader = new BufferedReader(file)) {
     111            String line = reader.readLine();
     112            while (line != null) {
     113                // A naive implementation that is expected to create a digest different from what a command
     114                // line tool would create. No lines breaks are included in the digest, and no
     115                // character encodings are specified.
     116                md5.update(line.getBytes(Charset.forName("UTF-8")));
     117                line = reader.readLine();
     118            }
     119        }
     120       
     121        String Value = new BigInteger(1,md5.digest()).toString(16);
     122        filesMd5.add("Generated file "+ fileName + " with checksum " + Value);
    87123    }
    88124
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/util/annotations/GenericAnnotationNode.java

    r13009 r14024  
    2525import java.util.Map;
    2626
     27import org.jmodelica.common.URIResolver;
    2728import org.jmodelica.common.URIResolver.URIException;
    2829import org.jmodelica.util.Criteria;
    29 import org.jmodelica.util.annotations.AnnotationProvider.SubAnnotationPair;
    3030import org.jmodelica.util.collections.FilteredIterable;
    3131import org.jmodelica.util.values.ConstValue;
     
    5555     */
    5656    public static final String VENDOR_NAME = "__Modelon";
    57 
    58     private String name;
    59     private N node;
    60     private final T parent;
    61 
    62     private volatile Collection<T> subNodes_cache;
    63     private volatile Map<String, T> subNodesNameMap_cache;
    64     private volatile boolean nodeWasSet = false;
    65     private volatile boolean subNodeNodeWasSet = false;
    66     private volatile T valueAnnotation_cache;
    67     private volatile boolean valueAnnotation_cacheComputed = false;
    68 
    69     /**
    70      * Constructor. <code>name</code> may be null, some nodes simply do not have a name.
     57    private final AnnotationStateManager state;
     58
     59    /**
     60     * Constructor to create an ambiguous annotation node.<br>
     61     * An ambiguous node created with this constructor is immutable.
     62     * That is, calling a state changing method on an unambiguous will not have any effect.
     63     * No state change will occur nor will any exception be thrown.
     64     */
     65    protected GenericAnnotationNode() {
     66        state = new AmbiguousAnnotationStateManager();
     67    }
     68
     69    /**
     70     * Constructor to create an unambiguous annotation node.<br>
     71     * <code>name</code> may be null, some nodes simply do not have a name.<br>
    7172     * <code>node</code> may only be null for the instances returned by
    7273     * {@link #ambiguousNode()} and nodes which don't exist yet.
    73      * 
     74     *
    7475     * @param name Name of the node, optionally null.
    7576     * @param node The node that this annotation node represent.
     77     * @param parent The parent of the node
     78     * @param ambiguous The ambiguity of the node.
    7679     */
    7780    protected GenericAnnotationNode(String name, N node, T parent) {
    78         this.parent = parent;
    79         setNode(name, node);
    80     }
    81 
    82    
    83     /**
     81        state = new MutableAnnotationStateManager(name, node, parent);
     82    }
     83
     84    /**
    8485     * This is an internal method, do not call it.
    8586     */
    8687    private void computeSubNodesCache() {
    87         if (isSubNodesCacheFresh()) {
    88             return;
    89         }
    90         if (subNodes_cache == null) {
    91             subNodes_cache = Collections.emptyList();
    92         }
    93         if (subNodesNameMap_cache == null) {
    94             subNodesNameMap_cache = Collections.emptyMap();
    95         }
    96 
    97         if(!nodeExists() || isAmbiguous()) {
    98             return;
    99         }
    100 
    101         List<T> subNodes = new ArrayList<T>();
    102         Map<String, List<T>> oldNodesMap = constructMapIncludingAmbiguous(subNodes_cache);
    103         Map<String, T> subNodesNameMap = new HashMap<String, T>();
    104         for (SubAnnotationPair<N> subNodePair : node.annotationSubNodes()) {
    105             String subNodeName = subNodePair.getAnnotationName();
    106             N subNodeNode = subNodePair.getAnnotationValue();
    107             T subNode = null;
    108            
    109             List<T> oldNodes = oldNodesMap.get(subNodeName);
    110             if (oldNodes != null) {
    111                 subNode = oldNodes.remove(0);
    112                 if (oldNodes.isEmpty()) {
    113                     oldNodesMap.remove(subNodeName);
    114                 }
    115             }
    116             createOrSetSubNodeAndAddToCaches(subNode, subNodeName, subNodeNode, subNodes, subNodesNameMap);
    117         }
    118 
    119         for(List<T> oldNodes : oldNodesMap.values()) {
    120             for(T oldNode: oldNodes) {
    121                 //TODO move the setting of the node field in the subnode to null to an explicit step
    122                 createOrSetSubNodeAndAddToCaches(oldNode, oldNode.name(), null, subNodes, subNodesNameMap);
    123             }
    124         }
    125         subNodes_cache = subNodes;
    126         subNodesNameMap_cache = subNodesNameMap;
    127         clearNodeWasSetFlags();
    128     }
    129 
    130     private T createOrSetSubNodeAndAddToCaches(T subNode, String subNodeName, N subNodeNode, Collection<T> subNodes, Map<String, T> subNodesNameMap) {
    131         if (subNode == null) {
    132             subNode = createNode(subNodeName, subNodeNode);
    133         } else {
    134             asGeneric(subNode).setNode(subNodeName, subNodeNode);
    135         }
    136         if (subNode != null) {
    137             addToCaches(subNodes, subNodesNameMap, subNode);
    138         }
    139         return subNode;
    140     }
    141 
    142     private void addToCaches(Collection<T> subNodes, Map<String, T> subNodesNameMap, T subNode) {
    143         subNodes.add(subNode);
    144         updateSubNodesNameMapCache(subNodesNameMap, subNode);
    145     }
    146 
    147     private void updateSubNodesNameMapCache(Map<String, T> subNodesNameMap, T subNode) {
    148         T previous = subNodesNameMap.put(subNode.name(), subNode);
    149         if (previous != null && previous.hasNode() && subNode.hasNode()) { // subNode goes from not ambiguous to ambiguous
    150             subNodesNameMap.put(subNode.name(), ambiguousNode());
    151         }
    152     }
    153 
    154     private T removeFromSubNodesNameMapCache(T subNode, Collection<T> subNodes, Map<String, T> subNodesNameMap) {
    155         T previous = subNodesNameMap.get(subNode.name());
    156         if (previous != null) {
    157             if (previous == ambiguousNode()) {
    158                 Map<String, List<T>> oldNodesMap = constructMapIncludingAmbiguous(filterExists(subNodes));
    159                 List<T> oldNodes = oldNodesMap.get(subNode.name());
    160                 if(oldNodes.size() == 2) { // subNode goes from ambiguous to not ambiguous
    161                     oldNodes.remove(subNode);
    162                     subNodesNameMap.put(subNode.name(), oldNodes.get(0));
    163                 }
    164             } else {
    165                 subNodesNameMap.remove(subNode.name());
    166             }
    167         }
    168         return previous;
    169     }
    170 
    171     /**
    172      * Computes a map that maps between name and node, the list is needed since
    173      * there may be multiple nodes with the same name, if that is the case,
    174      * then they are put in the list in the order that they are found!
    175      */
    176     private Map<String, List<T>> constructMapIncludingAmbiguous(Iterable<T> nodes) {
    177         if (nodes == null) {
    178             return Collections.emptyMap();
    179         }
    180         Map<String, List<T>> res = new LinkedHashMap<String, List<T>>();
    181         for (T node : nodes) {
    182             String name = node.name();
    183             List<T> withSameName = res.get(name);
    184             if (withSameName == null) {
    185                 withSameName = new ArrayList<T>(Collections.singletonList(node));
    186                 res.put(name, withSameName);
    187             } else if (withSameName.size() == 1) {
    188                 withSameName = new ArrayList<T>(withSameName);
    189                 withSameName.add(node);
    190                 res.put(name, withSameName);
    191             } else {
    192                 withSameName.add(node);
    193             }
    194         }
    195         return res;
     88        state.computeSubNodesCache();
     89    }
     90
     91    protected boolean isSubNodesCacheFresh() {
     92        return state.isSubNodesCacheFresh();
     93    }
     94
     95    protected boolean hasSubNodesCache() {
     96        return state.hasSubNodesCache();
     97    }
     98    /**
     99     * Sets the name and node of this GenericAnnotationNode. This is an internal method,
     100     * call {{@link #updateNode(String, AnnotationProvider)} instead.
     101     * @param newName The new name
     102     * @param node The new node
     103     */
     104    private void setNode(String newName, N node) {
     105        state.setNode(newName, node);
     106    }
     107
     108    private void setSubNodeNodeWasSet() {
     109        state.setSubNodeNodeWasSet();
    196110    }
    197111
     
    204118     */
    205119    private void updateSubNode(String newName, N newNode, T subNode) {
    206         removeFromSubNodesNameMapCache(subNode, subNodes_cache, subNodesNameMap_cache);
    207         asGeneric(subNode).setNode(newName, newNode);
    208         updateSubNodesNameMapCache(subNodesNameMap_cache, subNode);
    209     }
    210 
    211     protected boolean isSubNodesCacheFresh() {
    212         return !nodeWasSet && !subNodeNodeWasSet;
    213     }
    214 
    215     protected boolean hasSubNodesCache() {
    216         return subNodes_cache != null;
     120        state.updateSubNode(newName, newNode, subNode);
     121    }
     122
     123    private N createNodeForChild(GenericAnnotationNode<T, N, V> child) throws AnnotationEditException {
     124        return state.createNodeForChild(child);
    217125    }
    218126
     
    229137
    230138    T forPath(String[] paths, int currentIndex) {
    231         if (isAmbiguous()) {
    232             return ambiguousNode();
    233         }
    234         if (currentIndex == paths.length) {
    235             return self();
    236         }
    237         computeSubNodesCache();
    238         T subNode = subNodesNameMap_cache.get(paths[currentIndex]);
    239         if (subNode == null) {
    240             makeEmptySubNodesCacheMutable();
    241             subNode = createOrSetSubNodeAndAddToCaches(subNode, paths[currentIndex], null, subNodes_cache,
    242                     subNodesNameMap_cache);
    243         }
    244         return subNode.forPath(paths, currentIndex + 1);
    245     }
    246 
    247     private void makeEmptySubNodesCacheMutable() {
    248         if (subNodesNameMap_cache.isEmpty()) {
    249             subNodesNameMap_cache = new HashMap<String, T>();
    250         }
    251         if (subNodes_cache.isEmpty()) {
    252             subNodes_cache = new ArrayList<T>();
    253         }
    254     }
    255    
     139        return state.forPath(paths, currentIndex);
     140    }
     141
    256142    /**
    257143     * Returns reference to it self, but with correct type! This pattern
     
    282168     */
    283169    protected abstract T createNode(N node);
    284    
    285     private N createNodeForChild(GenericAnnotationNode<T, N, V> child) throws AnnotationEditException {
    286         if (child == valueAnnotation_cache) {
    287             // Trying to set the value annotation child
    288             throw new AnnotationEditException(this, "Not possible to set assign annotation value as annotation yet");
    289         }
    290         N res = node().addAnnotationSubNode(child.name());
    291         if (res == null) {
    292             throw new AnnotationEditException(child, "Unable to create sub node");
    293         }
    294         return res;
    295     }
    296 
    297     /**
    298      * Method for checking if this node has sub-nodes.
    299      *
    300      * @return true if this node has sub nodes, otherwise false.
    301      */
    302     public boolean hasSubNodes() {
    303         computeSubNodesCache();
    304         return !subNodes_cache.isEmpty();
    305     }
    306170
    307171    /**
     
    311175     */
    312176    public Iterable<T> subNodes() {
    313         computeSubNodesCache();
    314         return filterExists(subNodes_cache);
    315     }
    316 
    317     private Iterable<T> filterExists(Iterable<T> nodes) {
    318         return new FilteredIterable<T>(nodes, new Criteria<T>() {
    319 
    320             @Override
    321             public boolean test(T elem) {
    322                 return elem.nodeExists();
    323             }
    324 
    325         });
     177        return state.subNodes();
    326178    }
    327179
     
    333185     */
    334186    public N node() throws AnnotationEditException {
    335         if (!hasNode()) {
    336             if (parent == null) {
    337                 // This is a null pattern node without hope of creating
    338                 return null;
    339             }
    340             N node = asGeneric(parent()).createNodeForChild(this);
    341             updateNode(name(), node);
    342         }
    343         return node;
     187        return state.node();
    344188    }
    345189
     
    352196     */
    353197    protected N peekNode() {
    354         return node;
     198        return state.peekNode();
    355199    }
    356200
     
    362206     */
    363207    public String resolveURI(String str) throws URIException {
    364         if (node == null) {
    365             if (parent == null) {
    366                 return null; // We did our best, we cant do more
    367             }
    368             return parent.resolveURI(str);
    369         }
    370         return node.resolveURI(str);
     208        return state.resolveURI(str);
    371209    }
    372210   
     
    376214     */
    377215    public String name() {
    378         return name;
    379     }
    380    
     216        return state.name();
     217    }
     218
    381219    /**
    382220     * Updates the name and node of this GenericAnnotationNode.
     
    384222     * @param node The new node
    385223     */
    386     @SuppressWarnings("unchecked")
    387224    protected void updateNode(String newName, N node) {
    388         if (parent() != null && !name().equals(newName)) {
    389             asGeneric(parent()).updateSubNode(newName, node, (T) this);
    390         } else {
    391             setNode(newName, node);
    392         }
    393     }
    394     /**
    395      * Sets the name and node of this GenericAnnotationNode. This is an internal method,
    396      * call {{@link #updateNode(String, AnnotationProvider)} instead.
    397      * @param newName The new name
    398      * @param node The new node
    399      */
    400     private void setNode(String newName, N node) {
    401         // This is an internal method because it does not update the caches in the parent node.
    402         // it needs to be protected to be accessible from the parent node.
    403         disconnectFromNode();
    404         this.name = newName;
    405         this.node = node;
    406         setNodeWasSetFlags();
    407     }
    408 
    409     /**
    410      *
     225       state.updateNode(newName, node);
     226    }
     227
     228    /**
     229     *
    411230     * @return true if this node has a value, otherwise false
    412231     */
     
    420239     */
    421240    public V value() {
    422         if (!nodeExists() || isAmbiguous()) {
    423             return null;
    424         }
    425         return node().annotationValue();
     241        return state.value();
    426242    }
    427243
     
    435251     */
    436252    public void setValue(V newValue) throws AnnotationEditException {
    437         try {
    438             node().setAnnotationValue(newValue);
    439         } catch (FailedToSetAnnotationValueException e) {
    440             throw new AnnotationEditException(this, e);
    441         }
     253        state.setValue(newValue);
    442254    }
    443255
     
    450262     */
    451263    public T valueAsAnnotation() {
    452         if (!valueAnnotation_cacheComputed) {
    453             valueAnnotation_cacheComputed = true;
    454             if (isAmbiguous()) {
    455                 valueAnnotation_cache = ambiguousNode();
    456             } else if (nodeExists()) {
    457                 N annotationNode = valueAsProvider();
    458                 if (hasValue() && annotationNode == null) {
    459                     valueAnnotation_cache = null;
    460                 } else {
    461                     valueAnnotation_cache = createNode(annotationNode);
    462                 }
    463             } else {
    464                 valueAnnotation_cache = null;
    465             }
    466         }
    467         return valueAnnotation_cache;
     264        return state.valueAsAnnotation();
    468265    }
    469266
     
    473270     * annotation node.
    474271     *
    475      * @param value Value which can be an annotation node
    476272     * @return Provider which reflects the value as annotation node
    477273     */
     
    482278        StringBuilder sb = new StringBuilder();
    483279        try {
    484             toString(sb);
     280            state.toString(sb);
    485281        } catch (IOException e) {
    486282            // Not possible, sb.append() does not throw IOException...
     
    490286
    491287    public void toString(Appendable out) throws IOException {
    492         if (name() != null) {
    493             out.append(name());
    494         }
    495         if (hasSubNodes()) {
    496             boolean first = true;
    497             for (T subNode : subNodes()) {
    498                 if (first) {
    499                     out.append('(');
    500                 }
    501                 if (!first) {
    502                     out.append(", ");
    503                 }
    504                 first = false;
    505                 subNode.toString(out);
    506             }
    507             if (!first) {
    508                 out.append(')');
    509             }
    510         }
    511         if (hasValue()) {
    512             out.append('=');
    513             out.append(value().toString());
    514         }
     288        state.toString(out);
    515289    }
    516290
     
    524298
    525299    /**
    526      * This is an internal method, call {{@link #exists()} instead.
     300     * This is an internal method, call {{@link #nodeExists()} instead.
    527301     * @return true if this node is available.
    528302     */
    529303    protected boolean hasNode() {
    530         return isAmbiguous() || node != null;
     304        return state.hasNode();
    531305    }
    532306
     
    536310     */
    537311    public boolean nodeExists() {
    538         if (parent() != null) {
    539             asGeneric(parent()).computeSubNodesCache();
    540         }
    541         return hasNode();
     312        return state.nodeExists();
    542313    }
    543314
     
    556327     */
    557328    public boolean isEach() {
    558         return node().isEach();
     329        return state.isEach();
    559330    }
    560331
     
    565336     */
    566337    public boolean isFinal() {
    567         return node().isFinal();
     338        return state.isFinal();
    568339    }
    569340
     
    574345     */
    575346    protected T parent() {
    576         return parent;
     347        return state.parent();
    577348    }
    578349
     
    885656     */
    886657    protected void disconnectFromNode() {
    887         if (parent != null) {
    888             node = null;
     658        state.disconnectFromNode();
     659    }
     660
     661    public abstract class AnnotationStateManager {
     662
     663        protected abstract void computeSubNodesCache();
     664
     665        protected abstract boolean isFinal();
     666
     667        protected abstract boolean isEach();
     668
     669        protected abstract boolean isSubNodesCacheFresh();
     670
     671        protected abstract boolean hasSubNodesCache();
     672
     673        protected abstract void setNode(String newName, N node);
     674
     675        protected abstract void setSubNodeNodeWasSet();
     676
     677        protected abstract void updateSubNode(String newName, N newNode, T subNode);
     678
     679        protected abstract N createNodeForChild(GenericAnnotationNode<T,N,V> child);
     680
     681        protected abstract T forPath(String[] path, int i);
     682
     683        protected abstract Iterable<T> subNodes();
     684
     685        protected abstract N node();
     686
     687        protected abstract String resolveURI(String str) throws URIResolver.URIException ;
     688
     689        protected abstract N peekNode();
     690
     691        protected abstract String name();
     692
     693        protected abstract void disconnectFromNode();
     694
     695        protected abstract void updateNode(String newName, N node);
     696
     697        protected abstract V value();
     698
     699        protected abstract void setValue(V newValue);
     700
     701        protected abstract T valueAsAnnotation();
     702
     703        protected abstract void toString(Appendable out) throws IOException ;
     704
     705        protected abstract boolean hasNode();
     706
     707        protected abstract boolean nodeExists();
     708
     709        protected abstract T parent();
     710    }
     711
     712    public class AmbiguousAnnotationStateManager extends AnnotationStateManager {
     713
     714
     715        @Override
     716        protected void computeSubNodesCache() {
     717            // Do nothing
     718        }
     719
     720        @Override
     721        protected boolean isSubNodesCacheFresh() {
     722            return true;
     723        }
     724
     725        @Override
     726        protected boolean hasSubNodesCache() {
     727            return true;
     728        }
     729
     730        @Override
     731        protected void setNode(String newName, N node) {
     732            // Do nothing
     733        }
     734
     735        @Override
     736        protected void setSubNodeNodeWasSet() {
     737            // Do nothing
     738        }
     739
     740        @Override
     741        protected void updateSubNode(String newName, N newNode, T subNode) {
     742            // Do nothing
     743        }
     744
     745        @Override
     746        protected N createNodeForChild(GenericAnnotationNode<T, N, V> child) {
     747            return null;
     748        }
     749
     750        @Override
     751        protected T forPath(String[] path, int i) {
     752            return self();
     753        }
     754
     755        @Override
     756        protected Iterable<T> subNodes() {
     757            return Collections.emptyList();
     758        }
     759
     760        @Override
     761        protected N node() {
     762            return null;
     763        }
     764
     765        @Override
     766        protected String resolveURI(String str) throws URIException {
     767            return null;
     768        }
     769
     770        @Override
     771        protected N peekNode() {
     772            return null;
     773        }
     774
     775        @Override
     776        protected String name() {
     777            return null;
     778        }
     779
     780        @Override
     781        protected void disconnectFromNode() {
     782            // Do nothing
     783        }
     784
     785        @Override
     786        protected void updateNode(String newName, N node) {
     787            // Do nothing
     788        }
     789
     790        @Override
     791        protected V value() {
     792            return node().annotationValue();
     793        }
     794
     795        @Override
     796        protected void setValue(V newValue) {
     797            // Do nothing
     798        }
     799
     800        @Override
     801        protected T valueAsAnnotation() {
     802            return self();
     803        }
     804
     805        @Override
     806        protected void toString(Appendable out) throws IOException {
     807            // We don't have anything to append
     808        }
     809
     810        @Override
     811        protected boolean hasNode() {
     812            return true;
     813        }
     814
     815        @Override
     816        protected boolean nodeExists() {
     817            return true;
     818        }
     819
     820        @Override
     821        protected T parent() {
     822            return null;
     823        }
     824
     825        @Override
     826        protected boolean isFinal() {
     827            return false;
     828        }
     829
     830        @Override
     831        protected boolean isEach() {
     832            return false;
     833        }
     834    }
     835
     836    public class MutableAnnotationStateManager extends AnnotationStateManager {
     837
     838        private String name;
     839        private N node;
     840        private final T parent;
     841
     842        private Collection<T> subNodes_cache;
     843        private Map<String, T> subNodesNameMap_cache;
     844        private boolean nodeWasSet = false;
     845        private boolean subNodeNodeWasSet = false;
     846        private T valueAnnotation_cache;
     847        private boolean valueAnnotation_cacheComputed = false;
     848
     849        protected MutableAnnotationStateManager(String name, N node, T parent) {
     850            this.parent = parent;
     851            setNode(name, node);
     852        }
     853
     854        @Override
     855        protected void computeSubNodesCache() {
     856            if (isSubNodesCacheFresh()) {
     857                return;
     858            }
     859            if (subNodes_cache == null) {
     860                subNodes_cache = Collections.emptyList();
     861            }
     862            if (subNodesNameMap_cache == null) {
     863                subNodesNameMap_cache = Collections.emptyMap();
     864            }
     865
     866            if(!nodeExists()) {
     867                return;
     868            }
     869
     870            List<T> subNodes = new ArrayList<T>();
     871            Map<String, List<T>> oldNodesMap = constructMapIncludingAmbiguous(subNodes_cache);
     872            Map<String, T> subNodesNameMap = new HashMap<String, T>();
     873            for (AnnotationProvider.SubAnnotationPair<N> subNodePair : node.annotationSubNodes()) {
     874                String subNodeName = subNodePair.getAnnotationName();
     875                N subNodeNode = subNodePair.getAnnotationValue();
     876                T subNode = null;
     877
     878                List<T> oldNodes = oldNodesMap.get(subNodeName);
     879                if (oldNodes != null) {
     880                    subNode = oldNodes.remove(0);
     881                    if (oldNodes.isEmpty()) {
     882                        oldNodesMap.remove(subNodeName);
     883                    }
     884                }
     885                createOrSetSubNodeAndAddToCaches(subNode, subNodeName, subNodeNode, subNodes, subNodesNameMap);
     886            }
     887
     888            for(List<T> oldNodes : oldNodesMap.values()) {
     889                for(T oldNode: oldNodes) {
     890                    //TODO move the setting of the node field in the sub node to null to an explicit step
     891                    createOrSetSubNodeAndAddToCaches(oldNode, oldNode.name(), null, subNodes, subNodesNameMap);
     892                }
     893            }
     894            subNodes_cache = subNodes;
     895            subNodesNameMap_cache = subNodesNameMap;
     896            clearNodeWasSetFlags();
     897        }
     898
     899        private T createOrSetSubNodeAndAddToCaches(T subNode, String subNodeName, N subNodeNode, Collection<T> subNodes, Map<String, T> subNodesNameMap) {
     900            if (subNode == null) {
     901                subNode = createNode(subNodeName, subNodeNode);
     902            } else {
     903                asGeneric(subNode).setNode(subNodeName, subNodeNode);
     904            }
     905            if (subNode != null) {
     906                addToCaches(subNodes, subNodesNameMap, subNode);
     907            }
     908            return subNode;
     909        }
     910
     911        private void addToCaches(Collection<T> subNodes, Map<String, T> subNodesNameMap, T subNode) {
     912            subNodes.add(subNode);
     913            updateSubNodesNameMapCache(subNodesNameMap, subNode);
     914        }
     915
     916        private void updateSubNodesNameMapCache(Map<String, T> subNodesNameMap, T subNode) {
     917            T previous = subNodesNameMap.put(subNode.name(), subNode);
     918            if (previous != null && previous.hasNode() && subNode.hasNode()) { // subNode goes from not ambiguous to ambiguous
     919                subNodesNameMap.put(subNode.name(), ambiguousNode());
     920            }
     921        }
     922
     923        private T removeFromSubNodesNameMapCache(T subNode, Collection<T> subNodes, Map<String, T> subNodesNameMap) {
     924            T previous = subNodesNameMap.get(subNode.name());
     925            if (previous != null) {
     926                if (previous == ambiguousNode()) {
     927                    Map<String, List<T>> oldNodesMap = constructMapIncludingAmbiguous(filterExists(subNodes));
     928                    List<T> oldNodes = oldNodesMap.get(subNode.name());
     929                    if(oldNodes.size() == 2) { // subNode goes from ambiguous to not ambiguous
     930                        oldNodes.remove(subNode);
     931                        subNodesNameMap.put(subNode.name(), oldNodes.get(0));
     932                    }
     933                } else {
     934                    subNodesNameMap.remove(subNode.name());
     935                }
     936            }
     937            return previous;
     938        }
     939
     940        /**
     941         * Computes a map that maps between name and node, the list is needed since
     942         * there may be multiple nodes with the same name, if that is the case,
     943         * then they are put in the list in the order that they are found!
     944         */
     945        private Map<String, List<T>> constructMapIncludingAmbiguous(Iterable<T> nodes) {
     946            if (nodes == null) {
     947                return Collections.emptyMap();
     948            }
     949            Map<String, List<T>> res = new LinkedHashMap<String, List<T>>();
     950            for (T node : nodes) {
     951                String name = node.name();
     952                List<T> withSameName = res.get(name);
     953                if (withSameName == null) {
     954                    withSameName = new ArrayList<T>(Collections.singletonList(node));
     955                    res.put(name, withSameName);
     956                } else if (withSameName.size() == 1) {
     957                    withSameName = new ArrayList<T>(withSameName);
     958                    withSameName.add(node);
     959                    res.put(name, withSameName);
     960                } else {
     961                    withSameName.add(node);
     962                }
     963            }
     964            return res;
     965        }
     966
     967        @Override
     968        protected void updateSubNode(String newName, N newNode, T subNode) {
     969            removeFromSubNodesNameMapCache(subNode, subNodes_cache, subNodesNameMap_cache);
     970            asGeneric(subNode).setNode(newName, newNode);
     971            updateSubNodesNameMapCache(subNodesNameMap_cache, subNode);
     972        }
     973
     974        @Override
     975        protected boolean isSubNodesCacheFresh() {
     976            return !nodeWasSet && !subNodeNodeWasSet;
     977        }
     978
     979        @Override
     980        protected boolean hasSubNodesCache() {
     981            return subNodes_cache != null;
     982        }
     983
     984        @Override
     985        protected T forPath(String[] paths, int currentIndex) {
     986            if (currentIndex == paths.length) {
     987                return self();
     988            }
     989            computeSubNodesCache();
     990            T subNode = subNodesNameMap_cache.get(paths[currentIndex]);
     991            if (subNode == null) {
     992                makeEmptySubNodesCacheMutable();
     993                subNode = createOrSetSubNodeAndAddToCaches(subNode, paths[currentIndex], null, subNodes_cache,
     994                        subNodesNameMap_cache);
     995            }
     996            return subNode.forPath(paths, currentIndex + 1);
     997        }
     998
     999        private void makeEmptySubNodesCacheMutable() {
     1000            if (subNodesNameMap_cache.isEmpty()) {
     1001                subNodesNameMap_cache = new HashMap<String, T>();
     1002            }
     1003            if (subNodes_cache.isEmpty()) {
     1004                subNodes_cache = new ArrayList<T>();
     1005            }
     1006        }
     1007
     1008        @Override
     1009        protected N createNodeForChild(GenericAnnotationNode<T, N, V> child) throws AnnotationEditException {
     1010            if (child == valueAnnotation_cache) {
     1011                // Trying to set the value annotation child
     1012                throw new AnnotationEditException(GenericAnnotationNode.this, "Not possible to set assign annotation value as annotation yet");
     1013            }
     1014            N res = node().addAnnotationSubNode(child.name());
     1015            if (res == null) {
     1016                throw new AnnotationEditException(child, "Unable to create sub node");
     1017            }
     1018            return res;
     1019        }
     1020
     1021        private boolean hasSubNodes() {
     1022            computeSubNodesCache();
     1023            return !subNodes_cache.isEmpty();
     1024        }
     1025
     1026        @Override
     1027        protected Iterable<T> subNodes() {
     1028            computeSubNodesCache();
     1029            return filterExists(subNodes_cache);
     1030        }
     1031
     1032        private Iterable<T> filterExists(Iterable<T> nodes) {
     1033            return new FilteredIterable<T>(nodes, new Criteria<T>() {
     1034
     1035                @Override
     1036                public boolean test(T elem) {
     1037                    return elem.nodeExists();
     1038                }
     1039
     1040            });
     1041        }
     1042
     1043        @Override
     1044        protected N node() throws AnnotationEditException {
     1045            if (!hasNode()) {
     1046                if (parent == null) {
     1047                    // This is a null pattern node without hope of creating
     1048                    return null;
     1049                }
     1050                N node = asGeneric(parent()).createNodeForChild(GenericAnnotationNode.this);
     1051                updateNode(name(), node);
     1052            }
     1053            return node;
     1054        }
     1055
     1056        @Override
     1057        protected N peekNode() {
     1058            return node;
     1059        }
     1060
     1061        @Override
     1062        protected String resolveURI(String str) throws URIResolver.URIException {
     1063            if (node == null) {
     1064                if (parent == null) {
     1065                    return null; // We did our best, we cant do more
     1066                }
     1067                return parent.resolveURI(str);
     1068            }
     1069            return node.resolveURI(str);
     1070        }
     1071
     1072        @Override
     1073        protected String name() {
     1074            return name;
     1075        }
     1076
     1077        @SuppressWarnings("unchecked")
     1078        @Override
     1079        protected void updateNode(String newName, N node) {
     1080            if (parent() != null && !name().equals(newName)) {
     1081                asGeneric(parent()).updateSubNode(newName, node, (T) GenericAnnotationNode.this);
     1082            } else {
     1083                setNode(newName, node);
     1084            }
     1085        }
     1086
     1087        @Override
     1088        protected void setNode(String newName, N node) {
     1089            // This is an internal method because it does not update the caches in the parent node.
     1090            // it needs to be protected to be accessible from the parent node.
     1091            disconnectFromNode();
     1092            this.name = newName;
     1093            this.node = node;
    8891094            setNodeWasSetFlags();
    8901095        }
    891         if (subNodes_cache != null) {
    892             for (T t : subNodes_cache) {
    893                 t.disconnectFromNode();
    894             }
    895         }
    896     }
    897 
    898     private void setNodeWasSetFlags() {
    899         nodeWasSet = true;
    900         if (parent() != null) {
    901             asGeneric(parent()).setSubNodeNodeWasSet();
    902         }
    903     }
    904 
    905     private void setSubNodeNodeWasSet() {
    906         subNodeNodeWasSet = true;
    907     }
    908 
    909     private void clearNodeWasSetFlags() {
    910         nodeWasSet = false;
    911         subNodeNodeWasSet = false;
     1096
     1097        @Override
     1098        protected V value() {
     1099            if (!nodeExists()) {
     1100                return null;
     1101            }
     1102            return node().annotationValue();
     1103        }
     1104
     1105        @Override
     1106        protected void setValue(V newValue) throws AnnotationEditException {
     1107            try {
     1108                node().setAnnotationValue(newValue);
     1109            } catch (FailedToSetAnnotationValueException e) {
     1110                throw new AnnotationEditException(GenericAnnotationNode.this, e);
     1111            }
     1112        }
     1113
     1114        @Override
     1115        protected T valueAsAnnotation() {
     1116            if (!valueAnnotation_cacheComputed) {
     1117                valueAnnotation_cacheComputed = true;
     1118                if (nodeExists()) {
     1119                    N annotationNode = valueAsProvider();
     1120                    if (hasValue() && annotationNode == null) {
     1121                        valueAnnotation_cache = null;
     1122                    } else {
     1123                        valueAnnotation_cache = createNode(annotationNode);
     1124                    }
     1125                } else {
     1126                    valueAnnotation_cache = null;
     1127                }
     1128            }
     1129            return valueAnnotation_cache;
     1130        }
     1131
     1132        @Override
     1133        protected void toString(Appendable out) throws IOException {
     1134            if (name() != null) {
     1135                out.append(name());
     1136            }
     1137            if (hasSubNodes()) {
     1138                boolean first = true;
     1139                for (T subNode : subNodes()) {
     1140                    if (first) {
     1141                        out.append('(');
     1142                    }
     1143                    if (!first) {
     1144                        out.append(", ");
     1145                    }
     1146                    first = false;
     1147                    subNode.toString(out);
     1148                }
     1149                if (!first) {
     1150                    out.append(')');
     1151                }
     1152            }
     1153            if (hasValue()) {
     1154                out.append('=');
     1155                out.append(value().toString());
     1156            }
     1157        }
     1158
     1159        @Override
     1160        protected boolean hasNode() {
     1161            return node != null;
     1162        }
     1163
     1164        @Override
     1165        protected boolean nodeExists() {
     1166            if (parent() != null) {
     1167                asGeneric(parent()).computeSubNodesCache();
     1168            }
     1169            return hasNode();
     1170        }
     1171
     1172        @Override
     1173        protected T parent() {
     1174            return parent;
     1175        }
     1176
     1177        @Override
     1178        protected void disconnectFromNode() {
     1179            if (parent != null) {
     1180                node = null;
     1181                setNodeWasSetFlags();
     1182            }
     1183            if (subNodes_cache != null) {
     1184                for (T t : subNodes_cache) {
     1185                    t.disconnectFromNode();
     1186                }
     1187            }
     1188        }
     1189
     1190        private void setNodeWasSetFlags() {
     1191            nodeWasSet = true;
     1192            if (parent() != null) {
     1193                asGeneric(parent()).setSubNodeNodeWasSet();
     1194            }
     1195        }
     1196
     1197        @Override
     1198        protected void setSubNodeNodeWasSet() {
     1199            subNodeNodeWasSet = true;
     1200        }
     1201
     1202        private void clearNodeWasSetFlags() {
     1203            nodeWasSet = false;
     1204            subNodeNodeWasSet = false;
     1205        }
     1206
     1207        @Override
     1208        protected boolean isFinal() {
     1209            return node.isFinal();
     1210        }
     1211
     1212        @Override
     1213        protected boolean isEach() {
     1214            return node.isEach();
     1215        }
     1216
    9121217    }
    9131218
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/util/problemHandling/SimpleErrorProducer.java

    r9003 r14024  
    66/**
    77 * If you have a error message which only consists of a string and format
    8  * arguments, then this is the right class for you. Simple create a static
     8 * arguments, then this is the right class for you. Simply create a static
    99 * final field instantiating this class and then invoke the error as needed!
    1010 */
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/util/problemHandling/SimpleWarningProducer.java

    r9003 r14024  
    55
    66/**
    7  * Convenient class which takes a string message on construction, an
     7 * Convenience class which takes a string message on construction, an
    88 * optional list of format arguments when invoked and produces a warning.
    99 */
  • branches/stable/Compiler/ModelicaFrontEnd/src/java/org/jmodelica/util/values/ConstantEvaluationException.java

    r9590 r14024  
    1414    public ConstantEvaluationException() {
    1515        super("Unspecified constant evaluation failure");
     16        this.val = null;
     17    }
     18
     19    public ConstantEvaluationException(String msg) {
     20        super(msg);
     21        this.val = null;
     22    }
     23
     24    public ConstantEvaluationException(String msg, Throwable cause) {
     25        super(msg, cause);
    1626        this.val = null;
    1727    }
  • branches/stable/Compiler/ModelicaFrontEnd/src/parser/Modelica.parser

    r13404 r14024  
    2323%goal access_scalar;
    2424%goal subscript;
     25%goal function_call_list;
    2526
    2627%header {:
     
    4142
    4243%embed {:
    43 
    4444    /**
    4545     * Error reporting class that creates an error message and delegates reporting the
     
    17001700    :}
    17011701    ;
     1702
     1703//Extension
     1704List function_calls_stmt =
     1705    function_call SEMICOLON                   {: return new List().add(function_call); :}
     1706  | function_calls_stmt function_call SEMICOLON    {: return function_calls_stmt.add(function_call); :}
     1707  ;
     1708
     1709List function_calls_vector =
     1710    function_call                              {: return new List().add(function_call); :}
     1711  | function_calls_vector COMMA function_call  {: return function_calls_vector.add(function_call); :}
     1712  ;
     1713
     1714SrcFunctionCallList function_call_list
     1715    = LBRACE function_calls_vector RBRACE
     1716    {:
     1717        return new SrcFunctionCallList(function_calls_vector);
     1718    :}
     1719    | function_calls_stmt
     1720    {:
     1721        return new SrcFunctionCallList(function_calls_stmt);
     1722    :}
     1723    ;
  • branches/stable/Compiler/ModelicaFrontEnd/src/parser/Modelica_header.beaver

    r5961 r14024  
    2323%left MULT, DIV;
    2424%left PLUS, MINUS;
    25 
  • branches/stable/Compiler/ModelicaFrontEnd/test/junit/org/jmodelica/test/common/GUIDManagerTest.java

    r13771 r14024  
    33import static org.junit.Assert.assertEquals;
    44import static org.junit.Assert.assertFalse;
     5import static org.junit.Assert.assertNull;
    56import static org.junit.Assert.assertTrue;
    67
    78import java.io.ByteArrayOutputStream;
     9import java.io.FileReader;
     10import java.io.IOException;
     11import java.io.StringReader;
    812
    913import org.jmodelica.common.GUIDManager;
     14import org.jmodelica.util.logging.Level;
    1015import org.junit.Before;
    1116import org.junit.Test;
     
    117122        assertEquals(ignoreWhitespace(expected), ignoreWhitespace(actual));
    118123    }
     124   
     125    @Test
     126    public void checksumOfFilesOnlyWrittenAtDebug() {
     127        TestLogger log = new TestLogger(Level.VERBOSE);
     128        guidManager.filesMd5.add("DummyHash");
     129        guidManager.writeFileMD5(log);
     130        assertNull(log.next());
     131       
     132        log = new TestLogger(Level.DEBUG);
     133        guidManager.filesMd5.add("DummyHash");
     134        guidManager.writeFileMD5(log);
     135        assertEquals("DEBUG: DummyHash", log.next());
     136    }
    119137
     138    @Test
     139    public void checksumFiles() throws IOException {
     140        TestLogger log = new TestLogger(Level.VERBOSE);
     141        String dummyFile = "This is a dummy c-file /n c-stuff";
     142        StringReader reader = new StringReader(dummyFile);
     143        guidManager.createFileMD5(reader, "dummyfile.c", log);
     144        guidManager.writeFileMD5(log);
     145        assertNull(log.next());
     146       
     147        reader = new StringReader(dummyFile);
     148        log = new TestLogger(Level.DEBUG);
     149        guidManager.createFileMD5(reader, "dummyfile.c", log);
     150        guidManager.writeFileMD5(log);
     151        assertEquals("DEBUG: Generated file dummyfile.c with checksum fcde3f483c06e4a10bc5b28ec56214f8", log.next());
     152    }
    120153}
  • branches/stable/Compiler/ModelicaFrontEnd/test/junit/org/jmodelica/util/annotations/mock/DummyAnnotationNode.java

    r13009 r14024  
    11package org.jmodelica.util.annotations.mock;
    22
     3import org.jmodelica.util.annotations.AnnotationProvider;
    34import org.jmodelica.util.annotations.GenericAnnotationNode;
    45import org.jmodelica.util.values.Evaluable;
     
    67public class DummyAnnotationNode extends GenericAnnotationNode<DummyAnnotationNode, DummyAnnotProvider, Evaluable> {
    78
    8     private static DummyAnnotationNode ambiguousNode = new DummyAnnotationNode("Ambiguous", null, null);
     9    private static DummyAnnotationNode ambiguousNode = new DummyAnnotationNode();
     10
     11    /** Creates an unambiguous dummy annotation.
     12     * See {@link GenericAnnotationNode#GenericAnnotationNode(String, AnnotationProvider, GenericAnnotationNode)}
     13     */
    914    public DummyAnnotationNode(String name, DummyAnnotProvider node, DummyAnnotationNode parent) {
    1015        super(name, node, parent);
     16    }
     17
     18    /** Creates an ambiguous dummy annotation.
     19     * See {@link GenericAnnotationNode#GenericAnnotationNode()}
     20     */
     21    public DummyAnnotationNode() {
     22        super();
    1123    }
    1224
  • branches/stable/Compiler/ModelicaFrontEnd/test/modelica/CheckTests.mo

    r12580 r14024  
    174174    parameter Boolean b = false;
    175175
    176     annotation(__JModelica(UnitTesting(tests={
    177         FlatteningTestCase(
    178             name="ConditionalError2",
    179             description="Check that inactive conditional components aren't error checked in compile mode",
    180             flatModel="
     176annotation(__JModelica(UnitTesting(tests={
     177    FlatteningTestCase(
     178        name="ConditionalError2",
     179        description="Check that inactive conditional components aren't error checked in compile mode",
     180        flatModel="
    181181fclass CheckTests.ConditionalError2
    182  parameter Boolean b = false /* false */;
     182 structural parameter Boolean b = false /* false */;
    183183end CheckTests.ConditionalError2;
    184184")})));
     
    203203    parameter Boolean b = false;
    204204
    205     annotation(__JModelica(UnitTesting(tests={
    206         FlatteningTestCase(
    207             name="ConditionalError3",
    208             description="Check that inactive conditional components aren't searched for used functions and enums when flattening in compile mode",
    209             flatModel="
     205annotation(__JModelica(UnitTesting(tests={
     206    FlatteningTestCase(
     207        name="ConditionalError3",
     208        description="Check that inactive conditional components aren't searched for used functions and enums when flattening in compile mode",
     209        flatModel="
    210210fclass CheckTests.ConditionalError3
    211  parameter Boolean b = false /* false */;
     211 structural parameter Boolean b = false /* false */;
    212212end CheckTests.ConditionalError3;
    213213")})));
  • branches/stable/Compiler/ModelicaFrontEnd/test/modelica/ComplianceTests.mo

    r11639 r14024  
    527527
    528528model StringOperator1
     529    function f
     530        input Real x;
     531        input String f;
     532        output String o;
     533    algorithm
     534        o := String(x, format=f);
     535    end f;
     536   
    529537    Integer len = if time < 0 then 4 else 3;
    530538    Integer digits = if time < 0 then 5 else 2;
     539    String s1 = String(time, format = fmt1);
     540    String s2 = String(time, format = fmt2);
     541    String s3 = f(time, "g");
     542    parameter String fmt1 = if selFmt1 == 1 then "u" else "g";
     543    parameter String fmt2 = "f";
     544    parameter Integer selFmt1(fixed = false);
     545initial equation
     546    selFmt1 = if len == 4 then 1 else 2;
    531547equation
    532548    assert(time>2.0, String(time, significantDigits=digits, minimumLength=len, leftJustified=time<1));
    533     annotation(__JModelica(UnitTesting(tests={
    534         ComplianceErrorTestCase(
    535             name="StringOperator1",
    536             description="Test compliance warnings for non fixed string operator arguments (significantDigits, minimumLength, leftJustified)",
    537             errorMessage="
    538 3 errors found:
    539 
    540 Compliance error at line 5, column 53, in file 'Compiler/ModelicaFrontEnd/test/modelica/ComplianceTests.mo', UNSUPPORTED_NON_FIXED_STRING_ARGUMENT:
    541   significantDigits with higher than parameter variability is not supported
    542 
    543 Compliance error at line 5, column 75, in file 'Compiler/ModelicaFrontEnd/test/modelica/ComplianceTests.mo', UNSUPPORTED_NON_FIXED_STRING_ARGUMENT:
    544   minimumLength with higher than parameter variability is not supported
    545 
    546 Compliance error at line 5, column 94, in file 'Compiler/ModelicaFrontEnd/test/modelica/ComplianceTests.mo', UNSUPPORTED_NON_FIXED_STRING_ARGUMENT:
    547   leftJustified with higher than parameter variability is not supported
     549    assert(time>2.0, String(time, format=String(len)+"."+String(digits)+"f"));
     550annotation(__JModelica(UnitTesting(tests={
     551    ComplianceErrorTestCase(
     552        name="StringOperator1",
     553        description="Test compliance warnings for non fixed string operator format argument",
     554        errorMessage="
     555
     556
     557Compliance error at line 7, column 31, in file '...', UNSUPPORTED_NON_FIXED_STRING_ARGUMENT:
     558  Argument format of String operator is only supported as a fixed parameter expression.
     559
     560Compliance error at line 15, column 5, in file '...':
     561  Parameters with fixed=false can not be used as structural parameters
     562
     563Compliance error at line 22, column 42, in file '...', UNSUPPORTED_NON_FIXED_STRING_ARGUMENT:
     564  Argument format of String operator is only supported as a fixed parameter expression.
    548565")})));
    549566end StringOperator1;
    550567
     568
     569model StringOperator2
     570    String s = String(time, format="%f");
     571
     572annotation(__JModelica(UnitTesting(tests={
     573    WarningTestCase(
     574        name="StringOperator2",
     575        description="Test warning for supplying the initial % of format specifier",
     576        errorMessage="
     577
     578
     579Warning at line 2, column 16, in file '...', INVALID_FORMAT_STRING:
     580  The format string argument should not include the initial '%': \"%f\".
     581")})));
     582end StringOperator2;
    551583
    552584
  • branches/stable/Compiler/ModelicaFrontEnd/test/modelica/ConnectTests.mo

    r13504 r14024  
    31013101    connect(a.c, c);
    31023102
    3103     annotation(__JModelica(UnitTesting(tests={
    3104         FlatteningTestCase(
    3105             name="ConditionalNoErrTest6",
    3106             description="Ensure that components in conditionaly false components aren't error checked due to connections",
    3107             flatModel="
     3103annotation(__JModelica(UnitTesting(tests={
     3104    FlatteningTestCase(
     3105        name="ConditionalNoErrTest6",
     3106        description="Ensure that components in conditionaly false components aren't error checked due to connections",
     3107        flatModel="
    31083108fclass ConnectTests.ConditionalNoErrTest6
    3109  parameter Boolean on = false /* false */;
     3109 structural parameter Boolean on = false /* false */;
    31103110 Real c;
    31113111end ConnectTests.ConditionalNoErrTest6;
     
    31623162        flatModel="
    31633163fclass ConnectTests.ConditionalCompInConnector1
    3164  parameter Boolean c1.b = false /* false */;
     3164 structural parameter Boolean c1.b = false /* false */;
    31653165 potential Real c1.y;
    3166  parameter Boolean c2.b = false /* false */;
     3166 structural parameter Boolean c2.b = false /* false */;
    31673167 potential Real c2.y;
    31683168equation
  • branches/stable/Compiler/ModelicaFrontEnd/test/modelica/NameTests.mo

    r13504 r14024  
    30163016  parameter Real x = 1 if 1;
    30173017
    3018     annotation(__JModelica(UnitTesting(tests={
    3019         ErrorTestCase(
    3020             name="ConditionalComponentTest1_Err",
    3021             description="Test of type checking of conditional components.",
    3022             errorMessage="
    3023 1 errors found:
    3024 
    3025 Error at line 2, column 3, in file 'Compiler/ModelicaFrontEnd/test/modelica/NameTests.mo', NON_BOOLEAN_CONDITIONAL_GUARD:
    3026   The guard expression of a conditional component should be a boolean expression
     3018annotation(__JModelica(UnitTesting(tests={
     3019    ErrorTestCase(
     3020        name="ConditionalComponentTest1_Err",
     3021        description="Test of type checking of conditional components.",
     3022        errorMessage="
     3023
     3024
     3025Error at line 2, column 3, in file '...', NON_BOOLEAN_CONDITIONAL_GUARD:
     3026  The guard expression of a conditional component should be a scalar Boolean expression
    30273027")})));
    30283028end ConditionalComponentTest1_Err;
     
    30323032  parameter Real x = 1 if b;
    30333033
    3034     annotation(__JModelica(UnitTesting(tests={
    3035         ErrorTestCase(
    3036             name="ConditionalComponentTest2_Err",
    3037             description="Test of type checking of conditional components.",
    3038             errorMessage="
    3039 1 errors found:
    3040 
    3041 Error at line 3, column 3, in file 'Compiler/ModelicaFrontEnd/test/modelica/NameTests.mo', NON_SCALAR_CONDITIONAL_GUARD:
    3042   The guard expression of a conditional component should be a scalar expression
     3034annotation(__JModelica(UnitTesting(tests={
     3035    ErrorTestCase(
     3036        name="ConditionalComponentTest2_Err",
     3037        description="Test of type checking of conditional components.",
     3038        errorMessage="
     3039
     3040
     3041Error at line 3, column 3, in file '...', NON_BOOLEAN_CONDITIONAL_GUARD:
     3042  The guard expression of a conditional component should be a scalar Boolean expression
    30433043")})));
    30443044end ConditionalComponentTest2_Err;
     
    30483048  parameter Real x = 1 if b;
    30493049
    3050     annotation(__JModelica(UnitTesting(tests={
    3051         ErrorTestCase(
    3052             name="ConditionalComponentTest3_Err",
    3053             description="Test of type checking of conditional components.",
    3054             errorMessage="
    3055 2 errors found:
    3056 
    3057 Error at line 3, column 3, in file 'Compiler/ModelicaFrontEnd/test/modelica/NameTests.mo', NON_BOOLEAN_CONDITIONAL_GUARD:
    3058   The guard expression of a conditional component should be a boolean expression
    3059 
    3060 Error at line 3, column 3, in file 'Compiler/ModelicaFrontEnd/test/modelica/NameTests.mo', NON_SCALAR_CONDITIONAL_GUARD:
    3061   The guard expression of a conditional component should be a scalar expression
     3050annotation(__JModelica(UnitTesting(tests={
     3051    ErrorTestCase(
     3052        name="ConditionalComponentTest3_Err",
     3053        description="Test of type checking of conditional components.",
     3054        errorMessage="
     3055
     3056
     3057Error at line 3, column 3, in file '...', NON_BOOLEAN_CONDITIONAL_GUARD:
     3058  The guard expression of a conditional component should be a scalar Boolean expression
    30623059")})));
    30633060end ConditionalComponentTest3_Err;
     
    31473144            flatModel="
    31483145fclass NameTests.ConditionalComponentTest8
    3149  parameter Boolean b = false /* false */;
     3146 structural parameter Boolean b = false /* false */;
    31503147
    31513148end NameTests.ConditionalComponentTest8;
     
    31783175            flatModel="
    31793176fclass NameTests.ConditionalComponentTest9
    3180  parameter Boolean b = false /* false */;
     3177 structural parameter Boolean b = false /* false */;
    31813178
    31823179end NameTests.ConditionalComponentTest9;
     
    33803377")})));
    33813378end ConditionalComponentTest14;
     3379
     3380
     3381model ConditionalComponentTest15_Err
     3382    connector C
     3383        Real x;
     3384    end C;
     3385   
     3386    parameter Integer b[2] = {1,1};
     3387    C c if b;
     3388annotation(__JModelica(UnitTesting(tests={
     3389    ErrorTestCase(
     3390        name="ConditionalComponentTest15_Err",
     3391        description="Test of type checking of conditional composite component.",
     3392        errorMessage="
     3393
     3394
     3395Error at line 7, column 5, in file '...', NON_BOOLEAN_CONDITIONAL_GUARD:
     3396  The guard expression of a conditional component should be a scalar Boolean expression
     3397")})));
     3398end ConditionalComponentTest15_Err;
     3399
     3400
     3401model ConditionalComponentTest16
     3402    connector C
     3403        Real x;
     3404    end C;
     3405   
     3406    parameter Boolean b = false;
     3407    C c if b;
     3408annotation(__JModelica(UnitTesting(tests={
     3409    FlatteningTestCase(
     3410        description="Flattening conditional composite component",
     3411        flatModel="
     3412fclass NameTests.ConditionalComponentTest16
     3413 structural parameter Boolean b = false /* false */;
     3414end NameTests.ConditionalComponentTest16;
     3415")})));
     3416end ConditionalComponentTest16;
     3417
     3418
     3419model ConditionalComponentTest17
     3420    connector C
     3421        Real x;
     3422    end C;
     3423   
     3424    parameter Boolean b = true;
     3425    C c if b;
     3426annotation(__JModelica(UnitTesting(tests={
     3427    FlatteningTestCase(
     3428        description="Flattening conditional composite component",
     3429        flatModel="
     3430fclass NameTests.ConditionalComponentTest17
     3431 structural parameter Boolean b = true /* true */;
     3432 potential Real c.x;
     3433end NameTests.ConditionalComponentTest17;
     3434")})));
     3435end ConditionalComponentTest17;
     3436
     3437
     3438model ConditionalComponentTest18_Err
     3439    parameter Boolean b(start = false, fixed = false);
     3440    Real x if b;
     3441    Real y if time > 5;
     3442annotation(__JModelica(UnitTesting(tests={
     3443    ErrorTestCase(
     3444        description="Checking that conditional guard is a fixed parameter expression.",
     3445        errorMessage="
     3446Error at line 3, column 5, in file '...', NON_FIXED_CONDITIONAL_GUARD:
     3447  The guard expression of a conditional component must be a fixed parameter expression
     3448Error at line 4, column 5, in file '...', NON_FIXED_CONDITIONAL_GUARD:
     3449  The guard expression of a conditional component must be a fixed parameter expression
     3450
     3451")})));
     3452end ConditionalComponentTest18_Err;
     3453
     3454
    33823455
    33833456model AttributeDot1
  • branches/stable/Compiler/ModelicaFrontEnd/test/modelica/RedeclareTests.mo

    r13504 r14024  
    66196619    A a(use_b = false, redeclare C b);
    66206620
    6621     annotation(__JModelica(UnitTesting(tests={
    6622         FlatteningTestCase(
    6623             name="RedeclareConditional1",
    6624             description="Redeclaring inactive conditional as modification",
    6625             flatModel="
     6621annotation(__JModelica(UnitTesting(tests={
     6622    FlatteningTestCase(
     6623        name="Misc_RedeclareConditional1",
     6624        description="Redeclaring inactive conditional as modification",
     6625        flatModel="
    66266626fclass RedeclareTests.Misc.RedeclareConditional1
    6627  parameter Boolean a.use_b = false /* false */;
     6627 structural parameter Boolean a.use_b = false /* false */;
    66286628end RedeclareTests.Misc.RedeclareConditional1;
    66296629")})));
     
    66536653    D d;
    66546654
    6655     annotation(__JModelica(UnitTesting(tests={
    6656         FlatteningTestCase(
    6657             name="RedeclareConditional2",
    6658             description="Redeclaring inactive conditional as element",
    6659             flatModel="
     6655annotation(__JModelica(UnitTesting(tests={
     6656    FlatteningTestCase(
     6657        name="Misc_RedeclareConditional2",
     6658        description="Redeclaring inactive conditional as element",
     6659        flatModel="
    66606660fclass RedeclareTests.Misc.RedeclareConditional2
    6661  parameter Boolean d.use_b = false /* false */;
     6661 structural parameter Boolean d.use_b = false /* false */;
    66626662end RedeclareTests.Misc.RedeclareConditional2;
    66636663")})));
  • branches/stable/Compiler/ModelicaMiddleEnd/src/jastadd/Profiling.jrag

    r12940 r14024  
    401401    }
    402402
    403     private static Map<Class,Counter> ASTNode.buildNodeCountMap = null;
    404 
    405     private static NodeCountExtra[] ASTNode.nodeCountExtra = new NodeCountExtra[] { };
    406 
    407     public interface NodeCountExtra {
    408         public void count(ASTNode n);
    409         public void printResult(CodeStream out);
    410     }
    411 
    412403    /**
    413404     * Output a list of the number of instances of each node class.
    414405     */
    415     public static void ASTNode.dumpNodeCount(String file)
     406    public void ASTNode.dumpNodeCount(String file, UtilInterface util)
    416407            throws IOException {
    417         ArrayList<Counter> list = new ArrayList<Counter>();
    418         list.addAll(buildNodeCountMap.values());
     408        ArrayList<ASTNodeCounter> list = new ArrayList<ASTNodeCounter>();
     409        list.addAll(util.getBuildNodeCountMap().values());
    419410        Collections.sort(list);
    420411        CodeStream out = new CodeStream(file);
    421         for (Counter c : list)
     412        for (ASTNodeCounter c : list)
    422413            out.println(c);
    423         for (NodeCountExtra nce : nodeCountExtra)
    424             nce.printResult(out);
    425414        out.close();
    426415    }
    427416
    428     public void ASTNode.buildNodeCount() {
    429         Profiler.clear();
    430         if (buildNodeCountMap == null)
    431             buildNodeCountMap = new HashMap<Class,Counter>();
    432         buildNodeCount(buildNodeCountMap);
    433         Profiler.clear();
    434     }
    435 
    436     private void ASTNode.buildNodeCount(Map<Class,Counter> map) {
     417    public void ASTNode.buildNodeCount(Map<Class,ASTNodeCounter> map) {
    437418        addToNodeCount(map, getClass(), Profiler.getNodeSize(this, false), Profiler.getNodeSize(this, true));
    438         for (NodeCountExtra nce : nodeCountExtra)
    439             nce.count(this);
    440419       
    441420        for (ASTNode n : profilingChildren())
     
    443422    }
    444423
    445     private void ASTNode.addToNodeCount(Map<Class,Counter