| # lpt1 = # avol0, # lpt0 = # avol0, lpt1[n0] = mklp(0, m1, LP_FREE, m2), keyset(gch) = gc-heap(lpt1, log1), log = log1, buffered(n0) ≠ bleb, n0 < # avol0, awbuf-inv(avol0, bleb), awbuf-inv(avol0[n0, mapped(mkbuf(0))], bleb), bin-heap-inv(gch, lpt1), buf-ro-rw-mode(false, bleb, lpt1, avol0), bufs-log-only(bleb, log1, lpt1), freelist-cons(lpt1, n0 ' + nx0), log-group-block(log1, lpt1), lpt-free-unref(lpt1), lpt-free-unref(lpt0), lpt-leb-size(lpt1), lpt-leb-size(lpt0), lpt-ram-flash(lpt1, lpt0, log1), synced(avol0), ¬ dups(log1) ⊦ ⟪awbuf_add_log_leb#(n0, 0, adr, m, avol0[n0, mapped(mkbuf(0))], lpt0, ns, false; log, bleb; err0); freelist := (n0 ' + nx0).tail; if err0 ≠ ESUCCESS then freelist := n0 ' + freelist; lpt1 := lpt1[n0, mklp(lpt1[n0].ref-size, 0, lpt1[n0].flags, lpt1[n0].gcheapidx)] [n0, lpt1[n0, mklp(lpt1[n0].ref-size, 0, lpt1[n0].flags, lpt1[n0].gcheapidx)][n0].ref-size:= 0 ]; if err0 = ESUCCESS then {lpt1[n0].flags := LP_GROUP_NODES; log1 := log1 + n0 '}⟫ ( lpt-free-unref(lpt1) ∧ freelist-cons(lpt1, freelist) ∧ log1 = log ∧ bin-heap-inv(gch, lpt1) ∧ keyset(gch) = gc-heap(lpt1, log) ∧ bufs-log-only(bleb, log, lpt1) ∧ # lpt1 = # avol0 ∧ ¬ dups(log) ∧ log-group-block(log, lpt1) ∧ buf-ro-rw-mode(false, bleb, lpt1, avol0[n0, mapped(mkbuf(0))]) ∧ lpt-leb-size(lpt1) ∧ lpt-ram-flash(lpt1, lpt0, log) ∧ awbuf-inv(avol0[n0, mapped(mkbuf(0))], bleb)) |
awbuf-inv(avol, bleb), # lpt = # avol, m < # avol, avol[m].mapped?, m0 = # avol[m].data, synced(avol) ⊦ ⟪awbuf_add_log_leb#(m, m0, adr, m1, avol, lpt, ns, isbuf; nx, bleb; err)⟫ awbuf-inv(avol, bleb)
# lpt0 = # avol0, # lpt1 = # avol0, # lpt0 = # avol0[n0, mapped(mkbuf(0))], isbuf0 ↔ false, 0 = # avol0[n0, mapped(mkbuf(0))][n0].data, lpt1[n0] = mklp(0, m1, LP_FREE, m2), adr0 = adr, avol1 = avol0[n0, mapped(mkbuf(0))], keyset(gch) = gc-heap(lpt1, log1), log = log1, lpt2 = lpt0, m3 = n0, m4 = 0, m5 = m, ns0 = ns, avol0[n0, mapped(mkbuf(0))][n0].mapped?, n0 < # avol0, n0 < # avol0[n0, mapped(mkbuf(0))], awbuf-inv(avol0, bleb), awbuf-inv(avol0[n0, mapped(mkbuf(0))], bleb), bin-heap-inv(gch, lpt1), buf-ro-rw-mode(false, bleb, lpt1, avol0), bufs-log-only(bleb, log1, lpt1), freelist-cons(lpt1, n0 ' + nx0), log-group-block(log1, lpt1), lpt-free-unref(lpt0), lpt-free-unref(lpt1), lpt-leb-size(lpt0), lpt-leb-size(lpt1), lpt-ram-flash(lpt1, lpt0, log1), synced(avol0), synced(avol0[n0, mapped(mkbuf(0))]) ⊦ [awbuf_add_log_leb#(n0, 0, adr, m, avol0[n0, mapped(mkbuf(0))], lpt0, ns, false; log, bleb; err0)] ( awbuf-inv(avol1, bleb) → ⟪freelist := (n0 ' + nx0).tail; if err0 ≠ ESUCCESS then freelist := n0 ' + freelist; lpt1 := lpt1[n0, mklp(lpt1[n0].ref-size, 0, lpt1[n0].flags, lpt1[n0].gcheapidx)] [n0, lpt1[n0, mklp(lpt1[n0].ref-size, 0, lpt1[n0].flags, lpt1[n0].gcheapidx)][n0].ref-size:= 0 ]; if err0 = ESUCCESS then {lpt1[n0].flags := LP_GROUP_NODES; log1 := log1 + n0 '}⟫ ( lpt-free-unref(lpt1) ∧ freelist-cons(lpt1, freelist) ∧ log1 = log ∧ bin-heap-inv(gch, lpt1) ∧ keyset(gch) = gc-heap(lpt1, log) ∧ bufs-log-only(bleb, log, lpt1) ∧ # lpt1 = # avol0 ∧ ¬ dups(log) ∧ log-group-block(log, lpt1) ∧ buf-ro-rw-mode(false, bleb, lpt1, avol0[n0, mapped(mkbuf(0))]) ∧ lpt-leb-size(lpt1) ∧ lpt-ram-flash(lpt1, lpt0, log) ∧ awbuf-inv(avol0[n0, mapped(mkbuf(0))], bleb))), buffered(n0) = bleb, dups(log1)
Used simplifier rules: ⊦ # avol[n, aleb] = # avol; (s)% ⊦ m < # avol → avol[m, aleb][m] = aleb; (s)% ⊦ mapped(buf).mapped?; (s)% ⊦ mapped(buf).data = buf; (s)% ⊦ # mkbuf(n) = n; (s)% ⊦ synced(avol) → (synced(avol[n, mapped(mkbuf(0))]) ↔ true); (ss)