packages feed

cnc-spec-compiler-0.2.0.0: Intel/Cnc/Spec/Codegen/Plugins/ReductionDone.hs

{-# LANGUAGE ScopedTypeVariables, OverloadedStrings, NamedFieldPuns #-}
{- 

  The reduction-done plugin extends autodone by introducing counters
  for reduction collections and signalling all_done().

 -}
module Intel.Cnc.Spec.Codegen.Plugins.ReductionDone
  (
    reductionDonePlugin
  )
where
import Intel.Cnc.Spec.Codegen.Plugins
import Intel.Cnc.Spec.CncGraph
import Intel.Cnc.EasyEmit  hiding (not, (||))
import Control.Monad


reductionDonePlugin :: DonePlugin
reductionDonePlugin = DonePlugin $ 
  \ debug_autodone node -> 
    if isReductionC node then Just$ 
      do let redC = graphNodeName node

         comm "[reduction_done] When the dependencies of a reduction collection are done, signal all_done() on it"
	 when debug_autodone$
	      app (function "printf") [stringconst$ " [reduction_done] Signaling all_done() for "++ show redC ++".\n"]
	 app (function (atomToSyn redC `dot` "all_done")) []

    else Nothing