packages feed

what4-domains-0.1: test/PrecisionRegression/Bitwise.hs

{-
Module      : PrecisionRegression.Bitwise
Copyright   : (c) Galois Inc, 2026
License     : BSD3

Per-op precision results for the bitwise (tnum) domain at width 4. The CSV
is at @test\/PrecisionRegression\/bitwise.csv@.
-}

{-# LANGUAGE DataKinds #-}

module PrecisionRegression.Bitwise
  ( bitwiseEnum
  , results
  , csvPath
  ) where

import           Control.Exception (assert)
import           Data.Bits ((.|.))
import           Numeric.Natural (Natural)

import qualified What4.Domains.BV.Bitwise as B

import           PrecisionRegression.Common

-- | Enumerate every distinct 'B.Domain' at width 4.
enumBitwise4 :: [B.Domain 4]
enumBitwise4 =
  [ assert (B.proper w4 d) d
  | lo <- [0 .. mask4]
  , hi <- [0 .. mask4]
  , (lo .|. hi) == hi
  , let d = B.range w4 (toInteger lo) (toInteger hi)
  ]

bitwiseToList :: B.Domain 4 -> [Natural]
bitwiseToList d = [ x | x <- [0 .. mask4], B.member d (toInteger x) ]

bitwiseEnum :: DomainEnum (B.Domain 4)
bitwiseEnum = DomainEnum (dedup bitwiseToList enumBitwise4) bitwiseToList

results :: [Result]
results =
  [ leqResult bitwiseEnum "leq" B.leq
  , unaryResult bitwiseEnum "negate" B.negate cNegate
  , binaryResult bitwiseEnum "add" B.add cAdd
  , binaryResult bitwiseEnum "sub" B.sub cSub
  , scaleResult bitwiseEnum B.scale
  , binaryResult bitwiseEnum "mul" B.mul cMul
  , binaryResult bitwiseEnum "mulPrecise" B.mulPrecise cMul
  , binaryResultFiltered bitwiseEnum "udiv" B.udiv cUdivPartial
  , binaryResultFiltered bitwiseEnum "urem" B.urem cUremPartial
  , binaryResultFiltered bitwiseEnum "sdiv" (B.sdiv w4) cSdivPartial
  , binaryResultFiltered bitwiseEnum "srem" (B.srem w4) cSremPartial
  , binaryResultFiltered bitwiseEnum "udivPrecise" (B.udivPrecise w4) cUdivPartial
  , binaryResultFiltered bitwiseEnum "uremPrecise" (B.uremPrecise w4) cUremPartial
  , binaryResult bitwiseEnum "udivSmtlib" B.udivSmtlib cUdivSmtlib
  , binaryResult bitwiseEnum "uremSmtlib" B.uremSmtlib cUremSmtlib
  , binaryResult bitwiseEnum "sdivSmtlib" (B.sdivSmtlib w4) cSdivSmtlib
  , binaryResult bitwiseEnum "sremSmtlib" (B.sremSmtlib w4) cSremSmtlib
  , unaryResult bitwiseEnum "not" B.not cNot
  , binaryResult bitwiseEnum "and" B.and cAnd
  , binaryResult bitwiseEnum "or"  B.or  cOr
  , binaryResult bitwiseEnum "xor" B.xor cXor
  , binaryResult bitwiseEnum "shl"  (B.shlAbstract  w4) cShl
  , binaryResult bitwiseEnum "lshr" (B.lshrAbstract w4) cLshr
  , binaryResult bitwiseEnum "ashr" (B.ashrAbstract w4) cAshr
  , binaryResult bitwiseEnum "rol"  (B.rolAbstract  w4) cRol
  , binaryResult bitwiseEnum "ror"  (B.rorAbstract  w4) cRor
  , latticeResult bitwiseEnum "join" B.join cJoin
  , latticeResult bitwiseEnum "meet" B.meet cMeet
  ]

csvPath :: FilePath
csvPath = "test/PrecisionRegression/bitwise.csv"