Skip to content
This repository was archived by the owner on May 18, 2019. It is now read-only.

Commit 88fee4f

Browse files
adeas31OpenModelica-Hudson
authored andcommitted
New API to get initial states.
1 parent 591485e commit 88fee4f

File tree

2 files changed

+206
-51
lines changed

2 files changed

+206
-51
lines changed

Compiler/FrontEnd/ModelicaBuiltin.mo

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3967,6 +3967,17 @@ annotation(preferredView="text",Documentation(info="<html>
39673967
</html>"));
39683968
end updateTransition;
39693969

3970+
function getInitialStates
3971+
input TypeName cl;
3972+
output String[:,:] initialStates;
3973+
external "builtin";
3974+
annotation(
3975+
Documentation(info="<html>
3976+
<p>Returns list of initial states for the given class.</p>
3977+
<p>Each initial state item contains 2 values i.e, state name and annotation.</p>
3978+
</html>"), preferredView="text");
3979+
end getInitialStates;
3980+
39703981
function generateScriptingAPI
39713982
input TypeName cl;
39723983
input String name;

Compiler/Script/CevalScriptBackend.mo

Lines changed: 195 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -990,6 +990,22 @@ algorithm
990990
then
991991
(cache,Values.BOOL(false),st);
992992

993+
case (cache,_,"getInitialStates",{Values.CODE(Absyn.C_TYPENAME(className))},st as GlobalScript.SYMBOLTABLE(ast=p),_)
994+
equation
995+
cr_1 = Absyn.pathToCref(className);
996+
false = Interactive.existClass(cr_1, p);
997+
str = Absyn.pathString(className);
998+
Error.addMessage(Error.LOOKUP_ERROR, {str,"<TOP>"});
999+
then (cache, Values.ARRAY({},{}), st);
1000+
1001+
case (cache,_,"getInitialStates",{Values.CODE(Absyn.C_TYPENAME(className))},st as GlobalScript.SYMBOLTABLE(),_)
1002+
equation
1003+
v = getInitialStates(className, st.ast);
1004+
then (cache, v, st);
1005+
1006+
case (cache,_,"getInitialStates",_,st,_)
1007+
then (cache, Values.ARRAY({},{}), st);
1008+
9931009
case (cache,_,"diffModelicaFileListings",{Values.STRING(s1),Values.STRING(s2),Values.ENUM_LITERAL(name=path)},(st as GlobalScript.SYMBOLTABLE()),_)
9941010
algorithm
9951011
ExecStat.execStatReset();
@@ -6916,6 +6932,73 @@ algorithm
69166932
end matchcontinue;
69176933
end getClassComment;
69186934

6935+
protected function getAnnotationInEquation
6936+
"This function takes an `EquationItem\' and returns a comma separated
6937+
string of values from the flat record of an equation annotation that
6938+
is found in the `EquationItem\'."
6939+
input Absyn.EquationItem inEquationItem;
6940+
output String outString;
6941+
algorithm
6942+
outString := match (inEquationItem)
6943+
local
6944+
String annotationStr;
6945+
list<String> annotationList;
6946+
list<Absyn.ElementArg> annotations;
6947+
6948+
case (Absyn.EQUATIONITEM(comment = SOME(Absyn.COMMENT(SOME(Absyn.ANNOTATION(annotations)),_))))
6949+
equation
6950+
annotationList = getAnnotationInEquationElArgs(annotations);
6951+
annotationStr = stringDelimitList(annotationList, ", ");
6952+
then
6953+
annotationStr;
6954+
case (Absyn.EQUATIONITEM(comment = NONE()))
6955+
then
6956+
"";
6957+
end match;
6958+
end getAnnotationInEquation;
6959+
6960+
protected function getAnnotationInEquationElArgs
6961+
input list<Absyn.ElementArg> inElArgLst;
6962+
output list<String> outStringLst;
6963+
algorithm
6964+
outStringLst := matchcontinue (inElArgLst)
6965+
local
6966+
Absyn.FunctionArgs fargs;
6967+
list<SCode.Element> p_1;
6968+
FCore.Graph env;
6969+
DAE.Exp newexp;
6970+
String gexpstr, gexpstr_1, annName;
6971+
list<String> res;
6972+
list<Absyn.ElementArg> mod, rest;
6973+
FCore.Cache cache;
6974+
DAE.Properties prop;
6975+
Absyn.Program lineProgram;
6976+
6977+
// handle empty
6978+
case ({}) then {};
6979+
6980+
case (Absyn.MODIFICATION(path = Absyn.IDENT(annName), modification = SOME(Absyn.CLASSMOD(mod,_))) :: rest)
6981+
equation
6982+
lineProgram = Interactive.modelicaAnnotationProgram(Config.getAnnotationVersion());
6983+
fargs = Interactive.createFuncargsFromElementargs(mod);
6984+
p_1 = SCodeUtil.translateAbsyn2SCode(lineProgram);
6985+
(cache,env) = Inst.makeEnvFromProgram(p_1);
6986+
(_,newexp,prop) = StaticScript.elabGraphicsExp(cache,env, Absyn.CALL(Absyn.CREF_IDENT(annName,{}),fargs), false,Prefix.NOPRE(), sourceInfo()) "impl" ;
6987+
(cache, newexp, prop) = Ceval.cevalIfConstant(cache, env, newexp, prop, false, sourceInfo());
6988+
Print.clearErrorBuf() "this is to clear the error-msg generated by the annotations." ;
6989+
gexpstr = ExpressionDump.printExpStr(newexp);
6990+
res = getAnnotationInEquationElArgs(rest);
6991+
then
6992+
(gexpstr :: res);
6993+
case (Absyn.MODIFICATION(path = Absyn.IDENT(annName), modification = SOME(Absyn.CLASSMOD(_,Absyn.NOMOD()))) :: rest)
6994+
equation
6995+
gexpstr_1 = stringAppendList({annName,"(error)"});
6996+
res = getAnnotationInEquationElArgs(rest);
6997+
then
6998+
(gexpstr_1 :: res);
6999+
end matchcontinue;
7000+
end getAnnotationInEquationElArgs;
7001+
69197002
protected function getTransitions
69207003
input Absyn.Path path;
69217004
input Absyn.Program p;
@@ -7004,7 +7087,7 @@ algorithm
70047087
case (((eqItem as Absyn.EQUATIONITEM(equation_ = eq as Absyn.EQ_NORETCALL(functionName = Absyn.CREF_IDENT(name = "transition")))) :: xs),transitions)
70057088
equation
70067089
transition = getTransitionInEquation(eq);
7007-
transition = List.insert(transition, listLength(transition) + 1, getTransitionAnnotation(eqItem));
7090+
transition = List.insert(transition, listLength(transition) + 1, getAnnotationInEquation(eqItem));
70087091
transitions = listAppend({transition}, transitions);
70097092
then
70107093
getTransitionsInEquations(xs, transitions);
@@ -7049,72 +7132,133 @@ algorithm
70497132
end match;
70507133
end getTransitionInEquation;
70517134

7052-
protected function getTransitionAnnotation
7053-
"This function takes an `EquationItem\' and returns a comma separated
7054-
string of values from the flat record of a connection annotation that
7055-
is found in the `EquationItem\'."
7056-
input Absyn.EquationItem inEquationItem;
7057-
output String outString;
7135+
protected function getInitialStates
7136+
input Absyn.Path path;
7137+
input Absyn.Program p;
7138+
output Values.Value res;
7139+
protected
7140+
list<list<String>> initialStates;
7141+
Absyn.Class cdef;
70587142
algorithm
7059-
outString := match (inEquationItem)
7143+
cdef := Interactive.getPathedClassInProgram(path, p);
7144+
initialStates := listReverse(getInitialStatesInClass(cdef));
7145+
res := ValuesUtil.makeArray(List.map(initialStates, ValuesUtil.makeStringArray));
7146+
end getInitialStates;
7147+
7148+
protected function getInitialStatesInClass
7149+
"Gets the list of initial states in a class."
7150+
input Absyn.Class inClass;
7151+
output list<list<String>> outInitialStates;
7152+
algorithm
7153+
outInitialStates := match (inClass)
70607154
local
7061-
String annotationStr;
7062-
list<String> annotationList;
7063-
list<Absyn.ElementArg> annotations;
7155+
list<list<String>> initialStates;
7156+
list<Absyn.ClassPart> parts;
70647157

7065-
case (Absyn.EQUATIONITEM(comment = SOME(Absyn.COMMENT(SOME(Absyn.ANNOTATION(annotations)),_))))
7158+
case Absyn.CLASS(body = Absyn.PARTS(classParts = parts))
70667159
equation
7067-
annotationList = getTransitionAnnotationElArgs(annotations);
7068-
annotationStr = stringDelimitList(annotationList, ", ");
7160+
initialStates = getInitialStatesInClassParts(parts);
70697161
then
7070-
annotationStr;
7071-
case (Absyn.EQUATIONITEM(comment = NONE()))
7162+
initialStates;
7163+
7164+
// handle also the case model extends X end X;
7165+
case Absyn.CLASS(body = Absyn.CLASS_EXTENDS(parts = parts))
7166+
equation
7167+
initialStates = getInitialStatesInClassParts(parts);
70727168
then
7073-
"";
7169+
initialStates;
7170+
7171+
case Absyn.CLASS(body = Absyn.DERIVED()) then {};
7172+
70747173
end match;
7075-
end getTransitionAnnotation;
7174+
end getInitialStatesInClass;
70767175

7077-
protected function getTransitionAnnotationElArgs
7078-
input list<Absyn.ElementArg> inElArgLst;
7079-
output list<String> outStringLst;
7176+
protected function getInitialStatesInClassParts
7177+
"Helper function for getInitialStatesInClass."
7178+
input list<Absyn.ClassPart> inAbsynClassPartLst;
7179+
output list<list<String>> outInitialStates;
70807180
algorithm
7081-
outStringLst := matchcontinue (inElArgLst)
7181+
outInitialStates := matchcontinue (inAbsynClassPartLst)
70827182
local
7083-
Absyn.FunctionArgs fargs;
7084-
list<SCode.Element> p_1;
7085-
FCore.Graph env;
7086-
DAE.Exp newexp;
7087-
String gexpstr, gexpstr_1, annName;
7088-
list<String> res;
7089-
list<Absyn.ElementArg> mod, rest;
7090-
FCore.Cache cache;
7091-
DAE.Properties prop;
7092-
Absyn.Program lineProgram;
7093-
7094-
// handle empty
7095-
case ({}) then {};
7183+
list<list<String>> initialStates1, initialStates2;
7184+
list<Absyn.EquationItem> eqlist;
7185+
list<Absyn.ClassPart> xs;
70967186

7097-
case (Absyn.MODIFICATION(path = Absyn.IDENT(annName), modification = SOME(Absyn.CLASSMOD(mod,_))) :: rest)
7187+
case ((Absyn.EQUATIONS(contents = eqlist) :: xs))
70987188
equation
7099-
lineProgram = Interactive.modelicaAnnotationProgram(Config.getAnnotationVersion());
7100-
fargs = Interactive.createFuncargsFromElementargs(mod);
7101-
p_1 = SCodeUtil.translateAbsyn2SCode(lineProgram);
7102-
(cache,env) = Inst.makeEnvFromProgram(p_1);
7103-
(_,newexp,prop) = StaticScript.elabGraphicsExp(cache,env, Absyn.CALL(Absyn.CREF_IDENT(annName,{}),fargs), false,Prefix.NOPRE(), sourceInfo()) "impl" ;
7104-
(cache, newexp, prop) = Ceval.cevalIfConstant(cache, env, newexp, prop, false, sourceInfo());
7105-
Print.clearErrorBuf() "this is to clear the error-msg generated by the annotations." ;
7106-
gexpstr = ExpressionDump.printExpStr(newexp);
7107-
res = getTransitionAnnotationElArgs(rest);
7189+
initialStates1 = getInitialStatesInEquations(eqlist, {});
7190+
initialStates2 = getInitialStatesInClassParts(xs);
71087191
then
7109-
(gexpstr :: res);
7110-
case (Absyn.MODIFICATION(path = Absyn.IDENT(annName), modification = SOME(Absyn.CLASSMOD(_,Absyn.NOMOD()))) :: rest)
7192+
listAppend(initialStates1, initialStates2);
7193+
7194+
case ((_ :: xs))
71117195
equation
7112-
gexpstr_1 = stringAppendList({annName,"(error)"});
7113-
res = getTransitionAnnotationElArgs(rest);
7196+
initialStates1 = getInitialStatesInClassParts(xs);
71147197
then
7115-
(gexpstr_1 :: res);
7198+
initialStates1;
7199+
7200+
case ({})
7201+
then {};
7202+
71167203
end matchcontinue;
7117-
end getTransitionAnnotationElArgs;
7204+
end getInitialStatesInClassParts;
7205+
7206+
protected function getInitialStatesInEquations
7207+
"Helper function for getInitialStatesInClass."
7208+
input list<Absyn.EquationItem> inAbsynEquationItemLst;
7209+
input list<list<String>> inInitialStates;
7210+
output list<list<String>> outInitialStates;
7211+
algorithm
7212+
outInitialStates := match (inAbsynEquationItemLst, inInitialStates)
7213+
local
7214+
list<list<String>> initialStates;
7215+
list<String> initialState;
7216+
Absyn.EquationItem eqItem;
7217+
Absyn.Equation eq;
7218+
list<Absyn.EquationItem> xs;
7219+
7220+
case (((eqItem as Absyn.EQUATIONITEM(equation_ = eq as Absyn.EQ_NORETCALL(functionName = Absyn.CREF_IDENT(name = "initialState")))) :: xs),initialStates)
7221+
equation
7222+
initialState = getInitialStateInEquation(eq);
7223+
initialState = List.insert(initialState, listLength(initialState) + 1, getAnnotationInEquation(eqItem));
7224+
initialStates = listAppend({initialState}, initialStates);
7225+
then
7226+
getInitialStatesInEquations(xs, initialStates);
7227+
7228+
case ((_ :: xs), _)
7229+
then
7230+
getInitialStatesInEquations(xs, inInitialStates);
7231+
7232+
case ({}, _)
7233+
then
7234+
inInitialStates;
7235+
7236+
end match;
7237+
end getInitialStatesInEquations;
7238+
7239+
protected function getInitialStateInEquation
7240+
"Initial state is a Absyn.EQ_NORETCALL.
7241+
So we read the function arguments and named arguments.
7242+
This function should always return a list with 1 value."
7243+
input Absyn.Equation inEquation;
7244+
output list<String> outInitialState;
7245+
algorithm
7246+
outInitialState := match (inEquation)
7247+
local
7248+
list<Absyn.Exp> expArgs;
7249+
list<Absyn.NamedArg> namedArgs;
7250+
list<String> initialState;
7251+
7252+
case Absyn.EQ_NORETCALL(functionArgs = Absyn.FUNCTIONARGS(args = expArgs, argNames = namedArgs))
7253+
equation
7254+
initialState = List.map(expArgs, Dump.printExpStr);
7255+
then
7256+
initialState;
7257+
7258+
else {""};
7259+
7260+
end match;
7261+
end getInitialStateInEquation;
71187262

71197263
function getComponentInfo
71207264
input Absyn.Element comp;

0 commit comments

Comments
 (0)