sbv-8.7: SMT Based Verification: Symbolic Haskell theorem prover using SMT solving.

Copyright(c) Levent Erkok
Safe HaskellNone



This program demonstrates the use of the existentials and the QBVF (quantified bit-vector solver). We generate CRC polynomials of degree 16 that can be used for messages of size 48-bits. The query finds all such polynomials that have hamming distance is at least 4. That is, if the CRC can't tell two different 48-bit messages apart, then they must differ in at least 4 bits.



crc_48_16 :: SWord 48 -> SWord16 -> [SBool] Source #

Compute the 16 bit CRC of a 48 bit message, using the given polynomial

diffCount :: (SWord 48, [SBool]) -> (SWord 48, [SBool]) -> SWord8 Source #

Count the differing bits in the message and the corresponding CRC

crcGood :: SWord8 -> SWord16 -> SWord 48 -> SWord 48 -> SBool Source #

Given a hamming distance value hd, crcGood returns true if the 16 bit polynomial can distinguish all messages that has at most hd different bits. Note that we express this conversely: If the sent and received messages are different, then it must be the case that that must differ from each other (including CRCs), in more than hd bits.

genPoly :: SWord8 -> Int -> IO () Source #

Generate good CRC polynomials for 48-bit words, given the hamming distance hd.

findHD4Polynomials :: IO () Source #

Find and display all degree 16 polynomials with hamming distance at least 4, for 48 bit messages.

When run, this function prints:

   Polynomial #1. x^16 + x^3 + x^2 + 1
   Polynomial #2. x^16 + x^3 + x^2 + x + 1
   Polynomial #3. x^16 + x^3 + x + 1
   Polynomial #4. x^16 + x^15 + x^2 + 1
   Polynomial #5. x^16 + x^15 + x^2 + x + 1
   Found: 5 polynomail(s).

Note that different runs can produce different results, depending on the random numbers used by the solver, solver version, etc. (Also, the solver will take some time to generate these results. On my machine, the first five polynomials were generated in about 5 minutes.)