Skip to content

Commit

Permalink
Merge pull request #1 from vwaurich/synchronous
Browse files Browse the repository at this point in the history
-fix synchronous for variable intervals in cpp-runtime
  • Loading branch information
niklwors committed Apr 20, 2016
2 parents 1f4723e + a98c322 commit e04b3b7
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 8 deletions.
1 change: 1 addition & 0 deletions Compiler/SimCode/SimCode.mo
Expand Up @@ -143,6 +143,7 @@ end ClockedPartition;
public uniontype SubPartition
record SUBPARTITION
list<tuple<SimCodeVar.SimVar, Boolean /*previous*/>> vars;
list<SimEqSystem> previousAssignments; //equations to assign the $CLKPRE_* variables
list<SimEqSystem> equations;
list<SimEqSystem> removedEquations;
BackendDAE.SubClock subClock;
Expand Down
5 changes: 3 additions & 2 deletions Compiler/SimCode/SimCodeUtil.mo
Expand Up @@ -623,6 +623,7 @@ algorithm

prevClockedVars := {};
isPrevVar := arrayCreate(BackendVariable.varsSize(syst.orderedVars), false);
preEquations := {};
for cr in subPartition.prevVars loop
(_, varIxs) := BackendVariable.getVar(cr, syst.orderedVars);
for i in varIxs loop
Expand All @@ -639,13 +640,13 @@ algorithm
simVar.name := ComponentReference.crefPrefixPrevious(cr);
clockedVars := simVar::clockedVars;
simEq := SimCode.SES_SIMPLE_ASSIGN(ouniqueEqIndex, simVar.name, DAE.CREF(cr, simVar.type_), DAE.emptyElementSource);
equations := simEq::equations;
preEquations := simEq::preEquations;
ouniqueEqIndex := ouniqueEqIndex + 1;
end if;
end for;

//otempvars := listAppend(clockedVars, otempvars);
simSubPartition := SimCode.SUBPARTITION(prevClockedVars, equations, removedEquations, subPartition.clock, subPartition.holdEvents);
simSubPartition := SimCode.SUBPARTITION(prevClockedVars, preEquations, equations, removedEquations, subPartition.clock, subPartition.holdEvents);

