g2-0.2.0.0: src/G2/Equiv/Config.hs
module G2.Equiv.Config ( NebulaConfig (..)
, SummaryMode (..)
, UseLabeledErrors (..)
, getNebulaConfig
, getNebulaConfigPlugin
, mkNebulaConfigInfo
, mkNebulaConfig) where
import G2.Config.Config
import Data.Monoid ((<>))
import qualified Data.Text as T
import Options.Applicative
import Text.Read
-- Config options
data NebulaConfig = NC { limit :: Int
, num_lemmas :: Int
, print_summary :: SummaryMode
, use_labeled_errors :: UseLabeledErrors
, log_states :: LogMode -- ^ Determines whether to Log states, and if logging states, how to do so.
, log_rule :: Maybe String -- ^ Allow user to log the states for specific rule.
, sync :: Bool
, symbolic_unmapped :: Bool}
data SummaryMode = SM { have_summary :: Bool
, have_history :: Bool
, have_lemma_details :: Bool }
noSummary :: SummaryMode
noSummary = SM False False False
data UseLabeledErrors = UseLabeledErrors | NoLabeledErrors deriving (Eq, Show, Read)
getNebulaConfig :: IO (String, String, [T.Text], NebulaConfig)
getNebulaConfig = execParser mkNebulaConfigInfo
getNebulaConfigPlugin :: [String] -> ParserResult (Maybe String, NebulaConfig)
getNebulaConfigPlugin =
execParserPure defaultPrefs $
info (((,) <$> maybeGetRuleName <*> mkNebulaConfig) <**> helper)
( fullDesc
<> progDesc "Equivalence Checking for Haskell Rewrite Rules"
<> header "The Nebula Equivalence Checker" )
mkNebulaConfigInfo :: ParserInfo (String, String, [T.Text], NebulaConfig)
mkNebulaConfigInfo =
info (((,,,) <$> getFileName <*> getRuleName <*> getTotal <*> mkNebulaConfig) <**> helper)
( fullDesc
<> progDesc "Equivalence Checking for Haskell Rewrite Rules"
<> header "The Nebula Equivalence Checker" )
getFileName :: Parser String
getFileName = argument str (metavar "FILE")
getRuleName :: Parser String
getRuleName = argument str (metavar "RULE")
maybeGetRuleName :: Parser (Maybe String)
maybeGetRuleName =
argument (maybeReader (Just . Just)) (metavar "RULE" <> value Nothing)
getTotal :: Parser [T.Text]
getTotal = many (argument (maybeReader (Just . T.pack)) (metavar "TOTAL"))
mkNebulaConfig :: Parser NebulaConfig
mkNebulaConfig = NC
<$> option auto (long "limit"
<> metavar "N"
<> value (-1)
<> help "how many iterations the equivalence checker should go through before giving up")
<*> option auto (long "num_lemmas"
<> metavar "L"
<> value 2
<> help "how many lemmas can be applied to an expression simultaneously")
<*> mkSummaryMode
<*> flag UseLabeledErrors NoLabeledErrors (long "no-labeled-errors" <> help "disable labeled errors, treating all errors as equivalent")
<*> mkLogMode
<*> mkLogRule
<*> flag False True (long "sync" <> help "sync the left and right expressions prior to symbolic execution")
<*> flag True False (long "sym-unmapped" <> help "automatically treat unmapped function as symbolic")
mkLogRule :: Parser (Maybe String)
mkLogRule =
option (maybeReader (Just . Just))
( long "log-rule"
<> metavar "RULE"
<> value Nothing
<> help "Output states for this rule when logging")
mkSummaryMode :: Parser SummaryMode
mkSummaryMode =
(flag noSummary (SM True False False)
(long "summarize"
<> help "provide a summary with no history"))
<|>
(flag noSummary (SM True True False)
(long "hist-summarize"
<> help "provide a summary with history"))
<|>
(flag noSummary (SM True False True)
(long "lemmas-summarize"
<> help "provide a summary with all lemma results"))
<|>
(flag noSummary (SM True True True)
(long "lemmas-hist-summarize"
<> help "provide a summary with history and lemma results"))