use super::defaults;
use super::prefetch::{LoadPrefetcherConfig, StorePrefetcherConfig};
use serde::Deserialize;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize)]
#[serde(rename_all = "UPPERCASE")]
pub enum ReplacementPolicyKind {
#[default]
#[serde(alias = "Lru")]
Lru,
#[serde(alias = "Plru")]
Plru,
#[serde(alias = "Fifo")]
Fifo,
#[serde(alias = "Random")]
Random,
#[serde(alias = "Mru")]
Mru,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub enum InclusionPolicy {
#[default]
#[serde(alias = "NINE")]
Nine,
Inclusive,
Exclusive,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub enum PrefetcherKind {
#[default]
None,
NextLine,
Stride,
Stream,
Tagged,
}
#[derive(Debug, Clone, Default, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct CacheHierarchyConfig {
pub l1_i: CacheConfig,
pub l1_d: CacheConfig,
pub l2: CacheConfig,
pub l3: CacheConfig,
#[serde(default)]
pub inclusion_policy: InclusionPolicy,
#[serde(default)]
pub wcb_entries: usize,
#[serde(default)]
pub load_prefetcher: LoadPrefetcherConfig,
#[serde(default)]
pub store_prefetcher: StorePrefetcherConfig,
}
#[derive(Debug, Clone, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct CacheConfig {
#[serde(default)]
pub enabled: bool,
#[serde(default = "CacheConfig::default_size")]
pub size_bytes: usize,
#[serde(default = "CacheConfig::default_line")]
pub line_bytes: usize,
#[serde(default = "CacheConfig::default_ways")]
pub ways: usize,
#[serde(default)]
pub policy: ReplacementPolicyKind,
#[serde(default = "CacheConfig::default_latency")]
pub latency: u64,
#[serde(default = "CacheConfig::default_response_latency")]
pub response_latency: u64,
#[serde(default)]
pub prefetcher: PrefetcherKind,
#[serde(default = "CacheConfig::default_prefetch_table")]
pub prefetch_table_size: usize,
#[serde(default = "CacheConfig::default_prefetch_degree")]
pub prefetch_degree: usize,
#[serde(default = "CacheConfig::default_mshr_count")]
pub mshr_count: usize,
#[serde(default = "CacheConfig::default_write_buffers")]
pub write_buffers: usize,
#[serde(default = "CacheConfig::default_targets_per_mshr")]
pub targets_per_mshr: usize,
}
impl CacheConfig {
const fn default_size() -> usize {
defaults::CACHE_SIZE
}
const fn default_line() -> usize {
defaults::CACHE_LINE
}
const fn default_ways() -> usize {
defaults::CACHE_WAYS
}
const fn default_latency() -> u64 {
defaults::CACHE_LATENCY
}
const fn default_response_latency() -> u64 {
defaults::CACHE_RESPONSE_LATENCY
}
const fn default_prefetch_table() -> usize {
defaults::PREFETCH_TABLE_SIZE
}
const fn default_prefetch_degree() -> usize {
defaults::PREFETCH_DEGREE
}
const fn default_mshr_count() -> usize {
defaults::MSHR_COUNT
}
const fn default_write_buffers() -> usize {
defaults::WRITE_BUFFERS
}
const fn default_targets_per_mshr() -> usize {
defaults::TARGETS_PER_MSHR
}
}
impl Default for CacheConfig {
fn default() -> Self {
Self {
enabled: false,
size_bytes: defaults::CACHE_SIZE,
line_bytes: defaults::CACHE_LINE,
ways: defaults::CACHE_WAYS,
policy: ReplacementPolicyKind::default(),
latency: defaults::CACHE_LATENCY,
response_latency: defaults::CACHE_RESPONSE_LATENCY,
prefetcher: PrefetcherKind::default(),
prefetch_table_size: defaults::PREFETCH_TABLE_SIZE,
prefetch_degree: defaults::PREFETCH_DEGREE,
mshr_count: defaults::MSHR_COUNT,
write_buffers: defaults::WRITE_BUFFERS,
targets_per_mshr: defaults::TARGETS_PER_MSHR,
}
}
}