{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.Array.Accelerate.LLVM.Native.Foreign (
ForeignAcc(..),
ForeignExp(..),
LLVM,
Native(..),
liftIO,
module Data.Array.Accelerate.LLVM.Native.Array.Data,
) where
import qualified Data.Array.Accelerate.Array.Sugar as S
import Data.Array.Accelerate.LLVM.State
import Data.Array.Accelerate.LLVM.CodeGen.Sugar
import Data.Array.Accelerate.LLVM.Foreign
import Data.Array.Accelerate.LLVM.Native.Array.Data
import Data.Array.Accelerate.LLVM.Native.Target
import Control.Monad.State
import Data.Typeable
instance Foreign Native where
foreignAcc _ (ff :: asm (a -> b))
| Just (ForeignAcc _ asm :: ForeignAcc (a -> b)) <- cast ff = Just (const asm)
| otherwise = Nothing
foreignExp _ (ff :: asm (x -> y))
| Just (ForeignExp _ asm :: ForeignExp (x -> y)) <- cast ff = Just asm
| otherwise = Nothing
instance S.Foreign ForeignAcc where
strForeign (ForeignAcc s _) = s
instance S.Foreign ForeignExp where
strForeign (ForeignExp s _) = s
data ForeignAcc f where
ForeignAcc :: String
-> (a -> LLVM Native b)
-> ForeignAcc (a -> b)
data ForeignExp f where
ForeignExp :: String
-> IRFun1 Native () (x -> y)
-> ForeignExp (x -> y)
deriving instance Typeable ForeignAcc
deriving instance Typeable ForeignExp