module Writer.Formats.Basic where
import Config
import Simplify
import Data.Maybe
import Data.LTL
import Data.Types
import Data.Error
import Data.Specification
import Writer.Eval
import Writer.Data
import Writer.Utils
opConfig
:: OperatorConfig
opConfig = OperatorConfig
{ tTrue = "true"
, fFalse = "false"
, opNot = UnaryOp "!" 1
, opAnd = BinaryOp "&&" 2 AssocLeft
, opOr = BinaryOp "||" 3 AssocLeft
, opImplies = BinaryOp "->" 4 AssocRight
, opEquiv = BinaryOp "<->" 4 AssocRight
, opNext = UnaryOp "X" 1
, opFinally = UnaryOp "F" 1
, opGlobally = UnaryOp "G" 1
, opUntil = BinaryOp "U" 6 AssocRight
, opRelease = BinaryOp "R" 7 AssocLeft
, opWeak = BinaryOp "W" 5 AssocRight
}
writeFormat
:: Configuration -> Specification -> Either Error String
writeFormat c s = do
let s' = s {
target = fromMaybe (target s) $ owTarget c,
semantics = fromMaybe (semantics s) $ owSemantics c
}
(es,ss,rs,as,is,gs) <- eval c s
es' <- mapM (simplify (adjust c opConfig)) es
ss' <- mapM (simplify (adjust c opConfig)) ss
rs' <- mapM (simplify (adjust c opConfig)) rs
as' <- mapM (simplify (adjust c opConfig)) as
is' <- mapM (simplify (adjust c opConfig)) is
gs' <- mapM (simplify (adjust c opConfig)) gs
(si,so) <- signals c s'
return $
"INFO {"
++ "\n" ++ " TITLE: \"" ++ title s' ++ "\""
++ "\n" ++ " DESCRIPTION: \"" ++ description s' ++ "\""
++ "\n" ++ " SEMANTICS: " ++
(case semantics s' of
SemanticsMealy -> "Mealy"
SemanticsMoore -> "Moore"
SemanticsStrictMealy -> "Strict,Mealy"
SemanticsStrictMoore -> "Strict,Moore")
++ "\n" ++ " TARGET: " ++
(case target s' of
TargetMealy -> "Mealy"
TargetMoore -> "Moore")
++ (if null $ tags s' then ""
else "\n TAGS: " ++ head (tags s') ++
concatMap ((:) ' ' . (:) ',') (tail $ tags s'))
++ "\n" ++ "}"
++ "\n"
++ "\n" ++ "MAIN {"
++ "\n" ++ " INPUTS {"
++ concatMap printSignal si
++ "\n" ++ " }"
++ "\n" ++ " OUTPUTS {"
++ concatMap printSignal so
++ "\n" ++ " }"
++ (if not $ any checkTrue es' then ""
else "\n" ++ " INITIALLY {" ++
concatMap pr (filter checkTrue es') ++
"\n" ++ " }")
++ (if not $ any checkTrue ss' then ""
else "\n" ++ " PRESET {" ++
concatMap pr (filter checkTrue ss') ++
"\n" ++ " }")
++ (if not $ any checkTrue rs' then ""
else "\n" ++ " REQUIRE {" ++
concatMap pr (filter checkTrue rs') ++
"\n" ++ " }")
++ (if not $ any checkTrue as' then ""
else "\n" ++ " ASSUME {" ++
concatMap pr (filter checkTrue as') ++
"\n" ++ " }")
++ (if not $ any checkTrue is' then ""
else "\n" ++ " ASSERT {" ++
concatMap pr (filter checkTrue is') ++
"\n" ++ " }")
++ (if not $ any checkTrue gs' then ""
else "\n" ++ " GUARANTEE {" ++
concatMap pr (filter checkTrue gs') ++
"\n" ++ " }")
++ "\n" ++ "}"
++ "\n"
where
checkTrue f = case f of
TTrue -> False
_ -> True
printSignal sig =
"\n " ++ sig ++ ";"
pr = (++ ";") . ("\n " ++) . printFormula opConfig Fully