Skip to content

Commit

Permalink
Create the xml-file and then convert it to a C literal since Susan pe…
Browse files Browse the repository at this point in the history
…rformance suffers if we do it in memory

git-svn-id: https://openmodelica.org/svn/OpenModelica/trunk@19277 f25d12d1-65f4-0310-ae8a-bbce733d8d8e
  • Loading branch information
sjoelund committed Feb 24, 2014
1 parent 7aeec11 commit 0de3ec0
Show file tree
Hide file tree
Showing 9 changed files with 86 additions and 21 deletions.
16 changes: 8 additions & 8 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -71,14 +71,10 @@ template translateModel(SimCode simCode)

let()= textFile(recordsFile(fileNamePrefix, recordDecls), '<%fileNamePrefix%>_records.c')

let _ = if stringEq(Config.simCodeTarget(),"JavaScript") then
let()= textFile(simulationInitFileCString(simulationInitFile(simCode,guid)), '<%fileNamePrefix%>_init.c')
""
else if simulationSettingsOpt then //tests the Option<> for SOME()
let()= textFile(simulationInitFile(simCode,guid), '<%fileNamePrefix%>_init.xml')
""
else
"" //the else is automatically empty, too
let x = if simulationSettingsOpt then //tests the Option<> for SOME()
textFile(simulationInitFile(simCode,guid), '<%fileNamePrefix%>_init.xml')
let y = (if stringEq(Config.simCodeTarget(),"JavaScript") then
covertTextFileToCLiteral('<%fileNamePrefix%>_init.xml','<%fileNamePrefix%>_init.c'))

