| # apebs0 = # wlar, LEB_SIZE = n2 + n0, wlar[n1] = wl-entry(m1, free), apebs0[n1] = mkpeb(aehdr, empty, mkempbuf(LEB_SIZE), 0, false), apebs = apebs0[n1, apebs0[n1].vidhdr:= avidhdr(v, m0, sqnum, 0, 0)], apebs1 = apebs0, buf = mkempbuf(n0) + buf0, err = err0, err = ESUCCESS, m0 = VTBL_LNUM, q0 = q, v = VTBL_VOLID, vols0 = vols, vtblpnum0 = vtblpnum1, vtblpnum2 = n1, aehdr.valid?, n1 < # wlar, n1 < # apebs0, bflipset-cons(bflipset, wlar), is-aligned(n0, EB_PAGE_SIZE), ubi-io-inv(apebs), 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, ⌊err0⌋ ∨ err0 = ESUCCESS, v ∈ vols ∧ m0 < # vols[v] ∨ v = VTBL_VOLID ∧ m0 = VTBL_LNUM ⊦ ⟪ubi_wl_put_peb#(VTBL_VOLID × VTBL_LNUM, vtblpnum0; wlar, q); bflipset := bflipset -- vtblpnum0; vtblpnum0 := vtblpnum2; wlar[vtblpnum2] := wl-entry(wlar[vtblpnum2].ec, used)⟫ ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ id○(apebs, apebs1, n1) ∧ ubi-io-inv(apebs) ∧ # apebs = # wlar ∧ unique-sqns(apebs) ∧ valid-global-sqn(apebs, sqnum + 1) ∧ valid-wl(apebs, wlar) ∧ valid-eraseq(q) ∧ valid-eraseq(wlar, q) ∧ valid-eraseq(apebs, q) ∧ ¬ VTBL_VOLID ∈ vols ∧ bflipset-cons(bflipset, wlar) ∧ ( v ∈ vols0 ∨ is-encoded(to-vtbl(vols0), subarray(buf, 0, LEB_SIZE)) ∧ n0 = LEB_SIZE ∨ err ≠ ESUCCESS → valid-ebatbl(apebs, wlar, vols, vtblpnum0) ∧ valid-vtbl(apebs, vols, wlar, vtblpnum0)) ∧ ( err = ESUCCESS ∧ v = VTBL_VOLID ∧ m0 = VTBL_LNUM → (∀ v0, m0. ¬ v0 ∈ vols0 ∧ is-encoded(to-vtbl(vols0)[v0, m0], subarray(buf, 0, LEB_SIZE)) ∧ n0 = LEB_SIZE → valid-ebatbl(apebs, wlar, vols[v0, fill(mkebatbl(m0), unmapped)], vtblpnum0) ∧ valid-vtbl(apebs, vols[v0, fill(mkebatbl(m0), unmapped)], wlar, vtblpnum0))) ∧ (err = ESUCCESS ∧ v ∈ vols0 ∧ vols0[v][m0] ≠ unmapped → q = q0 + eq-entry(vols0[v][m0].pnum, v × m0) ') ∧ (err = ESUCCESS ∧ v = VTBL_VOLID ∧ m0 = VTBL_LNUM → q = q0 + eq-entry(vtblpnum1, VTBL_VOLID × VTBL_LNUM) ') ∧ id(apebs, apebs1, mapped-pebs(vols0)) ∧ (v = VTBL_VOLID ∧ m0 = VTBL_LNUM ∨ err ≠ ESUCCESS → vols = vols0) ∧ (v ∈ vols0 ∧ err = ESUCCESS → vols = vols0[v, vols0[v][m0, ⌜n1⌝ ]]) ∧ ( err = ESUCCESS → apebs[n1].fill = datasize(buf, n0) ∧ apebs[n1].data = subarray(buf, 0, n0) + mkempbuf(n2) ∧ q.lebrefs ⊆ q0.lebrefs ++ (v × m0)) ∧ (err ≠ ESUCCESS → q.lebrefs = q0.lebrefs)), vtblpnum1 = n1, VTBL_VOLID ∈ vols, vtblpnum1 ∈ q |
# apebs0 = # wlar, LEB_SIZE = n2 + n0, apebs0[n1] = mkpeb(aehdr, empty, mkempbuf(LEB_SIZE), 0, false), wlar[n1] = wl-entry(m1, free), q0 = q, vtblpnum1 ≠ n1, aehdr.valid?, 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 ∈ q, ¬ VTBL_VOLID ∈ vols ⊦ ⟪ubi_wl_put_peb#(VTBL_VOLID × VTBL_LNUM, vtblpnum1; wlar, q); bflipset := bflipset -- vtblpnum1; vtblpnum0 := n1; wlar[n1] := wl-entry(wlar[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, 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, vtblpnum0) ∧ valid-vtbl(apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], vols, wlar, vtblpnum0)) ∧ (∀ 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)], vtblpnum0) ∧ valid-vtbl (apebs0[n1, apebs0[n1].vidhdr:= avidhdr(VTBL_VOLID, VTBL_LNUM, sqnum, 0, 0)], vols[v, fill(mkebatbl(m), unmapped)], wlar, vtblpnum0)) ∧ q = 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: ls-datasize-empbuf-append-lower: ⊦ datasize(mkempbuf(n) + buf, n) = 0;%lf-valid-wl-free-emptyvidhdr: n < # wlar, n < # apebs ⊦ wlar[n] = wl-entry(m, free) ∧ valid-wl(apebs, wlar) ∧ ubi-io-inv(apebs) → apebs[n].vidhdr = empty ∧ apebs[n].echdr.valid? ∧ apebs[n].fill = 0;% ⊦ mkpeb(aehdr, avhdr, buf, m, boolvar).echdr = aehdr; (s)% ⊦ mkpeb(aehdr, avhdr, buf, m, boolvar).fill = m; (s)% ⊦ mkpeb(aehdr, avhdr, buf, m, boolvar).vidhdr = avhdr; (s)%⊦ mkpeb(aehdr, avhdr, buf, m, boolvar).vidhdr:= avhdr0 = mkpeb(aehdr, avhdr0, buf, m, boolvar); (s)%lf-01: ⊦ m < n ∧ n = n0 → m < n0; (forward) from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic% ⊦ s0 ⊆ s0 ++ lref; (s)% ⊦ s1 ++ lref ⊆ s2 ++ lref ↔ s1 ⊆ s2 ++ lref; (s)%a: ⊦ (q + q0) + q1 = q + q0 + q1; from specification list[erasequeue-base]% ⊦ (q + eq-entry(n, v × m) ').lebrefs = q.lebrefs ++ (v × m); (s)% ⊦ mkempbuf(n0) + mkempbuf(n1) = mkempbuf(n0 + n1); (s)% ⊦ (apeb.vidhdr:= avhdr).data = apeb.data; (s)% ⊦ (apeb.vidhdr:= avhdr).fill = apeb.fill; (s)% ⊦ m < # apebs → apebs[m, apeb][m] = apeb; (s)%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[buffer]%n = # buf ⊦ subarray(buf + buf0, 0, n) = buf; (s)% ⊦ # mkempbuf(n) = n; (s)% ⊦ # apebs[n, apeb] = # apebs; (s)%⊦ apeb = apebs[n] ∧ apeb = apebs0[n] → (id○(apebs, apebs0, n) ↔ apebs = apebs0); (s)% ⊦ id○(apebs[n, apeb], apebs0, n) ↔ id○(apebs, apebs0, n); (s)% ⊦ ¬ ⌊ESUCCESS⌋ ; (s)