Skip to content

Commit

Permalink
enumeration string(enum.e1) = e1
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@4509 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
Jens Frenkel committed Nov 14, 2009
1 parent c43b3a4 commit bf92899
Show file tree
Hide file tree
Showing 5 changed files with 99 additions and 23 deletions.
40 changes: 36 additions & 4 deletions Compiler/Codegen.mo
Expand Up @@ -5142,8 +5142,8 @@ algorithm
(cfn,tvar,tnr2);

case (Exp.CALL(path = Absyn.IDENT(name = "String"),expLst = {s,minlen,leftjust,signdig},tuple_ = false,builtin = true),tnr,context) /* max(v), v is vector */
local String cref_str; Exp.Exp s,minlen,leftjust,signdig; Boolean needCast; String var1,var2,var3,var4;
CFunction cfn3,cfn4;
local String cref_str; Exp.Exp s,minlen,leftjust,signdig; Boolean needCast; String var3,var4,var5,var6,var7,edecl,evar;
CFunction cfn3,cfn4; Boolean isenum; list<Lib> tedcllst;
equation
tp = Exp.typeof(s);
tp_str = expTypeStr(tp, false);
Expand All @@ -5152,8 +5152,13 @@ algorithm
(cfn2,var2,tnr1) = generateExpression(minlen, tnr1, context);
(cfn3,var3,tnr1) = generateExpression(leftjust, tnr1, context);
(cfn4,var4,tnr1) = generateExpression(signdig, tnr1, context);
cfn = cAddVariables(cEmptyFunction, {tdecl});
stmt = Util.stringAppendList({tp_str,"_to_modelica_string(&",tvar,",",var1,",",var2,",",var3,",",var4,");"});
(var5,isenum) = Exp.printEnumLiteralArray(tp);
(edecl,evar,tnr1) = generateTempDeclWithAssignment("modelica_string", tnr1,"[]",var5);
var6 = Util.stringAppendList({var1,",",evar});
var7 = Util.if_(isenum, var6, var1);
tedcllst = Util.if_(isenum, {tdecl,edecl}, {tdecl});
cfn = cAddVariables(cEmptyFunction, tedcllst);
stmt = Util.stringAppendList({tp_str,"_to_modelica_string(&",tvar,",",var7,",",var2,",",var3,",",var4,");"});
cfn = cAddStatements(cfn, {stmt});
cfn = cMergeFns({cfn1,cfn2,cfn3,cfn4,cfn});
then
Expand Down Expand Up @@ -5631,6 +5636,33 @@ algorithm
end matchcontinue;
end generateTempDecl;

protected function generateTempDeclWithAssignment
"function: generateTempDecl
Generates code for the declaration of a temporary variable."
input String inStringType;
input Integer inInteger;
input String inStringType1;
input String inStringAssignment;
output String outStringDecl;
output String outStringRef;
output Integer outInteger3;
algorithm
(outStringDecl,outStringRef,outInteger3):=
matchcontinue (inStringType,inInteger,inStringType1,inStringAssignment)
local
Lib tnr_str,tmp_name,t_1,t,a,t_2;
Integer tnr_1,tnr;
case (t,tnr,t_2,a)
equation
tnr_str = intString(tnr);
tnr_1 = tnr + 1;
tmp_name = stringAppend("tmp", tnr_str);
t_1 = Util.stringAppendList({t," ",tmp_name,t_2,"=",a,";"});
then
(t_1,tmp_name,tnr_1);
end matchcontinue;
end generateTempDeclWithAssignment;

protected function generateTempDeclList
"function: generateTempDeclList
Generates code for the declaration of temporary variables."
Expand Down
24 changes: 24 additions & 0 deletions Compiler/Exp.mo
Expand Up @@ -11385,6 +11385,30 @@ algorithm
end matchcontinue;
end getEnumIndexfromCref;

public function printEnumLiteralArray "function: printEnumLiteralArray
Evaluates ComponentRef, i.e. variables, by
looking up variables in the environment."
input Type inType;
output String outString;
output Boolean outIsEnum;
algorithm
(outString,outIsEnum) :=
matchcontinue (inType)
local
list<Ident> names;
String namestr,nn;
case ENUMERATION(_,_,names,_)
local String index;
equation
nn = Util.stringDelimitList(names,"\",\"");
namestr = Util.stringAppendList({"{\"",nn,"\"}"});
then
(namestr,true);
case (_) then ("",false);
end matchcontinue;
end printEnumLiteralArray;


