-- GENERATED by C->Haskell Compiler, version 0.28.8 Switcheroo, 25 November 2017 (Haskell)
-- Edit the ORIGNAL .chs file instead!


{-# LINE 1 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}
{-# LANGUAGE BangPatterns             #-}
{-# LANGUAGE CPP                      #-}
{-# LANGUAGE EmptyDataDecls           #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LANGUAGE TemplateHaskell          #-}
--------------------------------------------------------------------------------
-- |
-- Module    : Foreign.CUDA.Driver.Graph.Build
-- Copyright : [2018..2023] Trevor L. McDonell
-- License   : BSD
--
-- Graph construction functions for the low-level driver interface
--
-- Requires CUDA-10
--
--------------------------------------------------------------------------------

module Foreign.CUDA.Driver.Graph.Build (

  Graph(..), Node(..), NodeType(..), HostCallback,
  create, destroy, clone, remove,

  -- ** Construction
  addChild,
  addEmpty,
  addHost,
  addKernel,
  addMemcpy,
  addMemset,
  addDependencies,
  removeDependencies,

  -- ** Querying
  getType,
  getChildGraph,
  getEdges,
  getNodes,
  getRootNodes,
  getDependencies,
  getDependents,
  findInClone,

) where
import qualified Foreign.C.Types as C2HSImp
import qualified Foreign.Ptr as C2HSImp





{-# LINE 46 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}


import Foreign.CUDA.Driver.Context.Base                   ( Context(..) )
import Foreign.CUDA.Driver.Error
import Foreign.CUDA.Driver.Exec                           ( Fun(..), FunParam(..) )
import Foreign.CUDA.Driver.Graph.Base
import Foreign.CUDA.Driver.Marshal                        ( useDeviceHandle )
import Foreign.CUDA.Driver.Stream                         ( Stream(..) )
import Foreign.CUDA.Driver.Unified                        ( MemoryType(..) )
import Foreign.CUDA.Internal.C2HS
import Foreign.CUDA.Ptr                                   ( DevicePtr(..) )

import Control.Monad                                      ( liftM )
import Unsafe.Coerce

import Data.Word
import Foreign
import Foreign.C
import Foreign.Storable


-- | Callback function executed on the host
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__TYPES.html#group__CUDA__TYPES_1g262cd3570ff5d396db4e3dabede3c355>
--
-- @since 0.10.0.0
--
type HostCallback = ((C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (IO ()))))
{-# LINE 77 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



--------------------------------------------------------------------------------
-- Graph creation
--------------------------------------------------------------------------------

-- | Create an empty task graph
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1gd885f719186010727b75c3315f865fdf>
--
-- @since 0.10.0.0
--
{-# INLINEABLE create #-}
create :: ([GraphFlag]) -> IO ((Graph))
create :: [GraphFlag] -> IO Graph
create [GraphFlag]
a2 =
  (Ptr (Ptr ()) -> IO Graph) -> IO Graph
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO Graph) -> IO Graph)
-> (Ptr (Ptr ()) -> IO Graph) -> IO Graph
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a1' -> 
  let {a2' :: CUInt
a2' = [GraphFlag] -> CUInt
forall a b. (Enum a, Num b, Bits b) => [a] -> b
combineBitMasks [GraphFlag]
a2} in 
  Ptr (Ptr ()) -> CUInt -> IO CInt
create'_ Ptr (Ptr ())
a1' CUInt
a2' IO CInt -> (CInt -> IO Graph) -> IO Graph
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  CInt -> IO ()
checkStatus CInt
res IO () -> IO Graph -> IO Graph
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
  Ptr (Ptr ()) -> IO Graph
peekGraph  Ptr (Ptr ())
a1'IO Graph -> (Graph -> IO Graph) -> IO Graph
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Graph
a1'' -> 
  Graph -> IO Graph
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Graph
a1'')

{-# LINE 102 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Destroy a graph, as well as all of its nodes
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1g718cfd9681f078693d4be2426fd689c8>
--
-- @since 0.10.0.0
{-# INLINEABLE destroy #-}
destroy :: (Graph) -> IO ()
destroy :: Graph -> IO ()
destroy Graph
a1 =
  let {a1' :: Ptr ()
a1' = Graph -> Ptr ()
useGraph Graph
a1} in 
  Ptr () -> IO CInt
destroy'_ Ptr ()
a1' IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  CInt -> IO ()
checkStatus CInt
res IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
  () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

{-# LINE 121 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Clone a graph
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1g3603974654e463f2231c71d9b9d1517e>
--
-- @since 0.10.0.0
--
{-# INLINEABLE clone #-}
clone :: (Graph) -> IO ((Graph))
clone :: Graph -> IO Graph
clone Graph
a2 =
  (Ptr (Ptr ()) -> IO Graph) -> IO Graph
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO Graph) -> IO Graph)
-> (Ptr (Ptr ()) -> IO Graph) -> IO Graph
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a1' -> 
  let {a2' :: Ptr ()
a2' = Graph -> Ptr ()
useGraph Graph
a2} in 
  Ptr (Ptr ()) -> Ptr () -> IO CInt
clone'_ Ptr (Ptr ())
a1' Ptr ()
a2' IO CInt -> (CInt -> IO Graph) -> IO Graph
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  CInt -> IO ()
checkStatus CInt
res IO () -> IO Graph -> IO Graph
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
  Ptr (Ptr ()) -> IO Graph
peekGraph  Ptr (Ptr ())
a1'IO Graph -> (Graph -> IO Graph) -> IO Graph
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Graph
a1'' -> 
  Graph -> IO Graph
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Graph
a1'')

{-# LINE 142 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Remove a node from the graph
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1g00ed16434d983d8f0011683eacaf19b9>
--
-- @since 0.10.0.0
--
{-# INLINEABLE remove #-}
remove :: (Node) -> IO ()
remove :: Node -> IO ()
remove Node
a1 =
  let {a1' :: Ptr ()
a1' = Node -> Ptr ()
useNode Node
a1} in 
  Ptr () -> IO CInt
remove'_ Ptr ()
a1' IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  CInt -> IO ()
checkStatus CInt
res IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
  () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

{-# LINE 162 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Create a child graph node and add it to the graph
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1g3f27c2e56e3d568b09f00d438e61ceb1>
--
-- @since 0.10.0.0
--
{-# INLINEABLE addChild #-}
addChild :: Graph -> Graph -> [Node] -> IO Node
addChild :: Graph -> Graph -> [Node] -> IO Node
addChild Graph
parent Graph
child [Node]
dependencies = Graph -> [Node] -> Graph -> IO Node
cuGraphAddChildGraphNode Graph
parent [Node]
dependencies Graph
child
  where
    cuGraphAddChildGraphNode :: (Graph) -> ([Node]) -> (Graph) -> IO ((Node))
    cuGraphAddChildGraphNode :: Graph -> [Node] -> Graph -> IO Node
cuGraphAddChildGraphNode Graph
a2 [Node]
a3 Graph
a4 =
      (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO Node) -> IO Node)
-> (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a1' -> 
      let {a2' :: Ptr ()
a2' = Graph -> Ptr ()
useGraph Graph
a2} in 
      [Node] -> ((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node
forall a. [Node] -> ((Ptr (Ptr ()), CULong) -> IO a) -> IO a
withNodeArrayLen [Node]
a3 (((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node)
-> ((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \(Ptr (Ptr ())
a3'1, CULong
a3'2) -> 
      let {a4' :: Ptr ()
a4' = Graph -> Ptr ()
useGraph Graph
a4} in 
      Ptr (Ptr ())
-> Ptr () -> Ptr (Ptr ()) -> CULong -> Ptr () -> IO CInt
cuGraphAddChildGraphNode'_ Ptr (Ptr ())
a1' Ptr ()
a2' Ptr (Ptr ())
a3'1  CULong
a3'2 Ptr ()
a4' IO CInt -> (CInt -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
      CInt -> IO ()
checkStatus CInt
res IO () -> IO Node -> IO Node
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
      Ptr (Ptr ()) -> IO Node
peekNode  Ptr (Ptr ())
a1'IO Node -> (Node -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Node
a1'' -> 
      Node -> IO Node
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Node
a1'')

{-# LINE 187 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Add dependency edges to the graph
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1g81bf1a6965f881be6ad8d21cfe0ee44f>
--
-- @since 0.10.0.0
--
{-# INLINEABLE addDependencies #-}
addDependencies :: Graph -> [(Node,Node)] -> IO ()
addDependencies :: Graph -> [(Node, Node)] -> IO ()
addDependencies !Graph
g ![(Node, Node)]
deps = Graph -> [Node] -> [Node] -> IO ()
cuGraphAddDependencies Graph
g [Node]
from [Node]
to
  where
    ([Node]
from, [Node]
to) = [(Node, Node)] -> ([Node], [Node])
forall a b. [(a, b)] -> ([a], [b])
unzip [(Node, Node)]
deps

    cuGraphAddDependencies :: (Graph) -> ([Node]) -> ([Node]) -> IO ()
    cuGraphAddDependencies :: Graph -> [Node] -> [Node] -> IO ()
cuGraphAddDependencies Graph
a1 [Node]
a2 [Node]
a3 =
      let {a1' :: Ptr ()
a1' = Graph -> Ptr ()
useGraph Graph
a1} in 
      [Node] -> (Ptr (Ptr ()) -> IO ()) -> IO ()
forall a. [Node] -> (Ptr (Ptr ()) -> IO a) -> IO a
withNodeArray [Node]
a2 ((Ptr (Ptr ()) -> IO ()) -> IO ())
-> (Ptr (Ptr ()) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a2' -> 
      [Node] -> ((Ptr (Ptr ()), CULong) -> IO ()) -> IO ()
forall a. [Node] -> ((Ptr (Ptr ()), CULong) -> IO a) -> IO a
withNodeArrayLen [Node]
a3 (((Ptr (Ptr ()), CULong) -> IO ()) -> IO ())
-> ((Ptr (Ptr ()), CULong) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \(Ptr (Ptr ())
a3'1, CULong
a3'2) -> 
      Ptr () -> Ptr (Ptr ()) -> Ptr (Ptr ()) -> CULong -> IO CInt
cuGraphAddDependencies'_ Ptr ()
a1' Ptr (Ptr ())
a2' Ptr (Ptr ())
a3'1  CULong
a3'2 IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
      CInt -> IO ()
checkStatus CInt
res IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
      () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

{-# LINE 213 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Remove dependency edges from the graph
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1g8ab696a6b3ccd99db47feba7e97fb579>
--
-- @since 0.10.0.0
--
{-# INLINE removeDependencies #-}
removeDependencies :: Graph -> [(Node,Node)] -> IO ()
removeDependencies :: Graph -> [(Node, Node)] -> IO ()
removeDependencies !Graph
g ![(Node, Node)]
deps = Graph -> [Node] -> [Node] -> IO ()
cuGraphRemoveDependencies Graph
g [Node]
from [Node]
to
  where
    ([Node]
from, [Node]
to) = [(Node, Node)] -> ([Node], [Node])
forall a b. [(a, b)] -> ([a], [b])
unzip [(Node, Node)]
deps

    cuGraphRemoveDependencies :: (Graph) -> ([Node]) -> ([Node]) -> IO ()
    cuGraphRemoveDependencies :: Graph -> [Node] -> [Node] -> IO ()
cuGraphRemoveDependencies Graph
a1 [Node]
a2 [Node]
a3 =
      let {a1' :: Ptr ()
a1' = Graph -> Ptr ()
useGraph Graph
a1} in 
      [Node] -> (Ptr (Ptr ()) -> IO ()) -> IO ()
forall a. [Node] -> (Ptr (Ptr ()) -> IO a) -> IO a
withNodeArray [Node]
a2 ((Ptr (Ptr ()) -> IO ()) -> IO ())
-> (Ptr (Ptr ()) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a2' -> 
      [Node] -> ((Ptr (Ptr ()), CULong) -> IO ()) -> IO ()
forall a. [Node] -> ((Ptr (Ptr ()), CULong) -> IO a) -> IO a
withNodeArrayLen [Node]
a3 (((Ptr (Ptr ()), CULong) -> IO ()) -> IO ())
-> ((Ptr (Ptr ()), CULong) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \(Ptr (Ptr ())
a3'1, CULong
a3'2) -> 
      Ptr () -> Ptr (Ptr ()) -> Ptr (Ptr ()) -> CULong -> IO CInt
cuGraphRemoveDependencies'_ Ptr ()
a1' Ptr (Ptr ())
a2' Ptr (Ptr ())
a3'1  CULong
a3'2 IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
      CInt -> IO ()
checkStatus CInt
res IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
      () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

{-# LINE 239 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Create an empty node and add it to the graph.
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1g8a8681dbe97dbbb236ea5ebf3abe2ada>
--
-- @since 0.10.0.0
--
{-# INLINEABLE addEmpty #-}
addEmpty :: (Graph) -> ([Node]) -> IO ((Node))
addEmpty :: Graph -> [Node] -> IO Node
addEmpty Graph
a2 [Node]
a3 =
  (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO Node) -> IO Node)
-> (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a1' -> 
  let {a2' :: Ptr ()
a2' = Graph -> Ptr ()
useGraph Graph
a2} in 
  [Node] -> ((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node
forall a. [Node] -> ((Ptr (Ptr ()), CULong) -> IO a) -> IO a
withNodeArrayLen [Node]
a3 (((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node)
-> ((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \(Ptr (Ptr ())
a3'1, CULong
a3'2) -> 
  Ptr (Ptr ()) -> Ptr () -> Ptr (Ptr ()) -> CULong -> IO CInt
addEmpty'_ Ptr (Ptr ())
a1' Ptr ()
a2' Ptr (Ptr ())
a3'1  CULong
a3'2 IO CInt -> (CInt -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  CInt -> IO ()
checkStatus CInt
res IO () -> IO Node -> IO Node
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
  Ptr (Ptr ()) -> IO Node
peekNode  Ptr (Ptr ())
a1'IO Node -> (Node -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Node
a1'' -> 
  Node -> IO Node
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Node
a1'')

{-# LINE 261 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Creates a host execution node and adds it to the graph
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1g1ba15c2fe1afb8897091ecec4202b597>
--
-- @since 0.10.0.0
--
{-# INLINEABLE addHost #-}
addHost :: (Graph) -> ([Node]) -> (HostCallback) -> (Ptr ()) -> IO ((Node))
addHost :: Graph -> [Node] -> HostCallback -> Ptr () -> IO Node
addHost Graph
a2 [Node]
a3 HostCallback
a4 Ptr ()
a5 =
  (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO Node) -> IO Node)
-> (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a1' -> 
  let {a2' :: Ptr ()
a2' = Graph -> Ptr ()
useGraph Graph
a2} in 
  [Node] -> ((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node
forall a. [Node] -> ((Ptr (Ptr ()), CULong) -> IO a) -> IO a
withNodeArrayLen [Node]
a3 (((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node)
-> ((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \(Ptr (Ptr ())
a3'1, CULong
a3'2) -> 
  let {a4' :: HostCallback
a4' = HostCallback -> HostCallback
forall a. a -> a
id HostCallback
a4} in 
  let {a5' :: Ptr ()
a5' = Ptr () -> Ptr ()
forall a. a -> a
id Ptr ()
a5} in 
  Ptr (Ptr ())
-> Ptr ()
-> Ptr (Ptr ())
-> CULong
-> HostCallback
-> Ptr ()
-> IO CInt
addHost'_ Ptr (Ptr ())
a1' Ptr ()
a2' Ptr (Ptr ())
a3'1  CULong
a3'2 HostCallback
a4' Ptr ()
a5' IO CInt -> (CInt -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  CInt -> IO ()
checkStatus CInt
res IO () -> IO Node -> IO Node
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
  Ptr (Ptr ()) -> IO Node
peekNode  Ptr (Ptr ())
a1'IO Node -> (Node -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Node
a1'' -> 
  Node -> IO Node
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Node
a1'')

{-# LINE 285 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Create a kernel execution node and adds it to the graph
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1g886a9096293238937f2f3bc7f2d57635>
--
-- @since 0.10.0.0
--
{-# INLINEABLE addKernel #-}
addKernel
    :: Graph
    -> [Node]
    -> Fun
    -> (Int, Int, Int)  -- ^ grid dimension
    -> (Int, Int, Int)  -- ^ thread block dimensions
    -> Int              -- ^ shared memory (bytes)
    -> [FunParam]
    -> IO Node
addKernel :: Graph
-> [Node]
-> Fun
-> (Int, Int, Int)
-> (Int, Int, Int)
-> Int
-> [FunParam]
-> IO Node
addKernel !Graph
g ![Node]
ns !Fun
fun (!Int
gx,!Int
gy,!Int
gz) (!Int
tx,!Int
ty,!Int
tz) !Int
sm ![FunParam]
args
  = (FunParam -> (Ptr () -> IO Node) -> IO Node)
-> [FunParam] -> ([Ptr ()] -> IO Node) -> IO Node
forall a b res.
(a -> (b -> res) -> res) -> [a] -> ([b] -> res) -> res
withMany FunParam -> (Ptr () -> IO Node) -> IO Node
forall b. FunParam -> (Ptr () -> IO b) -> IO b
withFP [FunParam]
args
  (([Ptr ()] -> IO Node) -> IO Node)
-> ([Ptr ()] -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \[Ptr ()]
pa -> [Ptr ()] -> (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray [Ptr ()]
pa
  ((Ptr (Ptr ()) -> IO Node) -> IO Node)
-> (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
pp -> Graph
-> [Node]
-> Fun
-> Int
-> Int
-> Int
-> Int
-> Int
-> Int
-> Int
-> Ptr (Ptr ())
-> IO Node
cuGraphAddKernelNode_simple Graph
g [Node]
ns Fun
fun Int
gx Int
gy Int
gz Int
tx Int
ty Int
tz Int
sm Ptr (Ptr ())
pp
  where
    withFP :: FunParam -> (Ptr () -> IO b) -> IO b
    withFP :: forall b. FunParam -> (Ptr () -> IO b) -> IO b
withFP !FunParam
p !Ptr () -> IO b
f = case FunParam
p of
      IArg Int32
v -> Int32 -> (Ptr Int32 -> IO b) -> IO b
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with' Int32
v (Ptr () -> IO b
f (Ptr () -> IO b) -> (Ptr Int32 -> Ptr ()) -> Ptr Int32 -> IO b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr Int32 -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr)
      FArg Float
v -> Float -> (Ptr Float -> IO b) -> IO b
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with' Float
v (Ptr () -> IO b
f (Ptr () -> IO b) -> (Ptr Float -> Ptr ()) -> Ptr Float -> IO b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr Float -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr)
      VArg a
v -> a -> (Ptr a -> IO b) -> IO b
forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with' a
v (Ptr () -> IO b
f (Ptr () -> IO b) -> (Ptr a -> Ptr ()) -> Ptr a -> IO b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr a -> Ptr ()
forall a b. Ptr a -> Ptr b
castPtr)

    -- can't use the standard 'with' because 'alloca' will pass an undefined
    -- dummy argument when determining 'sizeOf' and 'alignment', but sometimes
    -- instances in Accelerate need to evaluate this argument.
    --
    with' :: Storable a => a -> (Ptr a -> IO b) -> IO b
    with' :: forall a b. Storable a => a -> (Ptr a -> IO b) -> IO b
with' !a
val !Ptr a -> IO b
f =
      Int -> (Ptr a -> IO b) -> IO b
forall a b. Int -> (Ptr a -> IO b) -> IO b
allocaBytes (a -> Int
forall a. Storable a => a -> Int
sizeOf a
val) ((Ptr a -> IO b) -> IO b) -> (Ptr a -> IO b) -> IO b
forall a b. (a -> b) -> a -> b
$ \Ptr a
ptr -> do
        Ptr a -> a -> IO ()
forall a. Storable a => Ptr a -> a -> IO ()
poke Ptr a
ptr a
val
        Ptr a -> IO b
f Ptr a
ptr

    cuGraphAddKernelNode_simple :: (Graph) -> ([Node]) -> (Fun) -> (Int) -> (Int) -> (Int) -> (Int) -> (Int) -> (Int) -> (Int) -> (Ptr (Ptr ())) -> IO ((Node))
    cuGraphAddKernelNode_simple :: Graph
-> [Node]
-> Fun
-> Int
-> Int
-> Int
-> Int
-> Int
-> Int
-> Int
-> Ptr (Ptr ())
-> IO Node
cuGraphAddKernelNode_simple Graph
a2 [Node]
a3 Fun
a4 Int
a5 Int
a6 Int
a7 Int
a8 Int
a9 Int
a10 Int
a11 Ptr (Ptr ())
a12 =
      (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO Node) -> IO Node)
-> (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a1' -> 
      let {a2' :: Ptr ()
a2' = Graph -> Ptr ()
useGraph Graph
a2} in 
      [Node] -> ((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node
forall a. [Node] -> ((Ptr (Ptr ()), CULong) -> IO a) -> IO a
withNodeArrayLen [Node]
a3 (((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node)
-> ((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \(Ptr (Ptr ())
a3'1, CULong
a3'2) -> 
      let {a4' :: Ptr ()
a4' = Fun -> Ptr ()
useFun Fun
a4} in 
      let {a5' :: CUInt
a5' = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a5} in 
      let {a6' :: CUInt
a6' = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a6} in 
      let {a7' :: CUInt
a7' = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a7} in 
      let {a8' :: CUInt
a8' = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a8} in 
      let {a9' :: CUInt
a9' = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a9} in 
      let {a10' :: CUInt
a10' = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a10} in 
      let {a11' :: CUInt
a11' = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a11} in 
      let {a12' :: Ptr (Ptr ())
a12' = Ptr (Ptr ()) -> Ptr (Ptr ())
forall a. a -> a
id Ptr (Ptr ())
a12} in 
      Ptr (Ptr ())
-> Ptr ()
-> Ptr (Ptr ())
-> CULong
-> Ptr ()
-> CUInt
-> CUInt
-> CUInt
-> CUInt
-> CUInt
-> CUInt
-> CUInt
-> Ptr (Ptr ())
-> IO CInt
cuGraphAddKernelNode_simple'_ Ptr (Ptr ())
a1' Ptr ()
a2' Ptr (Ptr ())
a3'1  CULong
a3'2 Ptr ()
a4' CUInt
a5' CUInt
a6' CUInt
a7' CUInt
a8' CUInt
a9' CUInt
a10' CUInt
a11' Ptr (Ptr ())
a12' IO CInt -> (CInt -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
      CInt -> IO ()
checkStatus CInt
res IO () -> IO Node -> IO Node
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
      Ptr (Ptr ()) -> IO Node
peekNode  Ptr (Ptr ())
a1'IO Node -> (Node -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Node
a1'' -> 
      Node -> IO Node
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Node
a1'')

{-# LINE 345 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Create a memcpy node and add it to the graph
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1gdd521e1437c1c3ea8822f66a32ff1f94>
--
-- @since 0.10.0.0
--
addMemcpy :: (Graph) -> ([Node]) -> (Context) -> (Int) -- ^ srcXInBytes
 -> (Int) -- ^ srcY
 -> (Int) -- ^ srcZ
 -> (Int) -- ^ srcLOD
 -> (MemoryType) -- ^ source memory type
 -> (Ptr a) -- ^ source ptr
 -> (Int) -- ^ srcPitch
 -> (Int) -- ^ srcHeight
 -> (Int) -- ^ dstXInBytes
 -> (Int) -- ^ dstY
 -> (Int) -- ^ dstZ
 -> (Int) -- ^ dstLOD
 -> (MemoryType) -- ^ destination memory type
 -> (Ptr a) -- ^ destination ptr
 -> (Int) -- ^ dstPitch
 -> (Int) -- ^ dstHeight
 -> (Int) -- ^ widthInBytes
 -> (Int) -- ^ height
 -> (Int) -- ^ depth
 -> IO ((Node))
addMemcpy :: forall a.
Graph
-> [Node]
-> Context
-> Int
-> Int
-> Int
-> Int
-> MemoryType
-> Ptr a
-> Int
-> Int
-> Int
-> Int
-> Int
-> Int
-> MemoryType
-> Ptr a
-> Int
-> Int
-> Int
-> Int
-> Int
-> IO Node
addMemcpy Graph
a2 [Node]
a3 Context
a4 Int
a5 Int
a6 Int
a7 Int
a8 MemoryType
a9 Ptr a
a10 Int
a11 Int
a12 Int
a13 Int
a14 Int
a15 Int
a16 MemoryType
a17 Ptr a
a18 Int
a19 Int
a20 Int
a21 Int
a22 Int
a23 =
  (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO Node) -> IO Node)
-> (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a1' -> 
  let {a2' :: Ptr ()
a2' = Graph -> Ptr ()
useGraph Graph
a2} in 
  [Node] -> ((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node
forall a. [Node] -> ((Ptr (Ptr ()), CULong) -> IO a) -> IO a
withNodeArrayLen [Node]
a3 (((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node)
-> ((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \(Ptr (Ptr ())
a3'1, CULong
a3'2) -> 
  let {a4' :: Ptr ()
a4' = Context -> Ptr ()
useContext Context
a4} in 
  let {a5' :: CULong
a5' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a5} in 
  let {a6' :: CULong
a6' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a6} in 
  let {a7' :: CULong
a7' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a7} in 
  let {a8' :: CULong
a8' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a8} in 
  let {a9' :: CInt
a9' = MemoryType -> CInt
forall e i. (Enum e, Integral i) => e -> i
cFromEnum MemoryType
a9} in 
  let {a10' :: Ptr b
a10' = Ptr a -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr Ptr a
a10} in 
  let {a11' :: CULong
a11' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a11} in 
  let {a12' :: CULong
a12' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a12} in 
  let {a13' :: CULong
a13' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a13} in 
  let {a14' :: CULong
a14' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a14} in 
  let {a15' :: CULong
a15' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a15} in 
  let {a16' :: CULong
a16' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a16} in 
  let {a17' :: CInt
a17' = MemoryType -> CInt
forall e i. (Enum e, Integral i) => e -> i
cFromEnum MemoryType
a17} in 
  let {a18' :: Ptr b
a18' = Ptr a -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr Ptr a
a18} in 
  let {a19' :: CULong
a19' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a19} in 
  let {a20' :: CULong
a20' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a20} in 
  let {a21' :: CULong
a21' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a21} in 
  let {a22' :: CULong
a22' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a22} in 
  let {a23' :: CULong
a23' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a23} in 
  Ptr (Ptr ())
-> Ptr ()
-> Ptr (Ptr ())
-> CULong
-> Ptr ()
-> CULong
-> CULong
-> CULong
-> CULong
-> CInt
-> Ptr ()
-> CULong
-> CULong
-> CULong
-> CULong
-> CULong
-> CULong
-> CInt
-> Ptr ()
-> CULong
-> CULong
-> CULong
-> CULong
-> CULong
-> IO CInt
addMemcpy'_ Ptr (Ptr ())
a1' Ptr ()
a2' Ptr (Ptr ())
a3'1  CULong
a3'2 Ptr ()
a4' CULong
a5' CULong
a6' CULong
a7' CULong
a8' CInt
a9' Ptr ()
forall {b}. Ptr b
a10' CULong
a11' CULong
a12' CULong
a13' CULong
a14' CULong
a15' CULong
a16' CInt
a17' Ptr ()
forall {b}. Ptr b
a18' CULong
a19' CULong
a20' CULong
a21' CULong
a22' CULong
a23' IO CInt -> (CInt -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  CInt -> IO ()
checkStatus CInt
res IO () -> IO Node -> IO Node
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
  Ptr (Ptr ()) -> IO Node
peekNode  Ptr (Ptr ())
a1'IO Node -> (Node -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Node
a1'' -> 
  Node -> IO Node
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Node
a1'')

{-# LINE 386 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Create a memset node and add it to the graph
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1gac7f59961798f14a9f94f9f6b53cc3b7>
--
-- @since 0.10.0.0
--
{-# INLINEABLE addMemset #-}
addMemset
    :: Storable a
    => Graph
    -> [Node]
    -> Context
    -> DevicePtr a
    -> a
    -> Int      -- ^ height
    -> Int      -- ^ pitch
    -> Int      -- ^ width
    -> IO Node
addMemset :: forall a.
Storable a =>
Graph
-> [Node]
-> Context
-> DevicePtr a
-> a
-> Int
-> Int
-> Int
-> IO Node
addMemset !Graph
g ![Node]
ns !Context
ctx !DevicePtr a
dptr !a
val !Int
h !Int
p !Int
w =
  Graph
-> [Node]
-> Context
-> DevicePtr a
-> Int
-> Int
-> Int
-> Word32
-> Int
-> IO Node
forall a.
Graph
-> [Node]
-> Context
-> DevicePtr a
-> Int
-> Int
-> Int
-> Word32
-> Int
-> IO Node
cuGraphAddMemsetNode_simple Graph
g [Node]
ns Context
ctx DevicePtr a
dptr Int
bytes Int
h Int
p Word32
val' Int
w
  where
    bytes :: Int
bytes = a -> Int
forall a. Storable a => a -> Int
sizeOf a
val

    val' :: Word32
    val' :: Word32
val' = case Int
bytes of
             Int
1 -> Word8 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (a -> Word8
forall a b. a -> b
unsafeCoerce a
val :: Word8)
             Int
2 -> Word16 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (a -> Word16
forall a b. a -> b
unsafeCoerce a
val :: Word16)
             Int
4 -> Word32 -> Word32
forall a b. (Integral a, Num b) => a -> b
fromIntegral (a -> Word32
forall a b. a -> b
unsafeCoerce a
val :: Word32)
             Int
_ -> String -> Word32
forall a. String -> a
cudaError String
"can only memset 8-, 16-, and 32-bit values"

    cuGraphAddMemsetNode_simple :: (Graph) -> ([Node]) -> (Context) -> (DevicePtr a) -> (Int) -> (Int) -> (Int) -> (Word32) -> (Int) -> IO ((Node))
    cuGraphAddMemsetNode_simple :: forall a.
Graph
-> [Node]
-> Context
-> DevicePtr a
-> Int
-> Int
-> Int
-> Word32
-> Int
-> IO Node
cuGraphAddMemsetNode_simple Graph
a2 [Node]
a3 Context
a4 DevicePtr a
a5 Int
a6 Int
a7 Int
a8 Word32
a9 Int
a10 =
      (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO Node) -> IO Node)
-> (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a1' -> 
      let {a2' :: Ptr ()
a2' = Graph -> Ptr ()
useGraph Graph
a2} in 
      [Node] -> ((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node
forall a. [Node] -> ((Ptr (Ptr ()), CULong) -> IO a) -> IO a
withNodeArrayLen [Node]
a3 (((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node)
-> ((Ptr (Ptr ()), CULong) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \(Ptr (Ptr ())
a3'1, CULong
a3'2) -> 
      let {a4' :: Ptr ()
a4' = Context -> Ptr ()
useContext Context
a4} in 
      let {a5' :: DeviceHandle
a5' = DevicePtr a -> DeviceHandle
forall a. DevicePtr a -> DeviceHandle
useDeviceHandle DevicePtr a
a5} in 
      let {a6' :: CUInt
a6' = Int -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a6} in 
      let {a7' :: CULong
a7' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a7} in 
      let {a8' :: CULong
a8' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a8} in 
      let {a9' :: CUInt
a9' = Word32 -> CUInt
forall a b. (Integral a, Num b) => a -> b
fromIntegral Word32
a9} in 
      let {a10' :: CULong
a10' = Int -> CULong
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
a10} in 
      Ptr (Ptr ())
-> Ptr ()
-> Ptr (Ptr ())
-> CULong
-> Ptr ()
-> DeviceHandle
-> CUInt
-> CULong
-> CULong
-> CUInt
-> CULong
-> IO CInt
cuGraphAddMemsetNode_simple'_ Ptr (Ptr ())
a1' Ptr ()
a2' Ptr (Ptr ())
a3'1  CULong
a3'2 Ptr ()
a4' DeviceHandle
a5' CUInt
a6' CULong
a7' CULong
a8' CUInt
a9' CULong
a10' IO CInt -> (CInt -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
      CInt -> IO ()
checkStatus CInt
res IO () -> IO Node -> IO Node
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
      Ptr (Ptr ()) -> IO Node
peekNode  Ptr (Ptr ())
a1'IO Node -> (Node -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Node
a1'' -> 
      Node -> IO Node
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Node
a1'')

{-# LINE 437 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



--------------------------------------------------------------------------------
-- Query
--------------------------------------------------------------------------------

-- | Return the type of a node
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1gdb1776d97aa1c9d5144774b29e4b8c3e>
--
-- @since 0.10.0.0
--
{-# INLINEABLE getType #-}
getType :: (Node) -> IO ((NodeType))
getType :: Node -> IO NodeType
getType Node
a1 =
  let {a1' :: Ptr ()
a1' = Node -> Ptr ()
useNode Node
a1} in 
  (Ptr CInt -> IO NodeType) -> IO NodeType
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CInt -> IO NodeType) -> IO NodeType)
-> (Ptr CInt -> IO NodeType) -> IO NodeType
forall a b. (a -> b) -> a -> b
$ \Ptr CInt
a2' -> 
  Ptr () -> Ptr CInt -> IO CInt
getType'_ Ptr ()
a1' Ptr CInt
a2' IO CInt -> (CInt -> IO NodeType) -> IO NodeType
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  CInt -> IO ()
checkStatus CInt
res IO () -> IO NodeType -> IO NodeType
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
  Ptr CInt -> IO NodeType
forall a b. (Enum a, Integral b, Storable b) => Ptr b -> IO a
peekEnum  Ptr CInt
a2'IO NodeType -> (NodeType -> IO NodeType) -> IO NodeType
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \NodeType
a2'' -> 
  NodeType -> IO NodeType
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (NodeType
a2'')

{-# LINE 462 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Retrieve the embedded graph of a child sub-graph node
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1gbe9fc9267316b3778ef0db507917b4fd>
--
-- @since 0.10.0.0
--
{-# INLINEABLE getChildGraph #-}
getChildGraph :: (Node) -> IO ((Graph))
getChildGraph :: Node -> IO Graph
getChildGraph Node
a1 =
  let {a1' :: Ptr ()
a1' = Node -> Ptr ()
useNode Node
a1} in 
  (Ptr (Ptr ()) -> IO Graph) -> IO Graph
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO Graph) -> IO Graph)
-> (Ptr (Ptr ()) -> IO Graph) -> IO Graph
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a2' -> 
  Ptr () -> Ptr (Ptr ()) -> IO CInt
getChildGraph'_ Ptr ()
a1' Ptr (Ptr ())
a2' IO CInt -> (CInt -> IO Graph) -> IO Graph
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  CInt -> IO ()
checkStatus CInt
res IO () -> IO Graph -> IO Graph
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
  Ptr (Ptr ()) -> IO Graph
peekGraph  Ptr (Ptr ())
a2'IO Graph -> (Graph -> IO Graph) -> IO Graph
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Graph
a2'' -> 
  Graph -> IO Graph
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Graph
a2'')

{-# LINE 483 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Return a graph's dependency edges
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1g2b7bd71b0b2b8521f141996e0975a0d7>
--
-- @since 0.10.0.0
--
{-# INLINEABLE getEdges #-}
getEdges :: Graph -> IO [(Node, Node)]
getEdges :: Graph -> IO [(Node, Node)]
getEdges !Graph
g =
  (Ptr CULong -> IO [(Node, Node)]) -> IO [(Node, Node)]
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CULong -> IO [(Node, Node)]) -> IO [(Node, Node)])
-> (Ptr CULong -> IO [(Node, Node)]) -> IO [(Node, Node)]
forall a b. (a -> b) -> a -> b
$ \Ptr CULong
p_count -> do
    Graph -> Ptr Node -> Ptr Node -> Ptr CULong -> IO ()
cuGraphGetEdges Graph
g Ptr Node
forall {b}. Ptr b
nullPtr Ptr Node
forall {b}. Ptr b
nullPtr Ptr CULong
p_count
    Int
count <- Ptr CULong -> IO Int
forall a b. (Storable a, Integral a, Integral b) => Ptr a -> IO b
peekIntConv Ptr CULong
p_count
    Int -> (Ptr Node -> IO [(Node, Node)]) -> IO [(Node, Node)]
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray  Int
count ((Ptr Node -> IO [(Node, Node)]) -> IO [(Node, Node)])
-> (Ptr Node -> IO [(Node, Node)]) -> IO [(Node, Node)]
forall a b. (a -> b) -> a -> b
$ \Ptr Node
p_from -> do
     Int -> (Ptr Node -> IO [(Node, Node)]) -> IO [(Node, Node)]
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
count ((Ptr Node -> IO [(Node, Node)]) -> IO [(Node, Node)])
-> (Ptr Node -> IO [(Node, Node)]) -> IO [(Node, Node)]
forall a b. (a -> b) -> a -> b
$ \Ptr Node
p_to   -> do
       Graph -> Ptr Node -> Ptr Node -> Ptr CULong -> IO ()
cuGraphGetEdges Graph
g Ptr Node
p_from Ptr Node
p_to Ptr CULong
p_count
       [Node]
from <- Int -> Ptr Node -> IO [Node]
forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray Int
count Ptr Node
p_from
       [Node]
to   <- Int -> Ptr Node -> IO [Node]
forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray Int
count Ptr Node
p_to
       [(Node, Node)] -> IO [(Node, Node)]
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([(Node, Node)] -> IO [(Node, Node)])
-> [(Node, Node)] -> IO [(Node, Node)]
forall a b. (a -> b) -> a -> b
$ [Node] -> [Node] -> [(Node, Node)]
forall a b. [a] -> [b] -> [(a, b)]
zip [Node]
from [Node]
to
  where
    cuGraphGetEdges :: (Graph) -> (Ptr Node) -> (Ptr Node) -> (Ptr CULong) -> IO ()
    cuGraphGetEdges :: Graph -> Ptr Node -> Ptr Node -> Ptr CULong -> IO ()
cuGraphGetEdges Graph
a1 Ptr Node
a2 Ptr Node
a3 Ptr CULong
a4 =
      let {a1' :: Ptr ()
a1' = Graph -> Ptr ()
useGraph Graph
a1} in 
      let {a2' :: Ptr b
a2' = Ptr Node -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr Ptr Node
a2} in 
      let {a3' :: Ptr b
a3' = Ptr Node -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr Ptr Node
a3} in 
      let {a4' :: Ptr CULong
a4' = Ptr CULong -> Ptr CULong
forall a. a -> a
id Ptr CULong
a4} in 
      Ptr () -> Ptr (Ptr ()) -> Ptr (Ptr ()) -> Ptr CULong -> IO CInt
cuGraphGetEdges'_ Ptr ()
a1' Ptr (Ptr ())
forall {b}. Ptr b
a2' Ptr (Ptr ())
forall {b}. Ptr b
a3' Ptr CULong
a4' IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
      CInt -> IO ()
checkStatus CInt
res IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
      () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

{-# LINE 517 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Return a graph's nodes
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1gfa35a8e2d2fc32f48dbd67ba27cf27e5>
--
-- @since 0.10.0.0
--
{-# INLINEABLE getNodes #-}
getNodes :: Graph -> IO [Node]
getNodes :: Graph -> IO [Node]
getNodes !Graph
g =
  (Ptr CULong -> IO [Node]) -> IO [Node]
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CULong -> IO [Node]) -> IO [Node])
-> (Ptr CULong -> IO [Node]) -> IO [Node]
forall a b. (a -> b) -> a -> b
$ \Ptr CULong
p_count -> do
    Graph -> Ptr Node -> Ptr CULong -> IO ()
cuGraphGetNodes Graph
g Ptr Node
forall {b}. Ptr b
nullPtr Ptr CULong
p_count
    Int
count <- Ptr CULong -> IO Int
forall a b. (Storable a, Integral a, Integral b) => Ptr a -> IO b
peekIntConv Ptr CULong
p_count
    Int -> (Ptr Node -> IO [Node]) -> IO [Node]
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
count ((Ptr Node -> IO [Node]) -> IO [Node])
-> (Ptr Node -> IO [Node]) -> IO [Node]
forall a b. (a -> b) -> a -> b
$ \Ptr Node
p_nodes -> do
      Graph -> Ptr Node -> Ptr CULong -> IO ()
cuGraphGetNodes Graph
g Ptr Node
p_nodes Ptr CULong
p_count
      Int -> Ptr Node -> IO [Node]
forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray Int
count Ptr Node
p_nodes
  where
    cuGraphGetNodes :: (Graph) -> (Ptr Node) -> (Ptr CULong) -> IO ()
    cuGraphGetNodes :: Graph -> Ptr Node -> Ptr CULong -> IO ()
cuGraphGetNodes Graph
a1 Ptr Node
a2 Ptr CULong
a3 =
      let {a1' :: Ptr ()
a1' = Graph -> Ptr ()
useGraph Graph
a1} in 
      let {a2' :: Ptr b
a2' = Ptr Node -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr Ptr Node
a2} in 
      let {a3' :: Ptr CULong
a3' = Ptr CULong -> Ptr CULong
forall a. a -> a
id Ptr CULong
a3} in 
      Ptr () -> Ptr (Ptr ()) -> Ptr CULong -> IO CInt
cuGraphGetNodes'_ Ptr ()
a1' Ptr (Ptr ())
forall {b}. Ptr b
a2' Ptr CULong
a3' IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
      CInt -> IO ()
checkStatus CInt
res IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
      () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

{-# LINE 547 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Returns the root nodes of a graph
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1gf8517646bd8b39ab6359f8e7f0edffbd>
--
-- @since 0.10.0.0
--
{-# INLINEABLE getRootNodes #-}
getRootNodes :: Graph -> IO [Node]
getRootNodes :: Graph -> IO [Node]
getRootNodes Graph
g =
  (Ptr CULong -> IO [Node]) -> IO [Node]
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CULong -> IO [Node]) -> IO [Node])
-> (Ptr CULong -> IO [Node]) -> IO [Node]
forall a b. (a -> b) -> a -> b
$ \Ptr CULong
p_count -> do
    Graph -> Ptr Node -> Ptr CULong -> IO ()
cuGraphGetRootNodes Graph
g Ptr Node
forall {b}. Ptr b
nullPtr Ptr CULong
p_count
    Int
count <- Ptr CULong -> IO Int
forall a b. (Storable a, Integral a, Integral b) => Ptr a -> IO b
peekIntConv Ptr CULong
p_count
    Int -> (Ptr Node -> IO [Node]) -> IO [Node]
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
count ((Ptr Node -> IO [Node]) -> IO [Node])
-> (Ptr Node -> IO [Node]) -> IO [Node]
forall a b. (a -> b) -> a -> b
$ \Ptr Node
p_nodes -> do
      Graph -> Ptr Node -> Ptr CULong -> IO ()
cuGraphGetRootNodes Graph
g Ptr Node
p_nodes Ptr CULong
p_count
      Int -> Ptr Node -> IO [Node]
forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray Int
count Ptr Node
p_nodes
  where
    cuGraphGetRootNodes :: (Graph) -> (Ptr Node) -> (Ptr CULong) -> IO ()
    cuGraphGetRootNodes :: Graph -> Ptr Node -> Ptr CULong -> IO ()
cuGraphGetRootNodes Graph
a1 Ptr Node
a2 Ptr CULong
a3 =
      let {a1' :: Ptr ()
a1' = Graph -> Ptr ()
useGraph Graph
a1} in 
      let {a2' :: Ptr b
a2' = Ptr Node -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr Ptr Node
a2} in 
      let {a3' :: Ptr CULong
a3' = Ptr CULong -> Ptr CULong
forall a. a -> a
id Ptr CULong
a3} in 
      Ptr () -> Ptr (Ptr ()) -> Ptr CULong -> IO CInt
cuGraphGetRootNodes'_ Ptr ()
a1' Ptr (Ptr ())
forall {b}. Ptr b
a2' Ptr CULong
a3' IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
      CInt -> IO ()
checkStatus CInt
res IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
      () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

{-# LINE 577 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Return the dependencies of a node
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1g048f4c0babcbba64a933fc277cd45083>
--
-- @since 0.10.0.0
--
{-# INLINEABLE getDependencies #-}
getDependencies :: Node -> IO [Node]
getDependencies :: Node -> IO [Node]
getDependencies !Node
n =
  (Ptr CULong -> IO [Node]) -> IO [Node]
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CULong -> IO [Node]) -> IO [Node])
-> (Ptr CULong -> IO [Node]) -> IO [Node]
forall a b. (a -> b) -> a -> b
$ \Ptr CULong
p_count -> do
    Node -> Ptr Node -> Ptr CULong -> IO ()
cuGraphNodeGetDependencies Node
n Ptr Node
forall {b}. Ptr b
nullPtr Ptr CULong
p_count
    Int
count <- Ptr CULong -> IO Int
forall a b. (Storable a, Integral a, Integral b) => Ptr a -> IO b
peekIntConv Ptr CULong
p_count
    Int -> (Ptr Node -> IO [Node]) -> IO [Node]
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
count ((Ptr Node -> IO [Node]) -> IO [Node])
-> (Ptr Node -> IO [Node]) -> IO [Node]
forall a b. (a -> b) -> a -> b
$ \Ptr Node
p_deps -> do
      Node -> Ptr Node -> Ptr CULong -> IO ()
cuGraphNodeGetDependencies Node
n Ptr Node
p_deps Ptr CULong
p_count
      Int -> Ptr Node -> IO [Node]
forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray Int
count Ptr Node
p_deps
  where
    cuGraphNodeGetDependencies :: (Node) -> (Ptr Node) -> (Ptr CULong) -> IO ()
    cuGraphNodeGetDependencies :: Node -> Ptr Node -> Ptr CULong -> IO ()
cuGraphNodeGetDependencies Node
a1 Ptr Node
a2 Ptr CULong
a3 =
      let {a1' :: Ptr ()
a1' = Node -> Ptr ()
useNode Node
a1} in 
      let {a2' :: Ptr b
a2' = Ptr Node -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr Ptr Node
a2} in 
      let {a3' :: Ptr CULong
a3' = Ptr CULong -> Ptr CULong
forall a. a -> a
id Ptr CULong
a3} in 
      Ptr () -> Ptr (Ptr ()) -> Ptr CULong -> IO CInt
cuGraphNodeGetDependencies'_ Ptr ()
a1' Ptr (Ptr ())
forall {b}. Ptr b
a2' Ptr CULong
a3' IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
      CInt -> IO ()
checkStatus CInt
res IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
      () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

{-# LINE 607 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Return a node's dependent nodes
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1g4b73d9e3b386a9c0b094a452b8431f59>
--
-- @since 0.10.0.0
--
{-# INLINEABLE getDependents #-}
getDependents :: Node -> IO [Node]
getDependents :: Node -> IO [Node]
getDependents Node
n =
  (Ptr CULong -> IO [Node]) -> IO [Node]
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr CULong -> IO [Node]) -> IO [Node])
-> (Ptr CULong -> IO [Node]) -> IO [Node]
forall a b. (a -> b) -> a -> b
$ \Ptr CULong
p_count -> do
    Node -> Ptr Node -> Ptr CULong -> IO ()
cuGraphNodeGetDependentNodes Node
n Ptr Node
forall {b}. Ptr b
nullPtr Ptr CULong
p_count
    Int
count <- Ptr CULong -> IO Int
forall a b. (Storable a, Integral a, Integral b) => Ptr a -> IO b
peekIntConv Ptr CULong
p_count
    Int -> (Ptr Node -> IO [Node]) -> IO [Node]
forall a b. Storable a => Int -> (Ptr a -> IO b) -> IO b
allocaArray Int
count ((Ptr Node -> IO [Node]) -> IO [Node])
-> (Ptr Node -> IO [Node]) -> IO [Node]
forall a b. (a -> b) -> a -> b
$ \Ptr Node
p_deps -> do
      Node -> Ptr Node -> Ptr CULong -> IO ()
cuGraphNodeGetDependentNodes Node
n Ptr Node
p_deps Ptr CULong
p_count
      Int -> Ptr Node -> IO [Node]
forall a. Storable a => Int -> Ptr a -> IO [a]
peekArray Int
count Ptr Node
p_deps
  where
    cuGraphNodeGetDependentNodes :: (Node) -> (Ptr Node) -> (Ptr CULong) -> IO ()
    cuGraphNodeGetDependentNodes :: Node -> Ptr Node -> Ptr CULong -> IO ()
cuGraphNodeGetDependentNodes Node
a1 Ptr Node
a2 Ptr CULong
a3 =
      let {a1' :: Ptr ()
a1' = Node -> Ptr ()
useNode Node
a1} in 
      let {a2' :: Ptr b
a2' = Ptr Node -> Ptr b
forall a b. Ptr a -> Ptr b
castPtr Ptr Node
a2} in 
      let {a3' :: Ptr CULong
a3' = Ptr CULong -> Ptr CULong
forall a. a -> a
id Ptr CULong
a3} in 
      Ptr () -> Ptr (Ptr ()) -> Ptr CULong -> IO CInt
cuGraphNodeGetDependentNodes'_ Ptr ()
a1' Ptr (Ptr ())
forall {b}. Ptr b
a2' Ptr CULong
a3' IO CInt -> (CInt -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
      CInt -> IO ()
checkStatus CInt
res IO () -> IO () -> IO ()
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
      () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()

{-# LINE 637 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



-- | Find a cloned version of a node
--
-- Requires CUDA-10.0
--
-- <https://docs.nvidia.com/cuda/cuda-driver-api/group__CUDA__GRAPH.html#group__CUDA__GRAPH_1gf21f6c968e346f028737c1118bfd41c2>
--
-- @since 0.10.0.0
--
{-# INLINEABLE findInClone #-}
findInClone :: (Node) -> (Graph) -> IO ((Node))
findInClone :: Node -> Graph -> IO Node
findInClone Node
a2 Graph
a3 =
  (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. Storable a => (Ptr a -> IO b) -> IO b
alloca ((Ptr (Ptr ()) -> IO Node) -> IO Node)
-> (Ptr (Ptr ()) -> IO Node) -> IO Node
forall a b. (a -> b) -> a -> b
$ \Ptr (Ptr ())
a1' -> 
  let {a2' :: Ptr ()
a2' = Node -> Ptr ()
useNode Node
a2} in 
  let {a3' :: Ptr ()
a3' = Graph -> Ptr ()
useGraph Graph
a3} in 
  Ptr (Ptr ()) -> Ptr () -> Ptr () -> IO CInt
findInClone'_ Ptr (Ptr ())
a1' Ptr ()
a2' Ptr ()
a3' IO CInt -> (CInt -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \CInt
res ->
  CInt -> IO ()
checkStatus CInt
res IO () -> IO Node -> IO Node
forall a b. IO a -> IO b -> IO b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> 
  Ptr (Ptr ()) -> IO Node
peekNode  Ptr (Ptr ())
a1'IO Node -> (Node -> IO Node) -> IO Node
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \Node
a1'' -> 
  Node -> IO Node
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Node
a1'')

{-# LINE 659 "src/Foreign/CUDA/Driver/Graph/Build.chs" #-}



--------------------------------------------------------------------------------
-- Internal
--------------------------------------------------------------------------------

{-# INLINE peekGraph #-}
peekGraph :: Ptr ((C2HSImp.Ptr ())) -> IO Graph
peekGraph :: Ptr (Ptr ()) -> IO Graph
peekGraph = (Ptr () -> Graph) -> IO (Ptr ()) -> IO Graph
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Ptr () -> Graph
Graph (IO (Ptr ()) -> IO Graph)
-> (Ptr (Ptr ()) -> IO (Ptr ())) -> Ptr (Ptr ()) -> IO Graph
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr (Ptr ()) -> IO (Ptr ())
forall a. Storable a => Ptr a -> IO a
peek

{-# INLINE peekNode #-}
peekNode :: Ptr ((C2HSImp.Ptr ())) -> IO Node
peekNode :: Ptr (Ptr ()) -> IO Node
peekNode = (Ptr () -> Node) -> IO (Ptr ()) -> IO Node
forall (m :: * -> *) a1 r. Monad m => (a1 -> r) -> m a1 -> m r
liftM Ptr () -> Node
Node (IO (Ptr ()) -> IO Node)
-> (Ptr (Ptr ()) -> IO (Ptr ())) -> Ptr (Ptr ()) -> IO Node
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr (Ptr ()) -> IO (Ptr ())
forall a. Storable a => Ptr a -> IO a
peek

{-# INLINE withNodeArray #-}
withNodeArray :: [Node] -> (Ptr ((C2HSImp.Ptr ())) -> IO a) -> IO a
withNodeArray :: forall a. [Node] -> (Ptr (Ptr ()) -> IO a) -> IO a
withNodeArray [Node]
ns Ptr (Ptr ()) -> IO a
f = [Node] -> (Ptr Node -> IO a) -> IO a
forall a b. Storable a => [a] -> (Ptr a -> IO b) -> IO b
withArray [Node]
ns (Ptr (Ptr ()) -> IO a
f (Ptr (Ptr ()) -> IO a)
-> (Ptr Node -> Ptr (Ptr ())) -> Ptr Node -> IO a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Ptr Node -> Ptr (Ptr ())
forall a b. Ptr a -> Ptr b
castPtr)

{-# INLINE withNodeArrayLen #-}
withNodeArrayLen :: [Node] -> ((Ptr ((C2HSImp.Ptr ())), CULong) -> IO a) -> IO a
withNodeArrayLen :: forall a. [Node] -> ((Ptr (Ptr ()), CULong) -> IO a) -> IO a
withNodeArrayLen [Node]
ns (Ptr (Ptr ()), CULong) -> IO a
f = [Node] -> (Int -> Ptr Node -> IO a) -> IO a
forall a b. Storable a => [a] -> (Int -> Ptr a -> IO b) -> IO b
withArrayLen [Node]
ns ((Int -> Ptr Node -> IO a) -> IO a)
-> (Int -> Ptr Node -> IO a) -> IO a
forall a b. (a -> b) -> a -> b
$ \Int
i Ptr Node
p -> (Ptr (Ptr ()), CULong) -> IO a
f (Ptr Node -> Ptr (Ptr ())
forall a b. Ptr a -> Ptr b
castPtr Ptr Node
p, Int -> CULong
forall a b. (Integral a, Integral b) => a -> b
cIntConv Int
i)


foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphCreate"
  create'_ :: ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (C2HSImp.CUInt -> (IO C2HSImp.CInt)))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphDestroy"
  destroy'_ :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphClone"
  clone'_ :: ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt)))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphDestroyNode"
  remove'_ :: ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphAddChildGraphNode"
  cuGraphAddChildGraphNode'_ :: ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (C2HSImp.CULong -> ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphAddDependencies"
  cuGraphAddDependencies'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (C2HSImp.CULong -> (IO C2HSImp.CInt)))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphRemoveDependencies"
  cuGraphRemoveDependencies'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (C2HSImp.CULong -> (IO C2HSImp.CInt)))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphAddEmptyNode"
  addEmpty'_ :: ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (C2HSImp.CULong -> (IO C2HSImp.CInt)))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphAddHostNode_simple"
  addHost'_ :: ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (C2HSImp.CULong -> ((C2HSImp.FunPtr ((C2HSImp.Ptr ()) -> (IO ()))) -> ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt)))))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphAddKernelNode_simple"
  cuGraphAddKernelNode_simple'_ :: ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (C2HSImp.CULong -> ((C2HSImp.Ptr ()) -> (C2HSImp.CUInt -> (C2HSImp.CUInt -> (C2HSImp.CUInt -> (C2HSImp.CUInt -> (C2HSImp.CUInt -> (C2HSImp.CUInt -> (C2HSImp.CUInt -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO C2HSImp.CInt))))))))))))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphAddMemcpyNode_simple"
  addMemcpy'_ :: ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (C2HSImp.CULong -> ((C2HSImp.Ptr ()) -> (C2HSImp.CULong -> (C2HSImp.CULong -> (C2HSImp.CULong -> (C2HSImp.CULong -> (C2HSImp.CInt -> ((C2HSImp.Ptr ()) -> (C2HSImp.CULong -> (C2HSImp.CULong -> (C2HSImp.CULong -> (C2HSImp.CULong -> (C2HSImp.CULong -> (C2HSImp.CULong -> (C2HSImp.CInt -> ((C2HSImp.Ptr ()) -> (C2HSImp.CULong -> (C2HSImp.CULong -> (C2HSImp.CULong -> (C2HSImp.CULong -> (C2HSImp.CULong -> (IO C2HSImp.CInt)))))))))))))))))))))))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphAddMemsetNode_simple"
  cuGraphAddMemsetNode_simple'_ :: ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (C2HSImp.CULong -> ((C2HSImp.Ptr ()) -> (C2HSImp.CULLong -> (C2HSImp.CUInt -> (C2HSImp.CULong -> (C2HSImp.CULong -> (C2HSImp.CUInt -> (C2HSImp.CULong -> (IO C2HSImp.CInt))))))))))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphNodeGetType"
  getType'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr C2HSImp.CInt) -> (IO C2HSImp.CInt)))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphChildGraphNodeGetGraph"
  getChildGraph'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> (IO C2HSImp.CInt)))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphGetEdges"
  cuGraphGetEdges'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr C2HSImp.CULong) -> (IO C2HSImp.CInt)))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphGetNodes"
  cuGraphGetNodes'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr C2HSImp.CULong) -> (IO C2HSImp.CInt))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphGetRootNodes"
  cuGraphGetRootNodes'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr C2HSImp.CULong) -> (IO C2HSImp.CInt))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphNodeGetDependencies"
  cuGraphNodeGetDependencies'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr C2HSImp.CULong) -> (IO C2HSImp.CInt))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphNodeGetDependentNodes"
  cuGraphNodeGetDependentNodes'_ :: ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr C2HSImp.CULong) -> (IO C2HSImp.CInt))))

foreign import ccall unsafe "Foreign/CUDA/Driver/Graph/Build.chs.h cuGraphNodeFindInClone"
  findInClone'_ :: ((C2HSImp.Ptr (C2HSImp.Ptr ())) -> ((C2HSImp.Ptr ()) -> ((C2HSImp.Ptr ()) -> (IO C2HSImp.CInt))))