Changeset 13949


Ignore:
Timestamp:
Nov 4, 2019 8:32:32 PM (13 days ago)
Author:
Christian Andersson
Message:

Added option for domain checks. Related to ticket:5868

Location:
branches/dev-cw-2658/Compiler
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • branches/dev-cw-2658/Compiler/ModelicaCBackEnd/src/jastadd/CCodeGen/CCodeGenExpressions.jrag

    r13897 r13949  
    3636    @Override
    3737    public void FAbsExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    38         str.print("jmi_abs(");
     38        String prefix = "jmi_abs(";
     39        str.print(myOptions().mathematical_domain_checks.getValue() ? prefix : prefix.toUpperCase());
    3940        p.print(getFExp(), str, indent);
     41        str.print(")");
     42    }
     43   
     44    @Override
     45    public void FSignExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
     46        String prefix = "jmi_sign(";
     47        str.print(myOptions().mathematical_domain_checks.getValue() ? prefix : prefix.toUpperCase());
     48        p.print(getFExp(), str, indent);
     49        str.print(")");
     50    }
     51   
     52    @Override
     53    public void FMinMaxExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
     54        String prefix = "jmi_" + builtInName() + "(";
     55        str.print(myOptions().mathematical_domain_checks.getValue() ? prefix : prefix.toUpperCase());
     56        p.print(getX(), str, indent);
     57        str.print(", ");
     58        p.print(getY(), str, indent);
    4059        str.print(")");
    4160    }
     
    105124    public void FDivFuncExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    106125        str.print("((long)");
    107         if (inFunction()) {
    108             str.format("jmi_divide_function(\"%s\", ", containingFFunctionDecl().name());
    109         } else {
    110             str.print("jmi_divide_equation(jmi, ");
    111         }
    112         p.print(getX(),str,indent);
    113         str.print(",");
    114         p.print(getY(),str,indent);
    115         str.print(",");
    116         str.print("\""+prettyPrint("")+"\")");
     126        prettyPrintGuarded(p.ExecStep, str, indent, getX(), getY());
    117127        str.print(")");
    118128    }
     
    265275
    266276    @Override
    267     public void FMinMaxExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    268         str.print("jmi_" + builtInName() + "(");
    269         p.print(getX(), str, indent);
    270         str.print(", ");
    271         p.print(getY(), str, indent);
    272         str.print(")");
    273     }
    274 
    275     @Override
    276277    public void FNoEventExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    277278        str.print('(');
     
    312313
    313314    @Override
    314     public void FSignExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    315         str.print("jmi_sign(");
    316         p.print(getFExp(), str, indent);
    317         str.print(")");
    318     }
    319 
    320     @Override
    321315    public void FSizeExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    322316        size().printSize_C(p, str, indent, getFExp(), dimension());
     
    427421    protected void RuntimeCallComputation.prettyPrintHead(CodePrinter.ExecuteCodePrinter p, CodeStream str, String indent, FExp ctx, FExp[] inputs, FExp[] outputs) {
    428422        boolean func = ctx.inFunction();
    429         str.print("jmi_");
    430         str.print(p.guardedFunctionName(ctx));
    431         str.print(func ? "_function(" : "_equation(");
     423        boolean domainCheck = ctx.myOptions().mathematical_domain_checks.getValue();
     424        String prefix = "jmi_" + p.guardedFunctionName(ctx) + (func ? "_function(" : "_equation(");
     425        str.print(domainCheck ? prefix : prefix.toUpperCase());
    432426        str.print(func ? "\"" + ctx.containingFFunctionDecl().name() + "\", ": "jmi, ");
    433427        p.codePrinter().print(this, str, indent, CFuncParamDirection.INPUT, Arrays.asList(inputs));
     
    460454    eq FDotDivExp.guardedFunctionName_C()           = "divide";
    461455    eq FDotPowExp.guardedFunctionName_C()           = "pow";
     456    eq FDivFuncExp.guardedFunctionName_C()          = "divide";
    462457    eq FBuiltInFunctionCall.guardedFunctionName_C() = builtInName();
    463458
     
    524519        }
    525520    }
    526 
    527     @Override
    528     public void FExpExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
     521   
     522    @Override
     523    public void FMathematicalFunctionCall.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    529524        prettyPrintGuarded(p.ExecStep, str, indent, getFExp());
    530525    }
    531 
    532     @Override
    533     public void  FLogExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    534         prettyPrintGuarded(p.ExecStep, str, indent, getFExp());
    535     }
    536 
    537     @Override
    538     public void  FLog10Exp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    539         prettyPrintGuarded(p.ExecStep, str, indent, getFExp());
    540     }
    541 
    542     @Override
    543     public void  FSinhExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    544         prettyPrintGuarded(p.ExecStep, str, indent, getFExp());
    545     }
    546 
    547     @Override
    548     public void  FCoshExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    549         prettyPrintGuarded(p.ExecStep, str, indent, getFExp());
    550     }
    551 
    552     @Override
    553     public void  FTanExp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
    554         prettyPrintGuarded(p.ExecStep, str, indent, getFExp());
    555     }
    556 
     526   
    557527    @Override
    558528    public void FAtan2Exp.prettyPrint_C(CodePrinter p, CodeStream str, String indent) {
  • branches/dev-cw-2658/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenAlgorithmTests.mo

    r13357 r13949  
    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);
  • branches/dev-cw-2658/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenArrayTests.mo

    r13846 r13949  
    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/dev-cw-2658/Compiler/ModelicaCBackEnd/test/modelica/CCodeGenTests.mo

    r13897 r13949  
    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(_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(_time);
     101    _x19_18 = jmi_max(_time, _x16_15);
     102    _x20_19 = jmi_min(_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    Real x2 = cos(time);
     152    Real x3 = sin(time);
     153    Real x4 = tan(time);
     154    Real x5 = acos(time);
     155    Real x6 = asin(time);
     156    Real x7 = atan(time);
     157    Real x8 = log(time);
     158    Real x9 = log10(time);
     159    Real x10= exp(time);
     160    Real x11= time^10;
     161    Real x12= sqrt(time);
     162    Real x13= sinh(time);
     163    Real x14= cosh(time);
     164    Real x15= tanh(time);
     165    Real x16= atan2(time, 2*time);
     166    Real x17= time / x16;
     167    Real x18= sign(time);
     168    Real x19= max(time, x16);
     169    Real x20= min(time, x16);
     170    Real x21= div(time, 2*time);
     171
     172    function operators
     173        input Real t;
     174        output Real[16] o;
     175    algorithm
     176        o[1] := cos(t);
     177        o[2] := sin(t);
     178        o[3] := acos(t);
     179        o[4] := asin(t);
     180        o[5] := atan(t);
     181        o[6] := log(t);
     182        o[7] := log10(t);
     183        o[8] := exp(t);
     184        o[9] := t^10;
     185        o[10]:= sqrt(time);
     186        o[11]:= cosh(time);
     187        o[12]:= sinh(time);
     188        o[13]:= tanh(time);
     189        o[14]:= atan2(time, 2*time);
     190        o[15]:= t / o[1];
     191        o[16]:= div(time, 2*time);
     192    end operators;
     193   
     194    Real o[16] = operators(time);
     195   
     196annotation(__JModelica(UnitTesting(tests={
     197    CCodeGenTestCase(
     198        name="DomainChecks2",
     199        description="Test of no domain check generation",
     200        mathematical_domain_checks=false,
     201        inline_functions="none",
     202        template="
     203$C_ode_derivatives$
     204$C_functions$
     205",
     206        generatedCode="
     207
     208int model_ode_derivatives_base(jmi_t* jmi) {
     209    int ef = 0;
     210    JMI_DYNAMIC_INIT()
     211    JMI_ARR(STACK, jmi_real_t, jmi_array_t, tmp_1, 16, 1)
     212    _x1_0 = JMI_ABS(_time);
     213    _x2_1 = JMI_COS_EQUATION(jmi, _time, \"cos(time)\");
     214    _x3_2 = JMI_SIN_EQUATION(jmi, _time, \"sin(time)\");
     215    _x4_3 = JMI_TAN_EQUATION(jmi, _time, \"tan(time)\");
     216    _x5_4 = JMI_ACOS_EQUATION(jmi, _time, \"acos(time)\");
     217    _x6_5 = JMI_ASIN_EQUATION(jmi, _time, \"asin(time)\");
     218    _x7_6 = JMI_ATAN_EQUATION(jmi, _time, \"atan(time)\");
     219    _x8_7 = JMI_LOG_EQUATION(jmi, _time, \"log(time)\");
     220    _x9_8 = JMI_LOG10_EQUATION(jmi, _time, \"log10(time)\");
     221    _x10_9 = JMI_EXP_EQUATION(jmi, _time, \"exp(time)\");
     222    _x11_10 = JMI_POW_EQUATION(jmi, _time, 10, \"time ^ 10\");
     223    _x12_11 = JMI_SQRT_EQUATION(jmi, _time, \"sqrt(time)\");
     224    _x13_12 = JMI_SINH_EQUATION(jmi, _time, \"sinh(time)\");
     225    _x14_13 = JMI_COSH_EQUATION(jmi, _time, \"cosh(time)\");
     226    _x15_14 = JMI_TANH_EQUATION(jmi, _time, \"tanh(time)\");
     227    _x16_15 = JMI_ATAN2_EQUATION(jmi, _time, 2.0 * _time, \"atan2(time, 2 * time)\");
     228    _x17_16 = JMI_DIVIDE_EQUATION(jmi, _time, _x16_15, \"time / x16\");
     229    _x18_17 = JMI_SIGN(_time);
     230    _x19_18 = JMI_MAX(_time, _x16_15);
     231    _x20_19 = JMI_MIN(_time, _x16_15);
     232    if (jmi->atInitial || jmi->atEvent) {
     233        _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);
     234    }
     235    if (jmi->atInitial || jmi->atEvent) {
     236        _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);
     237    }
     238    _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);
     239    pre_temp_2_37 = _temp_2_37;
     240    _x21_20 = _temp_2_37;
     241    JMI_ARRAY_INIT_1(STACK, jmi_real_t, jmi_array_t, tmp_1, 16, 1, 16)
     242    func_CCodeGenTests_DomainChecks2_operators_def0(_time, tmp_1);
     243    memcpy(&_o_1_21, &jmi_array_val_1(tmp_1, 1), 16 * sizeof(jmi_real_t));
     244    JMI_DYNAMIC_FREE()
     245    return ef;
     246}
     247
     248void func_CCodeGenTests_DomainChecks2_operators_def0(jmi_real_t t_v, jmi_array_t* o_a) {
     249    JMI_DYNAMIC_INIT()
     250    JMI_ARR(STACK, jmi_real_t, jmi_array_t, o_an, 16, 1)
     251    if (o_a == NULL) {
     252        JMI_ARRAY_INIT_1(STACK, jmi_real_t, jmi_array_t, o_an, 16, 1, 16)
     253        o_a = o_an;
     254    }
     255    jmi_array_ref_1(o_a, 1) = JMI_COS_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", t_v, \"cos(t)\");
     256    jmi_array_ref_1(o_a, 2) = JMI_SIN_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", t_v, \"sin(t)\");
     257    jmi_array_ref_1(o_a, 3) = JMI_ACOS_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", t_v, \"acos(t)\");
     258    jmi_array_ref_1(o_a, 4) = JMI_ASIN_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", t_v, \"asin(t)\");
     259    jmi_array_ref_1(o_a, 5) = JMI_ATAN_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", t_v, \"atan(t)\");
     260    jmi_array_ref_1(o_a, 6) = JMI_LOG_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", t_v, \"log(t)\");
     261    jmi_array_ref_1(o_a, 7) = JMI_LOG10_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", t_v, \"log10(t)\");
     262    jmi_array_ref_1(o_a, 8) = JMI_EXP_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", t_v, \"exp(t)\");
     263    jmi_array_ref_1(o_a, 9) = JMI_POW_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", t_v, 10, \"t ^ 10\");
     264    jmi_array_ref_1(o_a, 10) = JMI_SQRT_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", _time, \"sqrt(time)\");
     265    jmi_array_ref_1(o_a, 11) = JMI_COSH_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", _time, \"cosh(time)\");
     266    jmi_array_ref_1(o_a, 12) = JMI_SINH_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", _time, \"sinh(time)\");
     267    jmi_array_ref_1(o_a, 13) = JMI_TANH_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", _time, \"tanh(time)\");
     268    jmi_array_ref_1(o_a, 14) = JMI_ATAN2_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", _time, 2.0 * _time, \"atan2(time, 2 * time)\");
     269    jmi_array_ref_1(o_a, 15) = JMI_DIVIDE_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", t_v, jmi_array_val_1(o_a, 1), \"t / o[1]\");
     270    jmi_array_ref_1(o_a, 16) = ((long)JMI_DIVIDE_FUNCTION(\"CCodeGenTests.DomainChecks2.operators\", _time, 2.0 * _time, \"div(time, 2 * time)\"));
     271    JMI_DYNAMIC_FREE()
     272    return;
     273}
     274
     275")})));
     276end DomainChecks2;
    19277
    20278model CCodeGenTest1
     
    145403        generatedCode="
    146404    (*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);
     405    (*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);
    148406")})));
    149407end CCodeGenTest4;
     
    34693727    {a, b[1],b[2],c,b[3],d} = F({e, f[1], f[2], g, f[3], h});
    34703728   
    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="
     3729annotation(__JModelica(UnitTesting(tests={
     3730    CCodeGenTestCase(
     3731        name="CFunctionTest23",
     3732        description="memcpy for parts of array (both of input and output)",
     3733        template="$C_ode_derivatives$",
     3734        generatedCode="
    34773735
    34783736int model_ode_derivatives_base(jmi_t* jmi) {
     
    34823740    JMI_ARR(STACK, jmi_real_t, jmi_array_t, tmp_2, 6, 1)
    34833741    _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);
     3742    _f_1_7 = jmi_sin_equation(jmi, _time - 0.5, \"sin(time - 0.5)\");
     3743    _f_2_8 = jmi_sin_equation(jmi, _time, \"sin(time)\");
     3744    _g_10 = jmi_cos_equation(jmi, _time, \"cos(time)\");
     3745    _f_3_9 = jmi_sin_equation(jmi, _time + 0.5, \"sin(time + 0.5)\");
     3746    _h_11 = - jmi_cos_equation(jmi, _time, \"cos(time)\");
    34893747    JMI_ARRAY_INIT_1(STACK, jmi_real_t, jmi_array_t, tmp_1, 6, 1, 6)
    34903748    JMI_ARRAY_INIT_1(STACK, jmi_real_t, jmi_array_t, tmp_2, 6, 1, 6)
     
    85258783        }
    85268784        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);
     8785            (*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);
    85288786        }
    85298787    }
     
    989310151        }
    989410152        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    9895             (*res)[0] = _z1_2 + 2 - (sin(_z1_2) * 3);
     10153            (*res)[0] = _z1_2 + 2 - (jmi_sin_equation(jmi, _z1_2, \"sin(z1)\") * 3);
    989610154        }
    989710155    }
     
    991710175        }
    991810176        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    9919             (*res)[0] = _z1_2 + 2 - (sin(_z1_2) * 3);
     10177            (*res)[0] = _z1_2 + 2 - (jmi_sin_equation(jmi, _z1_2, \"sin(z1)\") * 3);
    992010178        }
    992110179    }
     
    1019410452    JMI_DYNAMIC_INIT()
    1019510453    _der_dummy_15 = 1;
    10196     _u_6 = 2 * sin(_time);
     10454    _u_6 = 2 * jmi_sin_equation(jmi, _time, \"sin(time)\");
    1019710455    if (jmi->atInitial || jmi->atEvent) {
    1019810456        _sw(2) = jmi_turn_switch(jmi, _v_3 - (0.0), _sw(2), JMI_REL_GT);
     
    1021110469    JMI_DYNAMIC_INIT()
    1021210470    _der_dummy_15 = 1;
    10213     _u_6 = 2 * sin(_time);
     10471    _u_6 = 2 * jmi_sin_equation(jmi, _time, \"sin(time)\");
    1021410472    pre_mode_10 = 2;
    1021510473    _v_3 = 0.0;
     
    1089611154        }
    1089711155        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);
     11156            (*res)[0] = jmi_sin_equation(jmi, _b_1, \"sin(b)\") * COND_EXP_EQ(_d_2, JMI_TRUE, 1.0, 2.0) - (_a_0);
    1089911157            (*res)[1] = 1 - _b_1 - (_a_0);
    1090011158        }
     
    1093711195        }
    1093811196        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);
     11197            (*res)[0] = jmi_sin_equation(jmi, _b_1, \"sin(b)\") * COND_EXP_EQ(_d_2, JMI_TRUE, 1.0, 2.0) - (_a_0);
    1094011198            (*res)[1] = 1 - _b_1 - (_a_0);
    1094111199        }
     
    1213412392        }
    1213512393        if (evaluation_mode & JMI_BLOCK_EVALUATE) {
    12136             (*res)[0] = asin(_b_1) - (_a_0);
     12394            (*res)[0] = jmi_asin_equation(jmi, _b_1, \"asin(b)\") - (_a_0);
    1213712395        }
    1213812396    }
     
    1528815546    b = cos(time);
    1528915547   
    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="
     15548annotation(__JModelica(UnitTesting(tests={
     15549    CCodeGenTestCase(
     15550        name="TestRelationalOp14",
     15551        description="Test inline bug which caused exception during code gen (related to switch index)",
     15552        template="
    1529515553$C_ode_time_events$
    1529615554$C_ode_derivatives$
    1529715555",
    15298             generatedCode="
    15299 
     15556        generatedCode="
    1530015557    jmi_real_t nSamp;
    1530115558
    1530215559
    15303 
    15304 
    1530515560int model_ode_derivatives_base(jmi_t* jmi) {
    1530615561    int ef = 0;
    1530715562    JMI_DYNAMIC_INIT()
    15308     _b_1 = cos(_time);
     15563    _b_1 = jmi_cos_equation(jmi, _time, \"cos(time)\");
    1530915564    if (jmi->atInitial || jmi->atEvent) {
    1531015565        _sw(0) = jmi_turn_switch(jmi, _b_1 - (0.0), _sw(0), JMI_REL_GT);
     
    1532815583    Real c = if b > 0.0 then b else -b;
    1532915584   
    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="
     15585annotation(__JModelica(UnitTesting(tests={
     15586    CCodeGenTestCase(
     15587        name="TestRelationalOp14B",
     15588        description="Test inline bug which caused exception during code gen (related to switch index)",
     15589        template="
    1533515590$C_ode_time_events$
    1533615591$C_ode_derivatives$
    1533715592",
    15338             generatedCode="
     15593        generatedCode="
    1533915594    jmi_real_t nSamp;
    1534015595
     
    1534315598    int ef = 0;
    1534415599    JMI_DYNAMIC_INIT()
    15345     _b_1 = cos(_time);
     15600    _b_1 = jmi_cos_equation(jmi, _time, \"cos(time)\");
    1534615601    if (jmi->atInitial || jmi->atEvent) {
    1534715602        _sw(0) = jmi_turn_switch(jmi, _b_1 - (0.0), _sw(0), JMI_REL_GT);
     
    1537815633    JMI_DYNAMIC_INIT()
    1537915634    if (jmi->atInitial || jmi->atEvent) {
    15380         _sw(0) = jmi_turn_switch(jmi, sin(_time) - (0.0), _sw(0), JMI_REL_GT);
     15635        _sw(0) = jmi_turn_switch(jmi, jmi_sin_equation(jmi, _time, \"sin(time)\") - (0.0), _sw(0), JMI_REL_GT);
    1538115636    }
    1538215637    if (jmi->atInitial || jmi->atEvent) {
    15383         _sw(1) = jmi_turn_switch(jmi, cos(_time) - (0.0), _sw(1), JMI_REL_GT);
     15638        _sw(1) = jmi_turn_switch(jmi, jmi_cos_equation(jmi, _time, \"cos(time)\") - (0.0), _sw(1), JMI_REL_GT);
    1538415639    }
    1538515640    _a_0 = COND_EXP_EQ(LOG_EXP_AND(_sw(0), _sw(1)), JMI_TRUE, 1.0, _time);
    1538615641    if (jmi->atInitial || jmi->atEvent) {
    15387         _sw(0) = jmi_turn_switch(jmi, sin(_time) - (0.0), _sw(0), JMI_REL_GT);
     15642        _sw(0) = jmi_turn_switch(jmi, jmi_sin_equation(jmi, _time, \"sin(time)\") - (0.0), _sw(0), JMI_REL_GT);
    1538815643    }
    1538915644    if (jmi->atInitial || jmi->atEvent) {
    15390         _sw(2) = jmi_turn_switch(jmi, cos(_time) - (0.0), _sw(2), JMI_REL_GT);
     15645        _sw(2) = jmi_turn_switch(jmi, jmi_cos_equation(jmi, _time, \"cos(time)\") - (0.0), _sw(2), JMI_REL_GT);
    1539115646    }
    1539215647    _b_1 = COND_EXP_EQ(LOG_EXP_AND(_sw(0), _sw(2)), JMI_TRUE, _time, 1.0);
     
    1539715652    int ef = 0;
    1539815653    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);
     15654    (*res)[0] = jmi_sin_equation(jmi, _time, \"sin(time)\") - (0.0);
     15655    (*res)[1] = COND_EXP_EQ(_sw(0), JMI_TRUE, jmi_cos_equation(jmi, _time, \"cos(time)\") - (0.0), 1.0);
     15656    (*res)[2] = COND_EXP_EQ(_sw(0), JMI_TRUE, jmi_cos_equation(jmi, _time, \"cos(time)\") - (0.0), 1.0);
    1540215657    JMI_DYNAMIC_FREE()
    1540315658    return ef;
     
    1542515680    JMI_DYNAMIC_INIT()
    1542615681    if (jmi->atInitial || jmi->atEvent) {
    15427         _sw(0) = jmi_turn_switch(jmi, sin(_time) - (0.0), _sw(0), JMI_REL_GT);
     15682        _sw(0) = jmi_turn_switch(jmi, jmi_sin_equation(jmi, _time, \"sin(time)\") - (0.0), _sw(0), JMI_REL_GT);
    1542815683    }
    1542915684    if (jmi->atInitial || jmi->atEvent) {
    15430         _sw(1) = jmi_turn_switch(jmi, cos(_time) - (0.0), _sw(1), JMI_REL_GT);
     15685        _sw(1) = jmi_turn_switch(jmi, jmi_cos_equation(jmi, _time, \"cos(time)\") - (0.0), _sw(1), JMI_REL_GT);
    1543115686    }
    1543215687    if (jmi->atInitial || jmi->atEvent) {
    15433         _sw(2) = jmi_turn_switch(jmi, cos(_time + 0.5) - (0.0), _sw(2), JMI_REL_GT);
     15688        _sw(2) = jmi_turn_switch(jmi, jmi_cos_equation(jmi, _time + 0.5, \"cos(time + 0.5)\") - (0.0), _sw(2), JMI_REL_GT);
    1543415689    }
    1543515690    _a_0 = COND_EXP_EQ(LOG_EXP_AND(LOG_EXP_AND(_sw(0), _sw(1)), _sw(2)), JMI_TRUE, 1.0, _time);
    1543615691    if (jmi->atInitial || jmi->atEvent) {
    15437         _sw(0) = jmi_turn_switch(jmi, sin(_time) - (0.0), _sw(0), JMI_REL_GT);
     15692        _sw(0) = jmi_turn_switch(jmi, jmi_sin_equation(jmi, _time, \"sin(time)\") - (0.0), _sw(0), JMI_REL_GT);
    1543815693    }
    1543915694    if (jmi->atInitial || jmi->atEvent) {
    15440         _sw(3) = jmi_turn_switch(jmi, cos(_time) - (0.0), _sw(3), JMI_REL_GT);
     15695        _sw(3) = jmi_turn_switch(jmi, jmi_cos_equation(jmi, _time, \"cos(time)\") - (0.0), _sw(3), JMI_REL_GT);
    1544115696    }
    1544215697    if (jmi->atInitial || jmi->atEvent) {
    15443         _sw(4) = jmi_turn_switch(jmi, cos(_time + 0.5) - (0.0), _sw(4), JMI_REL_GT);
     15698        _sw(4) = jmi_turn_switch(jmi, jmi_cos_equation(jmi, _time + 0.5, \"cos(time + 0.5)\") - (0.0), _sw(4), JMI_REL_GT);
    1544415699    }
    1544515700    _b_1 = COND_EXP_EQ(LOG_EXP_AND(LOG_EXP_AND(_sw(0), _sw(3)), _sw(4)), JMI_TRUE, _time, 1.0);
     
    1545015705    int ef = 0;
    1545115706    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);
     15707    (*res)[0] = jmi_sin_equation(jmi, _time, \"sin(time)\") - (0.0);
     15708    (*res)[1] = COND_EXP_EQ(_sw(0), JMI_TRUE, jmi_cos_equation(jmi, _time, \"cos(time)\") - (0.0), 1.0);
     15709    (*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);
     15710    (*res)[3] = COND_EXP_EQ(_sw(0), JMI_TRUE, jmi_cos_equation(jmi, _time, \"cos(time)\") - (0.0), 1.0);
     15711    (*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);
    1545715712    JMI_DYNAMIC_FREE()
    1545815713    return ef;
     
    1547115726    end when;
    1547215727
    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="
     15728annotation(__JModelica(UnitTesting(tests={
     15729    CCodeGenTestCase(
     15730        name="TestRelationalOp17",
     15731        description="Ensure that switches in DAE isn't eliminated for switch in initDAE'",
     15732        template="
    1547815733$C_ode_derivatives$
    1547915734$C_DAE_event_indicator_residuals$
    1548015735$C_DAE_initial_event_indicator_residuals$
    1548115736",
    15482             generatedCode="
     15737        generatedCode="
     15738
    1548315739int model_ode_derivatives_base(jmi_t* jmi) {
    1548415740    int ef = 0;
    1548515741    JMI_DYNAMIC_INIT()
    15486     _x_0 = sin(_time);
     15742    _x_0 = jmi_sin_equation(jmi, _time, \"sin(time)\");
    1548715743    if (jmi->atInitial || jmi->atEvent) {
    1548815744        _sw(1) = jmi_turn_switch(jmi, _x_0 - (-0.5), _sw(1), JMI_REL_LT);
     
    2006920325    int ef = 0;
    2007020326    JMI_DYNAMIC_INIT()
    20071     _tmp_2 = sin(_time * 100.0);
     20327    _tmp_2 = jmi_sin_equation(jmi, _time * 100.0, \"sin(time * 100)\");
    2007220328    if (jmi->atInitial || jmi->atEvent) {
    2007320329        _sw(0) = jmi_turn_switch(jmi, __eventIndicator_1_3, _sw(0), JMI_REL_GEQ);
     
    2009320349    }
    2009420350    ef |= jmi_solve_block_residual(jmi->dae_block_residuals[0]);
    20095     _tmp_2 = sin(_time * 100.0);
     20351    _tmp_2 = jmi_sin_equation(jmi, _time * 100.0, \"sin(time * 100)\");
    2009620352    __eventIndicator_2_4 = jmi_delay_first_event_indicator_exp(jmi, 0, _tmp_2);
    2009720353    __eventIndicator_3_5 = jmi_delay_second_event_indicator_exp(jmi, 0, _tmp_2);
  • branches/dev-cw-2658/Compiler/ModelicaCompiler/module.options

    r13719 r13949  
    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********************************************************************************
Note: See TracChangeset for help on using the changeset viewer.