Skip to content

Commit

Permalink
- BackendDAECreate.mo: do not add asserts for min,max,nominal if cons…
Browse files Browse the repository at this point in the history
…t true

- BackendDAEOptimize.mo: merge nomnial attribute
- BackendDAEUtil.mo: bugfix checkinitialconditions for remove alias equations
- BackendDump.mo: dump min,max,fix,nomial,start
- FMU: bugfix alias equations

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@8256 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Jens Frenkel committed Mar 16, 2011
1 parent b24474c commit 4002af6
Show file tree
Hide file tree
Showing 8 changed files with 232 additions and 24 deletions.
6 changes: 6 additions & 0 deletions Compiler/BackEnd/BackendDAECreate.mo
Expand Up @@ -888,6 +888,9 @@ algorithm
e = Expression.crefExp(name);
tp = Expression.typeof(e);
cond = lowerMinMax1(ominmax,e,tp);
cond = ExpressionSimplify.simplify(cond);
// do not add if const true
false = Expression.isConstTrue(cond);
checkAssertCondition(cond,msg);
then
{DAE.ALGORITHM_STMTS({DAE.STMT_ASSERT(cond,msg,source)})};
Expand Down Expand Up @@ -941,6 +944,9 @@ algorithm
msg = DAE.SCONST(str);
tp = Expression.typeof(e);
cond = lowerMinMax1(ominmax,e,tp);
cond = ExpressionSimplify.simplify(cond);
// do not add if const true
false = Expression.isConstTrue(cond);
checkAssertCondition(cond,msg);
then
{DAE.ALGORITHM_STMTS({DAE.STMT_ASSERT(cond,msg,source)})};
Expand Down
40 changes: 38 additions & 2 deletions Compiler/BackEnd/BackendDAEOptimize.mo
Expand Up @@ -1001,7 +1001,7 @@ algorithm
matchcontinue (inAVar,inCref,inVars,negate)
local
DAE.ComponentRef name,cr;
BackendDAE.Var v,var,var1,var2;
BackendDAE.Var v,var,var1,var2,var3;
BackendDAE.Variables vars;
Boolean fixeda, fixedb,starta,startb;
case (v as BackendDAE.VAR(varName=name),cr,inVars,negate)
Expand All @@ -1013,8 +1013,10 @@ algorithm
var1 = BackendVariable.setVarFixed(var,fixeda or fixedb);
// start
var2 = mergeStartAttribute(v,var1,negate);
// nominal
var3 = mergeNomnialAttribute(v,var2,negate);
// update vars
vars = BackendVariable.addVar(var2,inVars);
vars = BackendVariable.addVar(var3,inVars);
then vars;
case(_,_,inVars,negate) then inVars;
end matchcontinue;
Expand Down Expand Up @@ -1063,6 +1065,40 @@ algorithm
end matchcontinue;
end mergeStartAttribute1;

protected function mergeNomnialAttribute
input BackendDAE.Var inAVar;
input BackendDAE.Var inVar;
input Boolean negate;
output BackendDAE.Var outVar;
algorithm
outVar :=
matchcontinue (inAVar,inVar,negate)
local
BackendDAE.Var v,var,var1;
Option<DAE.VariableAttributes> attr,attr1;
DAE.Exp e,e_1,e1,esum,eaverage;
case (v as BackendDAE.VAR(values = attr),var as BackendDAE.VAR(values = attr1),negate)
equation
// nominal
e = BackendVariable.varNominalValue(v);
e1 = BackendVariable.varNominalValue(var);
e_1 = Util.if_(negate,Expression.negate(e),e);
esum = Expression.makeSum({e_1,e1});
eaverage = Expression.expDiv(esum,DAE.RCONST(2.0)); // Real is lecal because only Reals have nominal attribute
var1 = BackendVariable.setVarNominalValue(var,ExpressionSimplify.simplify(eaverage));
then var1;
case (v as BackendDAE.VAR(values = attr),var as BackendDAE.VAR(values = attr1),negate)
equation
// nominal
e = BackendVariable.varNominalValue(v);
e_1 = Util.if_(negate,Expression.negate(e),e);
var1 = BackendVariable.setVarNominalValue(var,e_1);
then var1;
case(_,inVar,_) then inVar;
end matchcontinue;
end mergeNomnialAttribute;


