Skip to content

Commit

Permalink
- Generate TypeDefinitions in the FMU modelDescription xml file.
Browse files Browse the repository at this point in the history
- This might break FMI tests.

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19959 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
adeas31 committed Apr 3, 2014
1 parent 9c14b99 commit 7550ab7
Show file tree
Hide file tree
Showing 5 changed files with 199 additions and 7 deletions.
131 changes: 131 additions & 0 deletions Compiler/BackEnd/SimCodeUtil.mo
Expand Up @@ -12157,4 +12157,135 @@ algorithm
end match;
end variableString;

public function getEnumerationTypes
input SimCode.SimVars inVars;
output list<SimCode.SimVar> outVars;
algorithm
outVars := match (inVars)
local
list<SimCode.SimVar> _stateVars, _enumStateVars;
list<SimCode.SimVar> _derivativeVars, _enumDerivativeVars;
list<SimCode.SimVar> _inlineVars, _enumInlineVars;
list<SimCode.SimVar> _algVars, _enumAlgVars;
list<SimCode.SimVar> _intAlgVars, _enumIntAlgVars;
list<SimCode.SimVar> _boolAlgVars, _enumBoolAlgVars;
list<SimCode.SimVar> _inputVars, _enumInputVars;
list<SimCode.SimVar> _outputVars, _enumOutputVars;
list<SimCode.SimVar> _aliasVars, _enumAliasVars;
list<SimCode.SimVar> _intAliasVars, _enumIntAliasVars;
list<SimCode.SimVar> _boolAliasVars, _enumBoolAliasVars;
list<SimCode.SimVar> _paramVars, _enumParamVars;
list<SimCode.SimVar> _intParamVars, _enumIntParamVars;
list<SimCode.SimVar> _boolParamVars, _enumBoolParamVars;
list<SimCode.SimVar> _stringAlgVars, _enumStringAlgVars;
list<SimCode.SimVar> _stringParamVars, _enumStringParamVars;
list<SimCode.SimVar> _stringAliasVars, _enumStringAliasVars;
list<SimCode.SimVar> _extObjVars, _enumExtObjVars;
list<SimCode.SimVar> _constVars, _enumConstVars;
list<SimCode.SimVar> _intConstVars, _enumIntConstVars;
list<SimCode.SimVar> _boolConstVars, _enumBoolConstVars;
list<SimCode.SimVar> _stringConstVars, _enumStringConstVars;
list<SimCode.SimVar> _jacobianVars, _enumJacobianVars;
list<SimCode.SimVar> _realOptimizeConstraintsVars, _enumRealOptimizeConstraintsVars;
list<SimCode.SimVar> tempEnumTypesList, enumTypesList;
case (SimCode.SIMVARS(stateVars = _stateVars, derivativeVars = _derivativeVars, inlineVars = _inlineVars, algVars = _algVars, intAlgVars = _intAlgVars,
boolAlgVars = _boolAlgVars, inputVars = _inputVars, outputVars = _outputVars, aliasVars = _aliasVars, intAliasVars = _intAliasVars,
boolAliasVars = _boolAliasVars, paramVars = _paramVars, intParamVars = _intParamVars, boolParamVars = _boolParamVars,
stringAlgVars = _stringAlgVars, stringParamVars = _stringParamVars, stringAliasVars = _stringAliasVars, extObjVars = _extObjVars,
constVars = _constVars, intConstVars = _intConstVars, boolConstVars = _boolConstVars, stringConstVars = _stringConstVars,
jacobianVars = _jacobianVars, realOptimizeConstraintsVars = _realOptimizeConstraintsVars))
equation
enumTypesList = getEnumerationTypesHelper(_stateVars);
tempEnumTypesList = getEnumerationTypesHelper(_derivativeVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_inlineVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_algVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_intAlgVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_boolAlgVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_inputVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_outputVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_aliasVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_intAliasVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_boolAliasVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_paramVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_intParamVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_boolParamVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_stringAlgVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_stringParamVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_stringAliasVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_extObjVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_constVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_intConstVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_boolConstVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_stringConstVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_jacobianVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
tempEnumTypesList = getEnumerationTypesHelper(_realOptimizeConstraintsVars);
enumTypesList = listAppend(enumTypesList, tempEnumTypesList);
enumTypesList = List.uniqueOnTrue(enumTypesList, compareEnumerationTypes);
then
enumTypesList;
case (_) then {};
end match;
end getEnumerationTypes;

protected function getEnumerationTypesHelper
input list<SimCode.SimVar> inVars;
output list<SimCode.SimVar> outVars;
algorithm
outVars := matchcontinue (inVars)
local
list<SimCode.SimVar> enumVars;
list<SimCode.SimVar> vars;
SimCode.SimVar var;
case ((var as SimCode.SIMVAR(type_ = DAE.T_ENUMERATION(_, _, _, _, _, _))) :: vars)
equation
enumVars = getEnumerationTypesHelper(vars);
then
var::enumVars;
case ((_ :: vars))
equation
enumVars = getEnumerationTypesHelper(vars);
then
enumVars;
case ({}) then {};
end matchcontinue;
end getEnumerationTypesHelper;

protected function compareEnumerationTypes
input SimCode.SimVar var;
input SimCode.SimVar var1;
output Boolean b;
algorithm
b := match (var, var1)
local
DAE.Type ty, ty1;
case (SimCode.SIMVAR(type_ = ty), SimCode.SIMVAR(type_ = ty1))
equation
true = Types.equivtypes(ty, ty1);
then true;
else false;
end match;
end compareEnumerationTypes;

end SimCodeUtil;
8 changes: 8 additions & 0 deletions Compiler/FrontEnd/Absyn.mo
Expand Up @@ -2809,6 +2809,14 @@ algorithm
end match;
end pathString2;

public function pathString2NoLeadingDot "Tail-recursive version, with string builder (stringDelimitList is optimised)"
input Path path;
input String delimiter;
output String outString;
algorithm
outString := stringDelimitList(pathToStringList(path),delimiter);
end pathString2NoLeadingDot;

public function pathStringReplaceDot "Helper function to pathString."
input Path inPath;
input String inString;
Expand Down
46 changes: 41 additions & 5 deletions Compiler/Template/CodegenFMU.tpl
Expand Up @@ -91,13 +91,13 @@ template fmiModelDescription(SimCode simCode, String guid)
"Generates code for ModelDescription file for FMU target."
::=
// <%UnitDefinitions(simCode)%>
// <%TypeDefinitions(simCode)%>
// <%VendorAnnotations(simCode)%>
match simCode
case SIMCODE(__) then
<<
<fmiModelDescription
<%fmiModelDescriptionAttributes(simCode,guid)%>>
<%TypeDefinitions(modelInfo)%>
<%DefaultExperiment(simulationSettingsOpt)%>
<%ModelVariables(modelInfo)%>
</fmiModelDescription>
Expand Down Expand Up @@ -161,17 +161,53 @@ case SIMCODE(__) then
>>
end UnitDefinitions;

template TypeDefinitions(SimCode simCode)
template TypeDefinitions(ModelInfo modelInfo)
"Generates code for TypeDefinitions file for FMU target."
::=
match simCode
case SIMCODE(__) then
match modelInfo
case MODELINFO(vars=SIMVARS(__)) then
<<
<TypeDefinitions>
<%SimCodeUtil.getEnumerationTypes(vars) |> var =>
TypeDefinition(var)
;separator="\n"%>
</TypeDefinitions>
>>
end TypeDefinitions;

template TypeDefinition(SimVar simVar)
::=
match simVar
case SIMVAR(__) then
<<
<%TypeDefinitionType(type_)%>
>>
end TypeDefinition;

template TypeDefinitionType(DAE.Type type_)
"Generates code for TypeDefinitions Type file for FMU target."
::=
match type_
case T_ENUMERATION(__) then
<<
<Type name="<%Absyn.pathString2NoLeadingDot(path, ".")%>">
<EnumerationType>
<%names |> name =>
EnumerationType(name)
;separator="\n"%>
</EnumerationType>
</Type>
>>
else 'UNKOWN_TYPE'
end TypeDefinitionType;

template EnumerationType(String name)
::=
<<
<Item name="<%name%>"/>
>>
end EnumerationType;

template DefaultExperiment(Option<SimulationSettings> simulationSettingsOpt)
"Generates code for DefaultExperiment file for FMU target."
::=
Expand Down Expand Up @@ -341,7 +377,7 @@ match type_
case T_REAL(__) then '<Real<%ScalarVariableTypeCommonAttribute(initialValue,isFixed)/*%> <%ScalarVariableTypeRealAttribute(unit,displayUnit)*/%>/>'
case T_BOOL(__) then '<Boolean<%ScalarVariableTypeCommonAttribute(initialValue,isFixed)%>/>'
case T_STRING(__) then '<String<%StringVariableTypeCommonAttribute(initialValue,isFixed)%>/>'
case T_ENUMERATION(__) then '<Integer<%ScalarVariableTypeCommonAttribute(initialValue,isFixed)%>/>'
case T_ENUMERATION(__) then '<Enumeration declaredType="<%Absyn.pathString2NoLeadingDot(path, ".")%>"<%ScalarVariableTypeCommonAttribute(initialValue,isFixed)%>/>'
else 'UNKOWN_TYPE'
end ScalarVariableType;

Expand Down
12 changes: 12 additions & 0 deletions Compiler/Template/SimCodeTV.mo
Expand Up @@ -742,6 +742,11 @@ package SimCodeUtil
input SimCode.Context context;
output Boolean s;
end isParallelFunctionContext;

function getEnumerationTypes
input SimCode.SimVars inVars;
output list<SimCode.SimVar> outVars;
end getEnumerationTypes;

end SimCodeUtil;

Expand Down Expand Up @@ -995,6 +1000,13 @@ package Absyn
end Within;

constant Info dummyInfo;

function pathString2NoLeadingDot "Tail-recursive version, with string builder (stringDelimitList is optimised)"
input Path path;
input String delimiter;
output String outString;
end pathString2NoLeadingDot;

end Absyn;


Expand Down
9 changes: 7 additions & 2 deletions Compiler/runtime/FMIImpl.c
Expand Up @@ -180,6 +180,7 @@ const char* getFMI2ModelVariableCausality(fmi2_import_variable_t* variable)
const char* getFMI1ModelVariableBaseType(fmi1_import_variable_t* variable)
{
fmi1_base_type_enu_t type = fmi1_import_get_variable_base_type(variable);
fmi1_import_variable_typedef_t* variableTypeDefinition = NULL;
switch (type) {
case fmi1_base_type_real:
return "Real";
Expand All @@ -190,7 +191,8 @@ const char* getFMI1ModelVariableBaseType(fmi1_import_variable_t* variable)
case fmi1_base_type_str:
return "String";
case fmi1_base_type_enum:
return "enumeration";
variableTypeDefinition = fmi1_import_get_variable_declared_type(variable);
return fmi1_import_get_type_name(variableTypeDefinition);
default: /* Should never be reached. */
return "";
}
Expand All @@ -202,6 +204,7 @@ const char* getFMI1ModelVariableBaseType(fmi1_import_variable_t* variable)
const char* getFMI2ModelVariableBaseType(fmi2_import_variable_t* variable)
{
fmi2_base_type_enu_t type = fmi2_import_get_variable_base_type(variable);
fmi2_import_variable_typedef_t* variableTypeDefinition = NULL;
switch (type) {
case fmi2_base_type_real:
return "Real";
Expand All @@ -212,7 +215,8 @@ const char* getFMI2ModelVariableBaseType(fmi2_import_variable_t* variable)
case fmi2_base_type_str:
return "String";
case fmi2_base_type_enum:
return "enumeration";
variableTypeDefinition = fmi2_import_get_variable_declared_type(variable);
return fmi2_import_get_type_name(variableTypeDefinition);
default: /* Should never be reached. */
return "";
}
Expand All @@ -231,6 +235,7 @@ char* getFMI1ModelVariableName(fmi1_import_variable_t* variable)
charReplace(res, length, '.', '_');
charReplace(res, length, '[', '_');
charReplace(res, length, ']', '_');
charReplace(res, length, ' ', '_');
charReplace(res, length, ',', '_');
charReplace(res, length, '(', '_');
charReplace(res, length, ')', '_');
Expand Down

0 comments on commit 7550ab7

Please sign in to comment.