let()= textFile(simulationHeaderFile(simCode,guid), '<%fileNamePrefix%>_model.h')
// adpro: write the main .c file last! Make on windows doesn't seem to realize that
Expand Down Expand Up @@ -756,8 +752,12 @@ template populateModelInfo(ModelInfo modelInfo, String fileNamePrefix, String gu
data->modelData.initXMLData = NULL;
data->modelData.modelDataXml.infoXMLData = NULL;
#else
data->modelData.initXMLData =
#include "<%fileNamePrefix%>_init.c"
;
data->modelData.modelDataXml.infoXMLData =
#include "<%fileNamePrefix%>_info.c"
;
#endif

data->modelData.nStates = <%varInfo.numStateVars%>;
Expand Down
3 changes: 2 additions & 1 deletion Compiler/Template/CodegenFMU.tpl
Expand Up @@ -66,7 +66,8 @@ case sc as SIMCODE(modelInfo=modelInfo as MODELINFO(__)) then

let _ = generateSimulationFiles(simCode,guid,fileNamePrefix)

let()= textFile(simulationInitFileCString(simulationInitFile(simCode,guid)), '<%fileNamePrefix%>_init.c')
let()= textFile(simulationInitFile(simCode,guid), '<%fileNamePrefix%>_init.xml')
let x = covertTextFileToCLiteral('<%fileNamePrefix%>_init.xml','<%fileNamePrefix%>_init.c')
let()= textFile(fmumodel_identifierFile(simCode,guid), '<%fileNamePrefix%>_FMU.c')
let()= textFile(fmuModelDescriptionFile(simCode,guid), 'modelDescription.xml')
let()= textFile(fmudeffile(simCode), '<%fileNamePrefix%>.def')
Expand Down
7 changes: 0 additions & 7 deletions Compiler/Template/CodegenUtil.tpl
Expand Up @@ -329,13 +329,6 @@ let() = Tpl.addTemplateError(errMessage)
>>
end errorMsg;

template simulationInitFileCString(Text text)
::=
<<
data->modelData.initXMLData = "<%Util.escapeModelicaStringToCString(text)%>";
>>
end simulationInitFileCString;

end CodegenUtil;

// vim: filetype=susan sw=2 sts=2
5 changes: 2 additions & 3 deletions Compiler/Template/SimCodeDump.tpl
Expand Up @@ -18,9 +18,8 @@ template dumpSimCodeToC(SimCode code, Boolean withOperations)
::=
match code
case sc as SIMCODE(modelInfo=mi as MODELINFO(vars=vars as SIMVARS(__))) then
let res =
'data->modelData.modelDataXml.infoXMLData = <% strtok(dumpSimCodeBase(code,withOperations),"\n") |> str => '"<%Util.escapeModelicaStringToCString(str)%>\n"' ; separator = "\n" %>;'
let() = textFile(res,'<%fileNamePrefix%>_info.c')
let _ = dumpSimCode(code,withOperations)
let _ = covertTextFileToCLiteral('<%fileNamePrefix%>_info.xml','<%fileNamePrefix%>_info.c')
'<%fileNamePrefix%>_info'
end dumpSimCodeToC;

Expand Down
6 changes: 6 additions & 0 deletions Compiler/Template/SimCodeTV.mo
Expand Up @@ -901,6 +901,12 @@ package System
input String s2;
output list<String> tokens;
end strtok;

function covertTextFileToCLiteral
input String textFile;
input String outFile;
output Boolean success;
end covertTextFileToCLiteral;
end System;


Expand Down
7 changes: 7 additions & 0 deletions Compiler/Util/System.mo
Expand Up @@ -1097,4 +1097,11 @@ external "C" previousAlarm=SystemImpl__alarm(seconds) annotation(Library = {"omc
</html>"));
end alarm;

public function covertTextFileToCLiteral
input String textFile;
input String outFile;
output Boolean success;
external "C" success=SystemImpl__covertTextFileToCLiteral(textFile,outFile);
end covertTextFileToCLiteral;

end System;
7 changes: 7 additions & 0 deletions Compiler/runtime/System_rml.c
Expand Up @@ -1904,3 +1904,10 @@ RML_BEGIN_LABEL(System__alarm)
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL

RML_BEGIN_LABEL(System__covertTextFileToCLiteral)
{
rmlA0 = mk_icon(SystemImpl__covertTextFileToCLiteral(RML_STRINGDATA(rmlA0),RML_STRINGDATA(rmlA1)));
RML_TAILCALLK(rmlSC);
}
RML_END_LABEL
52 changes: 52 additions & 0 deletions Compiler/runtime/systemimpl.c
Expand Up @@ -2664,6 +2664,58 @@ int SystemImpl__alarm(int seconds)
return alarm(seconds);
}

int SystemImpl__covertTextFileToCLiteral(const char *textFile, const char *outFile)
{
FILE *fin;
FILE *fout;
int result = 0, n, i, j;
char buffer[512];
char obuffer[1024];
fin = fopen(textFile, "r");
if (!fin) {
goto done;
}
fout = fopen(outFile, "w");
if (!fout) {
goto done;
}
fputc('\"', fout);
do {
n = fread(buffer,1,128,fin);

j = 0;
for (i=0; i<n; i++) {
if (buffer[i] == '\n') {
obuffer[j++] = '\\';
obuffer[j++] = 'n';
} else if (buffer[i] == '\\') {
obuffer[j++] = '\\';
obuffer[j++] = '\\';
} else if (buffer[i] == '"') {
obuffer[j++] = '\\';
obuffer[j++] = '"';
} else {
obuffer[j++] = buffer[i];
}
}
if (j!=fwrite(obuffer,1,j,fout)) {
fprintf(stderr, "failed to write\n");
return 1;
}
} while (!feof(fin));
fputc('\"', fout);

result = 1;
done:
if (fin) {
fclose(fin);
}
if (fout) {
fclose(fout);
}
return result;
}

#ifdef __cplusplus
}
#endif
4 changes: 2 additions & 2 deletions SimulationRuntime/c/Makefile.in
Expand Up @@ -44,8 +44,8 @@ Makefile: Makefile.in

emcc: Makefile emcc/pre.js
cp /usr/include/expat*.h .
emmake $(MAKE) OBJ_EXT=.bc CC=emcc CXX=emcc CFLAGS="$(CFLAGS) -DOMC_EMCC -DNO_INTERACTIVE_DEPENDENCY -I./simulation/libf2c/" libSimulationRuntimeC.bc
emmake $(MAKE) -C simulation/libf2c OBJ_EXT=.bc CC=emcc CXX=emcc libf2c.bc
emmake $(MAKE) OBJ_EXT=.bc CC=emcc CXX=emcc CFLAGS=" $(CPPFLAGS) -Os -DOMC_EMCC -DNO_INTERACTIVE_DEPENDENCY -I./simulation/libf2c/" libSimulationRuntimeC.bc
emmake $(MAKE) -C simulation/libf2c OBJ_EXT=.bc CC=emcc CXX=emcc CFLAGS="-Os" libf2c.bc
cp emcc/pre.js libSimulationRuntimeC.bc simulation/libf2c/libf2c.bc $(builddir_lib)/emcc/
emcc-clean: Makefile
$(MAKE) OBJ_EXT=.bc clean

0 comments on commit 0de3ec0

Please sign in to comment.