| # apebs0 = # wlar, LEB_SIZE = (n1 + m0) + m1, vols0[v][m] = unmapped, apebs = apebs0, apebs = apebs, apebs1 = apebs, bflipset0 = bflipset, q = q0, q = q, q1 = q, sqnum0 = sqnum, vols1 = vols0, vtblpnum0 = vtblpnum2, wlar = wlar, wlar1 = wlar, m < # vols0[v], bflipset-cons(bflipset, wlar), is-aligned(m1, EB_PAGE_SIZE), is-aligned(m0, EB_PAGE_SIZE), ubi-cons(apebs, vols0, wlar, q, bflipset, vtblpnum2, sqnum), ubi-io-inv(apebs0), ubi-io-inv(apebs), unique-sqns(apebs0), valid-ebatbl(apebs0, wlar, vols0, vtblpnum2), valid-eraseq(apebs0, q0), valid-eraseq(wlar, q0), valid-eraseq(q0), valid-global-sqn(apebs0, sqnum), valid-vtbl(apebs0, vols0, wlar, vtblpnum2), valid-wl(apebs0, wlar), v ∈ vols0, m1 ≤ LEB_SIZE, m1 + m2 ≤ # buf, m0 + m1 ≤ LEB_SIZE ⊦ [ubi_wl_get_peb#(; vtblpnum, wlar, q, apebs; err)] ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err ≠ ESUCCESS → ubi-cons(apebs, vols1, wlar, q, bflipset0, vtblpnum0, sqnum0)) ∧ ubi-io-inv(apebs) ∧ q.lebrefs ⊆ q1.lebrefs ∧ id(apebs, apebs1, mapped-pebs(vols1)) ∧ ( err = ESUCCESS → vtblpnum < # apebs ∧ wlar[vtblpnum].status = free ∧ ( apebs1 = apebs ∧ wlar1 = wlar ∧ q1 = q ∨ id○(apebs1, apebs, vtblpnum) ∧ id○(wlar1, wlar, vtblpnum) ∧ q1 ≠ [] ∧ q1 = eq-entry(vtblpnum, q1.head.lebref) + q) ∧ ubi-cons(apebs, vols1, wlar, q, bflipset0, vtblpnum0, sqnum0)) → ⟪vols := vols0; if err = ESUCCESS then let m3 = ? in {ubi_next_sqnum#(; sqnum; m3); aubi_io_write_vidhdr#(vtblpnum, avidhdr(v, m, m3, 0, 0); apebs; err); if err = ESUCCESS then {if m1 ≠ 0 then aubi_io_write_data#(vtblpnum, m0, m2, m1, buf; apebs; err); if err = ESUCCESS then {vols[v][m] := ⌜vtblpnum⌝ ; wlar[vtblpnum] := wl-entry(wlar[vtblpnum].ec, used)} else ubi_wl_put_peb#(v × m, vtblpnum; wlar, q); skip} else ubi_wl_put_peb#(none, vtblpnum; wlar, q)}⟫ ( # apebs = # wlar ∧ unique-sqns(apebs) ∧ valid-global-sqn(apebs, sqnum) ∧ valid-wl(apebs, wlar) ∧ valid-eraseq(q) ∧ valid-eraseq(wlar, q) ∧ valid-eraseq(apebs, q) ∧ ¬ VTBL_VOLID ∈ vols ∧ bflipset-cons(bflipset, wlar) ∧ valid-ebatbl(apebs, wlar, vols, vtblpnum2) ∧ valid-vtbl(apebs, vols, wlar, vtblpnum2) ∧ ubi-io-inv(apebs) ∧ id(apebs, apebs0, mapped-pebs(vols0)) ∧ q.lebrefs ⊆ q0.lebrefs ++ (v × m) ∧ (m1 = 0 → q.lebrefs ⊆ q0.lebrefs) ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err ≠ ESUCCESS → vols = vols0) ∧ ( err = ESUCCESS → (∃ n. vols = vols0[v, vols0[v][m, ⌜n⌝ ]] ∧ (m1 ≠ 0 → apebs[n].fill = m0 + m1) ∧ (m1 = 0 → apebs[n].fill = 0) ∧ apebs[n].data = mkempbuf(m0) + subarray(buf, m2, m1) + mkempbuf(n1))))), VTBL_VOLID ∈ vols0, vtblpnum2 ∈ q0 |
# apebs0 = # wlar, LEB_SIZE = (n1 + m0) + m1, vols0[v][m] = unmapped, apebs = apebs0, q = q0, wlar1 = wlar, m < # vols0[v], bflipset-cons(bflipset, wlar), is-aligned(m1, EB_PAGE_SIZE), is-aligned(m0, EB_PAGE_SIZE), ubi-io-inv(apebs0), unique-sqns(apebs0), valid-ebatbl(apebs0, wlar, vols0, vtblpnum2), valid-eraseq(apebs0, q0), valid-eraseq(wlar, q0), valid-eraseq(q0), valid-global-sqn(apebs0, sqnum), valid-vtbl(apebs0, vols0, wlar, vtblpnum2), valid-wl(apebs0, wlar), v ∈ vols0, m1 ≤ LEB_SIZE, m1 + m2 ≤ # buf, m0 + m1 ≤ LEB_SIZE, ¬ VTBL_VOLID ∈ vols0, ¬ vtblpnum2 ∈ q0 ⊦ [ubi_wl_get_peb#(; vtblpnum, wlar, q, apebs; err)] ( (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err ≠ ESUCCESS → # apebs = # wlar ∧ unique-sqns(apebs) ∧ valid-global-sqn(apebs, sqnum) ∧ valid-wl(apebs, wlar) ∧ valid-eraseq(q) ∧ valid-eraseq(wlar, q) ∧ valid-eraseq(apebs, q) ∧ bflipset-cons(bflipset, wlar) ∧ valid-ebatbl(apebs, wlar, vols0, vtblpnum2) ∧ valid-vtbl(apebs, vols0, wlar, vtblpnum2)) ∧ ubi-io-inv(apebs) ∧ q.lebrefs ⊆ q0.lebrefs ∧ id(apebs, apebs0, mapped-pebs(vols0)) ∧ ( err = ESUCCESS → vtblpnum < # apebs ∧ wlar[vtblpnum].status = free ∧ ( apebs0 = apebs ∧ wlar1 = wlar ∧ q0 = q ∨ id○(apebs0, apebs, vtblpnum) ∧ id○(wlar1, wlar, vtblpnum) ∧ q0 ≠ [] ∧ q0 = eq-entry(vtblpnum, q0.head.lebref) ' + q) ∧ # apebs = # wlar ∧ unique-sqns(apebs) ∧ valid-global-sqn(apebs, sqnum) ∧ valid-wl(apebs, wlar) ∧ valid-eraseq(q) ∧ valid-eraseq(wlar, q) ∧ valid-eraseq(apebs, q) ∧ bflipset-cons(bflipset, wlar) ∧ valid-ebatbl(apebs, wlar, vols0, vtblpnum2) ∧ valid-vtbl(apebs, vols0, wlar, vtblpnum2)) → ⟪vols := vols0; if err = ESUCCESS then let m3 = ? in {ubi_next_sqnum#(; sqnum; m3); aubi_io_write_vidhdr#(vtblpnum, avidhdr(v, m, m3, 0, 0); apebs; err); if err = ESUCCESS then {if m1 ≠ 0 then aubi_io_write_data#(vtblpnum, m0, m2, m1, buf; apebs; err); if err = ESUCCESS then {vols[v][m] := ⌜vtblpnum⌝ ; wlar[vtblpnum] := wl-entry(wlar[vtblpnum].ec, used)} else ubi_wl_put_peb#(v × m, vtblpnum; wlar, q); skip} else ubi_wl_put_peb#(none, vtblpnum; wlar, q)}⟫ ( # apebs = # wlar ∧ unique-sqns(apebs) ∧ valid-global-sqn(apebs, sqnum) ∧ valid-wl(apebs, wlar) ∧ valid-eraseq(q) ∧ valid-eraseq(wlar, q) ∧ valid-eraseq(apebs, q) ∧ ¬ VTBL_VOLID ∈ vols ∧ bflipset-cons(bflipset, wlar) ∧ valid-ebatbl(apebs, wlar, vols, vtblpnum2) ∧ valid-vtbl(apebs, vols, wlar, vtblpnum2) ∧ ubi-io-inv(apebs) ∧ id(apebs, apebs0, mapped-pebs(vols0)) ∧ q.lebrefs ⊆ q0.lebrefs ++ (v × m) ∧ (m1 = 0 → q.lebrefs ⊆ q0.lebrefs) ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err ≠ ESUCCESS → vols = vols0) ∧ ( err = ESUCCESS → (∃ n. vols = vols0[v, vols0[v][m, ⌜n⌝ ]] ∧ (m1 ≠ 0 → apebs[n].fill = m0 + m1) ∧ (m1 = 0 → apebs[n].fill = 0) ∧ apebs[n].data = mkempbuf(m0) + subarray(buf, m2, m1) + mkempbuf(n1)))))
Used simplifier rules: ⊦ eqent + q = eqent ' + q; (s)%⊦ ubi-cons(apebs, vols, wlar, q, bflipset, n0, n1) ↔ # apebs = # wlar ∧ unique-sqns(apebs) ∧ valid-global-sqn(apebs, n1) ∧ valid-wl(apebs, wlar) ∧ valid-eraseq(q) ∧ valid-eraseq(wlar, q) ∧ valid-eraseq(apebs, q) ∧ ¬ VTBL_VOLID ∈ vols ∧ bflipset-cons(bflipset, wlar) ∧ valid-ebatbl(apebs, wlar, vols, n0) ∧ valid-vtbl(apebs, vols, wlar, n0); (s)