Skip to content

Commit

Permalink
Fixed bugs with external object and new impl. on strings.
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@2433 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Peter Aronsson committed Jun 21, 2006
1 parent dcdb4c3 commit 0c7ba61
Show file tree
Hide file tree
Showing 9 changed files with 387 additions and 171 deletions.
6 changes: 6 additions & 0 deletions Compiler/Builtin.mo
Expand Up @@ -154,6 +154,10 @@ protected constant list<SCode.Element> stateSelectComps={
protected constant SCode.Class stateSelectType=SCode.CLASS("StateSelect",false,false,SCode.R_ENUMERATION(),
SCode.PARTS(stateSelectComps,{},{},{},{},NONE)) "The State Select Type" ;

public constant SCode.Class ExternalObjectType=SCode.CLASS("ExternalObject",false,false,SCode.R_CLASS(),
SCode.PARTS(
{},{},{},{},{},NONE)) "ExternalObject type" ;

public constant SCode.Class realType=SCode.CLASS("Real",false,false,SCode.R_PREDEFINED_REAL(),
SCode.PARTS(
{unit,quantity,displayUnit,min,max,realStart,fixed,nominal,
Expand Down Expand Up @@ -2490,6 +2494,7 @@ algorithm
env := Env.extendFrameC(env, strType);
env := Env.extendFrameC(env, boolType);
env := Env.extendFrameC(env, enumType);
env := Env.extendFrameC(env, ExternalObjectType);
env := Env.extendFrameC(env, realType);
env := Env.extendFrameC(env, integerType);
env := Env.extendFrameC(env, stringType);
Expand Down Expand Up @@ -2531,6 +2536,7 @@ algorithm
env = Env.extendFrameC(env, strType);
env = Env.extendFrameC(env, boolType);
env = Env.extendFrameC(env, enumType);
env = Env.extendFrameC(env, ExternalObjectType);
env = Env.extendFrameC(env, realType);
env = Env.extendFrameC(env, integerType);
env = Env.extendFrameC(env, stringType);
Expand Down
4 changes: 4 additions & 0 deletions Compiler/Ceval.mo
Expand Up @@ -482,6 +482,7 @@ algorithm

case (cache,env,(e as Exp.CALL(path = func,expLst = expl)),(impl as true),(st as SOME(_)),_,msg)
equation
(cache,false) = Static.isExternalObjectFunction(cache,env,func);
(cache,vallst) = cevalList(cache,env, expl, impl, st, msg) "Call of record constructors, etc., i.e. functions that can be
constant propagated." ;
(cache,newval) = cevalFunction(cache,env, func, vallst, impl, msg);
Expand All @@ -491,6 +492,7 @@ algorithm
case (cache,env,(e as Exp.CALL(path = func,expLst = expl)),(impl as true),(st as SOME(Interactive.SYMBOLTABLE(p,_,_,_,cflist))),_,msg)
equation
true = Static.isFunctionInCflist(cflist, func) "Call externally implemented functions." ;
(cache,false) = Static.isExternalObjectFunction(cache,env,func);
(cache,vallst) = cevalList(cache,env, expl, impl, st, msg);
funcstr = ModUtil.pathString2(func, "_");
infilename = stringAppend(funcstr, "_in.txt");
Expand Down Expand Up @@ -992,6 +994,7 @@ algorithm
funcpath2:=Absyn.stripLast(funcpath);
(_,tp,_) := Lookup.lookupType(cache,env,funcpath2,true);
Types.externalObjectConstructorType(tp);
print("isExternalObjectConstructor: ");print(Absyn.pathString(funcpath));print("\n");
end cevalIsExternalObjectConstructor;

protected function cevalKnownExternalFuncs "function: cevalKnownExternalFuncs
Expand Down Expand Up @@ -4559,6 +4562,7 @@ algorithm
Env.Cache cache;
case (cache,env,path)
equation
(cache,false) = Static.isExternalObjectFunction(cache,env,path); //ext objs functions not possible to ceval.
Debug.fprintln("ceval", "/*- ceval_generate_function starting*/");
pathstr = ModUtil.pathString2(path, "_");
(cache,gencodestr,_) = cevalGenerateFunctionStr(cache,path, env, {});
Expand Down
125 changes: 94 additions & 31 deletions Compiler/Codegen.mo
Expand Up @@ -120,13 +120,26 @@ uniontype CFunction

end CFunction;

public uniontype Context
record CONTEXT
CodeContext codeContext "The context code is generated in, either simulation or function";
ExpContext expContext "The context expressions are generated in, either normal or external calls";
end CONTEXT;
end Context;

public
uniontype Context "Which context is the code generated in."
uniontype CodeContext "Which context is the code generated in."
record SIMULATION "when generating simulation code" end SIMULATION;

record FUNCTION "when generating function code" end FUNCTION;

end Context;
end CodeContext;

public
uniontype ExpContext
record NORMAL "Normal expression generation" end NORMAL;
record EXP_EXTERNAL "for expressions in external calls" end EXP_EXTERNAL;
end ExpContext;

protected import OpenModelica.Compiler.Debug;

Expand Down Expand Up @@ -411,6 +424,27 @@ algorithm
end matchcontinue;
end cPrintFunctions;

public function cPrintDeclarations "
Prints only the local variable declarations of a function to a string"
input CFunction inCFunction;
output String outString;
algorithm
outString:=
matchcontinue (inCFunction)
local
Integer i5;
Lib str,res,rt,fn;
list<Lib> rts,ad,vd,is,st,cl;
case CFUNCTION(returnType = rt,functionName = fn,returnTypeStruct = rts,argumentDeclarationLst = ad,variableDeclarationLst = vd,initStatementLst = is,statementLst = st,cleanupStatementLst = cl)
equation
(i5,str) = cPrintIndentedListStr(vd, 2);
res = stringAppend(str, "\n");
then
res;
end matchcontinue;
end cPrintDeclarations;


public function cPrintStatements "function: cPrintStatements
Only prints the statements of a function to a string
Expand Down Expand Up @@ -1902,15 +1936,15 @@ algorithm
(ret_decl,ret_var,tnr_ret_1) := generateTempDecl(ret_type_str, tnr);
ret_stmt := Util.stringAppendList({"return ",ret_var,";"});
outvars := DAE.getOutputVars(dae);
(out_fn,tnr_ret) := generateAllocOutvars(outvars, ret_decl, ret_var, tnr_ret_1, FUNCTION());
(out_fn,tnr_ret) := generateAllocOutvars(outvars, ret_decl, ret_var, tnr_ret_1, CONTEXT(FUNCTION(),NORMAL()));
(mem_decl,mem_var,tnr_mem) := generateTempDecl("state", tnr_ret);
mem_stmt1 := Util.stringAppendList({mem_var," = get_memory_state();"});
mem_stmt2 := Util.stringAppendList({"restore_memory_state(",mem_var,");"});
mem_fn_1 := cAddVariables(out_fn, {mem_decl});
mem_fn := cAddInits(mem_fn_1, {mem_stmt1});
(var_fn,tnr_var) := generateVars(dae, isVarQ, tnr_mem, FUNCTION());
(alg_fn,tnr_alg) := generateAlgorithms(dae, tnr_var, FUNCTION());
(res_var_fn,tnr_res) := generateResultVars(dae, ret_var, tnr_alg, FUNCTION());
(var_fn,tnr_var) := generateVars(dae, isVarQ, tnr_mem, CONTEXT(FUNCTION(),NORMAL()));
(alg_fn,tnr_alg) := generateAlgorithms(dae, tnr_var, CONTEXT(FUNCTION(),NORMAL()));
(res_var_fn,tnr_res) := generateResultVars(dae, ret_var, tnr_alg, CONTEXT(FUNCTION(),NORMAL()));
cfn_1 := cMergeFn(mem_fn, var_fn);
cfn_2 := cMergeFn(cfn_1, alg_fn);
cfn_3 := cMergeFn(cfn_2, res_var_fn);
Expand Down Expand Up @@ -2063,7 +2097,7 @@ algorithm
case (((var as DAE.VAR(componentRef = cr,varible = vk,variable = vd,input_ = t,one = e,binding = id,dimension = start,value = flow_,flow_ = class_,variableAttributesOption = dae_var_attr,absynCommentOption = comment)) :: r),rv,tnr,extdecl)
equation
DAE.EXTERNALDECL(return = "C") = extdecl;
(cfn1,tnr1) = generateAllocOutvar(var, rv, tnr, FUNCTION());
(cfn1,tnr1) = generateAllocOutvar(var, rv, tnr, CONTEXT(FUNCTION(),NORMAL()));
(cfn2,tnr2) = generateAllocOutvarsExt(r, rv, tnr1, extdecl);
cfn = cMergeFn(cfn1, cfn2);
then
Expand Down Expand Up @@ -2121,7 +2155,7 @@ algorithm
(cref_str1,_) = compRefCstr(id);
cref_str2 = Util.stringAppendList({prefix,".",cref_str1});
cref_str = Util.if_(emptypre, cref_str1, cref_str2);
(cfn1,dim_strs,tnr1) = generateSizeSubscripts(cref_str, inst_dims, tnr, FUNCTION()) " list_reverse inst_dims => inst_dims\' &" ;
(cfn1,dim_strs,tnr1) = generateSizeSubscripts(cref_str, inst_dims, tnr, CONTEXT(FUNCTION(),NORMAL())) " list_reverse inst_dims => inst_dims\' &" ;
cfn1_1 = cMoveStatementsToInits(cfn1);
ndims = listLength(dim_strs);
ndims_str = intString(ndims);
Expand Down Expand Up @@ -2204,7 +2238,7 @@ algorithm
(elty,dims) = Types.flattenArrayType(ty);
dimsubs = Exp.intSubscripts(dims);
tnr = tick();
(cfn1,dim_strs,tnr1) = generateSizeSubscripts(crefstr, dimsubs, tnr, FUNCTION());
(cfn1,dim_strs,tnr1) = generateSizeSubscripts(crefstr, dimsubs, tnr, CONTEXT(FUNCTION(),NORMAL()));
cfn1_1 = cMoveStatementsToInits(cfn1);
typ_str = generateType(ty);
ndims = listLength(dim_strs);
Expand Down Expand Up @@ -2489,10 +2523,11 @@ algorithm
Debug.fprint("failtrace", "# tuple assign statement not implemented\n");
then
fail();
case (Algorithm.ASSERT(exp1 = e1,exp2 = e2),tnr,context)
case (Algorithm.ASSERT(exp1 = e1,exp2 = e2),tnr,CONTEXT(codeContext,_))
local CodeContext codeContext;
equation
(cfn1,var1,tnr1) = generateExpression(e1, tnr, context);
(cfn2,var2,tnr2) = generateExpression(e2, tnr1, context);
(cfn1,var1,tnr1) = generateExpression(e1, tnr, CONTEXT(codeContext,EXP_EXTERNAL()));
(cfn2,var2,tnr2) = generateExpression(e2, tnr1, CONTEXT(codeContext,EXP_EXTERNAL()));
stmt = Util.stringAppendList({"MODELICA_ASSERT(",var1,", ",var2,");"});
cfn2_1 = cAddStatements(cfn2, {stmt});
cfn = cMergeFns({cfn1,cfn2_1});
Expand Down Expand Up @@ -3202,10 +3237,15 @@ algorithm
then
(cEmptyFunction,rstr,tnr);
case (Exp.SCONST(string = s),tnr,context)
local String stmt; CFunction cfn;
equation
sstr = Util.stringAppendList({"\"",s,"\""});
(decl,tvar,tnr1_1) = generateTempDecl("modelica_string", tnr);
stmt = Util.stringAppendList({"init_modelica_string(&",tvar,",\"",s,"\");"});
cfn = cAddStatements(cEmptyFunction, {stmt});
cfn = cAddVariables(cfn, {decl});
tvar = cAddExternalStringData(tvar,context);
then
(cEmptyFunction,sstr,tnr);
(cfn,tvar,tnr1_1);
case (Exp.BCONST(bool = b),tnr,context)
equation
var = Util.if_(b, "(1)", "(0)");
Expand Down Expand Up @@ -3257,12 +3297,16 @@ algorithm
var = Util.stringAppendList({"((",tvar,")?",var2,":",var3,")"});
then
(cfn,var,tnr3);
case ((e as Exp.CALL(path = fn,expLst = args,tuple_ = false,builtin = builtin)),tnr,context) /* some buitlin functions that are e.g. overloaded */

/* some buitlin functions that are e.g. overloaded */
case ((e as Exp.CALL(path = fn,expLst = args,tuple_ = false,builtin = builtin)),tnr,context)
equation
(cfn,var,tnr2) = generateBuiltinFunction(e, tnr, context);
then
(cfn,var,tnr2);
case (Exp.CALL(path = fn,expLst = args,tuple_ = false,builtin = builtin),tnr,context) /* non-tuple calls */

/* non-tuple calls */
case (Exp.CALL(path = fn,expLst = args,tuple_ = false,builtin = builtin),tnr,context)
equation
(cfn1,vars1,tnr1) = generateExpressions(args, tnr, context);
ret_type = generateReturnType(fn);
Expand All @@ -3277,7 +3321,9 @@ algorithm
var = Util.if_(builtin, tvar, var_not_bi);
then
(cfn,var,tnr2);
case (Exp.CALL(path = fn,expLst = args,tuple_ = true,builtin = builtin),tnr,context) /* tuple calls */

/* tuple calls */
case (Exp.CALL(path = fn,expLst = args,tuple_ = true,builtin = builtin),tnr,context)
equation
(cfn1,vars1,tnr1) = generateExpressions(args, tnr, context);
ret_type = generateReturnType(fn);
Expand All @@ -3289,6 +3335,7 @@ algorithm
cfn = cAddStatements(cfn2, {stmt});
then
(cfn,tvar,tnr2);

case (Exp.SIZE(exp = (crexp as Exp.CREF(componentRef = cr,ty = ty)),sz = SOME(dim)),tnr,context)
equation
(cfn1,var1,tnr1) = generateExpression(crexp, tnr, context);
Expand All @@ -3302,6 +3349,7 @@ algorithm
cfn = cAddStatements(cfn4, {stmt});
then
(cfn,tvar,tnr2);

case (Exp.SIZE(exp = cr,sz = NONE),tnr,context)
local Exp.Exp cr;
equation
Expand Down Expand Up @@ -3806,6 +3854,20 @@ algorithm
end matchcontinue;
end generateBinary;

protected function cAddExternalStringData " adds .data to variable names if context is EXP_EXTERNAL, i.e.
for expressions in external function calls."
input String variable;
input Context context;
output String newVariable;

algorithm
newVariable := matchcontinue(variable,context)
case (variable,CONTEXT(_,EXP_EXTERNAL()))
then stringAppend(variable,".data");
case (variable,_) then variable;
end matchcontinue;
end cAddExternalStringData;

protected function generateTempDecl "function: generateTempDecl
Generates code for the declaration of a temporary variable.
Expand Down Expand Up @@ -3941,7 +4003,7 @@ algorithm
list<Integer> dims;
Context context;
list<Exp.Subscript> subs;
case (cref,Exp.T_ARRAY(ty = t,arrayDimensions = dims),tnr,SIMULATION()) /* For context simulation array variables must be boxed
case (cref,Exp.T_ARRAY(ty = t,arrayDimensions = dims),tnr,CONTEXT(SIMULATION(),_)) /* For context simulation array variables must be boxed
into a real_array object since they are represented only
in a double array. */
equation
Expand All @@ -3960,6 +4022,7 @@ algorithm
cfunc = cAddInits(cfunc, {vdecl});
then
(cfunc,vstr,tnr1);

case (cref,crt,tnr,context)
equation
(cref_str,{}) = compRefCstr(cref);
Expand Down Expand Up @@ -4903,8 +4966,8 @@ algorithm
{"char const* in_filename","char const* out_filename"});
out_decl := Util.stringAppendList({retstr," out;"});
cfn1_1 := cAddInits(cfn1, {"PRE_VARIABLES",out_decl});
(cfn31,tnr21) := generateVarDecls(invars, isRcwInput, 1, FUNCTION()) "generate_vars(outvars,is_rcw_output,1) => (cfn2,tnr1) &" ;
(cfn32,tnr2) := generateVarInits(invars, isRcwInput, tnr21, "", FUNCTION());
(cfn31,tnr21) := generateVarDecls(invars, isRcwInput, 1, CONTEXT(FUNCTION(),NORMAL())) "generate_vars(outvars,is_rcw_output,1) => (cfn2,tnr1) &" ;
(cfn32,tnr2) := generateVarInits(invars, isRcwInput, tnr21, "", CONTEXT(FUNCTION(),NORMAL()));
cfn3 := cMergeFns({cfn31,cfn32});
cfn3_1 := cAddInits(cfn3, {"PRE_OPEN_INFILE"});
in_names := invarNames(invars);
Expand Down Expand Up @@ -4952,10 +5015,10 @@ algorithm
cfn1 = cMakeFunction(retstr, fnname, {}, arg_strs);
out_decl = Util.stringAppendList({retstr," out;"});
cfn1_1 = cAddVariables(cfn1, {out_decl});
(cfn31,tnr_invars1) = generateVarDecls(invars, isRcwInput, tnr, FUNCTION());
(cfn32,tnr_invars) = generateVarInits(invars, isRcwInput, tnr_invars1, "", FUNCTION());
(cfn33,tnr_bivars1) = generateVarDecls(bivars, isRcwBidir, tnr_invars, FUNCTION());
(cfn34,tnr_bivars) = generateVarInits(bivars, isRcwBidir, tnr_bivars1, "", FUNCTION());
(cfn31,tnr_invars1) = generateVarDecls(invars, isRcwInput, tnr, CONTEXT(FUNCTION(),NORMAL()));
(cfn32,tnr_invars) = generateVarInits(invars, isRcwInput, tnr_invars1, "", CONTEXT(FUNCTION(),NORMAL()));
(cfn33,tnr_bivars1) = generateVarDecls(bivars, isRcwBidir, tnr_invars, CONTEXT(FUNCTION(),NORMAL()));
(cfn34,tnr_bivars) = generateVarInits(bivars, isRcwBidir, tnr_bivars1, "", CONTEXT(FUNCTION(),NORMAL));
cfn3 = cMergeFns({cfn1_1,cfn31,cfn32,cfn33,cfn34});
vars_1 = listAppend(invars, outvars);
vars = listAppend(vars_1, bivars);
Expand Down Expand Up @@ -5005,18 +5068,18 @@ algorithm
(allocstmts_1,tnr_ret) = generateAllocOutvarsExt(outvars, "out", tnr, extdecl) "generate_vars(outvars,is_rcw_output,1) => (cfn2,tnr1) &" ;
allocstmts = cAddVariables(allocstmts_1, {out_decl});
(biallocstmts,tnr_bialloc_1) = generateAllocOutvarsExt(bivars, "", tnr_ret, extdecl);
(cfnoutinit,tnr_bialloc) = generateVarInits(outvars, isRcwOutput, tnr_bialloc_1, "out", FUNCTION());
(cfnoutinit,tnr_bialloc) = generateVarInits(outvars, isRcwOutput, tnr_bialloc_1, "out", CONTEXT(FUNCTION(),NORMAL()));
cfnoutbialloc = cMergeFns({allocstmts,biallocstmts,cfnoutinit});
(mem_decl,mem_var,tnr_mem) = generateTempDecl("state", tnr_bialloc);
get_mem_stmt = Util.stringAppendList({mem_var," = get_memory_state();"});
rest_mem_stmt = Util.stringAppendList({"restore_memory_state(",mem_var,");"});
mem_fn_1 = cAddVariables(cEmptyFunction, {mem_decl});
mem_fn_2 = cAddInits(mem_fn_1, {get_mem_stmt});
mem_fn = cMergeFns({mem_fn_2,cfnoutbialloc});
(cfn31,tnr_invars1) = generateVarDecls(invars, isRcwInput, tnr_mem, FUNCTION());
(cfn32,tnr_invars) = generateVarInits(invars, isRcwInput, tnr_invars1, "", FUNCTION());
(cfn33,tnr_bivars1) = generateVarDecls(bivars, isRcwBidir, tnr_invars, FUNCTION());
(cfn34,tnr_bivars) = generateVarInits(bivars, isRcwBidir, tnr_bivars1, "", FUNCTION());
(cfn31,tnr_invars1) = generateVarDecls(invars, isRcwInput, tnr_mem, CONTEXT(FUNCTION(),NORMAL()));
(cfn32,tnr_invars) = generateVarInits(invars, isRcwInput, tnr_invars1, "", CONTEXT(FUNCTION(),NORMAL()));
(cfn33,tnr_bivars1) = generateVarDecls(bivars, isRcwBidir, tnr_invars, CONTEXT(FUNCTION(),NORMAL()));
(cfn34,tnr_bivars) = generateVarInits(bivars, isRcwBidir, tnr_bivars1, "", CONTEXT(FUNCTION(),NORMAL()));
cfn3 = cMergeFns({cfn31,cfn32,cfn33,cfn34});
cfn3_1 = cAddInits(cfn3, {"PRE_OPEN_INFILE"});
readinvars = generateRead(invars);
Expand Down Expand Up @@ -5154,7 +5217,7 @@ algorithm
dims_1 = listReverse(dims);
extvar = DAE.VAR(cref_1,vk,vd,ty,value,dims_1,NONE,DAE.NON_FLOW(),{},NONE,
NONE);
(fn,tnr_1) = generateVarDecl(extvar, tnr, FUNCTION());
(fn,tnr_1) = generateVarDecl(extvar, tnr, CONTEXT(FUNCTION(),NORMAL()));
(restfn,tnr_3) = generateExtcallCopydeclsF77(rest, tnr_1);
resfn = cMergeFn(fn, restfn);
then
Expand Down Expand Up @@ -5665,7 +5728,7 @@ algorithm
case arg
equation
DAE.EXTARGEXP(exp = exp,type_ = ty) = arg;
(_,res,_) = generateExpression(exp, 1, FUNCTION());
(_,res,_) = generateExpression(exp, 1, CONTEXT(FUNCTION(),NORMAL()));
then
res;
case ((arg as DAE.EXTARGSIZE(componentRef = _))) /* SIZE */
Expand Down
6 changes: 3 additions & 3 deletions Compiler/Error.mo
Expand Up @@ -355,7 +355,7 @@ protected constant list<tuple<Integer, MessageType, Severity, String>> errorTabl
(REDECLARE_NON_REPLACEABLE,TRANSLATION(),ERROR(),
"Trying to redeclare class %s but class not declared as repleacable"),
(COMPONENT_INPUT_OUTPUT_MISMATCH,TRANSLATION(),ERROR(),
"Component declared as %s when having the variable % declared as input"),
"Component declared as %s when having the variable %s declared as input"),
(ARRAY_DIMENSION_MISMATCH,TRANSLATION(),ERROR(),
"Array dimension mismatch, expression %s has type %s, expected array dimensions [%s]"),
(ARRAY_DIMENSION_INTEGER,TRANSLATION(),ERROR(),
Expand All @@ -367,7 +367,7 @@ protected constant list<tuple<Integer, MessageType, Severity, String>> errorTabl
(TUPLE_ASSIGN_FUNCALL_ONLY,TRANSLATION(),ERROR(),
"Tuple assignment only allowed when rhs is function call (in %s)"),
(INVALID_CONNECTOR_TYPE,TRANSLATION(),ERROR(),
"Cannot connect objects of type %, not a connector."),
"Cannot connect objects of type %s, not a connector."),
(CONNECT_TWO_INPUTS,TRANSLATION(),ERROR(),
"Cannot connect two input variables while connecting %s to %s unless one of them is inside and the other outside connector."),
(CONNECT_TWO_OUTPUTS,TRANSLATION(),ERROR(),
Expand Down Expand Up @@ -417,7 +417,7 @@ protected constant list<tuple<Integer, MessageType, Severity, String>> errorTabl
(ARGUMENT_MUST_BE_DISCRETE_VAR,TRANSLATION(),ERROR(),
"%s argument to %s must be discrete variable"),
(TYPE_MUST_BE_SIMPLE,TRANSLATION(),ERROR(),
"Type in % must be simple type"),
"Type in %s must be simple type"),
(ARGUMENT_MUST_BE_VARIABLE,TRANSLATION(),ERROR(),
"%s argument to %s must be a variable"),
(NO_MATCHING_FUNCTION_FOUND,TRANSLATION(),ERROR(),
Expand Down

0 comments on commit 0c7ba61

Please sign in to comment.