| # wlar = # apebs1, # buf1 = LEB_SIZE, apebs1[vtblpnum2] = mkpeb(aehdr, empty, buf0, 0, false), apebs = apebs1[vtblpnum2, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0), buf0, 0, false)], err = ESUCCESS, err = err0, aehdr.valid?, vtblpnum2 < # apebs1, vtblpnum2 < # apebs, vtblpnum2 < # wlar, is-aligned(LEB_SIZE, EB_PAGE_SIZE), is-encoded(∅, buf1), ubi-io-initial(apebs1), ubi-io-inv(apebs1[vtblpnum2, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0), buf0, 0, false)]), ubi-io-inv (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ]), ENCODED_NAT_SIZE ≤ LEB_SIZE, 0 + LEB_SIZE ≤ # buf1, 0 + 0 ≤ # apebs[vtblpnum2].data, LEB_SIZE ≥ 0, LEB_SIZE - 0 ≥ LEB_SIZE, ∀ n3. n3 < # apebs1 → (apebs1[n3].bad → wlar[n3] = wl-entry(0, erroneous)) ∧ (¬ apebs1[n3].bad → apebs1[n3].echdr.valid? ∧ wlar[n3] = wl-entry(apebs1[n3].echdr.ec, free) ∧ apebs1[n3].vidhdr = empty), ⌊err0⌋ ∨ err0 = ESUCCESS ⊦ ⟪sqnum := 1; bflipset := ∅⟫ ( ( err = ESUCCESS → # apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ] = # wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)] ∧ unique-sqns (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ]) ∧ valid-global-sqn (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ], sqnum) ∧ valid-wl (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ], wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)]) ∧ valid-eraseq([]) ∧ valid-eraseq(wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)], []) ∧ valid-eraseq (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ], []) ∧ ¬ VTBL_VOLID ∈ ∅ ∧ bflipset-cons(bflipset, wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)]) ∧ valid-ebatbl (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ], wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)], ∅, vtblpnum2) ∧ valid-vtbl (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ], ∅, wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)], vtblpnum2)) ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → ∅ = ∅)), vtblpnum2 = # apebs1 |
# buf1 = LEB_SIZE, # wlar = # apebs1, apebs1[vtblpnum2] = mkpeb(aehdr, empty, buf0, 0, false), apebs = apebs1[vtblpnum2, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0), buf0, 0, false)], err = err0, err = ESUCCESS, aehdr.valid?, vtblpnum2 < # wlar, vtblpnum2 < # apebs, vtblpnum2 < # apebs1, is-aligned(LEB_SIZE, EB_PAGE_SIZE), is-encoded(∅, buf1), ubi-io-initial(apebs1), ubi-io-inv (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ]), ubi-io-inv(apebs1[vtblpnum2, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0), buf0, 0, false)]), 0 + 0 ≤ # apebs[vtblpnum2].data, 0 + LEB_SIZE ≤ # buf1, ENCODED_NAT_SIZE ≤ LEB_SIZE, LEB_SIZE - 0 ≥ LEB_SIZE, LEB_SIZE ≥ 0, ∀ n3. n3 < # apebs1 → (apebs1[n3].bad → wlar[n3] = wl-entry(0, erroneous)) ∧ (¬ apebs1[n3].bad → apebs1[n3].echdr.valid? ∧ wlar[n3] = wl-entry(apebs1[n3].echdr.ec, free) ∧ apebs1[n3].vidhdr = empty), ⌊err0⌋ ∨ err0 = ESUCCESS ⊦ ⟪bflipset := ∅⟫ ( ( err = ESUCCESS → # apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ] = # wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)] ∧ unique-sqns (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ]) ∧ valid-global-sqn (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ], 1) ∧ valid-wl (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ], wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)]) ∧ valid-eraseq([]) ∧ valid-eraseq(wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)], []) ∧ valid-eraseq (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ], []) ∧ ¬ VTBL_VOLID ∈ ∅ ∧ bflipset-cons(bflipset, wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)]) ∧ valid-ebatbl (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ], wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)], ∅, vtblpnum2) ∧ valid-vtbl (apebs [vtblpnum2, mkpeb (apebs[vtblpnum2].echdr, apebs[vtblpnum2].vidhdr, subarray(apebs[vtblpnum2].data, 0, 0) + subarray(buf1, 0, LEB_SIZE) + mkempbuf(LEB_SIZE - 0 - LEB_SIZE), LEB_SIZE, apebs[vtblpnum2].bad) ], ∅, wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)], vtblpnum2)) ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → ∅ = ∅)), vtblpnum2 = # apebs1