| # lpt = # avol, # lpt0 = # avol, avol[m0] = mapped(buf0), adr = adr1, adr0 = @(m0, m1, m2), buf = mkbuf(adr0.size), log = log0, avol[adr0.lnum].mapped?, m0 < # avol, adr0.lnum < # avol, abs-node(subarray(buf0, m1, m2), ind), awbuf-inv(avol, bleb), buf-ro-rw-mode(isbuf, bleb, lpt0, avol), bufs-log-only(bleb, log0, lpt0), lpt-free-unref(lpt), lpt-leb-size(lpt), lpt-ram-flash(lpt0, lpt, log0), m1 + m2 ≤ # buf0, adr0.pos + adr0.size ≤ # avol[adr0.lnum].data, adr0.lnum < # avol → adr0.lnum < # avol ∧ ( avol[adr0.lnum].mapped? → (avol[adr0.lnum].mapped? ∧ adr0.lnum < # avol) ∧ ( adr0.pos + adr0.size ≤ # avol[adr0.lnum].data → (∀ ind. adr0.pos + adr0.size ≤ # avol[adr0.lnum].data ∧ avol[adr0.lnum].mapped? ∧ adr0.lnum < # avol))), ∃ ind. abs-node(subarray(avol[adr0.lnum].data, adr0.pos, adr0.size), ind) ⊦ ⟪awbuf_read_buf#(adr0.lnum, adr0.pos, adr0.size, adr, m, log, avol, lpt, ns, bleb, isbuf; buf; err); if err = ESUCCESS then decode_index_node#(0, adr0.size, buf; ind0; err)⟫ ((err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → ind = ind0)) |
# lpt0 = # avol, # lpt = # avol, avol[m0] = mapped(buf0), buf = mkbuf(m2), m0 < # avol, abs-node(subarray(buf0, m1, m2), ind), awbuf-inv(avol, bleb), buf-ro-rw-mode(isbuf, bleb, lpt0, avol), bufs-log-only(bleb, log0, lpt0), lpt-free-unref(lpt), lpt-leb-size(lpt), lpt-ram-flash(lpt0, lpt, log0), m1 + m2 ≤ # buf0 ⊦ ⟪awbuf_read_buf#(m0, m1, m2, adr, m, log0, avol, lpt, ns, bleb, isbuf; buf; err); if err = ESUCCESS then decode_index_node#(0, m2, buf; ind0; err)⟫ ((err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → ind = ind0))
Used simplifier rules: elim-mapped: ⊦ avol[n].mapped? ↔ (∃ buf. avol[n] = mapped(buf));% ⊦ abs-node(buf, ind) → (abs-node(buf, ind0) ↔ ind = ind0); (s)% ⊦ mapped(buf).data = buf; (s)% ⊦ mapped(buf) = mapped(buf0) ↔ buf = buf0; (s)% ⊦ @(m, m0, m1).pos = m0; (s)% ⊦ @(m, m0, m1).lnum = m; (s)% ⊦ @(m, m0, m1).size = m1; (s)