| # 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, n0 = LEB_SIZE, n1 = 0, vtblpnum = 0, vtblpnum0 = vtblpnum2, aehdr.valid?, vtblpnum2 < # wlar, vtblpnum0 < # apebs, vtblpnum2 < # apebs1, is-aligned(n, EB_PAGE_SIZE), is-aligned(LEB_SIZE, EB_PAGE_SIZE), is-encoded(∅, buf1), ubi-io-initial(apebs1), ubi-io-inv (apebs [vtblpnum0, mkpeb (apebs[vtblpnum0].echdr, apebs[vtblpnum0].vidhdr, subarray(apebs[vtblpnum0].data, 0, vtblpnum) + subarray(buf1, n1, n) + mkempbuf(LEB_SIZE - vtblpnum - n), vtblpnum + n, apebs[vtblpnum0].bad) ]), ubi-io-inv(apebs1[vtblpnum2, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0), buf0, 0, false)]), 0 + vtblpnum ≤ # apebs[vtblpnum0].data, n1 + n ≤ # buf1, ENCODED_NAT_SIZE ≤ LEB_SIZE, LEB_SIZE - vtblpnum ≥ n, LEB_SIZE ≥ vtblpnum, ∀ 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), n < n0 ∨ n = 0 ∧ n0 = 0, ⌊err0⌋ ∨ err0 = ESUCCESS ⊦ ⟪bflipset := ∅⟫ ( ( err = ESUCCESS → # apebs [vtblpnum0, mkpeb (apebs[vtblpnum0].echdr, apebs[vtblpnum0].vidhdr, subarray(apebs[vtblpnum0].data, 0, vtblpnum) + subarray(buf1, n1, n) + mkempbuf(LEB_SIZE - vtblpnum - n), vtblpnum + n, apebs[vtblpnum0].bad) ] = # wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)] ∧ unique-sqns (apebs [vtblpnum0, mkpeb (apebs[vtblpnum0].echdr, apebs[vtblpnum0].vidhdr, subarray(apebs[vtblpnum0].data, 0, vtblpnum) + subarray(buf1, n1, n) + mkempbuf(LEB_SIZE - vtblpnum - n), vtblpnum + n, apebs[vtblpnum0].bad) ]) ∧ valid-global-sqn (apebs [vtblpnum0, mkpeb (apebs[vtblpnum0].echdr, apebs[vtblpnum0].vidhdr, subarray(apebs[vtblpnum0].data, 0, vtblpnum) + subarray(buf1, n1, n) + mkempbuf(LEB_SIZE - vtblpnum - n), vtblpnum + n, apebs[vtblpnum0].bad) ], 1) ∧ valid-wl (apebs [vtblpnum0, mkpeb (apebs[vtblpnum0].echdr, apebs[vtblpnum0].vidhdr, subarray(apebs[vtblpnum0].data, 0, vtblpnum) + subarray(buf1, n1, n) + mkempbuf(LEB_SIZE - vtblpnum - n), vtblpnum + n, apebs[vtblpnum0].bad) ], wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)]) ∧ valid-eraseq([]) ∧ valid-eraseq(wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)], []) ∧ valid-eraseq (apebs [vtblpnum0, mkpeb (apebs[vtblpnum0].echdr, apebs[vtblpnum0].vidhdr, subarray(apebs[vtblpnum0].data, 0, vtblpnum) + subarray(buf1, n1, n) + mkempbuf(LEB_SIZE - vtblpnum - n), vtblpnum + n, apebs[vtblpnum0].bad) ], []) ∧ ¬ VTBL_VOLID ∈ ∅ ∧ bflipset-cons(bflipset, wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)]) ∧ valid-ebatbl (apebs [vtblpnum0, mkpeb (apebs[vtblpnum0].echdr, apebs[vtblpnum0].vidhdr, subarray(apebs[vtblpnum0].data, 0, vtblpnum) + subarray(buf1, n1, n) + mkempbuf(LEB_SIZE - vtblpnum - n), vtblpnum + n, apebs[vtblpnum0].bad) ], wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)], ∅, vtblpnum2) ∧ valid-vtbl (apebs [vtblpnum0, mkpeb (apebs[vtblpnum0].echdr, apebs[vtblpnum0].vidhdr, subarray(apebs[vtblpnum0].data, 0, vtblpnum) + subarray(buf1, n1, n) + mkempbuf(LEB_SIZE - vtblpnum - n), vtblpnum + n, apebs[vtblpnum0].bad) ], ∅, wlar[vtblpnum2, wl-entry(wlar[vtblpnum2].ec, used)], vtblpnum2)) ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → ∅ = ∅)), err = ESUCCESS, n = 0, vtblpnum2 = # apebs1 |
Used simplifier rules: ⊦ m - 0 = m; (s)% ⊦ n ≥ m ↔ m ≤ n; (s)% ⊦ 0 ≤ m; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic% ⊦ m < # apebs → apebs[m, apeb][m] = apeb; (s)% ⊦ mkpeb(aehdr, avhdr, buf, m, boolvar).data = buf; (s)% ⊦ n + 0 = n; (s)% ⊦ mkpeb(aehdr, avhdr, buf, m, boolvar).echdr = aehdr; (s)% ⊦ mkpeb(aehdr, avhdr, buf, m, boolvar).vidhdr = avhdr; (s)% ⊦ subarray(buf, n, 0) = mkbuf(0); (s)% ⊦ mkbuf(0) + buf = buf; (s)%append-a: ⊦ (buf + buf0) + buf1 = buf + buf0 + buf1; from specification array-splice[buffer]% ⊦ mkpeb(aehdr, avhdr, buf, m, boolvar).bad ↔ boolvar; (s)% ⊦ n ≠ n0 → (n < n0 ↔ ¬ n0 < n); (ss)% ⊦ m < n → ¬ n < m; (s)%m < # apebs ⊦ apebs[m, apeb][m, apeb0] = apebs[m, apeb0]; (s)% ⊦ # apebs[n, apeb] = # apebs; (s)% ⊦ m < n → m ≤ n; (s)% ⊦ ⌊err⌋ → err ≠ ESUCCESS; (s)