packages feed

feldspar-language-0.5.0.1: Examples/Simple/BitVectors.hs

module Examples.Simple.BitVectors where

import qualified Prelude
import Feldspar
import Feldspar.Wrap
import Feldspar.BitVector
import Feldspar.Compiler

-- | Counting 1 bits in a bitvector
countOnes :: (Unit w, Size w ~ Range w) => BitVector w -> Data Length
countOnes = fold (\a b -> a + b2i b) (0 :: Data Length)

countOnes' :: Data' D10 [Word32] -> Data Length
countOnes' = wrap (countOnes :: BitVector Word32 -> Data Length)

-- | CRC
crc :: (Unit w, Size w ~ Range w) => BitVector w -> BitVector w -> BitVector w
crc input control
  = fold step (takeUnits n padded) $ dropUnits n padded
  where
    n = numOfUnits control
    padded = input ++ replUnit n 0
    step window bit = head window ?
        ( zipWith (/=) (tail bit window) control
        , tail bit window
        )

crc' :: Data' D10 [Word16] -> Data' D1 [Word16] -> Data [Word16]
crc' = wrap (crc :: BitVector Word16 -> BitVector Word16 -> BitVector Word16)