| # apebs0 = # wlar0, LEB_SIZE = (n2 + m0) + m1, vols0[v][m] = unmapped, vols1[v][vtblpnum2] = unmapped, apebs1 = apebs0, err0 = EIO, n0 = m1, n1 = m2, q1 = q0, vols1 = vols0, vtblpnum0 = vtblpnum3, vtblpnum1 = m0, vtblpnum2 = m, vtblpnum5 = 0, m < # vols0[v], vtblpnum2 < # vols[v], bflipset-cons(bflipset, wlar0), id(apebs, apebs1, mapped-pebs(vols1)), is-aligned(m0, EB_PAGE_SIZE), is-aligned(m1, EB_PAGE_SIZE), is-aligned(vtblpnum1, EB_PAGE_SIZE), is-aligned(n0, EB_PAGE_SIZE), ubi-cons(apebs, vols, wlar, q, bflipset, vtblpnum0, sqnum), ubi-io-inv(apebs0), ubi-io-inv(apebs), unique-sqns(apebs0), valid-ebatbl(apebs0, wlar0, vols0, vtblpnum3), valid-eraseq(q0), valid-eraseq(wlar0, q0), valid-eraseq(apebs0, q0), valid-global-sqn(apebs0, sqnum0), valid-vtbl(apebs0, vols0, wlar0, vtblpnum3), valid-wl(apebs0, wlar0), v ∈ vols0, v ∈ vols, m0 + m1 ≤ LEB_SIZE, m1 + m2 ≤ # buf, m1 ≤ LEB_SIZE, n1 + n0 ≤ # buf, vtblpnum1 + n0 ≤ LEB_SIZE, q.lebrefs ⊆ q1.lebrefs ++ (v × vtblpnum2), n0 = 0 → q.lebrefs ⊆ q1.lebrefs, err ≠ ESUCCESS → vols = vols1, err = ESUCCESS → (∃ n. vols = vols1[v, vols1[v][vtblpnum2, ⌜n⌝ ]] ∧ (n0 ≠ 0 → apebs[n].fill = vtblpnum1 + n0) ∧ (n0 = 0 → apebs[n].fill = 0) ∧ apebs[n].data = mkempbuf(vtblpnum1) + subarray(buf, n1, n0) + mkempbuf(LEB_SIZE - n0 - vtblpnum1)), err = ESUCCESS ∨ ⌊err⌋ ⊦ vtblpnum3 ∈ q0, VTBL_VOLID ∈ vols0, # 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, vtblpnum3) ∧ valid-vtbl(apebs, vols, wlar, vtblpnum3) ∧ 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(n2))), err ≠ ESUCCESS ∧ vtblpnum ≤ UBI_WRITE_RETRIES |
# apebs = # wlar, # apebs0 = # wlar0, apebs[n].data = mkempbuf(m0) + subarray(buf, m2, m1) + mkempbuf(LEB_SIZE - m1 - m0), LEB_SIZE = (n2 + m0) + m1, vols0[v][m] = unmapped, m < # vols0[v], bflipset-cons(bflipset, wlar0), bflipset-cons(bflipset, wlar), id(apebs, apebs0, mapped-pebs(vols0)), is-aligned(m0, EB_PAGE_SIZE), is-aligned(m1, EB_PAGE_SIZE), ubi-io-inv(apebs0), ubi-io-inv(apebs), unique-sqns(apebs), unique-sqns(apebs0), valid-ebatbl(apebs, wlar, vols0[v, vols0[v][m, ⌜n⌝ ]], vtblpnum3), valid-ebatbl(apebs0, wlar0, vols0, vtblpnum3), valid-eraseq(apebs, q), valid-eraseq(wlar, q), valid-eraseq(q), valid-eraseq(q0), valid-eraseq(wlar0, q0), valid-eraseq(apebs0, q0), valid-global-sqn(apebs, sqnum), valid-global-sqn(apebs0, sqnum0), valid-vtbl(apebs, vols0, wlar, vtblpnum3), valid-vtbl(apebs0, vols0, wlar0, vtblpnum3), valid-wl(apebs, wlar), valid-wl(apebs0, wlar0), v ∈ vols0, m1 + m2 ≤ # buf, m1 ≤ LEB_SIZE, m2 + m1 ≤ # buf, m0 + m1 ≤ LEB_SIZE, q.lebrefs ⊆ q0.lebrefs ++ (v × m), m1 = 0 → apebs[n].fill = 0, m1 ≠ 0 → apebs[n].fill = m0 + m1, m1 = 0 → q.lebrefs ⊆ q0.lebrefs ⊦ vtblpnum3 ∈ q, vtblpnum3 ∈ q0, VTBL_VOLID ∈ vols0, ∃ n0. vols0[v, vols0[v][m, ⌜n⌝ ]] = vols0[v, vols0[v][m, ⌜n0⌝ ]] ∧ (m1 ≠ 0 → apebs[n0].fill = m0 + m1) ∧ (m1 = 0 → apebs[n0].fill = 0) ∧ apebs[n0].data = mkempbuf(m0) + subarray(buf, m2, m1) + mkempbuf(n2)
Used simplifier rules: lf-vtbl-info: ⊦ valid-vtbl(apebs, vols, wlar, n) ∧ valid-eraseq(wlar, q) → ¬ n ∈ q;% ⊦ v ∈ vols[v0, ebatbl] ↔ v = v0 ∨ v ∈ vols; (ws)% ⊦ v ∈ vols[v, ebatbl]; (s)%⊦ v ∈ vols → ( valid-vtbl(apebs, vols[v, vols[v][m, ebae]], wlar, n0) ↔ valid-vtbl(apebs, vols, wlar, n0)); (s)% ⊦ m < n → n ≠ 0; (s)% ⊦ # ebatbl[n, ebae] = # ebatbl; (s)% ⊦ vols[v, ebatbl][v] = ebatbl; (s)%f: ⊦ m < n → n ≠ 0; (forward) from specification nat-basic%⊦ 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)