-------------------------------------------------------------------------------- -- Copyright © 2011 National Institute of Aerospace / Galois, Inc. -------------------------------------------------------------------------------- {-# LANGUAGE GADTs #-} 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 -- , externFunArgs = args , 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" ++ "();"