-- | An example atom design.
module Language.Atom.Example
  ( compileExample
  , example
  ) where

import Language.Atom

-- | Invoke the atom compiler.
compileExample :: IO ()
compileExample = compile "example" example

-- | Example design introduces a unsigned 16-bit variable,
--   and declares two rules: one to increment the variable,
--   one to reset the variable back to zero when it hits 100.
example :: Atom ()
example = period 2 $ do   -- Set execution period as a factor of 2 of the base rate.

  -- A local state variable.
  count <- word64 "count" 0

  -- An external variable.
  reset <- bool' "reset"

  -- A rule to increment the count.
  atom "increment" $ do
    cond $ value count <. 100
    count <== value count + 1

  -- A rule to reset the count.
  atom "reset" $ do
    cond $ value count ==. 100
    cond $ value reset
    count <== 0