| # buf = m2 * LEB_SIZE, avol0 = avol, m = LEB_SIZE, m0 = m2, m1 = n, ebm-vol-inv(avol), n + m2 ≤ # avol ⊦ ⟪let n = 0 in {err := ESUCCESS; while err = ESUCCESS ∧ n < m0 do {/* (prepost-write-lebs : invariant n ≤ m0 ∧ ebm-vol-inv(avol) ∧ # buf = m0 * LEB_SIZE ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ # avol = # avol` ∧ range=(avol, 0, avol`, 0, m1) ∧ range=(avol, m1 + m0, avol`, m1 + m0, # avol` - m1 + m0) ∧ (err = ESUCCESS → lebs(avol, m1, n) = subarray(buf, 0, n * LEB_SIZE) ∧ mapped-full?(avol, m1, n)) wfbound m0 - n) */; ebm_avol_remap#(m1 + n; avol; err); if err = ESUCCESS then ebm_avol_write#(m1 + n, 0, n * m, m, buf; avol; err); n := n + 1}}⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ # avol = # avol0 ∧ ebm-vol-inv(avol) ∧ range=(avol, 0, avol0, 0, n) ∧ range=(avol, n + m2, avol0, n + m2, # avol - n + m2) ∧ (err = ESUCCESS → lebs(avol, n, m2) = buf ∧ mapped-full?(avol, n, m2))) |
# buf = m2 * LEB_SIZE, avol0 = avol, m = LEB_SIZE, m0 = m2, m1 = n0, n = 0, ebm-vol-inv(avol), n0 + m2 ≤ # avol ⊦ ⟪err := ESUCCESS; while err = ESUCCESS ∧ n < m0 do {/* (prepost-write-lebs : invariant n ≤ m0 ∧ ebm-vol-inv(avol) ∧ # buf = m0 * LEB_SIZE ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ # avol = # avol` ∧ range=(avol, 0, avol`, 0, m1) ∧ range=(avol, m1 + m0, avol`, m1 + m0, # avol` - m1 + m0) ∧ (err = ESUCCESS → lebs(avol, m1, n) = subarray(buf, 0, n * LEB_SIZE) ∧ mapped-full?(avol, m1, n)) wfbound m0 - n) */; ebm_avol_remap#(m1 + n; avol; err); if err = ESUCCESS then ebm_avol_write#(m1 + n, 0, n * m, m, buf; avol; err); n := n + 1}⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ # avol = # avol0 ∧ ebm-vol-inv(avol) ∧ range=(avol, 0, avol0, 0, n0) ∧ range=(avol, n0 + m2, avol0, n0 + m2, # avol - n0 + m2) ∧ (err = ESUCCESS → lebs(avol, n0, m2) = buf ∧ mapped-full?(avol, n0, m2)))