Changeset 28678f06 in OpenModelica


Ignore:
Timestamp:
2016-04-02T21:28:14+02:00 (8 years ago)
Author:
Martin Sjölund <martin.sjolund@…>
Branches:
Added-citation-metadata, maintenance/v1.14, maintenance/v1.15, maintenance/v1.16, maintenance/v1.17, maintenance/v1.18, maintenance/v1.19, maintenance/v1.20, maintenance/v1.21, maintenance/v1.22, maintenance/v1.23, master, omlib-staging
Children:
3ad7933b
Parents:
34d31de3
Message:

Use constant lookup for more operators

File:
1 edited

Legend:

Unmodified
Added
Removed
  • Compiler/FrontEnd/OperatorOverloading.mo

    r34d31de3 r28678f06  
    878878    import int_scalar = DAE.T_INTEGER_DEFAULT;
    879879    import real_scalar = DAE.T_REAL_DEFAULT;
     880    import bool_scalar = DAE.T_BOOL_DEFAULT;
    880881    constant DAE.Operator
    881882      int_mul = DAE.MUL(int_scalar),
    882883      real_mul = DAE.MUL(real_scalar),
     884      real_div = DAE.DIV(real_scalar),
     885      real_pow = DAE.POW(real_scalar),
    883886      int_mul_sp = DAE.MUL_SCALAR_PRODUCT(int_scalar),
    884887      real_mul_sp = DAE.MUL_SCALAR_PRODUCT(real_scalar),
     
    901904      },
    902905      addTypes = listAppend(addScalars, listAppend(addIntArrays, listAppend(addRealArrays, addStringArrays))),
    903 
    904906      // ADD_EW
    905907      addIntArrayScalars = list((DAE.ADD_ARRAY_SCALAR(int_vector), {at,rhs},at) threaded for at in intarrtypes, rhs in inttypes),
     
    907909      addStringArrayScalars = list((DAE.ADD_ARRAY_SCALAR(DAE.T_ARRAY(DAE.T_STRING_DEFAULT, {DAE.DIM_UNKNOWN()}, DAE.emptyTypeSource)), {at,rhs},at) threaded for at in stringarrtypes, rhs in stringtypes),
    908910      addEwTypes = listAppend(addIntArrayScalars, listAppend(addRealArrayScalars, listAppend(addStringArrayScalars, addTypes))),
    909 
    910911      // SUB
    911912      subIntArrays = list((DAE.SUB_ARR(int_vector), {at,at},at) for at in intarrtypes),
     
    916917      },
    917918      subTypes = listAppend(subScalars, listAppend(subIntArrays, subRealArrays)),
    918 
    919919      // SUB_EW
    920920      subIntArrayScalars = list((DAE.SUB_SCALAR_ARRAY(int_vector), {lhs,at},at) threaded for at in intarrtypes, lhs in inttypes),
    921921      subRealArrayScalars = list((DAE.SUB_SCALAR_ARRAY(real_vector), {lhs,at},at) threaded for at in realarrtypes, lhs in realtypes),
    922922      subEwTypes = listAppend(subScalars, listAppend(subIntArrayScalars, listAppend(subRealArrayScalars, listAppend(subIntArrays, subRealArrays)))),
    923 
    924923      // MUL
    925924      mulScalars = {
     
    942941      mulRealArrayScalars = list((DAE.MUL_ARRAY_SCALAR(real_vector), {at,rhs},at) threaded for at in realarrtypes, rhs in realtypes),
    943942      mulTypes = listAppend(mulScalars, listAppend(mulIntArrayScalars, listAppend(mulRealArrayScalars, listAppend(mulScalarProduct,mulMatrixProduct)))),
    944 
    945943      // MUL_EW
    946944      mulIntArray = list((DAE.MUL_ARR(int_vector), {at,at},at) for at in intarrtypes),
    947945      mulRealArray = list((DAE.MUL_ARR(real_vector), {at,at},at) for at in realarrtypes),
    948       mulEwTypes = listAppend(mulScalars, listAppend(mulIntArrayScalars, listAppend(mulRealArrayScalars, listAppend(mulIntArray, mulRealArray))));
     946      mulEwTypes = listAppend(mulScalars, listAppend(mulIntArrayScalars, listAppend(mulRealArrayScalars, listAppend(mulIntArray, mulRealArray)))),
     947      // DIV
     948      divTypes = (real_div,{real_scalar,real_scalar},real_scalar) ::
     949        list((DAE.DIV_ARRAY_SCALAR(real_vector), {at,rhs},at) threaded for at in realarrtypes, rhs in realtypes),
     950      // DIV_EW
     951      divRealScalarArray = list((DAE.DIV_SCALAR_ARRAY(real_vector), {lhs,at},at) threaded for at in realarrtypes, lhs in realtypes),
     952      divArrs = list((DAE.DIV_ARR(real_vector), {at,at},at) for at in realarrtypes),
     953      divEwTypes = listAppend(divTypes, listAppend(divRealScalarArray, divArrs)),
     954      // POW
     955      powTypes = {
     956        (real_pow,{real_scalar,real_scalar},real_scalar),
     957        (DAE.POW_ARR(real_scalar),{real_matrix,int_scalar},real_matrix)
     958      },
     959      // AND
     960      andTypes = (DAE.AND(bool_scalar), {bool_scalar, bool_scalar}, bool_scalar) ::
     961        list((DAE.AND(bool_scalar), {at,at},at) threaded for at in boolarrtypes),
     962      // OR
     963      orTypes = (DAE.OR(bool_scalar), {bool_scalar, bool_scalar}, bool_scalar) ::
     964        list((DAE.OR(bool_scalar), {at,at},at) threaded for at in boolarrtypes);
    949965  end OperatorsBinary;
    950966  DAE.Type t;
     
    9841000    case Absyn.MUL() then OperatorsBinary.mulTypes;
    9851001    case Absyn.MUL_EW() then OperatorsBinary.mulEwTypes;
    986 
    987     case Absyn.DIV()
    988       equation
    989         real_div = DAE.DIV(DAE.T_REAL_DEFAULT);
    990         real_scalar = DAE.T_REAL_DEFAULT;
    991         scalars = {(real_div,{real_scalar,real_scalar},real_scalar)};
    992         realarrscalar = operatorReturn(DAE.DIV_ARRAY_SCALAR(DAE.T_ARRAY(DAE.T_REAL_DEFAULT, {DAE.DIM_UNKNOWN()}, DAE.emptyTypeSource)),
    993           realarrtypes, realtypes, realarrtypes);
    994         types = List.flatten({scalars,realarrscalar});
    995       then types;
    996 
    997     case Absyn.DIV_EW()
    998       equation
    999         realarrs = operatorReturn(DAE.DIV_ARR(DAE.T_ARRAY(DAE.T_REAL_DEFAULT, {DAE.DIM_UNKNOWN()}, DAE.emptyTypeSource)),
    1000           realarrtypes, realarrtypes, realarrtypes);
    1001         scalars = {
    1002           (DAE.DIV(DAE.T_REAL_DEFAULT),
    1003           {DAE.T_REAL_DEFAULT,DAE.T_REAL_DEFAULT},DAE.T_REAL_DEFAULT)};
    1004         realscalararrs = operatorReturn(DAE.DIV_SCALAR_ARRAY(DAE.T_ARRAY(DAE.T_REAL_DEFAULT, {DAE.DIM_UNKNOWN()}, DAE.emptyTypeSource)),
    1005           realtypes, realarrtypes, realarrtypes);
    1006         realarrsscalar = operatorReturn(DAE.DIV_ARRAY_SCALAR(DAE.T_ARRAY(DAE.T_REAL_DEFAULT, {DAE.DIM_UNKNOWN()}, DAE.emptyTypeSource)),
    1007           realarrtypes, realtypes, realarrtypes);
    1008         types = List.flatten({scalars,realscalararrs,
    1009           realarrsscalar,realarrs});
    1010       then types;
    1011 
    1012     case Absyn.POW()
    1013       equation
    1014         // Note: POW_ARR uses Integer exponents, while POW only uses Real exponents
    1015         real_scalar = DAE.T_REAL_DEFAULT;
    1016         int_scalar = DAE.T_INTEGER_DEFAULT;
    1017         real_vector = DAE.T_ARRAY(real_scalar,{DAE.DIM_UNKNOWN()},DAE.emptyTypeSource);
    1018         real_matrix = DAE.T_ARRAY(real_vector,{DAE.DIM_UNKNOWN()},DAE.emptyTypeSource);
    1019         real_pow = DAE.POW(DAE.T_REAL_DEFAULT);
    1020         scalars = {(real_pow,{real_scalar,real_scalar},real_scalar)};
    1021         arrscalar = {
    1022           (DAE.POW_ARR(DAE.T_REAL_DEFAULT),{real_matrix,int_scalar},
    1023           real_matrix)};
    1024         types = List.flatten({scalars,arrscalar});
    1025       then types;
     1002    case Absyn.DIV() then OperatorsBinary.divTypes;
     1003    case Absyn.DIV_EW() then OperatorsBinary.divEwTypes;
     1004    case Absyn.POW() then OperatorsBinary.powTypes;
    10261005
    10271006    case Absyn.POW_EW()
     
    10401019      then types;
    10411020
    1042     case Absyn.AND()
    1043       equation
    1044         scalars = {(DAE.AND(DAE.T_BOOL_DEFAULT), {DAE.T_BOOL_DEFAULT, DAE.T_BOOL_DEFAULT}, DAE.T_BOOL_DEFAULT)};
    1045         boolarrs = operatorReturn(DAE.AND(DAE.T_BOOL_DEFAULT), boolarrtypes, boolarrtypes, boolarrtypes);
    1046         types = List.flatten({scalars, boolarrs});
    1047       then types;
    1048 
    1049     case Absyn.OR()
    1050       equation
    1051         scalars = {(DAE.OR(DAE.T_BOOL_DEFAULT), {DAE.T_BOOL_DEFAULT, DAE.T_BOOL_DEFAULT}, DAE.T_BOOL_DEFAULT)};
    1052         boolarrs = operatorReturn(DAE.OR(DAE.T_BOOL_DEFAULT), boolarrtypes, boolarrtypes, boolarrtypes);
    1053         types = List.flatten({scalars, boolarrs});
    1054       then types;
     1021    case Absyn.AND() then OperatorsBinary.andTypes;
     1022    case Absyn.OR() then OperatorsBinary.orTypes;
    10551023
    10561024    // Relational operators
Note: See TracChangeset for help on using the changeset viewer.