use crate::tools::flip_flop::FlipFlop;
pub struct Lsfr {
ff: Vec<FlipFlop>,
fb: Box<dyn Fn(&[FlipFlop]) -> bool>,
}
impl Lsfr {
pub fn new(ff: Vec<FlipFlop>) -> Self {
Self {
ff,
fb: Box::new(|ff| ff[0].get() ^ ff[ff.len() - 1].get()),
}
}
pub fn rotate(&mut self) {
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].put(fb);
}
pub fn get(&self) -> &[FlipFlop] {
&self.ff
}
pub fn calculate_possibilities(&self) -> usize {
(1 << self.ff.len()) - 1
}
}