-- | An example atom design. module Language.Atom.Example ( compileExample , example ) where import Language.Atom -- | Invoke the atom compiler. compileExample :: IO () compileExample = do (schedule, _, _, _, _) <- compile "example" defaults { cCode = prePostCode } example putStrLn $ reportSchedule schedule prePostCode :: [Name] -> [Name] -> [(Name, Type)] -> (String, String) prePostCode _ _ _ = ( unlines [ "#include " , "#include " , "unsigned long int a;" , "unsigned long int b;" , "unsigned long int x;" , "unsigned char running = 1;" ] , unlines [ "int main(int argc, char* argv[]) {" , " if (argc < 3) {" , " printf(\"usage: gcd \\n\");" , " }" , " else {" , " a = atoi(argv[1]);" , " b = atoi(argv[2]);" , " printf(\"Computing the GCD of %lu and %lu...\\n\", a, b);" , " while(running) {" , " example();" , " printf(\"iteration: a = %lu b = %lu\\n\", a, b);" , " }" , " printf(\"GCD result: %lu\\n\", a);" , " }" , " return 0;" , "}" ] ) -- | An example design that computes the greatest common divisor. example :: Atom () example = do -- External reference to value A. let a = word32' "a" -- External reference to value B. let b = word32' "b" -- The external running flag. let running = bool' "running" -- A rule to modify A. atom "a_minus_b" $ do cond $ value a >. value b a <== value a - value b -- A rule to modify B. atom "b_minus_a" $ do cond $ value b >. value a b <== value b - value a -- A rule to clear the running flag. atom "stop" $ do cond $ value a ==. value b running <== false