| # apebs = # wlar, vols[v][vtblpnum4] = unmapped, apebs[unmapped.pnum] = mkpeb(aehdr, avhdr, buf1, m, boolvar), vtblpnum4 < # vols[v], bflipset-cons(bflipset, wlar), is-aligned(n, EB_PAGE_SIZE), is-aligned(vtblpnum3, EB_PAGE_SIZE), ubi-io-inv(apebs), unique-sqns(apebs), valid-ebatbl(apebs, wlar, vols, vtblpnum), valid-eraseq(q), valid-eraseq(wlar, q), valid-eraseq(apebs, q), valid-global-sqn(apebs, sqnum), valid-vtbl(apebs, vols, wlar, vtblpnum), valid-wl(apebs, wlar), v ∈ vols, n0 + n ≤ # buf, vtblpnum3 + n ≤ LEB_SIZE, ¬ VTBL_VOLID ∈ vols, ¬ vtblpnum ∈ q ⊦ ⟪ubi_write_multiple#(v, vtblpnum4, vtblpnum3, n0, n, buf, bflipset, vtblpnum; vols, wlar, q, sqnum, apebs; err)⟫ ( # 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, vtblpnum) ∧ valid-vtbl(apebs, vols, wlar, vtblpnum) ∧ ubi-io-inv(apebs)) |
ubi-cons(apebs, vols, wlar, q, bflipset, vtblpnum, sqnum), ubi-io-inv(apebs), v ∈ vols, m < # vols[v], vols[v][m] = unmapped, m1 + m2 ≤ # buf, m0 + m1 ≤ LEB_SIZE, is-aligned(m0, EB_PAGE_SIZE), is-aligned(m1, EB_PAGE_SIZE), vols = vols0, apebs = apebs0, q = q0 ⊦ ⟪ubi_write_multiple#(v, m, m0, m2, m1, buf, bflipset, vtblpnum; vols, wlar, q, sqnum, apebs; err)⟫ ( ubi-cons(apebs, vols, wlar, q, bflipset, vtblpnum, sqnum) ∧ 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(LEB_SIZE - m1 - m0))))
Used simplifier rules: ⊦ 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)%c: ⊦ m + n = n + m; from specification nat-basic