g2-0.2.0.0: exe/Main.hs
{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import G2.Translation.GHC (GeneralFlag(Opt_Hpc))
import System.Environment
import System.FilePath
import Data.Foldable (toList)
import qualified Data.Map as M
import Data.Maybe
import Data.Monoid ((<>))
import qualified Data.Sequence as S
import qualified Data.Text as T
import qualified Data.Text.IO as T
import G2.Lib.Printers
import G2.Config
import G2.Interface
import G2.Language
import G2.Translation
main :: IO ()
main = do
as <- getArgs
runWithArgs as
runWithArgs :: [String] -> IO ()
runWithArgs as = do
let (_:_:tail_args) = as
(src, entry, m_assume, m_assert, config) <- getConfig
proj <- guessProj src
--Get args
let m_reaches = mReaches tail_args
let m_retsTrue = mReturnsTrue tail_args
let tentry = T.pack entry
_ <- doTimeout (timeLimit config) $ do
((in_out, b), entry_f@(Id (Name _ mb_modname _ _) _)) <-
runG2FromFile [proj] [src] (fmap T.pack m_assume)
(fmap T.pack m_assert) (fmap T.pack m_reaches)
(isJust m_assert || isJust m_reaches || m_retsTrue)
tentry simplTranslationConfig config
case validate config of
True -> do
r <- validateStates [proj] [src] (T.unpack $ fromJust mb_modname) entry [] [Opt_Hpc] in_out
if r then putStrLn "Validated" else putStrLn "There was an error during validation."
-- runHPC src (T.unpack $ fromJust mb_modname) entry in_out
False -> return ()
printFuncCalls config entry_f b in_out
return ()
printFuncCalls :: Config -> Id -> Bindings -> [ExecRes t] -> IO ()
printFuncCalls config entry b =
mapM_ (\execr@(ExecRes { final_state = s}) -> do
let pg = mkPrettyGuide (exprNames $ conc_args execr)
let funcCall = printHaskellPG pg s
. foldl (\a a' -> App a a') (Var entry) $ (conc_args execr)
let funcOut = printHaskellPG pg s $ (conc_out execr)
sym_gen_out = fmap (printHaskellPG pg s) $ conc_sym_gens execr
case sym_gen_out of
S.Empty -> T.putStrLn $ funcCall <> " = " <> funcOut
_ -> T.putStrLn $ funcCall <> " = " <> funcOut <> "\t| generated: " <> T.intercalate ", " (toList sym_gen_out))
ppStatePiece :: Bool -> String -> String -> IO ()
ppStatePiece b n res =
case b of
True -> do
putStrLn $ "---" ++ n ++ "---"
putStrLn res
putStrLn ""
False -> return ()
mIDir :: [String] -> Maybe String
mIDir a = strArg "idir" a M.empty Just Nothing
mReturnsTrue :: [String] -> Bool
mReturnsTrue a = boolArg "returns-true" a M.empty Off
mAssume :: [String] -> Maybe String
mAssume a = strArg "assume" a M.empty Just Nothing
mAssert :: [String] -> Maybe String
mAssert a = strArg "assert" a M.empty Just Nothing
mReaches :: [String] -> Maybe String
mReaches a = strArg "reaches" a M.empty Just Nothing
mkLiquid :: [String] -> Maybe String
mkLiquid a = strArg "liquid" a M.empty Just Nothing
mkLiquidFunc :: [String] -> Maybe String
mkLiquidFunc a = strArg "liquid-func" a M.empty Just Nothing