Skip to content

Commit

Permalink
- Some fixes for TypeDefinitions code generation.
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19974 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
adeas31 committed Apr 3, 2014
1 parent 60a8eca commit f54776b
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 21 deletions.
9 changes: 8 additions & 1 deletion Compiler/Template/CodegenFMU.tpl
Expand Up @@ -2088,7 +2088,7 @@ case STRINGVARIABLE(__) then
>>
case ENUMERATIONVARIABLE(__) then
<<
<%dumpFMIModelVariableVariability(variability)%><%dumpFMIModelVariableCausalityAndBaseType(causality, baseType, generateInputConnectors, generateOutputConnectors)%> <%name%><%dumpFMIIntegerModelVariableStartValue(hasStartValue, startValue, isFixed)%><%dumpFMIModelVariableDescription(description)%><%dumpFMIModelVariablePlacementAnnotation(x1Placement, x2Placement, y1Placement, y2Placement, generateInputConnectors, generateOutputConnectors, causality)%>;
<%dumpFMIModelVariableVariability(variability)%><%dumpFMIModelVariableCausalityAndBaseType(causality, baseType, generateInputConnectors, generateOutputConnectors)%> <%name%><%dumpFMIEnumerationModelVariableStartValue(hasStartValue, startValue, isFixed)%><%dumpFMIModelVariableDescription(description)%><%dumpFMIModelVariablePlacementAnnotation(x1Placement, x2Placement, y1Placement, y2Placement, generateInputConnectors, generateOutputConnectors, causality)%>;
>>
end dumpFMIModelVariable;

Expand Down Expand Up @@ -2145,6 +2145,13 @@ template dumpFMIStringModelVariableStartValue(Boolean hasStartValue, String star
>>
end dumpFMIStringModelVariableStartValue;

template dumpFMIEnumerationModelVariableStartValue(Boolean hasStartValue, Integer startValue, Boolean isFixed)
::=
<<
<%if hasStartValue then "="+startValue%>
>>
end dumpFMIEnumerationModelVariableStartValue;

template dumpFMIModelVariableDescription(String description)
::=
<<
Expand Down
63 changes: 43 additions & 20 deletions Compiler/runtime/FMIImpl.c
Expand Up @@ -224,14 +224,20 @@ const char* getFMI2ModelVariableBaseType(fmi2_import_variable_t* variable)
}
}

int startsWithModelicaDot(const char* str) {
if (strncmp(str, "Modelica.", 9) == 0) {
return 1;
} else {
return 0;
}
}

/*
* Reads the model variable name. Returns a malloc'd string that should be
* Makes the string safe by removing special characters. Returns a malloc'd string that should be
* free'd.
*/
char* getFMI1ModelVariableName(fmi1_import_variable_t* variable)
{
const char* name = fmi1_import_get_variable_name(variable);
char* res = strdup(name);
char* makeStringFMISafe(const char* str) {
char* res = strdup(str);
int length = strlen(res);

charReplace(res, length, '.', '_');
Expand All @@ -244,23 +250,24 @@ char* getFMI1ModelVariableName(fmi1_import_variable_t* variable)
return res;
}

/*
* Reads the model variable name. Returns a malloc'd string that should be
* free'd.
*/
char* getFMI1ModelVariableName(fmi1_import_variable_t* variable)
{
const char* name = fmi1_import_get_variable_name(variable);
return makeStringFMISafe(name);
}

/*
* Reads the model variable name. Returns a malloc'd string that should be
* free'd.
*/
char* getFMI2ModelVariableName(fmi2_import_variable_t* variable)
{
const char* name = fmi2_import_get_variable_name(variable);
char* res = strdup(name);
int length = strlen(res);

charReplace(res, length, '.', '_');
charReplace(res, length, '[', '_');
charReplace(res, length, ']', '_');
charReplace(res, length, ',', '_');
charReplace(res, length, '(', '_');
charReplace(res, length, ')', '_');
return res;
return makeStringFMISafe(name);
}

/*
Expand Down Expand Up @@ -396,6 +403,15 @@ void FMIImpl__initializeFMI1Import(fmi1_import_t* fmi, void** fmiInfo, fmi_versi
for (; i < typeDefinitionsSize ; i++) {
fmi1_import_variable_typedef_t* variableTypeDef = fmi1_import_get_typedef(typeDefinitions, i);
const char* name = fmi1_import_get_type_name(variableTypeDef);
void* typeName = NULL;
/* Don't save the types starting with Modelica since we don't want to generate them in the code. Skip them here and we don't have to check anything in CodgenFMU.tpl */
if (startsWithModelicaDot(name)) {
continue;
} else {
char* name_safe = makeStringFMISafe(name);
typeName = mk_scon_check_null(name_safe);
free(name_safe);
}
const char* description = fmi1_import_get_type_description(variableTypeDef);
/* get the TypeDefinition as EnumerationType */
fmi1_import_enumeration_typedef_t* enumTypeDef = fmi1_import_get_type_as_enum(variableTypeDef);
Expand All @@ -410,16 +426,16 @@ void FMIImpl__initializeFMI1Import(fmi1_import_t* fmi, void** fmiInfo, fmi_versi
min = fmi1_import_get_enum_type_min(enumTypeDef);
max = fmi1_import_get_enum_type_max(enumTypeDef);
itemsSize = fmi1_import_get_enum_type_size(enumTypeDef);
unsigned int j = 1;
/* get the enumeration items */
for (; j <= itemsSize ; j++) {
unsigned int j = itemsSize;
/* get the enumeration items. Loop the items in reverse order so that they are stored in correct order. */
for (; j > 0 ; j--) {
const char* itemName = fmi1_import_get_enum_type_item_name(enumTypeDef, j);
const char* itemDescription = fmi1_import_get_enum_type_item_description(enumTypeDef, j);
enumItem = FMI__ENUMERATIONITEM(mk_scon_check_null(itemName), mk_scon_check_null(itemDescription));
enumItems = mk_cons(enumItem, enumItems);
}
}
void* typeDefinition = FMI__ENUMERATIONTYPE(mk_scon_check_null(name), mk_scon_check_null(description), mk_scon_check_null(quantity), mk_icon(min), mk_icon(max), enumItems);
void* typeDefinition = FMI__ENUMERATIONTYPE(typeName, mk_scon_check_null(description), mk_scon_check_null(quantity), mk_icon(min), mk_icon(max), enumItems);
*typeDefinitionsList = mk_cons(typeDefinition, *typeDefinitionsList);
}
/* Read the FMI Default Experiment Start value from FMU's modelDescription.xml file. */
Expand Down Expand Up @@ -460,7 +476,14 @@ void FMIImpl__initializeFMI1Import(fmi1_import_t* fmi, void** fmiInfo, fmi_versi
}
void* variable_description = mk_scon_check_null(description);
const char* base_type = getFMI1ModelVariableBaseType(model_variable);
void* variable_base_type = mk_scon_check_null(base_type);
void* variable_base_type = NULL;
if (startsWithModelicaDot(base_type)) {
variable_base_type = mk_scon_check_null(base_type);
} else {
char* base_type_safe = makeStringFMISafe(base_type);
variable_base_type = mk_scon_check_null(base_type_safe);
free(base_type_safe);
}
void* variable_variability = mk_scon_check_null(getFMI1ModelVariableVariability(model_variable));
const char* causality = getFMI1ModelVariableCausality(model_variable);
void* variable_causality = mk_scon_check_null(causality);
Expand Down

0 comments on commit f54776b

Please sign in to comment.