packages feed

sbv-7.0: SBVTestSuite/TestSuite/CRC/Parity.hs

-----------------------------------------------------------------------------
-- |
-- Module      :  TestSuite.CRC.Parity
-- Copyright   :  (c) Levent Erkok
-- License     :  BSD3
-- Maintainer  :  erkokl@gmail.com
-- Stability   :  experimental
--
-- Test suite for Examples.CRC.Parity
-----------------------------------------------------------------------------

module TestSuite.CRC.Parity(tests) where

import Utils.SBVTestFramework

tests :: TestTree
tests =
  testGroup "CRC.Parity"
    [ testCase "parity" (assertIsThm parityOK)
    ]

parity :: SWord64 -> SBool
parity x = bnot (isOdd cnt)
  where cnt :: SWord8
        cnt = sum $ map oneIf $ blastLE x

isOdd :: SWord8 -> SBool
isOdd = lsb

-- Example suggested by Lee Pike
-- If x and y differ in odd-number of bits, then their parities are flipped
parityOK :: SWord64 -> SWord64 -> SBool
parityOK x y = isOdd cnt ==> px .== bnot py
  where cnt = sum $ map oneIf $ zipWith (./=) (blastLE x) (blastLE y)
        px  = parity x
        py  = parity y