added small fix
This commit is contained in:
@@ -83,7 +83,7 @@ This paper proposes \lambdammm, a call-by-value, simply typed lambda calculus-ba
|
|||||||
\section{VM Model and Instruction Set}
|
\section{VM Model and Instruction Set}
|
||||||
\label{sec:vm}
|
\label{sec:vm}
|
||||||
|
|
||||||
The virtual machine model and its instruction set for running \\ \lambdammm\ are based on Lua version 5 VM \cite{ierusalimschy2005}.
|
The virtual machine (VM) model and its instruction set for running \\ \lambdammm\ are based on Lua version 5 VM \cite{ierusalimschy2005}.
|
||||||
|
|
||||||
A key challenge when executing a computational model based on lambda calculus is handling the data structure, which is known as a closure. A closure captures the variable environment in which the inner function is defined, allowing it to refer to the variables from the outer function’s context. If the inner function is paired with a dictionary of variable names and values, the compiler (or interpreter) implementation is straightforward; however, the runtime performance is limited.
|
A key challenge when executing a computational model based on lambda calculus is handling the data structure, which is known as a closure. A closure captures the variable environment in which the inner function is defined, allowing it to refer to the variables from the outer function’s context. If the inner function is paired with a dictionary of variable names and values, the compiler (or interpreter) implementation is straightforward; however, the runtime performance is limited.
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ This paper proposes \lambdammm, a call-by-value, simply typed lambda calculus-ba
|
|||||||
\textit{ *(SPos,SPtr)= vm.closures[vm.statepos\_stack.top()].state }
|
\textit{ *(SPos,SPtr)= vm.closures[vm.statepos\_stack.top()].state }
|
||||||
}\\
|
}\\
|
||||||
\multicolumn{3}{l}{
|
\multicolumn{3}{l}{
|
||||||
\textit{\quad if vm.statepos\_stack is empty, use global state storage.)}
|
\textit{\quad (if vm.statepos\_stack is empty, use global state storage.)}
|
||||||
}\\
|
}\\
|
||||||
JMP & sAx & PC +=sAx \\
|
JMP & sAx & PC +=sAx \\
|
||||||
JMPIFNEG & A sBx & if (R(A)<0) then PC += sBx \\
|
JMPIFNEG & A sBx & if (R(A)<0) then PC += sBx \\
|
||||||
@@ -160,7 +160,7 @@ This paper proposes \lambdammm, a call-by-value, simply typed lambda calculus-ba
|
|||||||
\subsection{Overview of the VM Structure}
|
\subsection{Overview of the VM Structure}
|
||||||
\label{sec:vmstructure}
|
\label{sec:vmstructure}
|
||||||
|
|
||||||
The overall structure of the virtual machine (VM), program, and instantiated closures for \lambdammm\ is depicted in Figure \ref{fig:vmstructure}. In addition to the usual call stack, the VM has a dedicated storage area (a flat array) to manage the internal state data for feedback and delay.
|
The overall structure of the virtual machine program, and instantiated closures for \lambdammm\ is depicted in Figure \ref{fig:vmstructure}. In addition to the usual call stack, the VM has a dedicated storage area (a flat array) to manage the internal state data for feedback and delay.
|
||||||
|
|
||||||
This storage area is accompanied by pointers that indicate the positions from which the internal state data are retrieved via the \\ \texttt{GETSTATE} and \texttt{SETSTATE} instructions. These positions are shi-fted forward or backward using the \texttt{SHIFTSTATE} instruction. The actual data layout in the state storage memory is statically determined during compilation by analyzing function calls involving references to \texttt{self}, \texttt{delay}, and other stateful functions, including those that recursively invoke such functions. The \texttt{DELAY} operation takes two inputs: \texttt{B}, representing the input value, and \texttt{C}, representing the delay time in the samples.
|
This storage area is accompanied by pointers that indicate the positions from which the internal state data are retrieved via the \\ \texttt{GETSTATE} and \texttt{SETSTATE} instructions. These positions are shi-fted forward or backward using the \texttt{SHIFTSTATE} instruction. The actual data layout in the state storage memory is statically determined during compilation by analyzing function calls involving references to \texttt{self}, \texttt{delay}, and other stateful functions, including those that recursively invoke such functions. The \texttt{DELAY} operation takes two inputs: \texttt{B}, representing the input value, and \texttt{C}, representing the delay time in the samples.
|
||||||
|
|
||||||
@@ -200,11 +200,11 @@ This paper proposes \lambdammm, a call-by-value, simply typed lambda calculus-ba
|
|||||||
|
|
||||||
Listing \ref{lst:bytecodes_onepole} shows a basic example of how the mimium code in Listing \ref{lst:onepole} is compiled into VM bytecode. When \texttt{self} is referenced, the value is retrieved using the \texttt{GETSTATE} instruction, and the internal state is updated by storing the return value with the \texttt{SETSTATE} instruction before returning it via the \texttt{RETURN} instruction. In this case, the actual return value is obtained using the second \texttt{GETSTATE} instruction, which ensures that the initial state value is returned at time = 0.
|
Listing \ref{lst:bytecodes_onepole} shows a basic example of how the mimium code in Listing \ref{lst:onepole} is compiled into VM bytecode. When \texttt{self} is referenced, the value is retrieved using the \texttt{GETSTATE} instruction, and the internal state is updated by storing the return value with the \texttt{SETSTATE} instruction before returning it via the \texttt{RETURN} instruction. In this case, the actual return value is obtained using the second \texttt{GETSTATE} instruction, which ensures that the initial state value is returned at time = 0.
|
||||||
|
|
||||||
For example, if a time counter is written as \texttt{| | {self + 1}}, the decision on whether the return value at time = 0 should be 0 or 1 is left to the compiler design. Although returning 1 does not strictly follow the semantics of E-FEED in Figure \ref{fig:semantics}, if the compiler is designed to return 1 at time = 0, the second \texttt{GETSTATE} instruction can be omitted, and the value for the \texttt{RETURN} instruction should be \texttt{R(2)}.
|
For example, if a time counter is written as $feed x. x+1$, the decision on whether the return value at time = 0 should be 0 or 1 is left to the compiler design. Although returning 1 does not strictly follow the semantics of E-FEED in Figure \ref{fig:semantics}, if the compiler is designed to return 1 at time = 0, the second \texttt{GETSTATE} instruction can be omitted, and the value for the \texttt{RETURN} instruction should be \texttt{R(2)}.
|
||||||
|
|
||||||
A more complex example, along with its expected bytecode instructions, is shown in Listings \ref{lst:fbdelay} and \ref{lst:bytecodes_fbdelay}. The code defines a delay with feedback as \texttt{fbdelay}, while another function, \texttt{twodelay}, uses two feedback delays with different parameters. Finally, \texttt{dsp} uses two \texttt{twodelay} functions.
|
A more complex example, along with its expected bytecode instructions, is shown in Listings \ref{lst:fbdelay} and \ref{lst:bytecodes_fbdelay}. The code defines a delay with feedback as \texttt{fbdelay}, while another function, \texttt{twodelay}, uses two feedback delays with different parameters. Finally, \texttt{dsp} uses two \texttt{twodelay} functions.
|
||||||
|
|
||||||
After each reference to \texttt{self} through the \texttt{GETSTATE} instruction or after calling another stateful function, the \texttt{SHIFTSTATE} instruction is inserted to advance the state storage position in preparation for the next non-closure function call. Before the function exits, the state position is reset to where it was at the beginning of the current function context using the \texttt{SHIFTSTATE} instruction. The total operand value for \texttt{SHIFTSTATE} within a function must always sum to 0. Figure \ref{fig:fbdelay_spos} illustrates how the state position shifts with the \texttt{SHIFTSTATE} operations during the execution of the \texttt{twodelay} function.
|
After each reference to \texttt{self} through the \texttt{GETSTATE} instruction or after calling another stateful function, the \texttt{SHIFTSTATE} instruction is inserted to advance the state storage position in preparation for the next non-closure function call. Before the function exits, the state position is reset to where it was at the beginning of the current function context using the \texttt{SHIFTSTATE} instruction. The total operand value for \texttt{SHIFTSTATE} within a function must always sum to 0. Figure \ref{fig:fbdelay_spos} illustrates how the state position shifts with the \texttt{SHIFTSTATE} operations during the execution of the \texttt{twodelay} function. The argument for the \texttt{SHIFTSTATE} operation is a word size (a number of 64 bit values) and the word size for delay is \texttt{maximum delay time + 3} since the read index, write index and the length of the ring buffer are added.
|
||||||
|
|
||||||
The state data can be stored as a flat array by representing the internal state as a relative position within the state storage, thereby simplifying compiler implementation; this avoids the need to generate a tree structure from the root, which was required in the previous implementation of mimium. This approach is similar to how upvalues simplify the compiler implementation by treating free variables as relative positions on the call stack.
|
The state data can be stored as a flat array by representing the internal state as a relative position within the state storage, thereby simplifying compiler implementation; this avoids the need to generate a tree structure from the root, which was required in the previous implementation of mimium. This approach is similar to how upvalues simplify the compiler implementation by treating free variables as relative positions on the call stack.
|
||||||
|
|
||||||
@@ -223,7 +223,7 @@ This paper proposes \lambdammm, a call-by-value, simply typed lambda calculus-ba
|
|||||||
|
|
||||||
\begin{lstlisting}[float,floatplacement=H,label=lst:bytecodes_fbdelay,caption=\it Compiled VM instructions of feedback delay example in Listing \ref{lst:fbdelay}]
|
\begin{lstlisting}[float,floatplacement=H,label=lst:bytecodes_fbdelay,caption=\it Compiled VM instructions of feedback delay example in Listing \ref{lst:fbdelay}]
|
||||||
CONSTANTS:[0.7,2,0.8,400,800,0,1]
|
CONSTANTS:[0.7,2,0.8,400,800,0,1]
|
||||||
fn fbdelay(x,fb,dtime) state_size:2
|
fn fbdelay(x,fb,dtime) state_size:1004
|
||||||
MOVE 3 0 //load x
|
MOVE 3 0 //load x
|
||||||
GETSTATE 4 //load self
|
GETSTATE 4 //load self
|
||||||
SHIFTSTATE 1 //shift Spos
|
SHIFTSTATE 1 //shift Spos
|
||||||
@@ -236,13 +236,13 @@ This paper proposes \lambdammm, a call-by-value, simply typed lambda calculus-ba
|
|||||||
SETSTATE 3 //store to self
|
SETSTATE 3 //store to self
|
||||||
RETURN 4 1 //return previous self
|
RETURN 4 1 //return previous self
|
||||||
|
|
||||||
fn twodelay(x,dtime) state_size:4
|
fn twodelay(x,dtime) state_size:2008
|
||||||
MOVECONST 2 5 //load "fbdelay" prototype
|
MOVECONST 2 5 //load "fbdelay" prototype
|
||||||
MOVE 3 0
|
MOVE 3 0
|
||||||
MOVE 4 1
|
MOVE 4 1
|
||||||
MOVECONST 5 0 //load 0.7
|
MOVECONST 5 0 //load 0.7
|
||||||
CALL 2 3 1
|
CALL 2 3 1
|
||||||
SHIFTSTATE 2 //2=state_size of fbdelay
|
SHIFTSTATE 1004 //1004=state_size of fbdelay
|
||||||
MOVECONST 3 5 //load "fbdelay" prototype
|
MOVECONST 3 5 //load "fbdelay" prototype
|
||||||
MOVE 4 0
|
MOVE 4 0
|
||||||
MOVECONST 5 1 //load 2
|
MOVECONST 5 1 //load 2
|
||||||
@@ -250,7 +250,7 @@ This paper proposes \lambdammm, a call-by-value, simply typed lambda calculus-ba
|
|||||||
MOVECONST 5 0 //load 0.7
|
MOVECONST 5 0 //load 0.7
|
||||||
CALL 3 3 1
|
CALL 3 3 1
|
||||||
ADDF 3 3 4
|
ADDF 3 3 4
|
||||||
SHIFTSTATE -2
|
SHIFTSTATE -1004
|
||||||
RETURN 3 1
|
RETURN 3 1
|
||||||
|
|
||||||
fn dsp (x)
|
fn dsp (x)
|
||||||
@@ -258,14 +258,14 @@ This paper proposes \lambdammm, a call-by-value, simply typed lambda calculus-ba
|
|||||||
MOVE 2 0
|
MOVE 2 0
|
||||||
MOVECONST 3 3 //load 400
|
MOVECONST 3 3 //load 400
|
||||||
CALL 1 2 1
|
CALL 1 2 1
|
||||||
SHIFTSTATE 4 //4=state_size of twodelay
|
SHIFTSTATE 2008
|
||||||
MOVECONST 2 6
|
MOVECONST 2 6
|
||||||
MOVE 2 3 //load "twodelay" prototype
|
MOVE 2 3 //load "twodelay" prototype
|
||||||
MOVE 3 0
|
MOVE 3 0
|
||||||
MOVECONST 3 4 //load 400
|
MOVECONST 3 4 //load 400
|
||||||
CALL 2 2 1
|
CALL 2 2 1
|
||||||
ADD 1 1 2
|
ADD 1 1 2
|
||||||
SHIFTSTATE -4
|
SHIFTSTATE -2008
|
||||||
RETURN 1 1
|
RETURN 1 1
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
@@ -274,8 +274,8 @@ This paper proposes \lambdammm, a call-by-value, simply typed lambda calculus-ba
|
|||||||
\caption{\label{fig:fbdelay_spos}{\it Image of how the state position moves while executing \texttt{twodelay} function in Listing \ref{lst:bytecodes_fbdelay}.}}
|
\caption{\label{fig:fbdelay_spos}{\it Image of how the state position moves while executing \texttt{twodelay} function in Listing \ref{lst:bytecodes_fbdelay}.}}
|
||||||
\end{figure}
|
\end{figure}
|
||||||
|
|
||||||
Listing \ref{lst:filterbank_good} shows an example of a higher-order function \\ \texttt{filterbank}, which takes another function \texttt{filter}—accepting an input and a frequency as arguments—duplicates \texttt{n} instances of \texttt{filter} and adds them together. In the previous specification of mimium \cite{matsuura2021a}, the syntax for the variable binding and destructive assignment was the same (\texttt{x = a}). However, in the current syntax, variable binding uses the \texttt{let} keyword. In addition, because semantics follow a call-by-value paradigm, reassignment syntax is no longer used in the current implementation.
|
Listing \ref{lst:filterbank_good} shows an example of a higher-order function \\ \texttt{filterbank}, which takes another function \texttt{filter}—accepting an input and a frequency as arguments—duplicates \texttt{n} instances of \texttt{filter} and adds them together\footnote{In the previous specification of mimium \cite{matsuura2021a}, the syntax for the variable binding and destructive assignment was the same (\texttt{x = a}). However, in the current syntax, variable binding uses the \texttt{let} keyword.}.
|
||||||
|
|
||||||
The previous mimium compiler was unable to compile code that took a function with an internal state as an argument because the entire tree of internal states had to be statically determined at compile time. However, the VM in \lambdammm\ can handle this dynamically. Listing \ref{lst:bytecode_filterbank} shows the translated VM instructions for this code. Recursive calls on the first line of \texttt{filterbank}, as well as calls to functions passed as arguments or obtained through upvalues (like \texttt{filter}), are executed using the \texttt{CALLCLS} instruction rather than the \texttt{CALL} instruction. The \texttt{GETSTATE} and \texttt{SETSTATE} instructions are not used in this function because the internal state storage is switched dynamically when the \texttt{CALLCLS} instruction is interpreted.
|
The previous mimium compiler was unable to compile code that took a function with an internal state as an argument because the entire tree of internal states had to be statically determined at compile time. However, the VM in \lambdammm\ can handle this dynamically. Listing \ref{lst:bytecode_filterbank} shows the translated VM instructions for this code. Recursive calls on the first line of \texttt{filterbank}, as well as calls to functions passed as arguments or obtained through upvalues (like \texttt{filter}), are executed using the \texttt{CALLCLS} instruction rather than the \texttt{CALL} instruction. The \texttt{GETSTATE} and \texttt{SETSTATE} instructions are not used in this function because the internal state storage is switched dynamically when the \texttt{CALLCLS} instruction is interpreted.
|
||||||
|
|
||||||
\begin{lstlisting}[float,floatplacement=H,label=lst:filterbank_good,language=Rust,caption=\it Example code that duplicates filter parametrically using a recursive function and closure.]
|
\begin{lstlisting}[float,floatplacement=H,label=lst:filterbank_good,language=Rust,caption=\it Example code that duplicates filter parametrically using a recursive function and closure.]
|
||||||
@@ -384,7 +384,7 @@ This paper proposes \lambdammm, a call-by-value, simply typed lambda calculus-ba
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
fn dsp(){ //called by audio driver.
|
fn dsp(){ //called by audio driver.
|
||||||
filterbank(3,bandpass)
|
filterbank(3,bandpass)(x,1000)
|
||||||
}
|
}
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
@@ -398,19 +398,19 @@ This paper proposes \lambdammm, a call-by-value, simply typed lambda calculus-ba
|
|||||||
} >.
|
} >.
|
||||||
}
|
}
|
||||||
fn dsp(){
|
fn dsp(){
|
||||||
~filterbank(3,bandpass) (x,1000)
|
~filterbank(3,bandpass)(x,1000)
|
||||||
}
|
}
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
This implies that major compiler optimization techniques, such as constant folding and function inlining, cannot be directly applied to mimium. These optimizations must be performed after global context evaluation and before the evaluation of the \texttt{dsp} function.
|
This implies that major compiler optimization techniques, such as constant folding and function inlining, cannot be directly applied to mimium. These optimizations must be performed after global context evaluation and before the evaluation of the \texttt{dsp} function.
|
||||||
|
|
||||||
To address this issue, it is necessary to introduce a distinction in the type system to indicate whether a term should be used during global context evaluation (stage 0) or actual signal processing (stage 1). This can be achieved with Multi-Stage Computation \cite{Taha1997}. Listing \ref{lst:filterbank_multi} provides an example of the \\ \texttt{filterbank} code using BER MetaOCaml’s syntax: \texttt{.<term>.}, which generates a program to be used in the next stage, and \texttt{\textasciitilde term}, which embeds the terms evaluated in the previous stage \cite{kiselyov2014a}.
|
To address this issue, it is necessary to introduce a distinction in the type system to indicate whether a term should be used during global context evaluation (stage 0) or actual signal processing (stage 1). This can be achieved with Multi-Stage Computation \cite{Taha1997}. Listing \ref{lst:filterbank_multi} provides an example of the \texttt{filterbank} code using BER MetaOCaml’s syntax: \texttt{.<term>.}, which generates a program to be used in the next stage, and \texttt{\textasciitilde term}, which embeds the terms evaluated in the previous stage \cite{kiselyov2014a}.
|
||||||
|
|
||||||
The \texttt{filterbank} function is evaluated in stage 0 while embedding itself with \texttt{\textasciitilde}. In contrast to Faust and Kronos, this multi-stage computation code retains the same semantics for both the generation of the signal processing graph and the execution of signal processing.
|
The \texttt{filterbank} function is evaluated in stage 0 while embedding itself with \texttt{\textasciitilde}. In contrast to Faust and Kronos, this multi-stage computation code retains the same semantics for both the generation of the signal processing graph and the execution of signal processing.
|
||||||
|
|
||||||
\subsection{A Possibility of the Foreign Stateful Function Call}
|
\subsection{A Possibility of the Foreign Stateful Function Call}
|
||||||
|
|
||||||
The closure data structure in \lambdammm\ combines functions with the internal states, as shown in Figure 3. The fact that \texttt{filterbank} samples do not require special handling for internal states means that external signal processors (Unit Generators: UGens), such as oscillators and filters written in C or C++, can be called from mimium, just like normal closure calls. Additionally, it is possible to parameterize, duplicate, and combine external UGens. This capability is difficult to implement in Faust and similar languages but is easily achievable in the \lambdammm\ paradigm.
|
The closure data structure in \lambdammm\ combines functions with the internal states, as shown in Figure 3. The fact that \texttt{filterbank} samples do not require special handling for internal states means that external signal processors (Unit Generators: UGens), such as oscillators and filters written in C or C++, can be called from mimium, just like normal closure calls. Additionally, it is possible to parameterize, duplicate, and combine external UGens\texttt{In fact, in the actual implementation of mimium, an interoperation between VM and audio driver is realized by passing and calling Rust's closure}. This capability is difficult to implement in Faust and similar languages but is easily achievable in the \lambdammm\ paradigm.
|
||||||
|
|
||||||
However, mimium currently uses sample-by-sample processing and cannot handle buffer-by-buffer value passing. Because most native unit generators process data on a buffer-by-buffer basis, there are few practical cases where external UGens are currently used. Nonetheless, in \lambdammm, only $feed$ terms require sample-by-sample processing. Therefore, it is possible to differentiate the functions that can process only one sample at a time from those that can process concurrently at the type level. As the multi-rate specification is being considered in Faust \cite{jouvelotDependentVectorTypes2011}, it may be possible to facilitate buffer-based processing between an external Unit Generator by having the compiler automatically determine the parts that can be processed buffer-by-buffer.
|
However, mimium currently uses sample-by-sample processing and cannot handle buffer-by-buffer value passing. Because most native unit generators process data on a buffer-by-buffer basis, there are few practical cases where external UGens are currently used. Nonetheless, in \lambdammm, only $feed$ terms require sample-by-sample processing. Therefore, it is possible to differentiate the functions that can process only one sample at a time from those that can process concurrently at the type level. As the multi-rate specification is being considered in Faust \cite{jouvelotDependentVectorTypes2011}, it may be possible to facilitate buffer-based processing between an external Unit Generator by having the compiler automatically determine the parts that can be processed buffer-by-buffer.
|
||||||
|
|
||||||
|
|||||||
Binary file not shown.
@@ -7,7 +7,7 @@
|
|||||||
viewBox="0 0 58.050533 65.004601"
|
viewBox="0 0 58.050533 65.004601"
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg1"
|
id="svg1"
|
||||||
sodipodi:docname="fbdelay_explain.svg"
|
sodipodi:docname="fbdelay_spos.svg"
|
||||||
inkscape:version="1.3 (0e150ed, 2023-07-21)"
|
inkscape:version="1.3 (0e150ed, 2023-07-21)"
|
||||||
inkscape:export-filename="lambdammm_vm_structure.pdf"
|
inkscape:export-filename="lambdammm_vm_structure.pdf"
|
||||||
inkscape:export-xdpi="300"
|
inkscape:export-xdpi="300"
|
||||||
@@ -26,15 +26,15 @@
|
|||||||
inkscape:pagecheckerboard="0"
|
inkscape:pagecheckerboard="0"
|
||||||
inkscape:deskcolor="#d1d1d1"
|
inkscape:deskcolor="#d1d1d1"
|
||||||
inkscape:document-units="mm"
|
inkscape:document-units="mm"
|
||||||
inkscape:zoom="1.410082"
|
inkscape:zoom="1.3927308"
|
||||||
inkscape:cx="278.3526"
|
inkscape:cx="51.337989"
|
||||||
inkscape:cy="212.75358"
|
inkscape:cy="137.14064"
|
||||||
inkscape:window-width="1440"
|
inkscape:window-width="1440"
|
||||||
inkscape:window-height="783"
|
inkscape:window-height="783"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="0"
|
||||||
inkscape:window-y="25"
|
inkscape:window-y="25"
|
||||||
inkscape:window-maximized="0"
|
inkscape:window-maximized="0"
|
||||||
inkscape:current-layer="layer1" />
|
inkscape:current-layer="svg1" />
|
||||||
<defs
|
<defs
|
||||||
id="defs1">
|
id="defs1">
|
||||||
<marker
|
<marker
|
||||||
@@ -197,10 +197,10 @@
|
|||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect78);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect78);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
||||||
x="37.222656"
|
x="37.222656"
|
||||||
y="36.34345"
|
y="36.34345"
|
||||||
id="tspan2">Ring Buffer for </tspan><tspan
|
id="tspan1">Ring Buffer for </tspan><tspan
|
||||||
x="37.222656"
|
x="37.222656"
|
||||||
y="53.010076"
|
y="53.010076"
|
||||||
id="tspan3">delay 1</tspan></text>
|
id="tspan15">delay 1</tspan></text>
|
||||||
<rect
|
<rect
|
||||||
style="fill-opacity:0;stroke:#000000;stroke-width:0.238248;stroke-dasharray:none;stroke-opacity:1"
|
style="fill-opacity:0;stroke:#000000;stroke-width:0.238248;stroke-dasharray:none;stroke-opacity:1"
|
||||||
id="rect79"
|
id="rect79"
|
||||||
@@ -215,9 +215,9 @@
|
|||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect81);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect81);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
||||||
x="37.222656"
|
x="37.222656"
|
||||||
y="36.353868"
|
y="36.353868"
|
||||||
id="tspan5">State for <tspan
|
id="tspan17">State for <tspan
|
||||||
style="font-style:italic"
|
style="font-style:italic"
|
||||||
id="tspan4">self </tspan>2</tspan></text>
|
id="tspan16">self </tspan>2</tspan></text>
|
||||||
<rect
|
<rect
|
||||||
style="fill-opacity:0;stroke:#000000;stroke-width:0.238248;stroke-dasharray:none;stroke-opacity:1"
|
style="fill-opacity:0;stroke:#000000;stroke-width:0.238248;stroke-dasharray:none;stroke-opacity:1"
|
||||||
id="rect80"
|
id="rect80"
|
||||||
@@ -232,10 +232,10 @@
|
|||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect82);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect82);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
||||||
x="37.222656"
|
x="37.222656"
|
||||||
y="36.34345"
|
y="36.34345"
|
||||||
id="tspan6">Ring Buffer for </tspan><tspan
|
id="tspan18">Ring Buffer for </tspan><tspan
|
||||||
x="37.222656"
|
x="37.222656"
|
||||||
y="53.010076"
|
y="53.010076"
|
||||||
id="tspan7">delay 2</tspan></text>
|
id="tspan19">delay 2</tspan></text>
|
||||||
<text
|
<text
|
||||||
xml:space="preserve"
|
xml:space="preserve"
|
||||||
style="font-size:2.11667px;font-family:'Hiragino Mincho ProN';-inkscape-font-specification:'Hiragino Mincho ProN';word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264999;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
style="font-size:2.11667px;font-family:'Hiragino Mincho ProN';-inkscape-font-specification:'Hiragino Mincho ProN';word-spacing:0px;fill:#000000;stroke:none;stroke-width:0.264999;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||||
@@ -246,7 +246,7 @@
|
|||||||
id="tspan106"
|
id="tspan106"
|
||||||
style="stroke-width:0.265"
|
style="stroke-width:0.265"
|
||||||
x="60.299187"
|
x="60.299187"
|
||||||
y="94.177162"></tspan></text>
|
y="94.177162" /></text>
|
||||||
<rect
|
<rect
|
||||||
style="fill-opacity:0;stroke:#000000;stroke-width:0.238248;stroke-dasharray:none;stroke-opacity:1"
|
style="fill-opacity:0;stroke:#000000;stroke-width:0.238248;stroke-dasharray:none;stroke-opacity:1"
|
||||||
id="rect75"
|
id="rect75"
|
||||||
@@ -261,12 +261,12 @@
|
|||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect76);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:13.3333px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect76);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
||||||
x="37.222656"
|
x="37.222656"
|
||||||
y="36.353868"
|
y="36.353868"
|
||||||
id="tspan9">State for <tspan
|
id="tspan21">State for <tspan
|
||||||
style="font-style:italic"
|
style="font-style:italic"
|
||||||
id="tspan8">self </tspan>1</tspan></text>
|
id="tspan20">self </tspan>1</tspan></text>
|
||||||
<g
|
<g
|
||||||
id="g107"
|
id="g107"
|
||||||
transform="translate(-1.0263305)">
|
transform="translate(-3.7731265,-1.5279217)">
|
||||||
<circle
|
<circle
|
||||||
style="fill:#ffffff;stroke:#000000;stroke-width:0.1;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
style="fill:#ffffff;stroke:#000000;stroke-width:0.1;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||||
id="path107-6"
|
id="path107-6"
|
||||||
@@ -280,45 +280,47 @@
|
|||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect76-9-0);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect76-9-0);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
||||||
x="37.222656"
|
x="37.222656"
|
||||||
y="31.318589"
|
y="31.318589"
|
||||||
id="tspan10">1</tspan></text>
|
id="tspan22">1</tspan></text>
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
id="g108">
|
id="g108"
|
||||||
|
transform="translate(-8.0371494,2.1903877)">
|
||||||
<circle
|
<circle
|
||||||
style="fill:#ffffff;stroke:#000000;stroke-width:0.1;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
style="fill:#ffffff;stroke:#000000;stroke-width:0.1;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||||
id="path107-6-3"
|
id="path107-6-3"
|
||||||
cx="49.632725"
|
cx="49.8783"
|
||||||
cy="80.862404"
|
cy="83.74791"
|
||||||
r="1.4569392" />
|
r="1.4569392" />
|
||||||
<text
|
<text
|
||||||
xml:space="preserve"
|
xml:space="preserve"
|
||||||
transform="matrix(0.26458333,0,0,0.26458333,39.243713,73.315375)"
|
transform="matrix(0.26458333,0,0,0.26458333,39.489288,76.200883)"
|
||||||
id="text75-9-9-0"
|
id="text75-9-9-0"
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect76-9-0-2);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect76-9-0-2);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
||||||
x="37.222656"
|
x="37.222656"
|
||||||
y="31.318589"
|
y="31.318589"
|
||||||
id="tspan11">2</tspan></text>
|
id="tspan23">2</tspan></text>
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
id="g109">
|
id="g109"
|
||||||
|
transform="translate(-10.649816,-18.353939)">
|
||||||
<circle
|
<circle
|
||||||
style="fill:#ffffff;stroke:#000000;stroke-width:0.1;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
style="fill:#ffffff;stroke:#000000;stroke-width:0.1;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||||
id="path107-6-3-1"
|
id="path107-6-3-1"
|
||||||
cx="53.939831"
|
cx="52.490967"
|
||||||
cy="94.022964"
|
cy="93.905754"
|
||||||
r="1.4569392" />
|
r="1.4569392" />
|
||||||
<text
|
<text
|
||||||
xml:space="preserve"
|
xml:space="preserve"
|
||||||
transform="matrix(0.26458333,0,0,0.26458333,43.50265,86.487746)"
|
transform="matrix(0.26458333,0,0,0.26458333,42.071034,86.370532)"
|
||||||
id="text75-9-9-0-4"
|
id="text75-9-9-0-4"
|
||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect76-9-0-2-5);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect76-9-0-2-5);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
||||||
x="37.222656"
|
x="37.222656"
|
||||||
y="31.318589"
|
y="31.318589"
|
||||||
id="tspan12">3</tspan></text>
|
id="tspan24">3</tspan></text>
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
id="g111"
|
id="g111"
|
||||||
transform="translate(-1.3554851,-0.21179455)">
|
transform="translate(-3.0042285,-3.7800135)">
|
||||||
<circle
|
<circle
|
||||||
style="fill:#ffffff;stroke:#000000;stroke-width:0.1;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
style="fill:#ffffff;stroke:#000000;stroke-width:0.1;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||||
id="path107-6-3-3"
|
id="path107-6-3-3"
|
||||||
@@ -332,10 +334,11 @@
|
|||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect76-9-0-2-5-4);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect76-9-0-2-5-4);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
||||||
x="37.222656"
|
x="37.222656"
|
||||||
y="31.318589"
|
y="31.318589"
|
||||||
id="tspan13">4</tspan></text>
|
id="tspan25">4</tspan></text>
|
||||||
</g>
|
</g>
|
||||||
<g
|
<g
|
||||||
id="g110">
|
id="g110"
|
||||||
|
transform="translate(-18.451799,18.554739)">
|
||||||
<circle
|
<circle
|
||||||
style="fill:#ffffff;stroke:#000000;stroke-width:0.1;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
style="fill:#ffffff;stroke:#000000;stroke-width:0.1;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1"
|
||||||
id="path107-6-3-5"
|
id="path107-6-3-5"
|
||||||
@@ -349,12 +352,12 @@
|
|||||||
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect76-9-0-2-5-4-9);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8px;font-family:'Helvetica Neue';-inkscape-font-specification:'Helvetica Neue, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;word-spacing:0px;white-space:pre;shape-inside:url(#rect76-9-0-2-5-4-9);display:inline;fill:#000000;fill-opacity:1;fill-rule:nonzero"><tspan
|
||||||
x="37.222656"
|
x="37.222656"
|
||||||
y="31.318589"
|
y="31.318589"
|
||||||
id="tspan14">5</tspan></text>
|
id="tspan26">5</tspan></text>
|
||||||
</g>
|
</g>
|
||||||
</g>
|
</g>
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#999999;stroke-width:0.264999;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#ArrowTriangleStylized)"
|
style="fill:none;stroke:#999999;stroke-width:0.264999;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#ArrowTriangleStylized)"
|
||||||
d="m 41.536022,16.880034 c 0,0 2.196051,0.971397 2.224392,2.401003 0.02917,1.471405 -2.276185,1.940972 -2.276185,1.940972"
|
d="m 41.918027,17.207467 c 0,0 1.814046,0.643964 1.842387,2.07357 0.02917,1.471405 -2.276185,1.940972 -2.276185,1.940972"
|
||||||
id="path106"
|
id="path106"
|
||||||
sodipodi:nodetypes="csc" />
|
sodipodi:nodetypes="csc" />
|
||||||
<path
|
<path
|
||||||
@@ -364,17 +367,17 @@
|
|||||||
sodipodi:nodetypes="csc" />
|
sodipodi:nodetypes="csc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#999999;stroke-width:0.264999;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#ArrowTriangleStylized-9)"
|
style="fill:none;stroke:#999999;stroke-width:0.264999;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#ArrowTriangleStylized-9)"
|
||||||
d="m 41.965409,15.643326 c 0,0 10.707847,1.039181 10.841541,14.510639 0.145801,14.691442 -11.365391,14.489066 -11.365391,14.489066"
|
d="m 43.711718,15.916187 c 0,0 6.859125,0.661199 6.992819,14.132657 0.145801,14.691442 -9.262978,14.594187 -9.262978,14.594187"
|
||||||
id="path106-2"
|
id="path106-2"
|
||||||
sodipodi:nodetypes="csc" />
|
sodipodi:nodetypes="csc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#999999;stroke-width:0.264999;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#ArrowTriangleStylized-8)"
|
style="fill:none;stroke:#999999;stroke-width:0.264999;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-start:url(#ArrowTriangleStylized-8)"
|
||||||
d="m 42.90918,15.131599 c 0,0 12.375502,3.014503 12.509196,16.485961 0.145801,14.691442 -14.54125,19.953214 -14.54125,19.953214"
|
d="m 43.127469,14.749594 c 0,0 12.157213,3.396508 12.290907,16.867966 0.145801,14.691442 -14.54125,19.953214 -14.54125,19.953214"
|
||||||
id="path106-2-7"
|
id="path106-2-7"
|
||||||
sodipodi:nodetypes="csc" />
|
sodipodi:nodetypes="csc" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#999999;stroke-width:0.264999;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#ArrowTriangleStylized-7)"
|
style="fill:none;stroke:#999999;stroke-width:0.264999;stroke-linejoin:round;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;marker-end:url(#ArrowTriangleStylized-7)"
|
||||||
d="m 41.944461,21.265159 c 0,0 3.836439,0.08573 3.718899,-2.39661 -0.07451,-1.573548 -3.005988,-2.209014 -3.005988,-2.209014"
|
d="m 41.985155,22.770827 c 0,0 3.795745,-1.419938 3.678205,-3.902278 -0.07451,-1.573548 -3.005988,-2.209014 -3.005988,-2.209014"
|
||||||
id="path106-8"
|
id="path106-8"
|
||||||
sodipodi:nodetypes="csc" />
|
sodipodi:nodetypes="csc" />
|
||||||
</g>
|
</g>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 17 KiB After Width: | Height: | Size: 17 KiB |
BIN
src/main.pdf
BIN
src/main.pdf
Binary file not shown.
Reference in New Issue
Block a user