use sv_sim_abi::Region;
use crate::analysis::DpiVpiTag;
pub const LOOKAHEAD_CYCLES: u32 = 0;
#[derive(Clone, Copy, PartialEq, Eq, Debug)]
pub enum SpeculationGate {
Allow,
Barrier,
}
pub fn dpi_speculation_policy(tag: Option<DpiVpiTag>) -> SpeculationGate {
match tag {
None => SpeculationGate::Barrier,
Some(t) => match t {
DpiVpiTag::Pure => SpeculationGate::Allow,
DpiVpiTag::DeferredSafe => SpeculationGate::Allow,
DpiVpiTag::Barrier => SpeculationGate::Barrier,
DpiVpiTag::SpeculationUnsafe => SpeculationGate::Barrier,
},
}
}
pub fn lookahead_cycles_for_region(_region: Region) -> u32 {
LOOKAHEAD_CYCLES
}
#[cfg(test)]
mod tests {
use super::*;
use crate::determinism::SequentialController;
use crate::sched::SchedTime;
#[test]
fn unclassified_dpi_defaults_to_barrier_never_pure() {
assert!(matches!(
dpi_speculation_policy(None),
SpeculationGate::Barrier
));
}
#[test]
fn every_dpi_vpi_tag_variant_maps_correctly_fail_closed() {
let cases = [
(DpiVpiTag::Pure, SpeculationGate::Allow),
(DpiVpiTag::DeferredSafe, SpeculationGate::Allow),
(DpiVpiTag::Barrier, SpeculationGate::Barrier),
(DpiVpiTag::SpeculationUnsafe, SpeculationGate::Barrier),
];
for (tag, expected) in cases {
assert_eq!(
dpi_speculation_policy(Some(tag)),
expected,
"DpiVpiTag::{tag:?} must map to {expected:?}"
);
}
}
#[test]
fn lookahead_cycles_is_zero_for_every_region_in_v1() {
for r in [
Region::Active,
Region::Inactive,
Region::Nba,
Region::Reactive,
Region::Postponed,
] {
assert_eq!(
lookahead_cycles_for_region(r),
0,
"region {r:?} must have LOOKAHEAD_CYCLES == 0 in v1"
);
}
}
#[test]
fn the_only_determinism_controller_reachable_at_default_config_is_sequential() {
assert_eq!(lookahead_cycles_for_region(Region::Active), 0);
let controller = SequentialController::default_boxed();
let now = SchedTime { ticks: 11 };
let out = controller.partition(&[], Region::Active, now);
assert!(out.is_empty());
assert_eq!(
controller.gvt(),
now,
"the default controller's gvt() must equal now immediately after \
partition() — consistent with LOOKAHEAD_CYCLES == 0 (nothing ever \
runs ahead of now)"
);
}
}