use super::ReplacementPolicy;
#[derive(Debug)]
pub struct PlruPolicy {
usage: Vec<u64>,
ways: usize,
}
impl PlruPolicy {
pub fn new(sets: usize, ways: usize) -> Self {
Self { usage: vec![0; sets], ways }
}
}
impl ReplacementPolicy for PlruPolicy {
fn update(&mut self, set: usize, way: usize) {
let mask = 1 << way;
self.usage[set] |= mask;
let all_ones = (1 << self.ways) - 1;
if (self.usage[set] & all_ones) == all_ones {
self.usage[set] = mask;
}
}
fn get_victim(&mut self, set: usize) -> usize {
for i in 0..self.ways {
if (self.usage[set] >> i) & 1 == 0 {
return i;
}
}
0
}
}