pub struct PathDelaySet { /* private fields */ }Expand description
A module path’s own 12-entry transition-delay table (LRM 1800-2023
§30.5.1 Table 30-2, §30.5.2 Table 30-3) – docs/superpowers/plans/ 2026-10-03-sdf.md Task 4a’s PathDelaySet.
Deviation from the plan’s own §1.1 placement (“new,
crates/vj/src/specify.rs”): this type lives here instead,
alongside [PathEntry], because [PathEntry::delays] below is a FIELD
of this type, and vj depends on vj-sim (never the other
way around) – a type used as a field of a vj-sim-resident struct
cannot itself live in a downstream crate. This is also the layering
[TimingModel]’s own module doc already commits to: $sdf_annotate
(Track C) mutates a PathEntry’s delays in place, which means the
delays must live in TimingModel itself, not in a transient
vj-only plan-time structure.
Evaluating a path’s own path_delay_value expressions into real
u64 tick counts needs sv_lang::EvalSession (constant-folding) AND
vj-codegen::timescale (unit/precision conversion) – the latter
this crate cannot depend on (see PathEntry::delays’s own doc comment).
So PathDelaySet::from_list takes already-evaluated, already
tick-converted u64s: evaluation+conversion is vj’s own job
(crate::specify::discover’s delay-attachment pass, Task 4a), calling
[TimingModel::set_path_delays] to attach the result – mirroring
[TimingModel::set_specparam]’s own, already-established “no
sv_lang/EvalSession in the mutation path” shape exactly.
Implementations§
Source§impl PathDelaySet
impl PathDelaySet
Sourcepub fn from_list(d: &[u64]) -> Result<PathDelaySet, String>
pub fn from_list(d: &[u64]) -> Result<PathDelaySet, String>
LRM Table 30-2’s full 1/2/3/6/12-value path_delay_value forms (d
already evaluated and tick-converted by the caller – see this
type’s own doc comment).
For the 1/2/3/6-value forms, once the six “known” transitions
(0->1, 1->0, 0->z, z->1, 1->z, z->0) are set from d per
Table 30-2’s own column for that count – the 6-value form is simply
those six values given directly, in the SAME t01,t10,t0z,tz1,t1z, tz0 order Table 30-2’s own 6-value column lists them, so it needs
no grouping logic of its own, unlike the 1/2/3-value forms’ rise/
fall/z-shared derivation – the six x-involving transitions are
filled in from THEM via Table 30-3’s own general algorithm (s->x =
the shorter of the two delays INTO x from a known state; x->s =
the longer of the two delays OUT of x into a known state). This is
the table’s own “general algorithm,” not an approximation, and
applies identically to the 1/2/3-value and 6-value forms alike (one
shared match arm set feeds it).
The 12-value form is different in kind, not just in count: Table
30-2 lists an explicit column for all twelve transitions, INCLUDING
the six x-involving ones – there are no “known” vs “unknown”
transitions left for Table 30-3’s algorithm to derive from, so a
12-value list is copied straight into t, in [transition_index]’s
own 0->1,1->0,0->z,z->1,1->z,z->0,0->x,x->1,1->x,x->0,x->z,z->x
order – which is, verified directly against the LRM text, the
EXACT order Table 30-2’s own 12-value column already lists them in,
so no reordering is needed, only the copy.
Sourcepub fn from_transitions(t: [u64; 12]) -> PathDelaySet
pub fn from_transitions(t: [u64; 12]) -> PathDelaySet
A table from its twelve per-transition values, in TRANSITIONS order. The one
constructor that takes a table already expanded by someone other than
Self::from_list (SDF’s own Table 32-4 expansion, vj::sdf_apply, which
is a different function from Table 30-3’s and so must not go through it).
Sourcepub fn transitions(&self) -> [u64; 12]
pub fn transitions(&self) -> [u64; 12]
The twelve per-transition values, in TRANSITIONS order.
Sourcepub fn uniform(v: u64) -> PathDelaySet
pub fn uniform(v: u64) -> PathDelaySet
A table whose twelve transitions all hold v – the shape a
PATHPULSE$ limit takes (LRM 30.7.1 names ONE reject and ONE error
value for the whole path, never one per transition).
Sourcepub fn of(&self, from: Bit4, to: Bit4) -> u64
pub fn of(&self, from: Bit4, to: Bit4) -> u64
The delay for transition from -> to, in scheduler ticks. Callers
(vj::specify::PathRetimer) only ever call this after
proving from != to (a real transition) themselves – see
[transition_index]’s own doc comment for why that guard lives at
the call site, not here.
Sourcepub fn at_least(self, floor: u64) -> PathDelaySet
pub fn at_least(self, floor: u64) -> PathDelaySet
Every transition’s delay raised to at least floor ticks (LRM 31.9.1: a timing check
signal delayed by more than a path’s delay makes the output follow the delayed signal,
“as if its specify path delay were equal to the delay applied to the timing check
signal”).
Trait Implementations§
Source§impl Clone for PathDelaySet
impl Clone for PathDelaySet
impl Copy for PathDelaySet
Source§impl Debug for PathDelaySet
impl Debug for PathDelaySet
Source§impl Default for PathDelaySet
impl Default for PathDelaySet
Source§impl<'de> Deserialize<'de> for PathDelaySet
impl<'de> Deserialize<'de> for PathDelaySet
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
impl Eq for PathDelaySet
Source§impl PartialEq for PathDelaySet
impl PartialEq for PathDelaySet
Source§impl Serialize for PathDelaySet
impl Serialize for PathDelaySet
impl StructuralPartialEq for PathDelaySet
Auto Trait Implementations§
impl Freeze for PathDelaySet
impl RefUnwindSafe for PathDelaySet
impl Send for PathDelaySet
impl Sync for PathDelaySet
impl Unpin for PathDelaySet
impl UnsafeUnpin for PathDelaySet
impl UnwindSafe for PathDelaySet
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> DeserializeOwned for Twhere
T: for<'de> Deserialize<'de>,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.