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)