use crate::executor::{spawn_named, TaskHandle};
use crate::handle::LogicHandle;
use crate::time::SimDuration;
use crate::triggers::Timer;
pub struct Clock {
sig: LogicHandle,
period: SimDuration,
}
impl Clock {
pub fn new(sig: &LogicHandle, period: SimDuration) -> Clock {
assert!(period.steps >= 2, "clock period must be at least 2 precision steps");
Clock { sig: *sig, period }
}
pub fn start(&self) -> TaskHandle<()> {
let sig = self.sig;
let high = self.period.steps / 2;
let low = self.period.steps - high;
spawn_named(
async move {
loop {
sig.set_u64_now(1);
Timer::steps(high).await;
sig.set_u64_now(0);
Timer::steps(low).await;
}
},
&format!("clock({})", sig.name()),
)
}
}