public function getEnumTypefromCref "function: getEnumIndexfromCref
Evaluates ComponentRef, i.e. variables, by
looking up variables in the environment."
Expand Down
40 changes: 30 additions & 10 deletions Compiler/SimCodegen.mo
Expand Up @@ -1510,6 +1510,12 @@ algorithm
str_arr_1 = generateAttrVectorType2(vs, str_arr, nx, ny, np);
then
str_arr_1;
case ((v :: vs),str_arr,nx,ny,np) /* skip strings */
equation
DAELow.STRING() = DAELow.varType(v);
str_arr_1 = generateAttrVectorType2(vs, str_arr, nx, ny, np);
then
str_arr_1;
case ((v :: vs),str_arr,nx,ny,np)
equation
kind = DAELow.varKind(v);
Expand Down Expand Up @@ -1627,6 +1633,12 @@ algorithm
str_arr_1 = generateAttrVectorType2(vs, str_arr, nx, ny, np);
then
str_arr_1;
case ((v :: vs),str_arr,nx,ny,np) /* skip strings */
equation
DAELow.STRING() = DAELow.varType(v);
str_arr_1 = generateAttrVectorType2(vs, str_arr, nx, ny, np);
then
str_arr_1;
case ((v :: vs),str_arr,nx,ny,np)
equation
kind = DAELow.varKind(v);
Expand Down Expand Up @@ -1813,6 +1825,12 @@ algorithm
str_arr_1 = generateFixedVector3(vs, str_arr, nx, ny, np);
then
str_arr_1;
case ((v :: vs),str_arr,nx,ny,np) /* skip strings */
equation
DAELow.STRING() = DAELow.varType(v);
str_arr_1 = generateFixedVector3(vs, str_arr, nx, ny, np);
then
str_arr_1;
case ((v :: vs),str_arr,nx,ny,np)
equation
kind = DAELow.varKind(v);
Expand Down Expand Up @@ -1950,15 +1968,15 @@ algorithm
list<DAELow.Var> var_lst,knvar_lst,extvar_lst;
String[:] state_arr,derivative_arr,algvar_arr,param_arr,state_comment_arr,derivative_comment_arr,algvar_comment_arr,param_comment_arr,strparam_arr,strparam_comment_arr,stralg_arr,stralg_comment_arr;
Integer num_state_2,num_derivative_2,num_algvars_2,num_input_2,num_output_2,num_param_2;
Integer num_var_names,num_var_names_1,nx,ny,ni,no,np,next,num_stralg,num_strparam;
Integer num_var_names,num_var_names_1,nx,ny,ni,no,np,nys,nps,next,num_stralg,num_strparam;
list<String> input_arr,input_comment_arr,output_arr,output_comment_arr,get_name_function_ifs,var_defines,var_defines_1,state_str_1,derivative_str_1,algvars_str_1,param_str_1,state_comment_str_1,derivative_comment_str_1,algvars_comment_str_1,param_comment_str_1;
list<String> stralg_str_1,strparam_str_1,stralg_comment_str_1,strparam_comment_str_1;
String get_name_function_ifs_1,state_str_2,derivative_str_2,algvars_str_2,input_str_2,output_str_2,param_str_2,state_comment_str_2,derivative_comment_str_2,algvars_comment_str_2,input_comment_str_2,output_comment_str_2,param_comment_str_2,var_names,var_names_1,state_str_3,der_str_3,algvar_str_3,inputvar_str_3,outputvar_str_3,paramvar_str_3,res,state_comment_lst_1,der_comment_lst_1,algvar_comment_lst_1,inputvar_comment_lst_1,outputvar_comment_lst_1,paramvar_comment_lst_1,res2,get_name_function,var_defines_str;
String strparam_comment_str_2,stralg_comment_str_2,stralg_str_2,strparam_str_2,stralg_str_3,strparam_str_3;
String strparam_comment_lst_1,stralg_comment_lst_1;
DAELow.Variables vars,knvars,extvars;
case (DAELow.DAELOW(orderedVars = vars,knownVars = knvars,externalObjects = extvars),
nx,ny,ni,no,np,next,num_stralg,num_strparam)
nx,ny,ni,no,np,next,nys,nps)
equation
var_lst = DAELow.varList(vars);
knvar_lst = DAELow.varList(knvars);
Expand All @@ -1972,10 +1990,10 @@ algorithm
derivative_comment_arr = fill("\" ERROR\"", nx);
algvar_comment_arr = fill("\" ERROR\"", ny);
param_comment_arr = fill("\" ERROR\"", np);
stralg_arr = fill("\" stringalg ERROR\"", num_stralg);
stralg_comment_arr = fill("\" ERROR\"", num_stralg);
strparam_arr = fill("\" stringalg ERROR\"", num_strparam);
strparam_comment_arr = fill("\" ERROR\"", num_strparam);
stralg_arr = fill("\" stringalg ERROR\"", nys);
stralg_comment_arr = fill("\" ERROR\"", nys);
strparam_arr = fill("\" stringparam ERROR\"", nps);
strparam_comment_arr = fill("\" ERROR\"", nps);

