use alloc::{string::String, vec::Vec};
use crate::{ir::{Id, Scope, StorageType, Type}, launch::RudaDim};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone)]
#[allow(missing_docs)]
pub struct KernelDefinition {
pub buffers: Vec<KernelArg>,
pub tensor_maps: Vec<KernelArg>,
pub scalars: Vec<ScalarKernelArg>,
pub ruda_dim: RudaDim,
pub body: Scope,
pub options: KernelOptions,
}
#[derive(Default, Clone, Debug, Hash, PartialEq, Eq)]
pub struct KernelOptions {
pub kernel_name: String,
pub debug_symbols: bool,
pub cluster_dim: Option<RudaDim>,
}
#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
pub struct KernelArg {
pub id: Id,
pub visibility: Visibility,
pub ty: Type,
pub size: Option<usize>,
pub has_extended_meta: bool,
}
#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
#[allow(missing_docs)]
pub struct ScalarKernelArg {
pub ty: StorageType,
pub count: usize,
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Serialize, Deserialize)]
#[allow(missing_docs)]
pub enum Visibility {
Read,
ReadWrite,
}