| # apebs0 = # wlar, LEB_SIZE = n2 + n0, wlar[n1] = wl-entry(m1, free), apebs0[n1] = mkpeb(aehdr, empty, mkempbuf(LEB_SIZE), 0, false), lref = VTBL_VOLID × VTBL_LNUM, q0 = q, vtblpnum = vtblpnum1, aehdr.valid?, n1 < # wlar, vtblpnum < # wlar, bflipset-cons(bflipset, wlar), is-aligned(n0, EB_PAGE_SIZE), ubi-io-inv(apebs0[n1, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0), mkempbuf(LEB_SIZE), 0, false)]), ubi-io-inv(apebs0), unique-sqns(apebs0), valid-ebatbl(apebs0, wlar, vols, vtblpnum1), valid-eraseq(q), valid-eraseq(wlar, q), valid-eraseq(apebs0, q), valid-global-sqn(apebs0, sqnum), valid-vtbl(apebs0, vols, wlar, vtblpnum1), valid-wl(apebs0, wlar), n0 ≤ LEB_SIZE ⊦ ⟪wlar := wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1, wl-entry(wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1].ec, used)]⟫ ( # apebs0 = # wlar ∧ unique-sqns(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)]) ∧ valid-global-sqn(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], sqnum + 1) ∧ valid-wl(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], wlar) ∧ valid-eraseq(q0 + eq-entry(vtblpnum1, VTBL_VOLID × VTBL_LNUM) ') ∧ valid-eraseq(wlar, q0 + eq-entry(vtblpnum1, VTBL_VOLID × VTBL_LNUM) ') ∧ valid-eraseq(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], q0 + eq-entry(vtblpnum1, VTBL_VOLID × VTBL_LNUM) ') ∧ bflipset-cons(bflipset -- vtblpnum1, wlar) ∧ ( is-encoded(to-vtbl(vols), mkempbuf(LEB_SIZE)) ∧ n0 = LEB_SIZE → valid-ebatbl(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], wlar, vols, n1) ∧ valid-vtbl(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], vols, wlar, n1)) ∧ (∀ v, m. ¬ v ∈ vols ∧ is-encoded(to-vtbl(vols)[v, m], mkempbuf(LEB_SIZE)) ∧ n0 = LEB_SIZE → valid-ebatbl (apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], wlar, vols[v, fill(mkebatbl(m), unmapped)], n1) ∧ valid-vtbl(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], vols[v, fill(mkebatbl(m), unmapped)], wlar, n1)) ∧ q + eq-entry(vtblpnum, lref) = q0 + eq-entry(vtblpnum1, VTBL_VOLID × VTBL_LNUM) ' ∧ id(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], apebs0, mapped-pebs(vols)) ∧ apebs0[n1].data = mkempbuf(LEB_SIZE)), vtblpnum1 = n1, vtblpnum1 ∈ q, VTBL_VOLID ∈ vols |
# apebs0 = # wlar, LEB_SIZE = n2 + n0, apebs0[n1] = mkpeb(aehdr, empty, mkempbuf(LEB_SIZE), 0, false), wlar[n1] = wl-entry(m1, free), lref = VTBL_VOLID × VTBL_LNUM, q0 = q, vtblpnum = vtblpnum1, aehdr.valid?, n1 < # wlar[vtblpnum, wlar[vtblpnum].status:= erasing], vtblpnum < # wlar, n1 < # wlar, bflipset-cons(bflipset, wlar), is-aligned(n0, EB_PAGE_SIZE), ubi-io-inv(apebs0), ubi-io-inv(apebs0[n1, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0), mkempbuf(LEB_SIZE), 0, false)]), unique-sqns(apebs0), valid-ebatbl(apebs0, wlar, vols, vtblpnum1), valid-eraseq(apebs0, q), valid-eraseq(wlar, q), valid-eraseq(q), valid-global-sqn(apebs0, sqnum), valid-vtbl(apebs0, vols, wlar, vtblpnum1), valid-wl(apebs0, wlar), n0 ≤ LEB_SIZE ⊦ vtblpnum1 = n1, VTBL_VOLID ∈ vols, vtblpnum1 ∈ q, # apebs0 = # wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1, wl-entry(wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1].ec, used)] ∧ unique-sqns(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)]) ∧ valid-global-sqn(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], sqnum + 1) ∧ valid-wl (apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1, wl-entry(wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1].ec, used)]) ∧ valid-eraseq(q0 + eq-entry(vtblpnum1, VTBL_VOLID × VTBL_LNUM) ') ∧ valid-eraseq (wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1, wl-entry(wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1].ec, used)], q0 + eq-entry(vtblpnum1, VTBL_VOLID × VTBL_LNUM) ') ∧ valid-eraseq(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], q0 + eq-entry(vtblpnum1, VTBL_VOLID × VTBL_LNUM) ') ∧ bflipset-cons (bflipset -- vtblpnum1, wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1, wl-entry(wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1].ec, used)]) ∧ ( is-encoded(to-vtbl(vols), mkempbuf(LEB_SIZE)) ∧ n0 = LEB_SIZE → valid-ebatbl (apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1, wl-entry(wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1].ec, used)], vols, n1) ∧ valid-vtbl (apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], vols, wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1, wl-entry(wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1].ec, used)], n1)) ∧ (∀ v, m. ¬ v ∈ vols ∧ is-encoded(to-vtbl(vols)[v, m], mkempbuf(LEB_SIZE)) ∧ n0 = LEB_SIZE → valid-ebatbl (apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1, wl-entry(wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1].ec, used)], vols[v, fill(mkebatbl(m), unmapped)], n1) ∧ valid-vtbl (apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], vols[v, fill(mkebatbl(m), unmapped)], wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1, wl-entry(wlar[vtblpnum, wlar[vtblpnum].status:= erasing][n1].ec, used)], n1)) ∧ q + eq-entry(vtblpnum, lref) = q0 + eq-entry(vtblpnum1, VTBL_VOLID × VTBL_LNUM) ' ∧ id(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], apebs0, mapped-pebs(vols)) ∧ apebs0[n1].data = mkempbuf(LEB_SIZE)
Used simplifier rules: ⊦ wle.status:= stat = wl-entry(wle.ec, stat); (s)% ⊦ # wlar[n, wle] = # wlar; (s)% ⊦ valid-vtbl(apebs, vols, wlar, n0) → n0 < # wlar; (ss)