This commit is contained in:
parent
ff269e5def
commit
51ce7b079e
|
@ -25,3 +25,5 @@ pub use scoped_ref::ScopedRef;
|
||||||
pub use misc::{
|
pub use misc::{
|
||||||
interned_bit, iter_eq_by, BitSliceWriteWithBase, DebugAsDisplay, DebugAsRawString, MakeMutSlice,
|
interned_bit, iter_eq_by, BitSliceWriteWithBase, DebugAsDisplay, DebugAsRawString, MakeMutSlice,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pub mod ready_valid;
|
||||||
|
|
34
crates/fayalite/src/util/ready_valid.rs
Normal file
34
crates/fayalite/src/util/ready_valid.rs
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
use crate::prelude::*;
|
||||||
|
|
||||||
|
#[hdl]
|
||||||
|
pub struct ReadyValid<T> {
|
||||||
|
pub data: HdlOption<T>,
|
||||||
|
#[hdl(flip)]
|
||||||
|
pub ready: Bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T: Type> ReadyValid<T> {
|
||||||
|
#[hdl]
|
||||||
|
pub fn fire(expr: Expr<Self>) -> Expr<Bool> {
|
||||||
|
#[hdl]
|
||||||
|
let fire: Bool = wire();
|
||||||
|
#[hdl]
|
||||||
|
match expr.data {
|
||||||
|
HdlNone => connect(fire, false),
|
||||||
|
HdlSome(_) => connect(fire, expr.ready),
|
||||||
|
}
|
||||||
|
fire
|
||||||
|
}
|
||||||
|
#[hdl]
|
||||||
|
pub fn map<R: Type>(
|
||||||
|
expr: Expr<Self>,
|
||||||
|
f: impl FnOnce(Expr<T>) -> Expr<R>,
|
||||||
|
) -> Expr<ReadyValid<R>> {
|
||||||
|
let data = HdlOption::map(expr.data, f);
|
||||||
|
#[hdl]
|
||||||
|
let mapped = wire(ReadyValid[Expr::ty(data).HdlSome]);
|
||||||
|
connect(mapped.data, data);
|
||||||
|
connect(expr.ready, mapped.ready);
|
||||||
|
mapped
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue