| # 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[n0, mapped(mkbuf(0))], bleb), awbuf-inv(avol0, 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[n0, mapped(mkbuf(0))]), synced(avol0), ¬ dups(log1) ⊦ [awbuf_add_log_leb#(n0, 0, adr, m, avol0[n0, mapped(mkbuf(0))], lpt0, ns, false; log, bleb; err0)] ( awbuf-inv(avol0[n0, mapped(mkbuf(0))], 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))) |
# lpt0 = # avol0, # lpt1 = # avol0, isbuf ↔ false, lpt1[n0] = mklp(0, m3, LP_FREE, m2), avol = avol0[n0, mapped(mkbuf(0))], keyset(gch) = gc-heap(lpt1, log1), log = log1, lpt = lpt0, m0 = 0, m1 = n0, 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(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))]) ⊦ [if m1 < # avol ∧ avol[m1].mapped? ∧ m0 = # avol[m1].data ∧ synced(avol) then {fail_or_success#(; ; err); if err = ESUCCESS then log := log + m1, bleb := buffered(m1)} else abort] ( awbuf-inv(avol0[n0, mapped(mkbuf(0))], bleb) → ⟪freelist := (n0 ' + nx0).tail; err0 := err; 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))), buffered(n0) = bleb, dups(log1)
Used simplifier rules: awbuf_add_log_leb# (LNUM, OFFSET, WROOTADR, WMAXINO, WVOL, WLPT, WORPHANS, AROFS ; WLOG, WBUFLEB ; ERR ) {if LNUM < # WVOL ∧ WVOL[LNUM].mapped? ∧ OFFSET = # WVOL[LNUM].data ∧ synced(WVOL) then {fail_or_success#(; ; ERR); if ERR = ESUCCESS then WLOG := WLOG + LNUM, WBUFLEB := buffered(LNUM)} else abort };