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