-- | 
-- Module: Compile
-- Description: Compilation functions
-- Copyright: (c) 2013 Tom Hawkins & Lee Pike
--
-- Atom compilation functions

module Language.Atom.Compile
  ( compile
  , reportSchedule
  , Schedule
  ) where

import System.Exit
import Control.Monad (when)
import Data.Maybe (isJust)

import Language.Atom.Code
import Language.Atom.Scheduling
import Language.Atom.Elaboration
import Language.Atom.UeMap (emptyMap)
import Language.Atom.Language hiding (Atom)

-- | Compiles an atom description to C.
compile :: Name -> Config -> Atom () 
           -> IO (Schedule, RuleCoverage, [Name], [Name], [(Name, Type)])
compile name config atom' = do
  res <- elaborate emptyMap name atom'
  case res of
   Nothing -> putStrLn "ERROR: Design rule checks failed." >>
              exitWith (ExitFailure 1)
   Just (st,(state, rules, assertionNames, coverageNames, probeNames)) -> do
     let schedule' = schedule rules st
     ruleCoverage <- writeC name config state rules schedule' assertionNames
                     coverageNames probeNames
     when (isJust $ hardwareClock config) (putStrLn hwClockWarning)
     return (schedule', ruleCoverage, assertionNames, coverageNames, probeNames)

hwClockWarning :: String
hwClockWarning = unlines
 [ ""
 , "*** Atom WARNING: you are configuring to use a hardware clock.  Please remember"
 , "    to set the \"__phase_start_time\" variable to the time at which the first"
 , "    phase should be run before you enter the main Atom-generated function the"
 , "    first time."
 ]