| ubi_io_format#(; PAGESIZE, PEBS; ERR) {mtd_asm_init#(; ; PEBS, ERR); mtd_asm_get_page_size#(PEBS; ; PAGESIZE); if ERR = ESUCCESS then let N = ? in {mtd_asm_get_blockcount#(PEBS; ; N); let M = 0 in while M < N ∧ ERR = ESUCCESS do {/* (inv-format : invariant M ≤ N ∧ N = # PEBS ∧ mtd-cons(PEBS) ∧ (ERR = ESUCCESS → ubi-io-initial(subarray(PEBS, 0, M))) ∧ (ERR = ESUCCESS ∨ ⌊ERR⌋ ) wfbound N - M) */; let ISBAD = ? in {mtd_asm_isbad#(M, PEBS; ; ISBAD, ERR); if ERR = ESUCCESS ∧ ¬ ISBAD then let AEHDR = ?, BITFLIPS = ? in {ubi_io_read_echdr#(M, PAGESIZE, PEBS; AEHDR; BITFLIPS, ERR); let N = (ERR = ESUCCESS ∧ AEHDR.valid? ⊃ AEHDR.ec + 1;0) in {mtd_asm_erase#(M; PEBS; ERR); if ERR = ESUCCESS then ubi_io_write_echdr#(M, aechdr(N), PAGESIZE; PEBS; ERR)}}}; M := M + 1}} } |