| m = m1, m0 = m2, v = default-volid, m2 < # avols[default-volid], ebm-cons(avols), is-aligned(m1, EB_PAGE_SIZE), is-aligned(n, EB_PAGE_SIZE), default-volid ∈ avols, m1 + n ≤ LEB_SIZE, n + n0 ≤ # buf, avols[default-volid][m2].mapped? → avols[default-volid][m2].fill ≤ m1 ⊦ ⟪if m0 < # avols[v] ∧ m + n ≤ LEB_SIZE ∧ is-aligned(m, EB_PAGE_SIZE) ∧ is-aligned(n, EB_PAGE_SIZE) ∧ n + n0 ≤ # buf ∧ (avols[v][m0].mapped? → m ≥ avols[v][m0].fill) then ebm_write#(v, m0, m, n0, n, buf; avols; err) else abort⟫ (default-volid ∈ avols ∧ ebm-cons(avols)) |
m = m1, m0 = m2, v = default-volid, m2 < # avols[default-volid], ebm-cons(avols), is-aligned(n, EB_PAGE_SIZE), is-aligned(m1, EB_PAGE_SIZE), default-volid ∈ avols, n + n0 ≤ # buf, m1 + n ≤ LEB_SIZE, avols[default-volid][m2].mapped? → avols[default-volid][m2].fill ≤ m1 ⊦ ⟪ebm_write#(v, m0, m, n0, n, buf; avols; err)⟫ (default-volid ∈ avols ∧ ebm-cons(avols))
Used simplifier rules: ⊦ n ≥ m ↔ m ≤ n; (s)