| avols[default-volid][m2] = mapped(buf0, n1), avol = abs(avols[default-volid]), m2 < # avols[default-volid], ebm-cons(avols), ebm-vol-inv(abs(avols[default-volid])), is-aligned(m1, EB_PAGE_SIZE), is-aligned(n, EB_PAGE_SIZE), default-volid ∈ avols, n1 ≤ m1, m1 + n ≤ LEB_SIZE, n0 + n ≤ # buf ⊦ ⟪ebm_write#(default-volid, m2, m1, n0, n, buf; avols; err)⟫ ⟨ebm_avol_write#(m2, m1, n0, n, buf; avol; err0)⟩ (avol = abs(avols[default-volid]) ∧ err = err0) |
avols[default-volid][m2] = mapped(buf0, n2), avol = abs(avols[default-volid]), m = m1, m0 = m2, n0 = n, n1 = n3, v = default-volid, m2 < # avols[default-volid], ebm-cons(avols), ebm-vol-inv(abs(avols[default-volid])), is-aligned(n, EB_PAGE_SIZE), is-aligned(m1, EB_PAGE_SIZE), default-volid ∈ avols, n3 + n ≤ # buf, m1 + n ≤ LEB_SIZE, n2 ≤ m1 ⊦ ⟪if v ∈ avols ∧ m0 < # avols[v] ∧ m + n0 ≤ LEB_SIZE ∧ is-aligned(m, EB_PAGE_SIZE) ∧ is-aligned(n0, EB_PAGE_SIZE) ∧ n0 + n1 ≤ # buf ∧ (avols[v][m0].mapped? → m ≥ avols[v][m0].fill) then {fail_or_success#(; ; err); if err = ESUCCESS then if avols[v][m0].mapped? then if n0 ≠ 0 then avols[v][m0] := mapped(subarray(avols[v][m0].data, 0, m) + subarray(buf, n1, n0) + mkempbuf(LEB_SIZE - m - n0), m + n0) else avols[v][m0] := mapped(mkempbuf(m) + subarray(buf, n1, n0) + mkempbuf(LEB_SIZE - m - n0), m + n0) else if avols[v][m0].mapped? then choose n with n < n0 ∧ is-aligned(n, EB_PAGE_SIZE) in if n ≠ 0 then avols[v][m0] := mapped(subarray(avols[v][m0].data, 0, m) + subarray(buf, n1, n) + mkempbuf(LEB_SIZE - m - n), m + n) ifnone skip else if n0 ≠ 0 then avols[v][m0] := unmapped} else abort⟫ ⟨ebm_avol_write#(m2, m1, n3, n, buf; avol; err0)⟩ (avol = abs(avols[default-volid]) ∧ err = err0)
Used simplifier rules: ebm_write#(VOLID, LNUM, OFFSET, N0, N, BUF; AVOLS; ERR) {if VOLID ∈ AVOLS ∧ LNUM < # AVOLS[VOLID] ∧ OFFSET + N ≤ LEB_SIZE ∧ is-aligned(OFFSET, EB_PAGE_SIZE) ∧ is-aligned(N, EB_PAGE_SIZE) ∧ N + N0 ≤ # BUF ∧ (AVOLS[VOLID][LNUM].mapped? → OFFSET ≥ AVOLS[VOLID][LNUM].fill) then {fail_or_success#(; ; ERR); if ERR = ESUCCESS then if AVOLS[VOLID][LNUM].mapped? then if N ≠ 0 then AVOLS[VOLID][LNUM] := mapped ( subarray (AVOLS[VOLID][LNUM].data, 0, OFFSET) + subarray(BUF, N0, N) + mkempbuf(LEB_SIZE - OFFSET - N), OFFSET + N) else AVOLS[VOLID][LNUM] := mapped ( mkempbuf(OFFSET) + subarray(BUF, N0, N) + mkempbuf(LEB_SIZE - OFFSET - N), OFFSET + N) else if AVOLS[VOLID][LNUM].mapped? then choose N1 with N1 < N ∧ is-aligned(N1, EB_PAGE_SIZE) in if N1 ≠ 0 then AVOLS[VOLID][LNUM] := mapped ( subarray (AVOLS[VOLID][LNUM].data, 0, OFFSET) + subarray(BUF, N0, N1) + mkempbuf(LEB_SIZE - OFFSET - N1), OFFSET + N1) ifnone skip else if N ≠ 0 then AVOLS[VOLID][LNUM] := unmapped} else abort };