rust_hdl_widgets/
dff_with_init.rs

1use crate::{dff::DFF, dff_setup};
2use rust_hdl_core::prelude::*;
3use std::ops::BitXor;
4
5#[derive(Clone, Debug, LogicBlock)]
6pub struct DFFWithInit<T: Synth + BitXor<Output = T>> {
7    pub d: Signal<In, T>,
8    pub q: Signal<Out, T>,
9    pub clock: Signal<In, Clock>,
10    pub init: Constant<T>,
11    pub dff: DFF<T>,
12}
13
14impl<T: Synth + BitXor<Output = T>> DFFWithInit<T> {
15    pub fn new(init: T) -> Self {
16        Self {
17            d: Default::default(),
18            q: Default::default(),
19            clock: Default::default(),
20            init: Constant::new(init),
21            dff: Default::default(),
22        }
23    }
24}
25
26impl<T: Synth + BitXor<Output = T>> Logic for DFFWithInit<T> {
27    #[hdl_gen]
28    fn update(&mut self) {
29        self.dff.clock.next = self.clock.val();
30        self.q.next = self.dff.q.val() ^ self.init.val();
31        self.dff.d.next = self.d.val() ^ self.init.val();
32    }
33}