Skip to main content

vihaco_stdlib/clock/
types.rs

1// SPDX-FileCopyrightText: 2026 The vihaco Authors
2// SPDX-License-Identifier: MIT
3
4use super::ClockFault;
5
6/// An absolute position on the modeled global timeline.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
8pub struct GlobalTick(pub u64);
9
10/// A distance between two positions on the modeled global timeline.
11#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
12pub struct GlobalDuration(pub u64);
13
14/// Work measured in the local clock domain of a component.
15#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
16pub struct LocalCycles(pub u64);
17
18/// The conversion ratio from local cycles to global ticks.
19#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
20pub struct GlobalTicksPerLocalCycle(pub u64);
21
22/// Owned scheduling work returned by a clocked component.
23#[derive(Debug, PartialEq, Eq)]
24pub struct Schedule<E> {
25    pub at: GlobalTick,
26    pub event: E,
27}
28
29impl GlobalTick {
30    pub const ZERO: Self = Self(0);
31
32    pub fn checked_add(self, duration: GlobalDuration) -> Result<Self, ClockFault> {
33        self.0
34            .checked_add(duration.0)
35            .map(Self)
36            .ok_or(ClockFault::GlobalTickOverflow)
37    }
38}
39
40impl LocalCycles {
41    pub const ONE: Self = Self(1);
42
43    pub fn checked_add(self, other: Self) -> Result<Self, ClockFault> {
44        self.0
45            .checked_add(other.0)
46            .map(Self)
47            .ok_or(ClockFault::LocalCycleOverflow)
48    }
49
50    pub fn checked_mul(
51        self,
52        ratio: GlobalTicksPerLocalCycle,
53    ) -> Result<GlobalDuration, ClockFault> {
54        self.0
55            .checked_mul(ratio.0)
56            .map(GlobalDuration)
57            .ok_or(ClockFault::DurationOverflow)
58    }
59}
60
61impl GlobalTicksPerLocalCycle {
62    pub fn new(value: u64) -> Result<Self, ClockFault> {
63        (value != 0)
64            .then_some(Self(value))
65            .ok_or(ClockFault::ZeroTickRatio)
66    }
67}