Skip to content

Commit f6aecdf

Browse files
authored
[CodeGen] Introduce index map for resizable arrays (#12964)
- WIP use array index to access variables - TODO 1. load resizable parameters before calling initializeDataStruc 2. correctly compute index map based on sizes of variables
1 parent e36b641 commit f6aecdf

File tree

6 files changed

+63
-23
lines changed

6 files changed

+63
-23
lines changed

OMCompiler/Compiler/SimCode/SimCodeUtil.mo

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15217,7 +15217,6 @@ algorithm
1521715217
n := 2*varInfo.numStateVars+varInfo.numAlgVars+varInfo.numDiscreteReal+varInfo.numOptimizeConstraints+varInfo.numOptimizeFinalConstraints;
1521815218
end nVariablesReal;
1521915219

15220-
1522115220
public function getSimCode
1522215221
output SimCode.SimCode code;
1522315222
protected

OMCompiler/Compiler/Template/CodegenC.tpl

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1521,11 +1521,11 @@ template populateModelInfo(ModelInfo modelInfo, String fileNamePrefix, String gu
15211521
%>
15221522
data->modelData->runTestsuite = <%if Testsuite.isRunning() then "1" else "0"%>;
15231523
data->modelData->nStates = <%varInfo.numStateVars%>;
1524-
data->modelData->nVariablesReal = <%nVariablesReal(varInfo)%>;
1524+
data->modelData->nVariablesRealArray = <%nVariablesReal(varInfo)%>;
15251525
data->modelData->nDiscreteReal = <%varInfo.numDiscreteReal%>;
1526-
data->modelData->nVariablesInteger = <%varInfo.numIntAlgVars%>;
1527-
data->modelData->nVariablesBoolean = <%varInfo.numBoolAlgVars%>;
1528-
data->modelData->nVariablesString = <%varInfo.numStringAlgVars%>;
1526+
data->modelData->nVariablesIntegerArray = <%varInfo.numIntAlgVars%>;
1527+
data->modelData->nVariablesBooleanArray = <%varInfo.numBoolAlgVars%>;
1528+
data->modelData->nVariablesStringArray = <%varInfo.numStringAlgVars%>;
15291529
data->modelData->nParametersReal = <%varInfo.numParams%>;
15301530
data->modelData->nParametersInteger = <%varInfo.numIntParams%>;
15311531
data->modelData->nParametersBoolean = <%varInfo.numBoolParams%>;

OMCompiler/Compiler/Template/CodegenCFunctions.tpl

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4862,27 +4862,27 @@ template crefToCStr(ComponentRef cr, Integer ix, Boolean isPre, Boolean isStart,
48624862
match cr
48634863
case CREF_IDENT(ident = "time") then "data->localData[0]->timeValue"
48644864
case CREF_IDENT(ident = "$DAE_CJ") then "jacobian->dae_cj"
4865-
case CREF_QUAL(ident="$PRE", subscriptLst={}) then
4865+
case CREF_QUAL(ident = "$PRE", subscriptLst = {}) then
48664866
(if isPre then error(sourceInfo(), 'Got $PRE for something that is already pre: <%crefStrNoUnderscore(cr)%>')
48674867
else crefToCStr(componentRef, ix, true, isStart, &sub))
4868-
case CREF_QUAL(ident="$START") then
4868+
case CREF_QUAL(ident = "$START") then
48694869
crefToCStr(componentRef, ix, isPre, true, &sub)
48704870
else match cref2simvar(cr, getSimCode())
4871-
case SIMVAR(varKind=ALG_STATE_OLD(), index=index) then '(data->simulationInfo->inlineData->algOldVars[<%index%>])<%&sub%>'
4872-
case SIMVAR(aliasvar=ALIAS(varName=varName)) then crefToCStr(varName, ix, isPre, isStart, &sub)
4873-
case SIMVAR(aliasvar=NEGATEDALIAS(varName=varName), type_=T_BOOL()) then '!(<%crefToCStr(varName, ix, isPre, isStart, &sub)%>)'
4874-
case SIMVAR(aliasvar=NEGATEDALIAS(varName=varName)) then '-(<%crefToCStr(varName, ix, isPre, isStart, &sub)%>)'
4875-
case v as SIMVAR(varKind=JAC_VAR()) then '(parentJacobian->resultVars[<%index%>])<%&sub%><%crefCCommentWithVariability(v)%>'
4876-
case v as SIMVAR(varKind=JAC_TMP_VAR()) then '(parentJacobian->tmpVars[<%index%>])<%&sub%><%crefCCommentWithVariability(v)%>'
4877-
case v as SIMVAR(varKind=SEED_VAR()) then '(parentJacobian->seedVars[<%index%>])<%&sub%><%crefCCommentWithVariability(v)%>'
4878-
case v as SIMVAR(varKind=DAE_RESIDUAL_VAR()) then '(data->simulationInfo->daeModeData->residualVars[<%index%>])<%&sub%><%crefCCommentWithVariability(v)%>'
4879-
case v as SIMVAR(varKind=DAE_AUX_VAR()) then '(data->simulationInfo->daeModeData->auxiliaryVars[<%index%>])<%&sub%><%crefCCommentWithVariability(v)%>'
4880-
case SIMVAR(index=-2) then
4871+
case SIMVAR(varKind = ALG_STATE_OLD(), index = index) then '(data->simulationInfo->inlineData->algOldVars[<%index%>])<%&sub%>'
4872+
case SIMVAR(aliasvar = ALIAS(varName = varName)) then crefToCStr(varName, ix, isPre, isStart, &sub)
4873+
case SIMVAR(aliasvar = NEGATEDALIAS(varName = varName), type_=T_BOOL()) then '!(<%crefToCStr(varName, ix, isPre, isStart, &sub)%>)'
4874+
case SIMVAR(aliasvar = NEGATEDALIAS(varName = varName)) then '-(<%crefToCStr(varName, ix, isPre, isStart, &sub)%>)'
4875+
case v as SIMVAR(varKind = JAC_VAR()) then '(parentJacobian->resultVars[<%index%>])<%&sub%><%crefCCommentWithVariability(v)%>'
4876+
case v as SIMVAR(varKind = JAC_TMP_VAR()) then '(parentJacobian->tmpVars[<%index%>])<%&sub%><%crefCCommentWithVariability(v)%>'
4877+
case v as SIMVAR(varKind = SEED_VAR()) then '(parentJacobian->seedVars[<%index%>])<%&sub%><%crefCCommentWithVariability(v)%>'
4878+
case v as SIMVAR(varKind = DAE_RESIDUAL_VAR()) then '(data->simulationInfo->daeModeData->residualVars[<%index%>])<%&sub%><%crefCCommentWithVariability(v)%>'
4879+
case v as SIMVAR(varKind = DAE_AUX_VAR()) then '(data->simulationInfo->daeModeData->auxiliaryVars[<%index%>])<%&sub%><%crefCCommentWithVariability(v)%>'
4880+
case SIMVAR(index = -2) then
48814881
(let s = (if isPre then crefNonSimVar(crefPrefixPre(cr)) else crefNonSimVar(cr))
48824882
if intEq(ix,0) then s
48834883
else '_<%s%>(<%ix%>)')
4884-
case var as SIMVAR(index=-1) then error(sourceInfo(), 'crefToCStr got index=-1 for <%variabilityString(varKind)%> <%crefStrNoUnderscore(name)%>')
4885-
case var as SIMVAR(__) then '<%varArrayNameValues(var, ix, isPre, isStart, &sub)%>'
4884+
case SIMVAR(index = -1) then error(sourceInfo(), 'crefToCStr got index=-1 for <%variabilityString(varKind)%> <%crefStrNoUnderscore(name)%>')
4885+
case v as SIMVAR(__) then varArrayNameValues(v, ix, isPre, isStart, &sub)
48864886
else "CREF_NOT_IDENT_OR_QUAL"
48874887
end crefToCStr;
48884888

@@ -7837,18 +7837,19 @@ template varArrayNameValues(SimVar var, Integer ix, Boolean isPre, Boolean isSta
78377837
'(<%arr%>data->simulationInfo->extObjs[<%index%>])<%&sub%>'
78387838
case SIMVAR(__) then
78397839
let c_comment = CodegenUtil.crefCCommentWithVariability(var)
7840+
let ty = crefShortType(name)
78407841
'<%if isStart then '<%varAttributes(var, &sub)%>.start'
7841-
else if isPre then '(<%arr%>data->simulationInfo-><%crefShortType(name)%>VarsPre[<%index%>]<%c_comment%>)<%&sub%>'
7842-
else '(<%arr%>data->localData[<%ix%>]-><%crefShortType(name)%>Vars[<%index%>]<%c_comment%>)<%sub%>'%>'
7842+
else if isPre then '(<%arr%>data->simulationInfo-><%ty%>VarsPre[<%index%>]<%c_comment%>)<%&sub%>'
7843+
else '(<%arr%>data->localData[<%ix%>]-><%ty%>Vars[data->simulationInfo-><%ty%>VarsIndex[<%index%>]]<%c_comment%>)<%sub%>'%>'
78437844
end match
78447845
end match
78457846
end varArrayNameValues;
78467847

78477848
template varArrayName(SimVar var)
78487849
::=
78497850
match var
7850-
case SIMVAR(varKind=PARAM()) then '<%crefShortType(name)%>Parameter'
7851-
case SIMVAR(__) then '<%crefShortType(name)%>Vars'
7851+
case SIMVAR(varKind=PARAM()) then '<%crefShortType(name)%>Parameter'
7852+
case SIMVAR(__) then '<%crefShortType(name)%>Vars'
78527853
end varArrayName;
78537854

78547855
template crefVarInfo(ComponentRef cr)

OMCompiler/SimulationRuntime/c/simulation/simulation_runtime.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1063,6 +1063,8 @@ int initRuntimeAndSimulation(int argc, char**argv, DATA *data, threadData_t *thr
10631063
data->simulationInfo->maxWarnDisplays = DEFAULT_FLAG_LV_MAX_WARN;
10641064
}
10651065

1066+
// TODO this needs to happen after read_init_xml,
1067+
// or we need to read resizable parameters before this.
10661068
initializeDataStruc(data, threadData);
10671069
if(!data)
10681070
{
@@ -1285,6 +1287,8 @@ void communicateMsg(char id, unsigned int size, const char *data)
12851287
*/
12861288
int _main_initRuntimeAndSimulation(int argc, char**argv, DATA *data, threadData_t *threadData) {
12871289

1290+
// FIXME this looks like it's just a wrapper!
1291+
12881292
if (initRuntimeAndSimulation(argc, argv, data, threadData)) //initRuntimeAndSimulation returns 1 if an error occurs
12891293
return 1;
12901294

OMCompiler/SimulationRuntime/c/simulation/solver/model_help.c

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1004,6 +1004,23 @@ void initializeDataStruc(DATA *data, threadData_t *threadData)
10041004
throwStreamPrint(threadData, "Your memory is not strong enough for our ringbuffer!");
10051005
}
10061006

1007+
/* index map */
1008+
data->simulationInfo->realVarsIndex = (size_t*) calloc(data->modelData->nVariablesRealArray + 1, sizeof(size_t));
1009+
data->simulationInfo->integerVarsIndex = (size_t*) calloc(data->modelData->nVariablesIntegerArray + 1, sizeof(size_t));
1010+
data->simulationInfo->booleanVarsIndex = (size_t*) calloc(data->modelData->nVariablesBooleanArray + 1, sizeof(size_t));
1011+
data->simulationInfo->stringVarsIndex = (size_t*) calloc(data->modelData->nVariablesStringArray + 1, sizeof(size_t));
1012+
1013+
/* compute index map */
1014+
for (i = 0; i < data->modelData->nVariablesRealArray + 1; i++) data->simulationInfo->realVarsIndex[i] = i;
1015+
for (i = 0; i < data->modelData->nVariablesIntegerArray + 1; i++) data->simulationInfo->integerVarsIndex[i] = i;
1016+
for (i = 0; i < data->modelData->nVariablesBooleanArray + 1; i++) data->simulationInfo->booleanVarsIndex[i] = i;
1017+
for (i = 0; i < data->modelData->nVariablesStringArray + 1; i++) data->simulationInfo->stringVarsIndex[i] = i;
1018+
1019+
data->modelData->nVariablesReal = data->simulationInfo->realVarsIndex[data->modelData->nVariablesRealArray];
1020+
data->modelData->nVariablesInteger = data->simulationInfo->integerVarsIndex[data->modelData->nVariablesIntegerArray];
1021+
data->modelData->nVariablesBoolean = data->simulationInfo->booleanVarsIndex[data->modelData->nVariablesBooleanArray];
1022+
data->modelData->nVariablesString = data->simulationInfo->stringVarsIndex[data->modelData->nVariablesStringArray];
1023+
10071024
/* prepare RingBuffer */
10081025
for(i=0; i<SIZERINGBUFFER; i++)
10091026
{
@@ -1316,6 +1333,12 @@ void deInitializeDataStruc(DATA *data)
13161333
free(data->simulationInfo->states_left);
13171334
free(data->simulationInfo->states_right);
13181335

1336+
/* free buffer for index map */
1337+
free(data->simulationInfo->realVarsIndex);
1338+
free(data->simulationInfo->integerVarsIndex);
1339+
free(data->simulationInfo->booleanVarsIndex);
1340+
free(data->simulationInfo->stringVarsIndex);
1341+
13191342
/* free buffer for old state variables */
13201343
free(data->simulationInfo->realVarsOld);
13211344
free(data->simulationInfo->integerVarsOld);

OMCompiler/SimulationRuntime/c/simulation_data.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,6 +576,13 @@ typedef struct MODEL_DATA
576576
long nBaseClocks; /* total number of base-clocks*/
577577

578578
fortran_integer nStates;
579+
580+
/* numbers of unscalarized variables (arrays counted as one variable, used for index map) */
581+
size_t nVariablesRealArray;
582+
size_t nVariablesIntegerArray;
583+
size_t nVariablesBooleanArray;
584+
size_t nVariablesStringArray;
585+
579586
long nVariablesReal; /* all Real Variables of the model (states, statesderivatives, algebraics, real discretes) */
580587
long nDiscreteReal; /* only all _discrete_ reals */
581588
long nVariablesInteger;
@@ -761,6 +768,12 @@ typedef struct SIMULATION_INFO
761768
modelica_real* states_left; /* work array for findRoot in event.c */
762769
modelica_real* states_right; /* work array for findRoot in event.c */
763770

771+
/* index map: arr_idx -> start_idx */
772+
size_t* realVarsIndex;
773+
size_t* integerVarsIndex;
774+
size_t* booleanVarsIndex;
775+
size_t* stringVarsIndex;
776+
764777
/* old vars for event handling */
765778
modelica_real timeValueOld;
766779
modelica_real* realVarsOld;

0 commit comments

Comments
 (0)