use std::sync::{Arc, OnceLock};
use papaya::HashMap;
use svod_ir::UOp;
pub(crate) fn content_hash(uop: &UOp) -> u64 {
uop.content_hash
}
type ScheduleCacheKey = (u64, &'static str);
pub(crate) struct CachedSchedule {
pub pre_schedule: Arc<crate::schedule::PreSchedule>,
}
static SCHEDULE_CACHE: OnceLock<HashMap<ScheduleCacheKey, Arc<CachedSchedule>>> = OnceLock::new();
pub(crate) fn schedule_cache() -> &'static HashMap<ScheduleCacheKey, Arc<CachedSchedule>> {
SCHEDULE_CACHE.get_or_init(HashMap::new)
}
#[cfg(test)]
pub(crate) fn cache_key_for(tensor: &crate::Tensor, config: &crate::PrepareConfig) -> Option<(u64, &'static str)> {
let sink = UOp::sink(vec![tensor.uop().contiguous()]);
let normalized = crate::realize::normalize_for_schedule_cache(&sink).ok()?;
let param_buffers = normalized.param_buffers;
let codegen = crate::realize::resolve_codegen(¶m_buffers, config).ok()?;
Some((content_hash(&normalized.normalized), codegen))
}