| adr = adr1, ginval = ginval2, ginval0 = ginval1, gstore = gstore1, gstore0 = gstore2, istore1 = remove-refsize0(crash(istore, istore0)), pstate = readonly, remove-refsize0(gstore1) = gstore1, remove-refsize0(istore0) = istore0, syn, elems nx ∩ ginval1 = ∅, dom gstore1 ∪ elems nx = dom gstore2 ∪ ginval1, inv(gstore2 \ ginval1), inv(gstore1), inv(istore), inv(istore0), istore0 ⊑ istore ⊦ ⟨if pstate.index? ∨ pstate = readonly then if pstate = readonly then err0 := EROFS else {choose maxino, err with ¬ @(pstate.lnum, maxino, ind.flashsize) ∈ istore ∧ err = ESUCCESS ∨ ⌊err⌋ in adr := @(pstate.lnum, maxino, ind.flashsize), err0 := err; if err0 = ESUCCESS then {istore[pstate.lnum].indlist := istore[pstate.lnum].indlist + ind; istore[pstate.lnum].ladrlist := istore[pstate.lnum].ladrlist + @(adr.pos, adr.size)} else adr := ?, pstate := readonly; syn := ?} else abort⟩ (syn ∧ istore1 = remove-refsize0(crash(istore, istore0))), dups(nx) |
adr = adr1, ginval = ginval2, ginval0 = ginval1, gstore = gstore1, gstore0 = gstore2, istore1 = remove-refsize0(crash(istore, istore0)), pstate = readonly, remove-refsize0(istore0) = istore0, remove-refsize0(gstore1) = gstore1, syn, elems nx ∩ ginval1 = ∅, dom gstore1 ∪ elems nx = dom gstore2 ∪ ginval1, inv(istore0), inv(istore), inv(gstore1), inv(gstore2 \ ginval1), istore0 ⊑ istore ⊦ ⟨if pstate = readonly then err0 := EROFS else {choose maxino, err with ¬ @(pstate.lnum, maxino, ind.flashsize) ∈ istore ∧ err = ESUCCESS ∨ ⌊err⌋ in adr := @(pstate.lnum, maxino, ind.flashsize), err0 := err; if err0 = ESUCCESS then {istore[pstate.lnum].indlist := istore[pstate.lnum].indlist + ind; istore[pstate.lnum].ladrlist := istore[pstate.lnum].ladrlist + @(adr.pos, adr.size)} else adr := ?, pstate := readonly; syn := ?}⟩ (syn ∧ istore1 = remove-refsize0(crash(istore, istore0))), dups(nx)
Used simplifier rules: ⊦ ¬ readonly.index?; (s)