/*
* remove parameter equations
*/
Expand Down
13 changes: 8 additions & 5 deletions Compiler/BackEnd/BackendDAEUtil.mo
Expand Up @@ -281,31 +281,35 @@ public function checkInitialSystem"function: checkInitialSystem
algorithm
outDAE := matchcontinue (inDAE,funcs)
local
BackendDAE.Variables variables,knvars,exObj;
BackendDAE.Variables variables,knvars,exObj,aliasVars;
BackendDAE.EquationArray orderedEqs,removedEqs,initialEqs;
array<DAE.Algorithm> algs;
array<BackendDAE.MultiDimEquation> arrayEqs;
BackendDAE.EventInfo eventInfo;
BackendDAE.ExternalObjectClasses extObjClasses;
Integer nie,nie1,nie2,unfixed,unfixed1;
Integer nie,nie1,nie2,unfixed,unfixed1,unfixed2,sizealias;
BackendDAE.BackendDAE dae,dae1;
list<BackendDAE.WhenClause> whenClauseLst;
list<DAE.ComponentRef> vars,varsws,states,statesws;
BackendDAE.AliasVariables av;

case (dae as BackendDAE.DAE(orderedVars=variables,knownVars=knvars,externalObjects=exObj,orderedEqs=orderedEqs,removedEqs=removedEqs,
case (dae as BackendDAE.DAE(orderedVars=variables,knownVars=knvars,externalObjects=exObj,aliasVars=av,orderedEqs=orderedEqs,removedEqs=removedEqs,
initialEqs=initialEqs,arrayEqs=arrayEqs,algorithms=algs,eventInfo=eventInfo,extObjClasses=extObjClasses),funcs)
equation
/* count the unfixed variables */
// vars
((vars,varsws,states,statesws,unfixed)) = BackendVariable.traverseBackendDAEVars(variables,countInitialVars,({},{},{},{},0));
// kvars
((vars,varsws,states,statesws,unfixed1)) = BackendVariable.traverseBackendDAEVars(knvars,countInitialVars,(vars,varsws,states,statesws,unfixed));
BackendDAE.ALIASVARS(_,aliasVars) = av;
sizealias = BackendVariable.varsSize(aliasVars);
unfixed2 = unfixed1 - sizealias;
/* count the equations */
nie = equationSize(initialEqs);
BackendDAE.EVENT_INFO(whenClauseLst=whenClauseLst) = eventInfo;
((nie1,_)) = BackendEquation.traverseBackendDAEEqns(orderedEqs,countInitialEqns,(nie,whenClauseLst));
((nie2,_)) = BackendEquation.traverseBackendDAEEqns(removedEqs,countInitialEqns,(nie1,whenClauseLst));
dae1 = checkInitialSystem1(unfixed1,nie2,dae,funcs,vars,varsws,states,statesws);
dae1 = checkInitialSystem1(unfixed2,nie2,dae,funcs,vars,varsws,states,statesws);
then
dae;

Expand Down Expand Up @@ -726,7 +730,6 @@ algorithm
extVars = BackendVariable.addVars(extvarlst, extVars);
trans_dae = BackendDAE.DAE(vars,knvars,extVars,av,eqns,seqns,ieqns,ae,al,
BackendDAE.EVENT_INFO(wc,zc),extObjCls);
Debug.fcall("dumpindxdae", BackendDump.dump, trans_dae);
then
trans_dae;
end match;
Expand Down
90 changes: 82 additions & 8 deletions Compiler/BackEnd/BackendDump.mo
Expand Up @@ -891,7 +891,7 @@ protected function dumpVars2
algorithm
_ := matchcontinue (inVarLst,inInteger)
local
String varnostr,dirstr,str,path_str,comment_str,s,indx_str,sstart;
String varnostr,dirstr,str,path_str,comment_str,s,indx_str;
list<String> paths_lst,path_strs;
BackendDAE.Value varno_1,indx,varno;
BackendDAE.Var v;
Expand Down Expand Up @@ -935,6 +935,7 @@ algorithm
print(str);
print(":");
dumpKind(kind);
dumpAttributes(dae_var_attr);
paths = DAEUtil.getElementSourceTypes(source);
paths_lst = Util.listMap(paths, Absyn.pathString);
path_str = Util.stringDelimitList(paths_lst, ", ");
Expand All @@ -947,11 +948,11 @@ algorithm
indx_str = intString(indx) "print \" \" & print comment_str & print \" former: \" & print old_name &" ;
str = dumpTypeStr(var_type);print( " type: "); print(str);
print(ComponentReference.printComponentRef2Str("", arrayDim));
dumpAttributes(dae_var_attr);
print(" indx = ");
print(indx_str);
varno_1 = varno + 1;
print(" fixed:");print(boolString(BackendVariable.varFixed(v)));
print("\n");
varno_1 = varno + 1;
dumpVars2(xs, varno_1) "DAEDump.dump_variable_attributes(dae_var_attr) &" ;
then
();
Expand Down Expand Up @@ -983,17 +984,13 @@ algorithm
print(str);
print(":");
dumpKind(kind);
b = DAEUtil.hasStartAttr(dae_var_attr);
sstart = DAEUtil.getStartAttrString(dae_var_attr);
sstart = Util.if_(b,stringAppendList({"(start = ",sstart,") "})," ");
print(sstart);
dumpAttributes(dae_var_attr);
print(path_str);
indx_str = intString(indx) "print \" former: \" & print old_name &" ;
str = dumpTypeStr(var_type);print( " type: "); print(str);
print(ComponentReference.printComponentRef2Str("", arrayDim));
print(" indx = ");
print(indx_str);
print(" fixed:");print(boolString(BackendVariable.varFixed(v)));
print("\n");
varno_1 = varno + 1;
dumpVars2(xs, varno_1);
Expand Down Expand Up @@ -1034,6 +1031,83 @@ algorithm
end match;
end dumpKind;

public function dumpAttributes
"function: dumpAttributes
Helper function to dump."
input Option<DAE.VariableAttributes> inAttr;
algorithm
_:=
match (inAttr)
local
Option<DAE.Exp> min,max,start,fixed,nominal;
String snominal;
case NONE() then ();
case SOME(DAE.VAR_ATTR_REAL(min=(min,max),initial_=start,fixed=fixed,nominal=nominal))
equation
print("(");
dumpOptExpression(min,"min");
dumpOptExpression(max,"max");
dumpOptExpression(start,"start");
dumpOptExpression(fixed,"fixed");
dumpOptExpression(nominal,"nominal");
print(") ");
then ();
case SOME(DAE.VAR_ATTR_INT(min=(min,max),initial_=start,fixed=fixed))
equation
print("(");
dumpOptExpression(min,"min");
dumpOptExpression(max,"max");
dumpOptExpression(start,"start");
dumpOptExpression(fixed,"fixed");
print(") ");
then ();
case SOME(DAE.VAR_ATTR_BOOL(initial_=start,fixed=fixed))
equation
print("(");
dumpOptExpression(start,"start");
dumpOptExpression(fixed,"fixed");
print(") ");
then ();
case SOME(DAE.VAR_ATTR_STRING(initial_=start))
equation
print("(");
dumpOptExpression(start,"start");
print(") ");
then ();
case SOME(DAE.VAR_ATTR_ENUMERATION(min=(min,max),start=start,fixed=fixed))
equation
print("(");
dumpOptExpression(min,"min");
dumpOptExpression(max,"max");
dumpOptExpression(start,"start");
dumpOptExpression(fixed,"fixed");
print(") ");
then ();
else ();
end match;
end dumpAttributes;

protected function dumpOptExpression
"function: dumpOptExpression
Helper function to dump."
input Option<DAE.Exp> inExp;
input String inString;
algorithm
_:=
match (inExp,inString)
local
DAE.Exp e;
String s,se,str;
case (SOME(e),s)
equation
se = ExpressionDump.printExpStr(e);
str = stringAppendList({s," = ",se," "});
print(str);
then ();
else ();
end match;
end dumpOptExpression;

public function dumpIncidenceMatrix
"function: dumpIncidenceMatrix
author: PA
Expand Down
59 changes: 59 additions & 0 deletions Compiler/BackEnd/BackendVariable.mo
Expand Up @@ -456,6 +456,65 @@ algorithm
end matchcontinue;
end varStateSelect;


public function varNominalValue
"function varHasNominal
author: Frenkel TUD"
input BackendDAE.Var inVar;
output DAE.Exp outExp;
algorithm
outExp:=
match (inVar)
local DAE.Exp e;
DAE.StateSelect stateselect;
case (BackendDAE.VAR(values = SOME(DAE.VAR_ATTR_REAL(nominal=SOME(e))))) then e;
end match;
end varNominalValue;

public function setVarNominalValue
"function: setVarNominalValue
author: Frenkel TUD
Sets the nominal value attribute of a variable."
input BackendDAE.Var inVar;
input DAE.Exp inExp;
output BackendDAE.Var outVar;
algorithm
outVar := match (inVar,inExp)
local
DAE.ComponentRef a;
BackendDAE.VarKind b;
DAE.VarDirection c;
BackendDAE.Type d;
Option<DAE.Exp> e;
Option<Values.Value> f;
list<DAE.Subscript> g;
BackendDAE.Value i;
DAE.ElementSource source;
DAE.VariableAttributes attr;
Option<DAE.VariableAttributes> oattr,oattr1;
Option<SCode.Comment> s;
DAE.Flow t;
DAE.Stream streamPrefix;

case (BackendDAE.VAR(varName = a,
varKind = b,
varDirection = c,
varType = d,
bindExp = e,
bindValue = f,
arryDim = g,
index = i,
source = source,
values = SOME(attr),
comment = s,
flowPrefix = t,
streamPrefix = streamPrefix),inExp)
equation
oattr1 = DAEUtil.setNominalAttr(SOME(attr),inExp);
then BackendDAE.VAR(a,b,c,d,e,f,g,i,source,oattr1,s,t,streamPrefix);
end match;
end setVarNominalValue;

public function varType "function: varType
author: PA

Expand Down
21 changes: 21 additions & 0 deletions Compiler/FrontEnd/DAEUtil.mo
Expand Up @@ -792,6 +792,27 @@ algorithm
end match;
end setStartAttr;

public function setNominalAttr "
sets the nominal attribute. If NONE(), assumes Real attributes."
input Option<DAE.VariableAttributes> attr;
input DAE.Exp nominal;
output Option<DAE.VariableAttributes> outAttr;
algorithm
outAttr:=
match (attr,nominal)
local
Option<DAE.Exp> q,u,du,f,s;
tuple<Option<DAE.Exp>, Option<DAE.Exp>> minMax;
Option<DAE.StateSelect> ss;
Option<DAE.Exp> eb;
Option<Boolean> ip,fn;
case (SOME(DAE.VAR_ATTR_REAL(q,u,du,minMax,s,f,_,ss,eb,ip,fn)),nominal)
then SOME(DAE.VAR_ATTR_REAL(q,u,du,minMax,s,f,SOME(nominal),ss,eb,ip,fn));
case (NONE(),nominal)
then SOME(DAE.VAR_ATTR_REAL(NONE(),NONE(),NONE(),(NONE(),NONE()),NONE(),NONE(),SOME(nominal),NONE(),NONE(),NONE(),NONE()));
end match;
end setNominalAttr;

public function setUnitAttr "
sets the unit attribute. .
"
Expand Down
10 changes: 9 additions & 1 deletion Compiler/susan_codegen/SimCode/SimCodeC.tpl
Expand Up @@ -278,7 +278,15 @@ case MODELINFO(varInfo=VARINFO(__), vars=SIMVARS(__)) then
<%globalDataAliasVarArray("DATA_REAL_ALIAS","omc__realAlias", vars.aliasVars)%>
<%globalDataAliasVarArray("DATA_INT_ALIAS","omc__intAlias", vars.intAliasVars)%>
<%globalDataAliasVarArray("DATA_BOOL_ALIAS","omc__boolAlias", vars.boolAliasVars)%>
<%globalDataAliasVarArray("DATA_STRING_ALIAS","omc__stringAlias", vars.stringAliasVars)%>
<%globalDataAliasVarArray("DATA_STRING_ALIAS","omc__stringAlias", vars.stringAliasVars)%>
if (data->nAlias)
memcpy(data->realAlias,omc__realAlias,sizeof(DATA_REAL_ALIAS)*data->nAlias);
if (data->stringVariables.nAlias)
memcpy(data->intVariables.nAlias,omc__realAlias,sizeof(DATA_INT_ALIAS)*data->intVariables.nAlias);
if (data->stringVariables.nAlias)
memcpy(data->boolVariables.nAlias,omc__realAlias,sizeof(DATA_BOOL_ALIAS)*data->boolVariables.nAlias);
if (data->stringVariables.nAlias)
memcpy(data->stringVariables.alias,omc__realAlias,sizeof(DATA_STRING_ALIAS)*data->stringVariables.nAlias);
};

static char init_fixed[NX+NX+NY+NYINT+NYBOOL+NYSTR+NP+NPINT+NPBOOL+NPSTR] = {
Expand Down

0 comments on commit 4002af6

Please sign in to comment.