packages feed

ForSyDe-3.0: examples/ParAddFour.hs

{-# LANGUAGE TemplateHaskell #-}
-- Naive example to test instances working in paralell
-- Adds a signal to four signals
module ParAddFour where

import ForSyDe
import Data.Int


add :: ProcFun (Int32 -> Int32 -> Int32)
add = $(newProcFun [d| add :: Int32 -> Int32 -> Int32
                       add a b = a + b |])

addProc :: Signal Int32 -> Signal Int32 -> Signal Int32
addProc s1 s2 = zipWithSY "zip1" add s1 s2


addSys :: SysDef (Signal Int32 -> Signal Int32 -> Signal Int32)
addSys = $(newSysDefTHName 'addProc ["in1","in2"] ["sum"])

simAdd :: [Int32] -> [Int32] -> [Int32]
simAdd = simulate addSys

parAddFour :: Signal Int32 
           -> Signal Int32 -> Signal Int32 -> Signal Int32 -> Signal Int32 
           -> (Signal Int32, Signal Int32, Signal Int32, Signal Int32)
parAddFour toAdd s1 s2 s3 s4 = (sum1, sum2, sum3, sum4)
  where sum1 = (instantiate "adder1" addSys) toAdd s1
        sum2 = (instantiate "adder2" addSys) toAdd s2
        sum3 = (instantiate "adder3" addSys) toAdd s3
        sum4 = (instantiate "adder4" addSys) toAdd s4

parAddFourSys :: SysDef (Signal Int32 
           -> Signal Int32 -> Signal Int32 -> Signal Int32 -> Signal Int32 
           -> (Signal Int32, Signal Int32, Signal Int32, Signal Int32))
parAddFourSys = $(newSysDefTHName 'parAddFour ["toAdd","s1","s2","s3","s4"]
                                        ["sum1","sum2","sum3","sum4"])


simParAddFour :: [Int32]
              -> [Int32] -> [Int32] -> [Int32] -> [Int32]
              -> ([Int32], [Int32], [Int32], [Int32]) 
simParAddFour = simulate parAddFourSys