| apebs = apebs0, ubi-io-initial(apebs0) ⊦ ⟪n := LEB_SIZE; aubi_io_get_page_size#(apebs0; ; vtblpnum0); apebs := apebs0; err0 := ESUCCESS; vtblpnum1 := n; if err0 ≠ ESUCCESS then debug#("ubi: ubi-io format failed") else let n = ?, vtblpnum = 0 in {aubi_io_get_blockcount#(apebs; ; n); wlar := mkwlarray(n); vtblpnum2 := n; err0 := ESUCCESS; while vtblpnum < n ∧ err0 = ESUCCESS do {/* (inv-format : invariant vtblpnum ≤ # apebs ∧ n = # apebs ∧ # wlar = # apebs ∧ (err0 = ESUCCESS ∨ ⌊err0⌋ ) ∧ ( err0 = ESUCCESS → ubi-io-initial(apebs) ∧ vtblpnum2 ≤ # apebs ∧ (∀ n3. n3 < vtblpnum → (apebs[n3].bad → wlar[n3] = wl-entry(0, erroneous)) ∧ ( ¬ apebs[n3].bad → apebs[n3].echdr.valid? ∧ wlar[n3] = wl-entry(apebs[n3].echdr.ec, free) ∧ apebs[n3].vidhdr = empty)) ∧ (vtblpnum2 ≠ # apebs → ¬ apebs[vtblpnum2].bad)) wfbound n - vtblpnum) */; let isbad = ? in {aubi_io_isbad#(vtblpnum, apebs; ; isbad, err0); if err0 = ESUCCESS then if ¬ isbad then let aehdr = ?, bitflips = ? in {aubi_io_read_echdr#(vtblpnum, apebs; aehdr; bitflips, err0); if err0 = ESUCCESS ∧ vtblpnum2 = n then vtblpnum2 := vtblpnum; if err0 = ESUCCESS ∧ aehdr.valid? then wlar[vtblpnum] := wl-entry(aehdr.ec, free)} else wlar[vtblpnum] := wl-entry(0, erroneous); vtblpnum := vtblpnum + 1}}; if err0 = ESUCCESS then if vtblpnum2 = n then err0 := ENOSPC else {aubi_io_write_vidhdr#(vtblpnum2, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0); apebs; err0); if err0 = ESUCCESS then if vtblpnum1 < ENCODED_NAT_SIZE then err0 := ENOSPC else let buf = mkbuf(vtblpnum1), vtbl = ∅ in {encode_vtbl#(; vtbl, buf; err0); if err0 = ESUCCESS then aubi_io_write_data#(vtblpnum2, 0, 0, vtblpnum1, buf; apebs; err0)}; vols := ∅; wlar[vtblpnum2] := wl-entry(wlar[vtblpnum2].ec, used); q := []; sqnum := 1; bflipset := ∅}}⟫ ( ( err0 = 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) ∧ ¬ VTBL_VOLID ∈ vols ∧ bflipset-cons(bflipset, wlar) ∧ valid-ebatbl(apebs, wlar, vols, vtblpnum2) ∧ valid-vtbl(apebs, vols, wlar, vtblpnum2) ∧ vtblpnum1 = LEB_SIZE ∧ vtblpnum0 = EB_PAGE_SIZE ∧ ubi-io-inv(apebs)) ∧ (err0 = ESUCCESS ∨ ⌊err0⌋ ) ∧ (err0 = ESUCCESS → vols = ∅)) |
apebs = apebs0, ubi-io-initial(apebs0) ⊦ ⟪aubi_io_get_page_size#(apebs0; ; vtblpnum0); apebs := apebs0; err0 := ESUCCESS; vtblpnum1 := LEB_SIZE; if err0 ≠ ESUCCESS then debug#("ubi: ubi-io format failed") else let n = ?, vtblpnum = 0 in {aubi_io_get_blockcount#(apebs; ; n); wlar := mkwlarray(n); vtblpnum2 := n; err0 := ESUCCESS; while vtblpnum < n ∧ err0 = ESUCCESS do {/* (inv-format : invariant vtblpnum ≤ # apebs ∧ n = # apebs ∧ # wlar = # apebs ∧ (err0 = ESUCCESS ∨ ⌊err0⌋ ) ∧ ( err0 = ESUCCESS → ubi-io-initial(apebs) ∧ vtblpnum2 ≤ # apebs ∧ (∀ n3. n3 < vtblpnum → (apebs[n3].bad → wlar[n3] = wl-entry(0, erroneous)) ∧ ( ¬ apebs[n3].bad → apebs[n3].echdr.valid? ∧ wlar[n3] = wl-entry(apebs[n3].echdr.ec, free) ∧ apebs[n3].vidhdr = empty)) ∧ (vtblpnum2 ≠ # apebs → ¬ apebs[vtblpnum2].bad)) wfbound n - vtblpnum) */; let isbad = ? in {aubi_io_isbad#(vtblpnum, apebs; ; isbad, err0); if err0 = ESUCCESS then if ¬ isbad then let aehdr = ?, bitflips = ? in {aubi_io_read_echdr#(vtblpnum, apebs; aehdr; bitflips, err0); if err0 = ESUCCESS ∧ vtblpnum2 = n then vtblpnum2 := vtblpnum; if err0 = ESUCCESS ∧ aehdr.valid? then wlar[vtblpnum] := wl-entry(aehdr.ec, free)} else wlar[vtblpnum] := wl-entry(0, erroneous); vtblpnum := vtblpnum + 1}}; if err0 = ESUCCESS then if vtblpnum2 = n then err0 := ENOSPC else {aubi_io_write_vidhdr#(vtblpnum2, avidhdr(VTBL_VOLID, VTBL_LNUM, 0, 0, 0); apebs; err0); if err0 = ESUCCESS then if vtblpnum1 < ENCODED_NAT_SIZE then err0 := ENOSPC else let buf = mkbuf(vtblpnum1), vtbl = ∅ in {encode_vtbl#(; vtbl, buf; err0); if err0 = ESUCCESS then aubi_io_write_data#(vtblpnum2, 0, 0, vtblpnum1, buf; apebs; err0)}; vols := ∅; wlar[vtblpnum2] := wl-entry(wlar[vtblpnum2].ec, used); q := []; sqnum := 1; bflipset := ∅}}⟫ ( ( err0 = 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) ∧ ¬ VTBL_VOLID ∈ vols ∧ bflipset-cons(bflipset, wlar) ∧ valid-ebatbl(apebs, wlar, vols, vtblpnum2) ∧ valid-vtbl(apebs, vols, wlar, vtblpnum2) ∧ vtblpnum1 = LEB_SIZE ∧ vtblpnum0 = EB_PAGE_SIZE ∧ ubi-io-inv(apebs)) ∧ (err0 = ESUCCESS ∨ ⌊err0⌋ ) ∧ (err0 = ESUCCESS → vols = ∅))