46 lines
1.2 KiB
Haskell
46 lines
1.2 KiB
Haskell
module Generators
|
|
where
|
|
|
|
import Language.Rust.Data.Position
|
|
import Language.Rust.Syntax
|
|
import Numeric(showHex)
|
|
import System.Random(RandomGen,random,randomR)
|
|
|
|
toLit :: Word -> Expr Span
|
|
toLit i = Lit [] (Int Dec (fromIntegral i) Unsuffixed mempty) mempty
|
|
|
|
generateNum :: RandomGen g => g -> Word -> (Integer, g)
|
|
generateNum g size =
|
|
let (x, g') = random g
|
|
x' = x `mod` (2 ^ size)
|
|
in (x', g')
|
|
|
|
generateSignedNum :: RandomGen g => g -> Word -> (Integer, g)
|
|
generateSignedNum g size =
|
|
let biggest = (2 ^ (size - 1)) - 1
|
|
smallest = - (2 ^ (size - 1))
|
|
(x, g') = randomR (smallest, biggest) g
|
|
in (x, g')
|
|
|
|
modulate :: (Integral a, Integral b) => a -> b -> Integer
|
|
modulate x size = x' `mod` (2 ^ size')
|
|
where
|
|
x', size' :: Integer
|
|
size' = fromIntegral size
|
|
x' = fromIntegral x
|
|
|
|
modulate' :: (Num a, Integral a, Integral b) => a -> b -> Integer
|
|
modulate' x size = signum x' * ((abs x') `mod` (2 ^ size'))
|
|
where
|
|
x', size' :: Integer
|
|
size' = fromIntegral size
|
|
x' = fromIntegral x
|
|
|
|
showX :: Integer -> String
|
|
showX x | x < 0 = "-" ++ showX (abs x)
|
|
| otherwise = showHex x ""
|
|
|
|
showB :: Bool -> String
|
|
showB False = "0"
|
|
showB True = "1"
|