assert(isNone(simSubPartitions[subPartIdx]), "SimCodeUtil.translateClockedEquations failed");
arrayUpdate(simSubPartitions, subPartIdx, SOME(simSubPartition));
Expand Down
4 changes: 2 additions & 2 deletions Compiler/Template/CodegenC.tpl
Expand Up @@ -351,8 +351,8 @@ template functionSystemsSynchronous(list<SubPartition> subPartitions, String mod
::=
let systs = subPartitions |> subPartition hasindex i =>
match subPartition
case SUBPARTITION(__) then
functionEquationsSynchronous(i, vars, listAppend(equations, removedEquations), modelNamePrefix)
case SUBPARTITION(equations=equations, previousAssignments=preveequations) then
functionEquationsSynchronous(i, vars, listAppend(listAppend(previousAssignments,equations), removedEquations), modelNamePrefix)
; separator = "\n"
let cases = subPartitions |> subPartition hasindex i =>
let name = 'functionEquationsSynchronous_system<%i%>'
Expand Down
22 changes: 18 additions & 4 deletions Compiler/Template/CodegenCpp.tpl
Expand Up @@ -7218,7 +7218,9 @@ template generateClockedFuncDecls(list<SubPartition> subPartitions, Text method)
<<
/// Clocked partition <%i%>
void evaluateClocked<%i%>(const UPDATETYPE command);
<%generateEquationMemberFuncDecls(listAppend(equations, removedEquations), method)%>
void evaluateClockedAssignPrevious<%i%>(const UPDATETYPE command);

<%generateEquationMemberFuncDecls(listAppend(listAppend(previousAssignments,equations), removedEquations), method)%>
>>
; separator="\n")
'<%decls%>'
Expand Down Expand Up @@ -12657,7 +12659,7 @@ template clockedFunctions(list<ClockedPartition> clockedPartitions, SimCode simC
let subClocks = (subPartitions |> subPartition hasindex j fromindex 1 =>
match subPartition
case SUBPARTITION(subClock=SUBCLOCK(factor=RATIONAL(nom=fnom, denom=fres), shift=RATIONAL(nom=snom, denom=sres))) then
clockedPartFunctions(intMul(i,j), listAppend(equations, removedEquations), clock,subClock,simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, contextSimulationDiscrete, stateDerVectorName, useFlatArrayNotation, enableMeasureTime)
clockedPartFunctions(intMul(i,j),previousAssignments, listAppend(equations, removedEquations), clock,subClock,simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, contextSimulationDiscrete, stateDerVectorName, useFlatArrayNotation, enableMeasureTime)
; separator="\n")
<<
<%subClocks%>
Expand Down Expand Up @@ -12689,7 +12691,7 @@ template clockedFunctions(list<ClockedPartition> clockedPartitions, SimCode simC
>>
end clockedFunctions;

template clockedPartFunctions(Integer i, list<SimEqSystem> equations,DAE.ClockKind baseClock,BackendDAE.SubClock subClock,SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl, Text extraFuncsNamespace, Context context, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation, Boolean enableMeasureTime)
template clockedPartFunctions(Integer i, list<SimEqSystem> previousAssignments, list<SimEqSystem> equations,DAE.ClockKind baseClock,BackendDAE.SubClock subClock,SimCode simCode, Text& extraFuncs, Text& extraFuncsDecl, Text extraFuncsNamespace, Context context, Text stateDerVectorName /*=__zDot*/, Boolean useFlatArrayNotation, Boolean enableMeasureTime)
"Evaluate functions that belong to a clocked partition"
::=
let className = lastIdentOfPathFromSimCode(simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace)
Expand All @@ -12706,13 +12708,20 @@ template clockedPartFunctions(Integer i, list<SimEqSystem> equations,DAE.ClockKi
_clockTime[<%idx%>] = _simTime + _clockShift[<%idx%>] * _clockInterval[<%idx%>];
>>

let funcs = equations |> eq =>
let funcs = listAppend(previousAssignments,equations) |> eq =>
equation_function_create_single_func(eq, context/*BUFC*/, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace, "evaluate", "", stateDerVectorName, useFlatArrayNotation, enableMeasureTime, false, false, 'const int clockIndex = <%i%>;<%\n%>')
; separator="\n"

let funcNamePrev = 'evaluateClockedAssignPrevious<%i%>'
let funcCallsPrev = (List.partition(previousAssignments, 100) |> eqs hasindex i0 =>
createEvaluateWithSplit(i0, context, eqs, funcNamePrev, className, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace)
; separator="\n")

let funcName = 'evaluateClocked<%i%>'
let funcCalls = (List.partition(equations, 100) |> eqs hasindex i0 =>
createEvaluateWithSplit(i0, context, eqs, funcName, className, simCode, &extraFuncs, &extraFuncsDecl, extraFuncsNamespace)
; separator="\n")

let idx = intAdd(i, -1)
<<
<%funcs%>
Expand All @@ -12721,11 +12730,16 @@ template clockedPartFunctions(Integer i, list<SimEqSystem> equations,DAE.ClockKi
{
<%varDecls%>
<%preExp%>
//evaluate clock partition equations
<%funcCalls%>

//compute new clock tick
if ((_simTime > _clockTime[<%idx%>])||_clockStart) {
<%clockvals%>
_clockStart = false;
}
//assign the previous-vars since the step is completed
<%funcCallsPrev%>
}
>>
end clockedPartFunctions;
Expand Down
1 change: 1 addition & 0 deletions Compiler/Template/SimCodeTV.mo
Expand Up @@ -333,6 +333,7 @@ package SimCode
uniontype SubPartition
record SUBPARTITION
list<tuple<SimCodeVar.SimVar, Boolean>> vars;
list<SimEqSystem> previousAssignments;
list<SimEqSystem> equations;
list<SimEqSystem> removedEquations;
BackendDAE.SubClock subClock;
Expand Down

0 comments on commit e04b3b7

Please sign in to comment.