module Copilot.Compile.C99.Util where
import Control.Monad.State
import Copilot.Core (Id)
import qualified Language.C99.Simple.AST as C
type FunEnv = [C.Decln]
statetell :: Monoid m => m -> State m ()
statetell :: forall m. Monoid m => m -> State m ()
statetell m
m = forall s (m :: * -> *). MonadState s m => (s -> s) -> m ()
modify ((forall a b c. (a -> b -> c) -> b -> a -> c
flip forall a. Monoid a => a -> a -> a
mappend) m
m)
fresh :: String -> [String] -> String
fresh :: String -> [String] -> String
fresh String
name [String]
used = forall a. [a] -> a
head forall a b. (a -> b) -> a -> b
$ forall a. (a -> Bool) -> [a] -> [a]
dropWhile (forall a b c. (a -> b -> c) -> b -> a -> c
flip forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
elem [String]
used) (String
nameforall a. a -> [a] -> [a]
:[String]
freshnames)
where
freshnames :: [String]
freshnames = (String
name forall a. [a] -> [a] -> [a]
++)forall b c a. (b -> c) -> (a -> b) -> a -> c
.forall a. Show a => a -> String
show forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Integer
0..]
names :: [C.Decln] -> [String]
names :: [Decln] -> [String]
names [Decln]
ds = forall a b. (a -> b) -> [a] -> [b]
map Decln -> String
match [Decln]
ds
where
match :: Decln -> String
match (C.VarDecln Maybe StorageSpec
_ Type
_ String
name Maybe Init
_) = String
name
streamname :: Id -> String
streamname :: Int -> String
streamname Int
sid = String
"s" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
sid
indexname :: Id -> String
indexname :: Int -> String
indexname Int
sid = Int -> String
streamname Int
sid forall a. [a] -> [a] -> [a]
++ String
"_idx"
streamaccessorname :: Id -> String
streamaccessorname :: Int -> String
streamaccessorname Int
sid = Int -> String
streamname Int
sid forall a. [a] -> [a] -> [a]
++ String
"_get"
excpyname :: String -> String
excpyname :: String -> String
excpyname String
name = String
name forall a. [a] -> [a] -> [a]
++ String
"_cpy"
generatorname :: Id -> String
generatorname :: Int -> String
generatorname Int
sid = Int -> String
streamname Int
sid forall a. [a] -> [a] -> [a]
++ String
"_gen"
generatorOutputArgName :: Id -> String
generatorOutputArgName :: Int -> String
generatorOutputArgName Int
sid = Int -> String
streamname Int
sid forall a. [a] -> [a] -> [a]
++ String
"_output"
guardname :: String -> String
guardname :: String -> String
guardname String
name = String
name forall a. [a] -> [a] -> [a]
++ String
"_guard"
argname :: String -> Int -> String
argname :: String -> Int -> String
argname String
name Int
n = String
name forall a. [a] -> [a] -> [a]
++ String
"_arg" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
n
argTempName :: String -> Int -> String
argTempName :: String -> Int -> String
argTempName String
name Int
n = String
name forall a. [a] -> [a] -> [a]
++ String
"_arg_temp" forall a. [a] -> [a] -> [a]
++ forall a. Show a => a -> String
show Int
n
argnames :: String -> [String]
argnames :: String -> [String]
argnames String
base = [String
aname | Int
n <- [Int
0..], let aname :: String
aname = String -> Int -> String
argname String
base Int
n]
argTempNames :: String -> [String]
argTempNames :: String -> [String]
argTempNames String
base = forall a b. (a -> b) -> [a] -> [b]
map (String -> Int -> String
argTempName String
base) [Int
0..]
funcall :: C.Ident -> [C.Expr] -> C.Expr
funcall :: String -> [Expr] -> Expr
funcall String
name [Expr]
args = Expr -> [Expr] -> Expr
C.Funcall (String -> Expr
C.Ident String
name) [Expr]
args