packages feed

accelerate-llvm-1.4.0.0: src/Data/Array/Accelerate/LLVM/CodeGen/Sugar.hs

{-# LANGUAGE GADTs           #-}
{-# LANGUAGE RankNTypes      #-}
{-# LANGUAGE RoleAnnotations #-}
{-# LANGUAGE TypeFamilies    #-}
{-# OPTIONS_HADDOCK hide #-}
-- |
-- Module      : Data.Array.Accelerate.LLVM.CodeGen.Sugar
-- Copyright   : [2015..2020] The Accelerate Team
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Data.Array.Accelerate.LLVM.CodeGen.Sugar (

  IRExp, MIRExp, IRFun1, IRFun2,
  IROpenExp, IROpenFun1(..), IROpenFun2(..),
  IROpenAcc(..),
  IRDelayed(..), MIRDelayed(..),

  IRArray(..),

) where

import LLVM.AST.Type.Instruction.Volatile
import LLVM.AST.Type.Representation                                 ( AddrSpace )

import Data.Array.Accelerate.Representation.Array

import Data.Array.Accelerate.LLVM.CodeGen.IR
import Data.Array.Accelerate.LLVM.CodeGen.Module
import {-# SOURCE #-} Data.Array.Accelerate.LLVM.CodeGen.Monad


-- Scalar expressions
-- ------------------

-- | LLVM IR is in single static assignment, so we need to be able to generate
-- fresh names for each application of a scalar function or expression.
--
type IRExp     arch     aenv t = IROpenExp arch () aenv t
type MIRExp    arch     aenv t = Maybe (IRExp arch aenv t)
type IROpenExp arch env aenv t = CodeGen arch (Operands t)

type IRFun1 arch aenv t = IROpenFun1 arch () aenv t
type IRFun2 arch aenv t = IROpenFun2 arch () aenv t

data IROpenFun1 arch env aenv t where
  IRFun1 :: { app1 :: Operands a -> IROpenExp arch (env,a) aenv b }
         -> IROpenFun1 arch env aenv (a -> b)

data IROpenFun2 arch env aenv t where
  IRFun2 :: { app2 :: Operands a -> Operands b -> IROpenExp arch ((env,a),b) aenv c }
         -> IROpenFun2 arch env aenv (a -> b -> c)


-- Arrays
-- ------

data IROpenAcc arch aenv arrs where
  IROpenAcc :: [Kernel arch aenv arrs]
            -> IROpenAcc arch aenv arrs

data MIRDelayed arch aenv a
  = IRDelayedJust (IRDelayed arch aenv a)
  | IRDelayedNothing (ArrayR a)

data IRDelayed arch aenv a where
  IRDelayed :: { delayedRepr        :: ArrayR (Array sh e)
               , delayedExtent      :: IRExp  arch aenv sh
               , delayedIndex       :: IRFun1 arch aenv (sh -> e)
               , delayedLinearIndex :: IRFun1 arch aenv (Int -> e)
               }
            -> IRDelayed arch aenv (Array sh e)

data IRArray a where
  IRArray :: { irArrayRepr        :: ArrayR (Array sh e)
             , irArrayShape       :: Operands sh        -- Array extent
             , irArrayData        :: Operands e         -- Array payloads (should really be 'Ptr e')
             , irArrayAddrSpace   :: AddrSpace
             , irArrayVolatility  :: Volatility
             }
          -> IRArray (Array sh e)