| ubi_init_vols_mappings#(VTBLPNUM, APEBS; RECS, VOLS, WLARRAY, ERASEQ, BFLIPSET) {RECS := RECS -- (VTBL_VOLID × VTBL_LNUM); while RECS ≠ ∅ do {/* (prepost-init-vols-mappings : invariant unique-sqns(APEBS) ∧ valid-vtbl(APEBS, VOLS, WLARRAY, VTBLPNUM) ∧ ¬ VTBL_VOLID ∈ VOLS ∧ ¬ VTBL_VOLID × VTBL_LNUM ∈ RECS ∧ # APEBS = # WLARRAY ∧ valid-wl(APEBS, WLARRAY) ∧ valid-eraseq(WLARRAY, ERASEQ) ∧ (∃ vtbl. is-encoded(vtbl, APEBS[VTBLPNUM].data) ∧ valid-eraseq-strong(APEBS, vtbl, ERASEQ)) ∧ bflipset-cons(BFLIPSET, WLARRAY) ∧ RECS ⊥ VOLS ∧ ERASEQ` ⊆ ERASEQ ∧ (∀ v, m, n. v × m ∈ RECS ∧ RECS[v × m].pnum = n ∨ v ∈ VOLS ∧ m < # VOLS[v] ∧ VOLS[v][m] = ⌜n⌝ ↔ WLARRAY[n].status = used ∧ n < # APEBS ∧ APEBS[n].vidhdr.valid? ∧ APEBS[n].vidhdr.vol = v ∧ APEBS[n].vidhdr.leb = m ∧ n ≠ VTBLPNUM) wfbound # RECS) */; choose LADR with LADR ∈ RECS in let N = RECS[LADR].pnum in {if LADR.vol ∈ VOLS ∧ LADR.leb < # VOLS[LADR.vol] then VOLS[LADR.vol][LADR.leb] := ⌜N⌝ else {WLARRAY[N].status := erasing; ERASEQ := ERASEQ + eq-entry(N, LADR.vol × LADR.leb); BFLIPSET := BFLIPSET -- N}; RECS := RECS -- LADR}} } |