[Imprint][Data Privacy Statement][E-Mail]

Back to main index. View the specification. View theorem base summary, View theorem base listing, the used properties by spec, the dependency list, the symbol table,

Specification ubi-crash-recovery-base
enrich
   ubi-base, 
   recovery-entries

with
   

   
   
   
   predicates  . ⊆ . : volumes × volumes;
               . ⌈ . ⌉ : volumes × volumes × queue;
               is-max : apebs × volumes × wlarray × queue × nat-set × nat × nat;
               indices-erasing : wlarray × nat-list;
               valid-eraseq-stronger : apebs × queue;
              comment: valid-eraseq + no pebs with maxsqnum in eraseq;
               valid-eraseq-strong : apebs × vtbl × queue;
              comment: valid-eraseq-stronger - pebs outside vtbl with maxsqnum may be in eraseq;
               valid-vtbl-weak : apebs × nat;
               valid-recs : apebs × wlarray × recoveryentries;
               valid-recs-sqns : apebs × recoveryentries;
               unmapped-vols : volumes;
               scan-all-inv : nat × apebs × recoveryentries × wlarray × queue × nat-set × nat-list × nat × error;
               . ⊥ . : recoveryentries × volumes;
   
   
   
   

   

   axioms vols-le
          : ⊦   vols0 ⊆ vols1
              ↔ (∀ v. 
                     (v ∈ vols0 ↔ v ∈ vols1)
                   ∧ (v ∈ vols0 → # vols0[v] = # vols1[v] ∧ (∀ m. m < # vols0[v] ∧ vols0[v][m] ≠ unmapped → vols0[v][m] = vols1[v][m])));
          used for: ls;
          vols-eraseq-bound
          : ⊦   vols1⌈vols0, q0⌉
              ↔ (∀ v, m. 
                     v ∈ vols0 ∧ v ∈ vols1 ∧ m < # vols0[v] ∧ m < # vols1[v] ∧ vols0[v][m] = unmapped ∧ vols1[v][m] ≠ unmapped
                   → eq-entry(vols1[v][m].pnum, v × m) ∈ q0);
          used for: ls;
          vols-is-max-weak
          : ⊦   is-max(apebs, vols, wlar, q, bflipset, n0, n1)
              ↔ ubi-cons(apebs, vols, wlar, q, bflipset, n0, n1) ∧ (∃ vtbl. is-encoded(vtbl, apebs[n0].data) ∧ valid-eraseq-strong(apebs, vtbl, q));
          valid-eraseq-stronger-base :  ⊦ valid-eraseq-stronger(apebs, []);
          used for: s, ls;
          valid-eraseq-stronger-rec
          : ⊦   valid-eraseq-stronger(apebs, eqent ' + q)
              ↔   eqent.pnum < # apebs ∧ ¬ eqent.pnum ∈ q
                ∧ (∀ v, m. 
                       (valid-peb(v, m, apebs[eqent.pnum]) ↔ eqent.lebref = v × m)
                     ∧ (eqent.lebref = v × m → apebs[eqent.pnum].vidhdr.sqn ≠ valid-sqns(v, m, apebs).max))
                ∧ valid-eraseq-stronger(apebs, q);
          used for: ls;
          valid-eraseq-strong-base :  ⊦ valid-eraseq-strong(apebs, vtbl, []);
          used for: s, ls;
          valid-eraseq-strong-rec
          : ⊦   valid-eraseq-strong(apebs, vtbl, eqent ' + q)
              ↔   eqent.pnum < # apebs ∧ ¬ eqent.pnum ∈ q
                ∧ (∀ v, m. 
                       (valid-peb(v, m, apebs[eqent.pnum]) ↔ eqent.lebref = v × m)
                     ∧ (eqent.lebref = v × m ∧ v ∈ vtbl ∧ m < vtbl[v] → apebs[eqent.pnum].vidhdr.sqn ≠ valid-sqns(v, m, apebs).max))
                ∧ valid-eraseq-strong(apebs, vtbl, q);
          used for: ls;
          disj :  ⊦ recs ⊥ vols ↔ (∀ v, m. ¬ v × m ∈ recs ∨ ¬ v ∈ vols ∨ ¬ m < # vols[v] ∨ vols[v][m] = unmapped);
          used for: ls;
          valid-vtbl-weak
          : ⊦   valid-vtbl-weak(apebs, n)
              ↔   n < # apebs ∧ valid-peb(VTBL_VOLID, VTBL_LNUM, apebs[n]) ∧ apebs[n].vidhdr.sqn = valid-sqns(VTBL_VOLID, VTBL_LNUM, apebs).max
                ∧ (∃ vtbl. is-encoded(vtbl, apebs[n].data) ∧ ¬ VTBL_VOLID ∈ vtbl);
          valid-recs
          : ⊦   valid-recs(apebs, wlar, recs)
              ↔ (∀ ladr, m. 
                     ladr ∈ recs ∧ recs[ladr].pnum = m
                   ↔ wlar[m].status = used ∧ m < # apebs ∧ apebs[m].vidhdr.vol = ladr.vol ∧ apebs[m].vidhdr.leb = ladr.leb);
          used for: ls;
          valid-recs-sqns
          : ⊦   valid-recs-sqns(apebs, recs)
              ↔ (∀ ladr. ladr ∈ recs → recs[ladr].pnum < # apebs ∧ apebs[recs[ladr].pnum].vidhdr.sqn = recs[ladr].sqn);
          used for: ls;
          unmapped-vols :  ⊦ unmapped-vols(vols) ↔ (∀ v, m. v ∈ vols ∧ m < # vols[v] → vols[v][m] = unmapped);
          used for: ls;
          scan-all-inv
          : ⊦   scan-all-inv(n, apebs, recs, wlar, q, bflipset, nx, n1, err)
              ↔ ¬
                ¬
                (  n ≤ # apebs ∧ (err = ESUCCESS ∨ ⌊err⌋ )
                 ∧ (  err = ESUCCESS
                    →   ubi-io-inv(apebs) ∧ unique-sqns(apebs) ∧ # apebs = # wlar ∧ ¬ dups(nx) ∧ nx < n ∧ indices-erasing(wlar, nx)
                      ∧ valid-global-sqn(subarray(apebs, 0, n), n1) ∧ valid-eraseq(subarray(wlar, 0, n), q)
                      ∧ bflipset-cons(bflipset, subarray(wlar, 0, n)) ∧ valid-eraseq-stronger(subarray(apebs, 0, n), q)
                      ∧ valid-wl(subarray(apebs, 0, n), subarray(wlar, 0, n)) ∧ valid-recs-sqns(apebs, recs)
                      ∧ valid-recs(subarray(apebs, 0, n), subarray(wlar, 0, n), recs)));
          used for: s;
          indices-erasing-base :  ⊦ indices-erasing(wlar, []);
          used for: s, ls;
          indices-erasing-rec :  ⊦ indices-erasing(wlar, n ' + nx) ↔ n < # wlar ∧ wlar[n].status = erasing ∧ indices-erasing(wlar, nx);
          used for: s, ls;

   

   
end enrich