module Copilot.Compile.C99.PrePostCode
( preCode , postCode
) where
import Copilot.Core
import Copilot.Compile.C99.Common (typeSpec, mkTmpExtFunVarName)
import Copilot.Compile.C99.Params
import Copilot.Compile.C99.Phases (numberOfPhases)
import Copilot.Compile.Header.C99 (c99HeaderName)
preCode :: Params -> Spec -> String
preCode params spec = unlines $
[ "#include \"" ++ c99HeaderName (prefix params) ++ "\"" ] ++
( map (observerDecl params) . specObservers ) spec ++
( map (tmpExtFunVar params) . externFuns ) spec
observerDecl :: Params -> Observer -> String
observerDecl params (Observer cs _ t) = typeSpec t ++ " " ++ name ++ ";"
where
name = withPrefix (prefix params) cs
tmpExtFunVar :: Params -> ExtFun -> String
tmpExtFunVar _ ExtFun
{ externFunName = name
, externFunType = t
, externFunTag = Just tag } =
"static " ++ typeSpec t ++ " " ++ mkTmpExtFunVarName name tag ++ ";"
postCode :: Params -> Spec -> String
postCode params _ =
unlines
[ "void " ++ withPrefix (prefix params) "step" ++ "()"
, "{"
, " " ++ concat (replicate numberOfPhases step)
, "}"
]
where
step = withPrefix (prefix params) "copilot" ++ "();"