Skip to content

Commit

Permalink
Simplify clumsy logic
Browse files Browse the repository at this point in the history
  • Loading branch information
henrikt-ma committed Jan 18, 2022
1 parent d551987 commit 6d68686
Showing 1 changed file with 15 additions and 29 deletions.
44 changes: 15 additions & 29 deletions chapters/statemachines.tex
Expand Up @@ -253,9 +253,8 @@ \subsection{State Activation}\label{state-activation}
\begin{lstlisting}[language=modelica]
Integer fired =
max(
if (if t[i].from == selectedState
then (if t[i].immediate then c[i] else previous(c[i]))
else false)
if t[i].from == selectedState and
(if t[i].immediate then c[i] else previous(c[i]))
then i
else 0
for i in 1 : size(t, 1));
Expand All @@ -273,9 +272,7 @@ \subsection{State Activation}\label{state-activation}
\begin{lstlisting}[language=modelica]
Integer immediate =
max(
if (if t[i].immediate and t[i].from == selectedState
then c[i]
else false)
if t[i].immediate and t[i].from == selectedState and c[i]
then i
else 0
for i in 1 : size(t, 1));
Expand All @@ -288,9 +285,7 @@ \subsection{State Activation}\label{state-activation}
\begin{lstlisting}[language=modelica]
Integer delayed =
max(
if (if not t[i].immediate and t[i].from == nextState
then c[i]
else false)
if not t[i].immediate and t[i].from == nextState and c[i]
then i
else 0
for i in 1 : size(t, 1));
Expand All @@ -317,8 +312,7 @@ \subsection{State Activation}\label{state-activation}
state currently:
\begin{lstlisting}[language=modelica]
Boolean finalStates[nStates] =
{max(if t[j].from == i then 1 else 0 for j in 1 : size(t, 1)) == 0
for i in 1 : nStates};
{min(t[j].from <> i for j in 1 : size(t, 1)) for i in 1 : nStates};
Boolean stateMachineInFinalState = finalStates[activeState];
\end{lstlisting}
To enable a synchronize transition, all the \lstinline!stateMachineInFinalState! conditions of all state machines within the meta state must be true. An example is given below in the semantic example model.
Expand All @@ -341,14 +335,13 @@ \subsection{Reset Handling}\label{reset-handling}
The state machine reset flag is propagated and maintained to each state individually:
\begin{lstlisting}[language=modelica]
output Boolean activeResetStates[nStates] =
{if reset then true else previous(nextResetStates[i]) for i in 1 : nStates};
{reset or previous(nextResetStates[i]) for i in 1 : nStates};
\end{lstlisting}
until a state is eventually executed, then its corresponding reset condition is set to false:
\begin{lstlisting}[language=modelica]
Boolean nextResetStates[nStates] =
if active then
{if activeState == i then false else activeResetStates[i]
for i in 1 : nStates}
{activeState <> i and activeResetStates[i] for i in 1 : nStates}
else
previous(nextResetStates)
\end{lstlisting}
Expand All @@ -375,46 +368,39 @@ \subsection{Semantics Summary}\label{semantics-summary}
input Boolean active "true if the state machine is active";
input Boolean reset "true when the state machine should be reset";
Integer selectedState = if reset then 1 else previous(nextState);
Boolean selectedReset = if reset then true else previous(nextReset);
Boolean selectedReset = reset or previous(nextReset);
// For strong (immediate) and weak (delayed) transitions
Integer immediate =
max(
if (if t[i].immediate and t[i].from == selectedState
then c[i]
else false)
if (t[i].immediate and t[i].from == selectedState and c[i])
then i
else 0
for i in 1 : size(t, 1));
Integer delayed =
max(
if (if not t[i].immediate and t[i].from == nextState
then c[i]
else false)
if (not t[i].immediate and t[i].from == nextState and c[i])
then i
else 0
for i in 1 : size(t, 1));
Integer fired = max(previous(delayed), immediate);
output Integer activeState =
if reset then 1 elseif fired > 0 then t[fired].to else selectedState;
output Boolean activeReset =
if reset then true elseif fired > 0 then t[fired].reset else selectedReset;
reset or (if fired > 0 then t[fired].reset else selectedReset);

// Update states
Integer nextState = if active then activeState else previous(nextState);
Boolean nextReset = if active then false else previous(nextReset);
Boolean nextReset = not active and previous(nextReset);
// Delayed resetting of individual states
output Boolean activeResetStates[nStates] =
{if reset then true else previous(nextResetStates[i])
for i in 1 : nStates};
{reset or previous(nextResetStates[i]) for i in 1 : nStates};
Boolean nextResetStates[nStates] =
if active then
{if activeState == i then false else activeResetStates[i]
for i in 1 : nStates}
{activeState <> i and activeResetStates[i] for i in 1 : nStates}
else
previous(nextResetStates);
Boolean finalStates[nStates] =
{max(if t[j].from == i then 1 else 0 for j in 1 : size(t, 1)) == 0
for i in 1 : nStates};
{min(t[j].from <> i for j in 1 : size(t, 1)) for i in 1 : nStates};
Boolean stateMachineInFinalState = finalStates[activeState];
end StateMachineSemantics;
\end{lstlisting}
Expand Down

0 comments on commit 6d68686

Please sign in to comment.