| # buf = m0, avol[m5] = mapped(buf0), buf1 = mkbuf(m0), err = ESUCCESS, err0 = ESUCCESS, log1 = [], logoff = logoff0, logoff1 = 0, m = LEB_SIZE, m0 = EB_PAGE_SIZE, sb = mksb(adr, m6, m5, m1, m2, m3, m4), avol[sb.log].mapped?, m5 < # avol, sb.log < # avol, logoff < m, ebm-vol-inv(avol), is-aligned(logoff, m0), is-encoded(log0, buf0), logoff ≤ LEB_SIZE, err = ESUCCESS → logoff ≤ # avol[sb.log].data ∧ is-encoded(log, subarray(avol[sb.log].data, 0, logoff)), err = ENOENT → is-encoded(log, avol[sb.log].data), err = ESUCCESS ∨ err = ENOENT ∨ ⌊err⌋ ⊦ ⟪ebm_avol_read#(sb.log, logoff, 0, m0, avol; buf; err); if err = ESUCCESS then if isempty(buf) then err := ENOENT else let rnd = ? in {decode_ref_node#(m0, buf; rnd; err); if err = ESUCCESS then log := log + rnd.leb}; logoff := logoff + m0⟫ ( ( logoff ≤ LEB_SIZE ∧ # buf = m0 ∧ is-aligned(logoff, m0) ∧ (err = ESUCCESS ∨ err = ENOENT ∨ ⌊err⌋ ) ∧ ebm-vol-inv(avol) ∧ sb.log < # avol ∧ avol[sb.log].mapped? ∧ (err = ESUCCESS → logoff ≤ # avol[sb.log].data ∧ is-encoded(log, subarray(avol[sb.log].data, 0, logoff))) ∧ (err = ENOENT → is-encoded(log, avol[sb.log].data))) ∧ LEB_SIZE - logoff < LEB_SIZE - logoff0) |
# buf = EB_PAGE_SIZE, avol[m5] = mapped(buf0), logoff0 < LEB_SIZE, m5 < # avol, ebm-vol-inv(avol), is-aligned(logoff0, EB_PAGE_SIZE), is-encoded(log, subarray(buf0, 0, logoff0)), is-encoded(log0, buf0), logoff0 ≤ # buf0 ⊦ ⟪ebm_avol_read#(m5, logoff0, 0, EB_PAGE_SIZE, avol; buf; err); m0 := EB_PAGE_SIZE; if err = ESUCCESS then if buf = mkempbuf(# buf) then err := ENOENT else let rnd = ? in {decode_ref_node#(m0, buf; rnd; err); if err = ESUCCESS then log := log + rnd.leb '}; logoff := logoff0 + m0⟫ ( logoff ≤ LEB_SIZE ∧ # buf = m0 ∧ is-aligned(logoff, # buf) ∧ (err = ESUCCESS ∨ err = ENOENT ∨ ⌊err⌋ ) ∧ avol[m5].mapped? ∧ (err = ESUCCESS → logoff ≤ # avol[m5].data ∧ is-encoded(log, subarray(avol[m5].data, 0, logoff))) ∧ (err = ENOENT → is-encoded(log, avol[m5].data)) ∧ LEB_SIZE < (LEB_SIZE - logoff0) + logoff)
Used simplifier rules: ⊦ mapped(buf).data = buf; (s)% ⊦ LEB_SIZE ≠ 0; (s)% ⊦ mapped(buf) = mapped(buf0) ↔ buf = buf0; (s)%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic%n0 ≤ n ⊦ n - n0 < m ↔ n < m + n0; (s)% ⊦ m ≤ n → (n < m ↔ false); (s)% ⊦ m ≤ n ↔ ¬ n < m; (ss)% ⊦ isempty(buf) ↔ buf = mkempbuf(# buf); (s)% ⊦ nx + n = nx + n '; (s)% ⊦ ESUCCESS ≠ ENOENT; (s)% ⊦ aleb.mapped? ↔ (∃ buf. aleb = mapped(buf)); (as)% ⊦ mksb(adr, m, m0, m1, m2, m3, m4).log = m0; (s)% ⊦ m < n → m ≤ n; (s)