cndrv 0.1.2

Safe Cambricon driver API.
Documentation
use crate::{bindings::CNkernel, AsRaw, Queue};
use std::{
    ffi::{c_void, CStr},
    ptr::null_mut,
};

use super::module::Module;

pub struct KernelFn<'m>(CNkernel, #[allow(unused)] &'m Module<'m>);

impl<'m> Module<'m> {
    pub fn get_kernel(&'m self, name: impl AsRef<CStr>) -> KernelFn<'m> {
        let name = name.as_ref();
        let mut kernel = null_mut();
        cndrv!(cnModuleGetKernel(self.as_raw(), name.as_ptr(), &mut kernel));
        KernelFn(kernel, self)
    }
}

impl KernelFn<'_> {
    pub fn launch(
        &self,
        dimz: u32,
        dimy: u32,
        dimx: u32,
        params: *const *const c_void,
        queue: &Queue,
    ) {
        cndrv!(cnInvokeKernel(
            self.0,
            dimx,
            dimy,
            dimz,
            cn_kernel_class::CN_KERNEL_CLASS_BLOCK,
            0,
            queue.as_raw(),
            params as _,
            null_mut(),
        ));
    }
}