use crate::tools::flip_flop::FlipFlop;
pub struct Lfsr<F: Fn(&[FlipFlop]) -> bool> {
pub ff: Vec<FlipFlop>,
pub fb: F,
}
impl<F> Lfsr<F>
where
F: Fn(&[FlipFlop]) -> bool,
{
pub fn new(ff: Vec<FlipFlop>, rule: F) -> Self {
Self { ff, fb: rule }
}
pub fn rotate(&mut self) -> &mut FlipFlop {
let fb = (self.fb)(&self.ff);
for i in (1..self.ff.len()).rev() {
let val = self.ff[i - 1].get();
self.ff[i].put(val);
}
self.ff[0].set(fb)
}
pub fn get(&self) -> &[FlipFlop] {
&self.ff
}
pub fn calculate_possibilities(&self) -> usize {
(1 << self.ff.len()) - 1
}
}