/* Variable list*/
(state_arr,state_comment_arr,num_state_2,derivative_arr,derivative_comment_arr,
Expand All @@ -1986,7 +2004,7 @@ algorithm
= generateVarNamesAndComments2(var_lst, state_arr, state_comment_arr, 0, derivative_arr,
derivative_comment_arr, 0, algvar_arr, algvar_comment_arr, 0, {}, {}, 0, {}, {}, 0,
param_arr, param_comment_arr, 0,
stralg_arr,stralg_comment_arr,num_stralg,strparam_arr,strparam_comment_arr,num_strparam,
stralg_arr,stralg_comment_arr,0,strparam_arr,strparam_comment_arr,0,
{}, {}) ;

/* Known variable list*/
Expand Down Expand Up @@ -2024,6 +2042,8 @@ algorithm
num_output_2 = no;
num_input_2 = ni;
num_param_2 = np;
num_stralg = nys;
num_strparam = nps;

// Generate array of variable names

Expand All @@ -2050,7 +2070,7 @@ algorithm
outputvar_str_3 = generateCDeclForStringArray(outputNames, output_str_2, num_output_2);
paramvar_str_3 = generateCDeclForStringArray(paramNames, param_str_2, num_param_2);
stralg_str_3 = generateCDeclForStringArray(stringAlgNames, stralg_str_2, num_stralg);
strparam_str_3 = generateCDeclForStringArray(stringParamNames, stralg_str_2, num_stralg);
strparam_str_3 = generateCDeclForStringArray(stringParamNames, strparam_str_2, num_strparam);

res = Util.stringAppendList(
{state_str_3,der_str_3,algvar_str_3,inputvar_str_3,
Expand Down Expand Up @@ -2082,8 +2102,8 @@ algorithm
inputvar_comment_lst_1 = generateCDeclForStringArray(inputComments, input_comment_str_2, num_input_2);
outputvar_comment_lst_1 = generateCDeclForStringArray(outputComments, output_comment_str_2, num_output_2);
paramvar_comment_lst_1 = generateCDeclForStringArray(paramComments, param_comment_str_2, num_param_2);
strparam_comment_lst_1 = generateCDeclForStringArray(stringParamComments, param_comment_str_2, num_param_2);
stralg_comment_lst_1 = generateCDeclForStringArray(stringAlgComments, param_comment_str_2, num_param_2);
strparam_comment_lst_1 = generateCDeclForStringArray(stringParamComments, strparam_comment_str_2, num_strparam);
stralg_comment_lst_1 = generateCDeclForStringArray(stringAlgComments, stralg_comment_str_2, num_stralg);

res2 = Util.stringAppendList(
{state_comment_lst_1,der_comment_lst_1,algvar_comment_lst_1,
Expand Down
16 changes: 8 additions & 8 deletions c_runtime/modelica_string.c
Expand Up @@ -90,15 +90,15 @@ void modelica_boolean_to_modelica_string(modelica_string_t* dest,modelica_boolea

/* Convert a modelica_enumeration to a modelica_string, used in String(b) */

void modelica_enumeration_to_modelica_string(modelica_string_t* dest,modelica_string_t* e,modelica_integer minLen, modelica_boolean leftJustified, modelica_integer signDigits)
void modelica_enumeration_to_modelica_string(modelica_string_t* dest,modelica_integer nr,modelica_string_t e[],modelica_integer minLen, modelica_boolean leftJustified, modelica_integer signDigits)
{
modelica_string_t* pdummy=0;
init_modelica_string(pdummy,"String(Enumeration) not yet implemented\n");
/* free dest */
if (dest != 0) free_modelica_string(dest);
/* copy */
/* copy_modelica_string(e,dest); */
copy_modelica_string(pdummy ,dest);
int i;
int length = strlen(e[nr-1]);
alloc_modelica_string(dest, length);
for (i = 0; i<length; ++i) {
(*dest)[i] = e[nr-1][i];
}
(*dest)[i]=0;
}


Expand Down
2 changes: 1 addition & 1 deletion c_runtime/modelica_string.h
Expand Up @@ -54,7 +54,7 @@ void modelica_integer_to_modelica_string(modelica_string_t* dest,modelica_intege
void modelica_boolean_to_modelica_string(modelica_string_t* dest,modelica_boolean b,
modelica_integer minLen, modelica_boolean leftJustified, modelica_integer signDigits);

void modelica_enumeration_to_modelica_string(modelica_string_t* dest,modelica_string_t* e,
void modelica_enumeration_to_modelica_string(modelica_string_t* dest,modelica_integer nr, modelica_string_t e[],
modelica_integer minLen, modelica_boolean leftJustified, modelica_integer signDigits);


Expand Down

0 comments on commit bf92899

Please sign in to comment.