From c49c65d04f5d23809f49e81e64f23ae72ae2eecb Mon Sep 17 00:00:00 2001 From: Hans-Peter Deifel <hpd@hpdeifel.de> Date: Wed, 15 Feb 2017 10:35:21 +0100 Subject: [PATCH] Make graph comparison available in CLI --- osek-verification.cabal | 1 + src/main/Main.hs | 23 ++++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/osek-verification.cabal b/osek-verification.cabal index 1d57383..041b826 100644 --- a/osek-verification.cabal +++ b/osek-verification.cabal @@ -55,6 +55,7 @@ executable mockup_generator , bytestring >= 0.10 && <0.11 , osek-verification , optparse-applicative >= 0.12 && <0.13 + , microlens >= 0.4 && < 0.5 hs-source-dirs: src/main default-language: Haskell2010 ghc-options: -Wall -fdefer-typed-holes -fno-warn-name-shadowing diff --git a/src/main/Main.hs b/src/main/Main.hs index 9245342..6b3eddc 100644 --- a/src/main/Main.hs +++ b/src/main/Main.hs @@ -3,10 +3,13 @@ module Main where import Control.Monad +import System.IO +import System.Exit import qualified Data.ByteString.Lazy as BS import qualified Data.Text.IO as T import Options.Applicative +import Lens.Micro import CFG.Types import qualified CFG.Parser as P @@ -15,6 +18,9 @@ import CFG.IR import CFG.C import CFG.Sanitize import Search.Search +import qualified Compare.JSON as JSON +import Compare.Compare +import Compare.Types data Command = Mockup MockupOpts | Search SearchOpts @@ -27,12 +33,14 @@ optParser = subparser data SearchOpts = SearchOpts { mockupExecutable :: FilePath + , sseGraphJsonFile :: Maybe FilePath , eliminateEpsilons :: Bool } searchOptParser :: Parser SearchOpts searchOptParser = SearchOpts <$> argument str (metavar "EXECUTABLE") + <*> optional (argument str (metavar "SSE-JSON")) <*> (not <$> switch ( long "no-epsilon-elimination" <> help "Don't do epsilon elimination on the search graph" )) @@ -53,7 +61,20 @@ main = do ( fullDesc <> progDesc "dOSEK verification tool" ) case cmd of (Search opts) -> do - void (driver (eliminateEpsilons opts) (mockupExecutable opts)) + json <- traverse BS.readFile (sseGraphJsonFile opts) + case JSON.parseFile <$> json of + -- Don't do any comparision between graphs + Nothing -> void (driver (eliminateEpsilons opts) (mockupExecutable opts)) + Just (Left e) -> do + hPutStrLn stderr $ "Could not parse sse graph json: " <> e + exitFailure + Just (Right graph1) -> do + graph2 <- driver (eliminateEpsilons opts) (mockupExecutable opts) + if (not (isDeterministic (graph1^._graph)) || not (isDeterministic (graph2^._graph))) then do + hPutStrLn stderr $ "One of the graphs is not deterministic" + exitFailure + else + hPrint stderr (isIsomorphic graph1 graph2) Mockup opts -> do cntnt <- BS.getContents case P.parseFile cntnt of -- GitLab