use serde::Deserialize;
#[derive(Debug, Clone, Copy, PartialEq, Deserialize)]
#[serde(tag = "kind")]
pub enum HomeAgentConfig {
Broadcast,
SnoopFilter {
#[serde(default = "HomeAgentConfig::default_capacity_factor")]
capacity_factor: f64,
#[serde(default = "HomeAgentConfig::default_ways")]
ways: usize,
},
}
impl HomeAgentConfig {
const fn default_capacity_factor() -> f64 {
1.5
}
const fn default_ways() -> usize {
8
}
}
impl Default for HomeAgentConfig {
fn default() -> Self {
Self::SnoopFilter {
capacity_factor: Self::default_capacity_factor(),
ways: Self::default_ways(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
#[serde(tag = "kind")]
pub enum InterconnectConfig {
Crossbar {
#[serde(default = "InterconnectConfig::default_hop_latency")]
hop_latency: u64,
#[serde(default = "InterconnectConfig::default_bytes_per_cycle")]
bytes_per_cycle: usize,
},
Ring {
#[serde(default = "InterconnectConfig::default_hop_latency")]
hop_latency: u64,
#[serde(default = "InterconnectConfig::default_bytes_per_cycle")]
bytes_per_cycle: usize,
},
Mesh {
#[serde(default = "InterconnectConfig::default_hop_latency")]
hop_latency: u64,
#[serde(default = "InterconnectConfig::default_bytes_per_cycle")]
bytes_per_cycle: usize,
},
Torus {
#[serde(default = "InterconnectConfig::default_hop_latency")]
hop_latency: u64,
#[serde(default = "InterconnectConfig::default_bytes_per_cycle")]
bytes_per_cycle: usize,
},
Hypercube {
#[serde(default = "InterconnectConfig::default_hop_latency")]
hop_latency: u64,
#[serde(default = "InterconnectConfig::default_bytes_per_cycle")]
bytes_per_cycle: usize,
},
}
impl InterconnectConfig {
const fn default_hop_latency() -> u64 {
2
}
const fn default_bytes_per_cycle() -> usize {
32
}
}
impl Default for InterconnectConfig {
fn default() -> Self {
Self::Crossbar {
hop_latency: Self::default_hop_latency(),
bytes_per_cycle: Self::default_bytes_per_cycle(),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub enum CoherenceProtocolConfig {
#[default]
Mesi,
}
#[derive(Debug, Clone, Copy, PartialEq, Deserialize)]
#[serde(deny_unknown_fields)]
pub struct CoherenceConfig {
#[serde(default)]
pub protocol: CoherenceProtocolConfig,
#[serde(default)]
pub home_agent: HomeAgentConfig,
#[serde(default)]
pub interconnect: InterconnectConfig,
#[serde(default = "CoherenceConfig::default_txn_entries")]
pub txn_entries: usize,
}
impl CoherenceConfig {
const fn default_txn_entries() -> usize {
32
}
}
impl Default for CoherenceConfig {
fn default() -> Self {
Self {
protocol: CoherenceProtocolConfig::default(),
home_agent: HomeAgentConfig::default(),
interconnect: InterconnectConfig::default(),
txn_entries: Self::default_txn_entries(),
}
}
}