Skip to content

Commit

Permalink
- Let the user decided whether he want input/output connectors or not.
Browse files Browse the repository at this point in the history
git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@14155 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
adeas31 committed Nov 29, 2012
1 parent dded62c commit ef974c3
Show file tree
Hide file tree
Showing 9 changed files with 40 additions and 35 deletions.
2 changes: 2 additions & 0 deletions Compiler/FrontEnd/ModelicaBuiltin.mo
Original file line number Diff line number Diff line change
Expand Up @@ -1904,6 +1904,8 @@ function importFMU "Imports the Functional Mockup Unit
input Integer loglevel := 3 "loglevel_nothing=0;loglevel_fatal=1;loglevel_error=2;loglevel_warning=3;loglevel_info=4;loglevel_verbose=5;loglevel_debug=6";
input Boolean fullPath := false "When true the full output path is returned otherwise only the file name.";
input Boolean debugLogging := false "When true the FMU's debug output is printed.";
input Boolean generateInputConnectors := true "When true creates the input connector pins.";
input Boolean generateOutputConnectors := true "When true creates the output connector pins.";
output String generatedFileName "Returns the full path of the generated file.";
external "builtin";
annotation(preferredView="text");
Expand Down
6 changes: 3 additions & 3 deletions Compiler/OpenModelicaBootstrappingHeader.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ extern struct record_description FMI_ModelVariables_ENUMERATIONVARIABLE__desc;
#ifdef ADD_METARECORD_DEFINTIONS
#ifndef FMI_FmiImport_FMIIMPORT__desc_added
#define FMI_FmiImport_FMIIMPORT__desc_added
ADD_METARECORD_DEFINTIONS const char* FMI_FmiImport_FMIIMPORT__desc__fields[11] = {"platform","fmuFileName","fmuWorkingDirectory","fmiLogLevel","fmiDebugOutput","fmiContext","fmiInstance","fmiInfo","fmiExperimentAnnotation","fmiModelVariablesInstance","fmiModelVariablesList"};
ADD_METARECORD_DEFINTIONS const char* FMI_FmiImport_FMIIMPORT__desc__fields[13] = {"platform","fmuFileName","fmuWorkingDirectory","fmiLogLevel","fmiDebugOutput","fmiContext","fmiInstance","fmiInfo","fmiExperimentAnnotation","fmiModelVariablesInstance","fmiModelVariablesList","generateInputConnectors","generateOutputConnectors"};
ADD_METARECORD_DEFINTIONS struct record_description FMI_FmiImport_FMIIMPORT__desc = {
"FMI_FmiImport_FMIIMPORT",
"FMI.FmiImport.FMIIMPORT",
Expand All @@ -120,8 +120,8 @@ ADD_METARECORD_DEFINTIONS struct record_description FMI_FmiImport_FMIIMPORT__des
#else /* Only use the file as a header */
extern struct record_description FMI_FmiImport_FMIIMPORT__desc;
#endif
#define FMI__FMIIMPORT_3dBOX11 3
#define FMI__FMIIMPORT(platform,fmuFileName,fmuWorkingDirectory,fmiLogLevel,fmiDebugOutput,fmiContext,fmiInstance,fmiInfo,fmiExperimentAnnotation,fmiModelVariablesInstance,fmiModelVariablesList) (mmc_mk_box(12, 3,&FMI_FmiImport_FMIIMPORT__desc,platform,fmuFileName,fmuWorkingDirectory,fmiLogLevel,fmiDebugOutput,fmiContext,fmiInstance,fmiInfo,fmiExperimentAnnotation,fmiModelVariablesInstance,fmiModelVariablesList))
#define FMI__FMIIMPORT_3dBOX13 3
#define FMI__FMIIMPORT(platform,fmuFileName,fmuWorkingDirectory,fmiLogLevel,fmiDebugOutput,fmiContext,fmiInstance,fmiInfo,fmiExperimentAnnotation,fmiModelVariablesInstance,fmiModelVariablesList,generateInputConnectors,generateOutputConnectors) (mmc_mk_box(14, 3,&FMI_FmiImport_FMIIMPORT__desc,platform,fmuFileName,fmuWorkingDirectory,fmiLogLevel,fmiDebugOutput,fmiContext,fmiInstance,fmiInfo,fmiExperimentAnnotation,fmiModelVariablesInstance,fmiModelVariablesList,generateInputConnectors,generateOutputConnectors))
#ifdef ADD_METARECORD_DEFINTIONS
#ifndef Util_ReplacePattern_REPLACEPATTERN__desc_added
#define Util_ReplacePattern_REPLACEPATTERN__desc_added
Expand Down
9 changes: 4 additions & 5 deletions Compiler/Script/CevalScript.mo
Original file line number Diff line number Diff line change
Expand Up @@ -841,7 +841,7 @@ algorithm
String strlinearizeTime;
Real timeTotal,timeSimulation,timeStamp,val,x1,x2,y1,y2,r, linearizeTime;
Interactive.Statements istmts;
Boolean have_corba, bval, anyCode, b, b1, b2, externalWindow, legend, grid, logX, logY, gcc_res, omcfound, rm_res, touch_res, uname_res, extended, insensitive,ifcpp, sort, builtin, showProtected;
Boolean have_corba, bval, anyCode, b, b1, b2, externalWindow, legend, grid, logX, logY, gcc_res, omcfound, rm_res, touch_res, uname_res, extended, insensitive,ifcpp, sort, builtin, showProtected, inputConnectors, outputConnectors;
Env.Cache cache;
list<Interactive.LoadedFile> lf;
AbsynDep.Depends aDep;
Expand Down Expand Up @@ -1499,18 +1499,17 @@ algorithm
then
(cache,Values.BOOL(false),st);

case (cache,env,"importFMU",{Values.STRING(filename),Values.STRING(workdir),Values.INTEGER(fmiLogLevel),Values.BOOL(b1), Values.BOOL(b2)},st,_)
case (cache,env,"importFMU",{Values.STRING(filename),Values.STRING(workdir),Values.INTEGER(fmiLogLevel),Values.BOOL(b1), Values.BOOL(b2), Values.BOOL(inputConnectors), Values.BOOL(outputConnectors)},st,_)
equation
Error.clearMessages() "Clear messages";
true = System.regularFileExists(filename);
workdir = Util.if_(System.directoryExists(workdir), workdir, System.pwd());
/* Initialize FMI objects */
(b, SOME(fmiContext), SOME(fmiInstance), fmiInfo, fmiExperimentAnnotation, SOME(fmiModelVariablesInstance), fmiModelVariablesList) = FMIExt.initializeFMIImport(filename, workdir, fmiLogLevel);
(b, SOME(fmiContext), SOME(fmiInstance), fmiInfo, fmiExperimentAnnotation, SOME(fmiModelVariablesInstance), fmiModelVariablesList) = FMIExt.initializeFMIImport(filename, workdir, fmiLogLevel, inputConnectors, outputConnectors);
true = b; /* if something goes wrong while initializing */
fmiModelVariablesList1 = listReverse(fmiModelVariablesList);
s1 = System.tolower(System.platform());
str = Tpl.tplString(CodegenFMU.importFMUModelica, FMI.FMIIMPORT(s1, filename, workdir, fmiLogLevel, b2, fmiContext, fmiInstance, fmiInfo,
fmiExperimentAnnotation, fmiModelVariablesInstance, fmiModelVariablesList1));
str = Tpl.tplString(CodegenFMU.importFMUModelica, FMI.FMIIMPORT(s1, filename, workdir, fmiLogLevel, b2, fmiContext, fmiInstance, fmiInfo, fmiExperimentAnnotation, fmiModelVariablesInstance, fmiModelVariablesList1, inputConnectors, outputConnectors));
pd = System.pathDelimiter();
str1 = FMI.getFMIModelIdentifier(fmiInfo);
str2 = FMI.getFMIType(fmiInfo);
Expand Down
34 changes: 17 additions & 17 deletions Compiler/Template/CodegenFMU.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -1148,7 +1148,7 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
fmiImportInstance fmi = fmiImportInstance(context, fmuWorkingDir);
fmiImportContext context = fmiImportContext(fmiLogLevel);
fmiEventInfo eventInfo;
<%dumpFMIModelVariablesList(fmiModelVariablesList)%>
<%dumpFMIModelVariablesList(fmiModelVariablesList, generateInputConnectors, generateOutputConnectors)%>
constant Integer numberOfContinuousStates = <%listLength(fmiInfo.fmiNumberOfContinuousStates)%>;
Real fmi_x[numberOfContinuousStates] "States";
Real fmi_x_new[numberOfContinuousStates] "New States";
Expand Down Expand Up @@ -1372,7 +1372,7 @@ case FMIIMPORT(fmiInfo=INFO(__),fmiExperimentAnnotation=EXPERIMENTANNOTATION(__)
constant Real communicationStepSize = 0.005;
fmiImportInstance fmi = fmiImportInstance(context, fmuWorkingDir);
fmiImportContext context = fmiImportContext(fmiLogLevel);
<%dumpFMIModelVariablesList(fmiModelVariablesList)%>
<%dumpFMIModelVariablesList(fmiModelVariablesList, generateInputConnectors, generateOutputConnectors)%>
constant Boolean stopTimeDefined = false;
Real flowControl;
Boolean initializationDone(start=false);
Expand Down Expand Up @@ -1565,36 +1565,36 @@ template dumpFMICommonFunctions(String platform)
>>
end dumpFMICommonFunctions;

template dumpFMIModelVariablesList(list<ModelVariables> fmiModelVariablesList)
template dumpFMIModelVariablesList(list<ModelVariables> fmiModelVariablesList, Boolean generateInputConnectors, Boolean generateOutputConnectors)
"Generates the Model Variables code."
::=
<<
<%fmiModelVariablesList |> fmiModelVariable => dumpFMIModelVariable(fmiModelVariable) ;separator="\n"%>
<%fmiModelVariablesList |> fmiModelVariable => dumpFMIModelVariable(fmiModelVariable, generateInputConnectors, generateOutputConnectors) ;separator="\n"%>
>>
end dumpFMIModelVariablesList;

template dumpFMIModelVariable(ModelVariables fmiModelVariable)
template dumpFMIModelVariable(ModelVariables fmiModelVariable, Boolean generateInputConnectors, Boolean generateOutputConnectors)
::=
match fmiModelVariable
case REALVARIABLE(__) then
<<
<%dumpFMIModelVariableVariability(variability)%><%dumpFMIModelVariableCausalityAndBaseType(causality,baseType)%> <%name%><%dumpFMIRealModelVariableStartValue(hasStartValue, startValue, isFixed)%><%dumpFMIModelVariableDescription(description)%><%dumpFMIModelVariablePlacementAnnotation(placementAnnotation)%>;
<%dumpFMIModelVariableVariability(variability)%><%dumpFMIModelVariableCausalityAndBaseType(causality, baseType, generateInputConnectors, generateOutputConnectors)%> <%name%><%dumpFMIRealModelVariableStartValue(hasStartValue, startValue, isFixed)%><%dumpFMIModelVariableDescription(description)%><%dumpFMIModelVariablePlacementAnnotation(placementAnnotation)%>;
>>
case INTEGERVARIABLE(__) then
<<
<%dumpFMIModelVariableVariability(variability)%><%dumpFMIModelVariableCausalityAndBaseType(causality,baseType)%> <%name%><%dumpFMIIntegerModelVariableStartValue(hasStartValue, startValue, isFixed)%><%dumpFMIModelVariableDescription(description)%><%dumpFMIModelVariablePlacementAnnotation(placementAnnotation)%>;
<%dumpFMIModelVariableVariability(variability)%><%dumpFMIModelVariableCausalityAndBaseType(causality, baseType, generateInputConnectors, generateOutputConnectors)%> <%name%><%dumpFMIIntegerModelVariableStartValue(hasStartValue, startValue, isFixed)%><%dumpFMIModelVariableDescription(description)%><%dumpFMIModelVariablePlacementAnnotation(placementAnnotation)%>;
>>
case BOOLEANVARIABLE(__) then
<<
<%dumpFMIModelVariableVariability(variability)%><%dumpFMIModelVariableCausalityAndBaseType(causality,baseType)%> <%name%><%dumpFMIBooleanModelVariableStartValue(hasStartValue, startValue, isFixed)%><%dumpFMIModelVariableDescription(description)%><%dumpFMIModelVariablePlacementAnnotation(placementAnnotation)%>;
<%dumpFMIModelVariableVariability(variability)%><%dumpFMIModelVariableCausalityAndBaseType(causality, baseType, generateInputConnectors, generateOutputConnectors)%> <%name%><%dumpFMIBooleanModelVariableStartValue(hasStartValue, startValue, isFixed)%><%dumpFMIModelVariableDescription(description)%><%dumpFMIModelVariablePlacementAnnotation(placementAnnotation)%>;
>>
case STRINGVARIABLE(__) then
<<
<%dumpFMIModelVariableVariability(variability)%><%dumpFMIModelVariableCausalityAndBaseType(causality,baseType)%> <%name%><%dumpFMIStringModelVariableStartValue(hasStartValue, startValue, isFixed)%><%dumpFMIModelVariableDescription(description)%><%dumpFMIModelVariablePlacementAnnotation(placementAnnotation)%>;
<%dumpFMIModelVariableVariability(variability)%><%dumpFMIModelVariableCausalityAndBaseType(causality, baseType, generateInputConnectors, generateOutputConnectors)%> <%name%><%dumpFMIStringModelVariableStartValue(hasStartValue, startValue, isFixed)%><%dumpFMIModelVariableDescription(description)%><%dumpFMIModelVariablePlacementAnnotation(placementAnnotation)%>;
>>
case ENUMERATIONVARIABLE(__) then
<<
<%dumpFMIModelVariableVariability(variability)%><%dumpFMIModelVariableCausalityAndBaseType(causality,baseType)%> <%name%><%dumpFMIIntegerModelVariableStartValue(hasStartValue, startValue, isFixed)%><%dumpFMIModelVariableDescription(description)%><%dumpFMIModelVariablePlacementAnnotation(placementAnnotation)%>;
<%dumpFMIModelVariableVariability(variability)%><%dumpFMIModelVariableCausalityAndBaseType(causality, baseType, generateInputConnectors, generateOutputConnectors)%> <%name%><%dumpFMIIntegerModelVariableStartValue(hasStartValue, startValue, isFixed)%><%dumpFMIModelVariableDescription(description)%><%dumpFMIModelVariablePlacementAnnotation(placementAnnotation)%>;
>>
end dumpFMIModelVariable;

Expand All @@ -1605,14 +1605,14 @@ template dumpFMIModelVariableVariability(String variability)
>>
end dumpFMIModelVariableVariability;

template dumpFMIModelVariableCausalityAndBaseType(String causality, String baseType)
template dumpFMIModelVariableCausalityAndBaseType(String causality, String baseType, Boolean generateInputConnectors, Boolean generateOutputConnectors)
::=
if boolAnd(stringEq(causality, "input"),stringEq(baseType, "Real")) then "Modelica.Blocks.Interfaces.RealInput"
else if boolAnd(stringEq(causality, "input"),stringEq(baseType, "Integer")) then "Modelica.Blocks.Interfaces.IntegerInput"
else if boolAnd(stringEq(causality, "input"),stringEq(baseType, "Boolean")) then "Modelica.Blocks.Interfaces.BooleanInput"
else if boolAnd(stringEq(causality, "output"),stringEq(baseType, "Real")) then "Modelica.Blocks.Interfaces.RealOutput"
else if boolAnd(stringEq(causality, "output"),stringEq(baseType, "Integer")) then "Modelica.Blocks.Interfaces.IntegerOutput"
else if boolAnd(stringEq(causality, "output"),stringEq(baseType, "Boolean")) then "Modelica.Blocks.Interfaces.BooleanOutput"
if boolAnd(generateInputConnectors, boolAnd(stringEq(causality, "input"),stringEq(baseType, "Real"))) then "Modelica.Blocks.Interfaces.RealInput"
else if boolAnd(generateInputConnectors, boolAnd(stringEq(causality, "input"),stringEq(baseType, "Integer"))) then "Modelica.Blocks.Interfaces.IntegerInput"
else if boolAnd(generateInputConnectors, boolAnd(stringEq(causality, "input"),stringEq(baseType, "Boolean"))) then "Modelica.Blocks.Interfaces.BooleanInput"
else if boolAnd(generateOutputConnectors, boolAnd(stringEq(causality, "output"),stringEq(baseType, "Real"))) then "Modelica.Blocks.Interfaces.RealOutput"
else if boolAnd(generateOutputConnectors, boolAnd(stringEq(causality, "output"),stringEq(baseType, "Integer"))) then "Modelica.Blocks.Interfaces.IntegerOutput"
else if boolAnd(generateOutputConnectors, boolAnd(stringEq(causality, "output"),stringEq(baseType, "Boolean"))) then "Modelica.Blocks.Interfaces.BooleanOutput"
else if stringEq(causality, "") then baseType else causality+" "+baseType
end dumpFMIModelVariableCausalityAndBaseType;

Expand Down
2 changes: 2 additions & 0 deletions Compiler/Template/SimCodeTV.mo
Original file line number Diff line number Diff line change
Expand Up @@ -2731,6 +2731,8 @@ package FMI
ExperimentAnnotation fmiExperimentAnnotation;
Integer fmiModelVariablesInstance;
list<ModelVariables> fmiModelVariablesList;
Boolean generateInputConnectors;
Boolean generateOutputConnectors;
end FMIIMPORT;
end FmiImport;

Expand Down
2 changes: 2 additions & 0 deletions Compiler/Util/FMI.mo
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,8 @@ public uniontype FmiImport
ExperimentAnnotation fmiExperimentAnnotation;
Integer fmiModelVariablesInstance;
list<ModelVariables> fmiModelVariablesList;
Boolean generateInputConnectors;
Boolean generateOutputConnectors;
end FMIIMPORT;
end FmiImport;

Expand Down
6 changes: 4 additions & 2 deletions Compiler/Util/FMIExt.mo
Original file line number Diff line number Diff line change
Expand Up @@ -39,15 +39,17 @@ public function initializeFMIImport
input String inFileName;
input String inWorkingDirectory;
input Integer inFMILogLevel;
input Boolean inInputConnectors;
input Boolean inOutputConnectors;
output Boolean result;
output Option<Integer> outFMIContext "Stores a pointer. If it is declared as Integer, it is truncated to 32-bit.";
output Option<Integer> outFMIInstance "Stores a pointer. If it is declared as Integer, it is truncated to 32-bit.";
output FMI.Info outFMIInfo;
output FMI.ExperimentAnnotation outExperimentAnnotation;
output Option<Integer> outModelVariablesInstance "Stores a pointer. If it is declared as Integer, it is truncated to 32-bit.";
output list<FMI.ModelVariables> outModelVariablesList;
external "C" result=FMIImpl__initializeFMIImport(inFileName, inWorkingDirectory, inFMILogLevel, outFMIContext, outFMIInstance, outFMIInfo, outExperimentAnnotation,
outModelVariablesInstance, outModelVariablesList) annotation(Library = {"omcruntime","fmilib"});
external "C" result=FMIImpl__initializeFMIImport(inFileName, inWorkingDirectory, inFMILogLevel, inInputConnectors, inOutputConnectors, outFMIContext,
outFMIInstance, outFMIInfo, outExperimentAnnotation, outModelVariablesInstance, outModelVariablesList) annotation(Library = {"omcruntime","fmilib"});
end initializeFMIImport;

public function releaseFMIImport
Expand Down
10 changes: 4 additions & 6 deletions Compiler/runtime/FMIImpl.c
Original file line number Diff line number Diff line change
Expand Up @@ -214,8 +214,8 @@ void* getModelVariableStartValue(fmi1_import_variable_t* variable, int hasStartV
* Reads the experiment annotation.
* Reads the model variables.
*/
int FMIImpl__initializeFMIImport(const char* file_name, const char* working_directory, int fmi_log_level, void** fmiContext, void** fmiInstance,
void** fmiInfo, void** experimentAnnotation, void** modelVariablesInstance, void** modelVariablesList)
int FMIImpl__initializeFMIImport(const char* file_name, const char* working_directory, int fmi_log_level, int input_connectors, int output_connectors,
void** fmiContext, void** fmiInstance, void** fmiInfo, void** experimentAnnotation, void** modelVariablesInstance, void** modelVariablesList)
{
*fmiContext = NULL;
*fmiInstance = NULL;
Expand Down Expand Up @@ -321,8 +321,6 @@ int FMIImpl__initializeFMIImport(const char* file_name, const char* working_dire
const fmi1_value_reference_t* model_variables_value_reference_list = fmi1_import_get_value_referece_list(model_variables_list);
i = 0;
*modelVariablesList = mk_nil();
int realCount, integerCount, booleanCount, stringCount, enumerationCount;
realCount = integerCount = booleanCount = stringCount = enumerationCount = 0;
int xInputPlacement = -120;
int yInputPlacement = 60;
int xOutputPlacement = 100;
Expand All @@ -348,13 +346,13 @@ int FMIImpl__initializeFMIImport(const char* file_name, const char* working_dire
void* variable_is_fixed = mk_bcon(fmi1_import_get_variable_is_fixed(model_variable));
void* variable_value_reference = mk_rcon((double)model_variables_value_reference_list[i]);
void* variable_placement_annotation = mk_scon("");
if (strcmp(causality,"input") == 0) {
if ((strcmp(causality,"input") == 0) && input_connectors) {
char* placementAnnotation = (char*) malloc((strlen(placementAnnotationFormat)+8)*sizeof(char));
sprintf(placementAnnotation, placementAnnotationFormat, xInputPlacement, yInputPlacement, xInputPlacement+20, yInputPlacement+20);
variable_placement_annotation = mk_scon(placementAnnotation);
yInputPlacement -= 25;
free(placementAnnotation);
} else if (strcmp(causality,"output") == 0) {
} else if ((strcmp(causality,"output") == 0) && output_connectors) {
char* placementAnnotation = (char*) malloc((strlen(placementAnnotationFormat)+8)*sizeof(char));
sprintf(placementAnnotation, placementAnnotationFormat, xOutputPlacement, yOutputPlacement, xOutputPlacement+20, yOutputPlacement+20);
variable_placement_annotation = mk_scon(placementAnnotation);
Expand Down
4 changes: 2 additions & 2 deletions Compiler/runtime/FMI_rml.c
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,8 @@ RML_BEGIN_LABEL(FMIExt__initializeFMIImport)
void* experimentAnnotation;
void* modelVariablesInstance;
void* modelVariablesList;
rmlA0 = FMIImpl__initializeFMIImport(filename, workingDirectory, RML_UNTAGFIXNUM(rmlA2), &fmiContext, &fmiInstance, &fmiInfo, &experimentAnnotation,
&modelVariablesInstance, &modelVariablesList) ? RML_TRUE : RML_FALSE;
rmlA0 = FMIImpl__initializeFMIImport(filename, workingDirectory, RML_UNTAGFIXNUM(rmlA2), RML_UNTAGFIXNUM(rmlA3), RML_UNTAGFIXNUM(rmlA4), &fmiContext, &fmiInstance,
&fmiInfo, &experimentAnnotation, &modelVariablesInstance, &modelVariablesList) ? RML_TRUE : RML_FALSE;
rmlA1 = (void*) fmiContext;
rmlA2 = (void*) fmiInstance;
rmlA3 = fmiInfo;
Expand Down

0 comments on commit ef974c3

Please sign in to comment.