<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <!--Rendered using the Haskell Html Library v0.2--> <HTML ><HEAD ><META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8" ><TITLE >ForSyDe.Shallow.DataflowLib</TITLE ><LINK HREF="haddock.css" REL="stylesheet" TYPE="text/css" ><SCRIPT SRC="haddock-util.js" TYPE="text/javascript" ></SCRIPT ><SCRIPT TYPE="text/javascript" >window.onload = function () {setSynopsis("mini_ForSyDe-Shallow-DataflowLib.html")};</SCRIPT ></HEAD ><BODY ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="topbar" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD ><IMG SRC="haskell_icon.gif" WIDTH="16" HEIGHT="16" ALT=" " ></TD ><TD CLASS="title" >ForSyDe-3.1.1: ForSyDe's Haskell-embedded Domain Specific Language.</TD ><TD CLASS="topbut" ><A HREF="src/ForSyDe-Shallow-DataflowLib.html" >Source code</A ></TD ><TD CLASS="topbut" ><A HREF="index.html" >Contents</A ></TD ><TD CLASS="topbut" ><A HREF="doc-index.html" >Index</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="modulebar" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD ><FONT SIZE="6" >ForSyDe.Shallow.DataflowLib</FONT ></TD ><TD ALIGN="right" ><TABLE CLASS="narrow" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="infohead" >Portability</TD ><TD CLASS="infoval" >portable</TD ></TR ><TR ><TD CLASS="infohead" >Stability</TD ><TD CLASS="infoval" >experimental</TD ></TR ><TR ><TD CLASS="infohead" >Maintainer</TD ><TD CLASS="infoval" >forsyde-dev@ict.kth.se</TD ></TR ></TABLE ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="section4" ><B >Contents</B ></TD ></TR ><TR ><TD ><DL ><DT ><A HREF="#1" >Data Types </A ></DT ><DT ><A HREF="#2" >Combinational Process Constructors </A ></DT ><DT ><A HREF="#3" >Sequential Process Constructors </A ></DT ></DL ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" >Description</TD ></TR ><TR ><TD CLASS="doc" ><P >The dataflow library defines data types, process constructors and functions to model dataflow process networks, as described by Lee and Parks in Dataflow process networks, IEEE Proceedings, 1995 ([LeeParks95]). </P ><P >Each process is defined by a set of firing rules and corresponding actions. A process fires, if the incoming signals match a firing rule. Then the process consumes the matched tokens and executes the action corresponding to the firing rule. </P ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" >Synopsis</TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" ><SPAN CLASS="keyword" >data</SPAN > <A HREF="#t%3AFiringToken" >FiringToken</A > a </TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="decl" >= <A HREF="#v%3AWild" >Wild</A ></TD ></TR ><TR ><TD CLASS="decl" >| <A HREF="#v%3AValue" >Value</A > a</TD ></TR ></TABLE ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AmapDF" >mapDF</A > :: <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a => [[<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a]] -> (<A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> [[b]]) -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > b</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AzipWithDF" >zipWithDF</A > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > b) => [([<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > b], [<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a])] -> (<A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> [[c]]) -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > c</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AzipWith3DF" >zipWith3DF</A > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > b, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > c) => [([<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a], [<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > b], [<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > c])] -> (<A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > c -> [[d]]) -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > c -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > d</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AscanlDF" >scanlDF</A > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > b) => [(<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > b, [<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a])] -> (b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> [b]) -> b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > b</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AmooreDF" >mooreDF</A > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > b) => [(<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > b, [<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a])] -> (b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> [b]) -> (b -> [c]) -> b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > c</TD ></TR ><TR ><TD CLASS="s8" ></TD ></TR ><TR ><TD CLASS="decl" ><A HREF="#v%3AmealyDF" >mealyDF</A > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > b) => [(<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > b, [<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a])] -> (b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> [b]) -> (b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> [[c]]) -> b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > c</TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="1" ><A NAME="1" >Data Types </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="doc" ><P >The data type <TT >FiringToken</TT > defines the data type for tokens. The constructor <TT >Wild</TT > constructs a token wildcard, the constructor <TT >Value a</TT > constructs a token with value <TT >a</TT >. </P ><P >A sequence (pattern) matches a signal, if the sequence is a prefix of the signal. The following list illustrates the firing rules: </P ><UL ><LI > [⊥] matches always (<EM >NullS</EM > in ForSyDe) </LI ><LI > [*] matches signal with at least one token (<EM >[Wild]</EM > in ForSyDe) </LI ><LI > [v] matches signal with v as its first value (<EM >[Value v]</EM > in ForSyDe) </LI ><LI > [*,*] matches signals with at least two tokens (<EM >[Wild,Wild]</EM > in ForSyDe) </LI ></UL ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><SPAN CLASS="keyword" >data</SPAN > <A NAME="t:FiringToken" ><A NAME="t%3AFiringToken" ></A ></A ><B >FiringToken</B > a </TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-DataflowLib.html#FiringToken" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="0" CELLPADDING="0" ><TR ><TD CLASS="section4" >Constructors</TD ></TR ><TR ><TD CLASS="body" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="arg" ><A NAME="v:Wild" ><A NAME="v%3AWild" ></A ></A ><B >Wild</B ></TD ><TD CLASS="rdoc" ></TD ></TR ><TR ><TD CLASS="arg" ><A NAME="v:Value" ><A NAME="v%3AValue" ></A ></A ><B >Value</B > a</TD ><TD CLASS="rdoc" ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="section4" ><IMG SRC="minus.gif" CLASS="coll" ONCLICK="toggle(this,'i:FiringToken')" ALT="show/hide" > Instances</TD ></TR ><TR ><TD CLASS="body" ><DIV ID="i:FiringToken" STYLE="display:block;" ><TABLE CLASS="vanilla" CELLSPACING="1" CELLPADDING="0" ><TR ><TD CLASS="decl" ><A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a => <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > (<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a)</TD ></TR ><TR ><TD CLASS="decl" ><A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Text-Show.html#t%3AShow" >Show</A > a => <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Text-Show.html#t%3AShow" >Show</A > (<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a)</TD ></TR ></TABLE ></DIV ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="2" ><A NAME="2" >Combinational Process Constructors </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="doc" ><P >Combinatorial processes do not have an internal state. This means, that the output signal only depends on the input signals. </P ><P >To illustrate the concept of data flow processes, we create a process that selects tokens from two inputs according to a control signal. </P ><P >The process has the following firing rules [LeeParks95]: </P ><UL ><LI > R1 = {[*], ⊥, [T]} </LI ><LI > R2 = {⊥, [*], [F]} </LI ></UL ><P >The corresponding ForSyDe formulation of the firing rules is: </P ><PRE > selectRules = [ ([Wild], [], [Value True]), ([], [Wild], [Value False]) ] </PRE ><P >For the output we formulate the following set of output functions: </P ><PRE > selectOutput xs ys _ = [ [headS xs], [headS ys] ] </PRE ><P >The select process <EM >selectDF</EM > is then defined by: </P ><PRE > selectDF :: Eq a => Signal a -> Signal a -> Signal Bool -> Signal a selectDF = zipWith3DF selectRules selectOutput </PRE ><P >Given the signals <EM >s1</EM >, <EM >s2</EM > and <EM >s3</EM > </P ><PRE > s1 = signal [1,2,3,4,5,6] s2 = signal [7,8,9,10,11,12] s3 = signal [True, True, False, False, True, True] </PRE ><P >the executed process gives the following results: </P ><PRE > DataflowLib> selectDF s1 s2 s3 {1,2,7,8,3,4} :: Signal Integer </PRE ><P >The library contains the following combinational process constructors: </P ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:mapDF" ><A NAME="v%3AmapDF" ></A ></A ><B >mapDF</B > :: <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a => [[<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a]] -> (<A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> [[b]]) -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > b</TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-DataflowLib.html#mapDF" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="doc" >The process constructor <TT >mapDF</TT > takes a list of firing rules, a list of corresponding output functions and generates a data flow process with one input and one output signal. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:zipWithDF" ><A NAME="v%3AzipWithDF" ></A ></A ><B >zipWithDF</B > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > b) => [([<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > b], [<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a])] -> (<A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> [[c]]) -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > c</TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-DataflowLib.html#zipWithDF" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="doc" >The process constructors <TT >zipWithDF</TT > takes a list of firing rules, a list of corresponding output functions to generate a data flow process with two input signals and one output signal. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:zipWith3DF" ><A NAME="v%3AzipWith3DF" ></A ></A ><B >zipWith3DF</B > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > b, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > c) => [([<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a], [<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > b], [<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > c])] -> (<A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > c -> [[d]]) -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > c -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > d</TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-DataflowLib.html#zipWith3DF" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="doc" >The process constructors <TT >zipWith3DF</TT > takes a list of firing rules, a list of corresponding output functions to generate a data flow process with three input signals and one output signal. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="section1" ><A NAME="3" ><A NAME="3" >Sequential Process Constructors </A ></A ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="doc" ><P >Sequential processes have an internal state. This means, that the output signal may depend internal state and on the input signal. </P ><P >As an example we can view a process calculating the running sum of the input tokens. It has only one firing rule, which is illustrated below. </P ><PRE > Firing Rule Next State Output ------------------------------------ (*,[*]) state + x {state} </PRE ><P >A dataflow process using these firing rules and the initial state 0 can be formulated in ForSyDe as </P ><PRE > rs xs = mealyDF firingRule nextState output initState xs where firingRule = [(Wild, [Wild])] nextState state xs = [(state + headS xs)] output state _ = [[state]] initState = 0 </PRE ><P >Execution of the process gives </P ><PRE > DataflowLib> rs (signal[1,2,3,4,5,6]) {0,1,3,6,10,15} :: Signal Integer </PRE ><P >Another 'running sum' process <EM >rs2</EM > takes two tokens, pushes them into a queue of five elements and calculates the sum as output. </P ><PRE > rs2 = mealyDF fs ns o init where init = [0,0,0,0,0] fs = [(Wild, ([Wild, Wild]))] ns state xs = [drop 2 state ++ fromSignal (takeS 2 xs)] o state _ = [[(sum state)]] </PRE ><P >Execution of the process gives </P ><PRE > DataflowLib>rs2 (signal [1,2,3,4,5,6,7,8,9,10]) {0,3,10,20,30} :: Signal Integer </PRE ></TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:scanlDF" ><A NAME="v%3AscanlDF" ></A ></A ><B >scanlDF</B > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > b) => [(<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > b, [<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a])] -> (b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> [b]) -> b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > b</TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-DataflowLib.html#scanlDF" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="doc" >The process constructor <TT >scanlDF</TT > implements a finite state machine without output decoder in the ForSyDe methodology. It takes a set of firing rules and a set of corresponding next state functions as arguments. A firing rule is a tuple. The first value is a pattern for the state, the second value corresponds to an input pattern. When a pattern matches, the process fires, the corresponding next state is executed, and the tokens matching the pattern are consumed. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:mooreDF" ><A NAME="v%3AmooreDF" ></A ></A ><B >mooreDF</B > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > b) => [(<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > b, [<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a])] -> (b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> [b]) -> (b -> [c]) -> b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > c</TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-DataflowLib.html#mooreDF" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="doc" >The process constructor <TT >mooreDF</TT > implements a Moore finite state machine in the ForSyDe methodology. It takes a set of firing rules, a set of corresponding next state functions and a set of output functions as argument. A firing rule is a tuple. The first value is a pattern for the state, the second value corresponds to an input pattern. When a pattern matches, the process fires, the corresponding next state and output functions are executed, and the tokens matching the pattern are consumed. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="topdecl" ><TABLE CLASS="declbar" ><TR ><TD CLASS="declname" ><A NAME="v:mealyDF" ><A NAME="v%3AmealyDF" ></A ></A ><B >mealyDF</B > :: (<A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > a, <A HREF="/usr/share/doc/ghc/html/libraries/base-4.2.0.2/Data-Eq.html#t%3AEq" >Eq</A > b) => [(<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > b, [<A HREF="ForSyDe-Shallow-DataflowLib.html#t%3AFiringToken" >FiringToken</A > a])] -> (b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> [b]) -> (b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> [[c]]) -> b -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > a -> <A HREF="ForSyDe-Shallow-Signal.html#t%3ASignal" >Signal</A > c</TD ><TD CLASS="declbut" ><A HREF="src/ForSyDe-Shallow-DataflowLib.html#mealyDF" >Source</A ></TD ></TR ></TABLE ></TD ></TR ><TR ><TD CLASS="doc" >The process constructor <TT >mealyDF</TT > implements the most general state machine in the ForSyDe methodology. It takes a set of firing rules, a set of corresponding next state functions and a set of output functions as argument. A firing rule is a tuple. The first value is a pattern for the state, the second value corresponds to an input pattern. When a pattern matches, the process fires, the corresponding next state and output functions are executed, and the tokens matching the pattern are consumed. </TD ></TR ><TR ><TD CLASS="s15" ></TD ></TR ><TR ><TD CLASS="botbar" >Produced by <A HREF="http://www.haskell.org/haddock/" >Haddock</A > version 2.6.1</TD ></TR ></TABLE ></BODY ></HTML >