use crate::{
Features, TypeUsage,
memory_management::{HardwareProperties, MemoryDeviceProperties},
};
use cubecl_common::profile::TimingMethod;
use cubecl_ir::{SemanticType, StorageType, Type};
use enumset::EnumSet;
#[derive(Debug)]
pub struct DeviceProperties {
pub features: Features,
pub memory: MemoryDeviceProperties,
pub hardware: HardwareProperties,
pub timing_method: TimingMethod,
}
impl DeviceProperties {
pub fn new(
features: Features,
memory_props: MemoryDeviceProperties,
hardware: HardwareProperties,
timing_method: TimingMethod,
) -> Self {
DeviceProperties {
features,
memory: memory_props,
hardware,
timing_method,
}
}
pub fn type_usage(&self, ty: StorageType) -> EnumSet<TypeUsage> {
self.features.type_usage(ty)
}
pub fn supports_type(&self, ty: impl Into<Type>) -> bool {
self.features.supports_type(ty)
}
pub fn register_type_usage(
&mut self,
ty: impl Into<StorageType>,
uses: impl Into<EnumSet<TypeUsage>>,
) {
*self.features.storage_types.entry(ty.into()).or_default() |= uses.into();
}
pub fn register_semantic_type(&mut self, ty: SemanticType) {
self.features.semantic_types.insert(ty);
}
}