| # buf2 = EB_PAGE_SIZE, pebs[m2] = mkpeb(buf1, 0, false), apebs[m2] = mkpeb(empty, avhdr, subarray(buf1, 2 * EB_PAGE_SIZE, LEB_SIZE), m1, false), subarray(buf1, 0, PEB_SIZE) = subarray(emptypeb, 0, PEB_SIZE), m2 < # pebs, m2 < # apebs, abs(pebs, apebs), abs-echdr(subarray(buf1, 0, EB_PAGE_SIZE), empty), abs-vidhdr(subarray(buf1, EB_PAGE_SIZE, EB_PAGE_SIZE), avhdr), is-encoded(echdr(m3), buf2), mtd-cons(pebs), ubi-io-inv(apebs), EB_PAGE_SIZE ≤ PEB_SIZE, 0 + PEB_SIZE ≤ # buf1, 0 + PEB_SIZE ≤ # emptypeb ⊦ avhdr = empty ∧ abs-echdr(buf2, aechdr(m3)) |
# buf2 = EB_PAGE_SIZE, pebs[m2] = mkpeb(emptypeb, 0, false), apebs[m2] = mkpeb(empty, empty, emptyleb, m1, false), mkempbuf(LEB_SIZE) = emptyleb, m2 < # pebs, m2 < # apebs, abs(pebs, apebs), abs-echdr(emptypage, empty), abs-vidhdr(emptypage, empty), is-encoded(echdr(m3), buf2), mtd-cons(pebs), ubi-io-inv(apebs), EB_PAGE_SIZE ≤ PEB_SIZE ⊦ abs-echdr(buf2, aechdr(m3))
Used simplifier rules: ⊦ mkpeb(aehdr, avhdr, buf, m, boolvar) = mkpeb(aehdr0, avhdr0, buf0, m0, boolvar0) ↔ aehdr = aehdr0 ∧ avhdr = avhdr0 ∧ buf = buf0 ∧ m = m0 ∧ (boolvar ↔ boolvar0); (s)%⊦ abs-peb(mkpeb(emptypeb, 0, false), apeb) ↔ (∃ m. apeb = mkpeb(empty, empty, mkempbuf(LEB_SIZE), m, false)); (s)%abs-fwd: ⊦ n < # pebs ∧ pebs[n] = peb ∧ abs(pebs, apebs) → n < # apebs ∧ abs-peb(peb, apebs[n]); (forward) from specification ubi-io-abs% ⊦ subarray(emptypeb, EB_PAGE_SIZE, EB_PAGE_SIZE) = emptypage; (s)% ⊦ subarray(emptypeb, 0, EB_PAGE_SIZE) = emptypage; (s)%mult-c: ⊦ m * n = n * m; from specification nat-mult%mult-a: ⊦ m0 * m * n = (m0 * m) * n; from specification nat-mult% ⊦ subarray(emptypeb, 2 * EB_PAGE_SIZE, LEB_SIZE) = emptyleb; (s)% ⊦ m ≤ m; (s)%c: ⊦ m + n = n + m; from specification nat-basic%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic% ⊦ n + 0 = n; (s)% ⊦ # emptypeb = PEB_SIZE; (s)%# buf = n ⊦ subarray(buf, 0, n) = buf; (s)%n < # pebs ⊦ pebs[n] = mkpeb(buf, m, boolvar) ∧ mtd-cons(pebs) → # buf = PEB_SIZE; (s)% ⊦ m < n → (n ≤ m ↔ false); (s)% ⊦ m < n ↔ ¬ n ≤ m; (ss)