Skip to content

Commit 2c726dd

Browse files
authored
Merge pull request #1594 from GaloisInc/mr-solver/heapster-tests
MR Solver SMT fixes for testing on Heapster models
2 parents e2fef66 + 8d0aa64 commit 2c726dd

File tree

5 files changed

+541
-149
lines changed

5 files changed

+541
-149
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
include "arrays.saw";
2+
contains0 <- parse_core_mod "arrays" "contains0";
3+
mr_solver_debug 1 contains0 contains0;

saw-core/src/Verifier/SAW/OpenTerm.hs

+11-2
Original file line numberDiff line numberDiff line change
@@ -27,13 +27,14 @@ module Verifier.SAW.OpenTerm (
2727
unitOpenTerm, unitTypeOpenTerm,
2828
stringLitOpenTerm, stringTypeOpenTerm,
2929
trueOpenTerm, falseOpenTerm, boolOpenTerm, boolTypeOpenTerm,
30-
arrayValueOpenTerm, bvLitOpenTerm, bvTypeOpenTerm,
30+
arrayValueOpenTerm, vectorTypeOpenTerm, bvLitOpenTerm, bvTypeOpenTerm,
3131
pairOpenTerm, pairTypeOpenTerm, pairLeftOpenTerm, pairRightOpenTerm,
3232
tupleOpenTerm, tupleTypeOpenTerm, projTupleOpenTerm,
3333
tupleOpenTerm', tupleTypeOpenTerm',
3434
recordOpenTerm, recordTypeOpenTerm, projRecordOpenTerm,
3535
ctorOpenTerm, dataTypeOpenTerm, globalOpenTerm, extCnsOpenTerm,
36-
applyOpenTerm, applyOpenTermMulti, applyPiOpenTerm, piArgOpenTerm,
36+
applyOpenTerm, applyOpenTermMulti, applyGlobalOpenTerm,
37+
applyPiOpenTerm, piArgOpenTerm,
3738
lambdaOpenTerm, lambdaOpenTermMulti, piOpenTerm, piOpenTermMulti,
3839
arrowOpenTerm, letOpenTerm, sawLetOpenTerm,
3940
-- * Monadic operations for building terms with binders
@@ -179,6 +180,10 @@ bvLitOpenTerm :: [Bool] -> OpenTerm
179180
bvLitOpenTerm bits =
180181
arrayValueOpenTerm boolTypeOpenTerm $ map boolOpenTerm bits
181182

183+
-- | Create a SAW core term for a vector type
184+
vectorTypeOpenTerm :: OpenTerm -> OpenTerm -> OpenTerm
185+
vectorTypeOpenTerm n a = applyGlobalOpenTerm "Prelude.Vec" [n,a]
186+
182187
-- | Create a SAW core term for the type of a bitvector
183188
bvTypeOpenTerm :: Integral a => a -> OpenTerm
184189
bvTypeOpenTerm n =
@@ -287,6 +292,10 @@ applyOpenTerm (OpenTerm f) (OpenTerm arg) =
287292
applyOpenTermMulti :: OpenTerm -> [OpenTerm] -> OpenTerm
288293
applyOpenTermMulti = foldl applyOpenTerm
289294

295+
-- | Apply a named global to 0 or more arguments
296+
applyGlobalOpenTerm :: Ident -> [OpenTerm] -> OpenTerm
297+
applyGlobalOpenTerm ident = applyOpenTermMulti (globalOpenTerm ident)
298+
290299
-- | Compute the output type of applying a function of a given type to an
291300
-- argument. That is, given @tp@ and @arg@, compute the type of applying any @f@
292301
-- of type @tp@ to @arg@.

src/SAWScript/Builtins.hs

+21-8
Original file line numberDiff line numberDiff line change
@@ -1385,8 +1385,8 @@ tailPrim :: [a] -> TopLevel [a]
13851385
tailPrim [] = fail "tail: empty list"
13861386
tailPrim (_ : xs) = return xs
13871387

1388-
parseCore :: String -> TopLevel Term
1389-
parseCore input =
1388+
parseCoreMod :: String -> String -> TopLevel Term
1389+
parseCoreMod mnm_str input =
13901390
do sc <- getSharedContext
13911391
let base = "<interactive>"
13921392
path = "<interactive>"
@@ -1397,18 +1397,29 @@ parseCore input =
13971397
do let msg = show err
13981398
printOutLnTop Opts.Error msg
13991399
fail msg
1400-
let mnm = Just $ mkModuleName ["Cryptol"]
1401-
err_or_t <- io $ runTCM (typeInferComplete uterm) sc mnm []
1400+
let mnm =
1401+
mkModuleName $ Text.splitOn (Text.pack ".") $ Text.pack mnm_str
1402+
_ <- io $ scFindModule sc mnm -- Check that mnm exists
1403+
err_or_t <- io $ runTCM (typeInferComplete uterm) sc (Just mnm) []
14021404
case err_or_t of
14031405
Left err -> fail (show err)
14041406
Right (TC.TypedTerm x _) -> return x
14051407

1408+
parseCore :: String -> TopLevel Term
1409+
parseCore = parseCoreMod "Cryptol"
1410+
14061411
parse_core :: String -> TopLevel TypedTerm
14071412
parse_core input = do
14081413
t <- parseCore input
14091414
sc <- getSharedContext
14101415
io $ mkTypedTerm sc t
14111416

1417+
parse_core_mod :: String -> String -> TopLevel TypedTerm
1418+
parse_core_mod mnm input = do
1419+
t <- parseCoreMod mnm input
1420+
sc <- getSharedContext
1421+
io $ mkTypedTerm sc t
1422+
14121423
prove_core :: ProofScript () -> String -> TopLevel Theorem
14131424
prove_core script input =
14141425
do sc <- getSharedContext
@@ -1540,16 +1551,18 @@ monadifyTypedTerm sc t =
15401551

15411552
-- | Ensure that a 'TypedTerm' has been monadified
15421553
ensureMonadicTerm :: SharedContext -> TypedTerm -> TopLevel TypedTerm
1543-
ensureMonadicTerm _ t
1544-
| TypedTermOther tp <- ttType t
1545-
, Prover.isCompFunType tp = return t
1554+
ensureMonadicTerm sc t
1555+
| TypedTermOther tp <- ttType t =
1556+
io (Prover.isCompFunType sc tp) >>= \case
1557+
True -> return t
1558+
False -> monadifyTypedTerm sc t
15461559
ensureMonadicTerm sc t = monadifyTypedTerm sc t
15471560

15481561
mrSolver :: SharedContext -> Int -> TypedTerm -> TypedTerm -> TopLevel Bool
15491562
mrSolver sc dlvl t1 t2 =
15501563
do m1 <- ttTerm <$> ensureMonadicTerm sc t1
15511564
m2 <- ttTerm <$> ensureMonadicTerm sc t2
1552-
res <- liftIO $ Prover.askMRSolver sc dlvl SBV.z3 Nothing m1 m2
1565+
res <- liftIO $ Prover.askMRSolver sc dlvl Nothing m1 m2
15531566
case res of
15541567
Just err -> io (putStrLn $ Prover.showMRFailure err) >> return False
15551568
Nothing -> return True

src/SAWScript/Interpreter.hs

+7
Original file line numberDiff line numberDiff line change
@@ -2225,6 +2225,13 @@ primitives = Map.fromList
22252225
[ "Parse a Term from a String in SAWCore syntax."
22262226
]
22272227

2228+
, prim "parse_core_mod" "String -> String -> Term"
2229+
(funVal2 parse_core_mod)
2230+
Current
2231+
[ "Parse a Term from the second supplied String in SAWCore syntax,"
2232+
, "relative to the module specified by the first String"
2233+
]
2234+
22282235
, prim "prove_core" "ProofScript () -> String -> TopLevel Theorem"
22292236
(pureVal prove_core)
22302237
Current

0 commit comments

Comments
 (0)