| # wlar = # apebs1, # buf1 = LEB_SIZE, apebs1[vtblpnum2] = mkpeb(aehdr, empty, buf0, m, false), apebs0 = apebs1[vtblpnum2, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0), buf0, m, false)], vtblpnum2 ≠ # apebs1, aehdr.valid?, vtblpnum2 < # apebs1, is-encoded(∅, buf1), ubi-io-initial(apebs1), ubi-io-inv(apebs1[vtblpnum2, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0), buf0, m, false)]), ENCODED_NAT_SIZE ≤ 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) ⊦ ⟪aubi_io_write_data#(vtblpnum2, 0, 0, LEB_SIZE, buf1; apebs0; err); vols := ∅; wlar[vtblpnum2] := wl-entry(wlar[vtblpnum2].ec, used); q := []; sqnum := 1; bflipset := ∅⟫ ( ( err = ESUCCESS → # apebs0 = # wlar ∧ unique-sqns(apebs0) ∧ valid-global-sqn(apebs0, sqnum) ∧ valid-wl(apebs0, wlar) ∧ valid-eraseq(q) ∧ valid-eraseq(wlar, q) ∧ valid-eraseq(apebs0, q) ∧ ¬ VTBL_VOLID ∈ vols ∧ bflipset-cons(bflipset, wlar) ∧ valid-ebatbl(apebs0, wlar, vols, vtblpnum2) ∧ valid-vtbl(apebs0, vols, wlar, vtblpnum2) ∧ ubi-io-inv(apebs0)) ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → vols = ∅)) |
ubi-io-inv(apebs), ubi-io-write-data-pre(n, n0, n1, n2, buf, apebs) ⊦ ⟪aubi_io_write_data#(n, n0, n1, n2, buf; apebs; err)⟫ ubi-io-inv(apebs)
# buf1 = LEB_SIZE, # wlar = # apebs1, apebs1[vtblpnum2] = mkpeb(aehdr, empty, buf0, m, false), apebs0 = apebs1[vtblpnum2, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0), buf0, m, false)], aehdr.valid?, vtblpnum2 < # apebs1, is-encoded(∅, buf1), ubi-io-initial(apebs1), ubi-io-inv(apebs1[vtblpnum2, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0), buf0, m, false)]), ENCODED_NAT_SIZE ≤ 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) ⊦ vtblpnum2 = # apebs1, ubi-io-inv(apebs0) ∧ ubi-io-write-data-pre(vtblpnum2, 0, 0, LEB_SIZE, buf1, apebs0)
# buf1 = LEB_SIZE, # wlar = # apebs1, apebs1[vtblpnum2] = mkpeb(aehdr, empty, buf0, m, false), apebs0 = apebs1[vtblpnum2, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0), buf0, m, false)], buf2 = buf1, n3 = vtblpnum2, n4 = 0, n5 = 0, n6 = LEB_SIZE, aehdr.valid?, vtblpnum2 < # apebs1, is-encoded(∅, buf1), ubi-io-initial(apebs1), ubi-io-inv(apebs1[vtblpnum2, mkpeb(aehdr, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0), buf0, m, false)]), ubi-io-inv(apebs0), ubi-io-write-data-pre(vtblpnum2, 0, 0, LEB_SIZE, buf1, apebs0), ENCODED_NAT_SIZE ≤ 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) ⊦ [aubi_io_write_data#(vtblpnum2, 0, 0, LEB_SIZE, buf1; apebs0; err)] ( ubi-io-inv(apebs0) → ⟪vols := ∅; wlar[vtblpnum2] := wl-entry(wlar[vtblpnum2].ec, used); q := []; sqnum := 1; bflipset := ∅⟫ ( ( err = ESUCCESS → # apebs0 = # wlar ∧ unique-sqns(apebs0) ∧ valid-global-sqn(apebs0, sqnum) ∧ valid-wl(apebs0, wlar) ∧ valid-eraseq(q) ∧ valid-eraseq(wlar, q) ∧ valid-eraseq(apebs0, q) ∧ ¬ VTBL_VOLID ∈ vols ∧ bflipset-cons(bflipset, wlar) ∧ valid-ebatbl(apebs0, wlar, vols, vtblpnum2) ∧ valid-vtbl(apebs0, vols, wlar, vtblpnum2) ∧ ubi-io-inv(apebs0)) ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ (err = ESUCCESS → vols = ∅))), vtblpnum2 = # apebs1