use vstd::prelude::*;
verus! {
pub open spec fn rows_current(job_gen: int, live_gen: int) -> bool {
job_gen == live_gen
}
pub open spec fn revision_current(extracted_rev: int, observed_rev: int) -> bool {
extracted_rev == observed_rev
}
pub open spec fn completion_honest(terminal_gen: int, live_gen: int, truncated: bool) -> bool {
terminal_gen == live_gen && !truncated
}
pub open spec fn warm_bounded(in_flight: int, limit: int) -> bool {
0 <= in_flight <= limit
}
pub fn generation_is_live(job_gen: u64, live_gen: u64) -> (live: bool)
ensures
live == rows_current(job_gen as int, live_gen as int),
{
job_gen == live_gen
}
pub fn revision_is_current(extracted_rev: u64, observed_rev: u64) -> (current: bool)
ensures
current == revision_current(extracted_rev as int, observed_rev as int),
{
extracted_rev == observed_rev
}
pub fn completion_is_honest(terminal_gen: u64, live_gen: u64, truncated: bool) -> (honest: bool)
ensures
honest == completion_honest(terminal_gen as int, live_gen as int, truncated),
{
terminal_gen == live_gen && !truncated
}
pub fn warm_slot_free(in_flight: usize, limit: usize) -> (free: bool)
ensures
free == (in_flight < limit),
free ==> warm_bounded(in_flight as int + 1, limit as int),
{
in_flight < limit
}
proof fn retired_generation_never_live(job_gen: int, retired_gen: int, live_gen: int)
requires
rows_current(job_gen, live_gen),
retired_gen != live_gen,
ensures
!rows_current(retired_gen, live_gen),
{
}
proof fn moved_source_never_current(extracted_rev: int, observed_rev: int)
requires
extracted_rev != observed_rev,
ensures
!revision_current(extracted_rev, observed_rev),
{
}
proof fn honest_completion_is_current(terminal_gen: int, live_gen: int, truncated: bool)
requires
completion_honest(terminal_gen, live_gen, truncated),
ensures
terminal_gen == live_gen,
!truncated,
{
}
}