@@ -631,7 +631,7 @@ requires call YieldRead(i, ma, drp);
631631 par value := cache_invalidate_exc#1 (dirState-> i, ma, Invalid(), dp) | YieldInv#1 ();
632632 par write_mem(ma, value, dp) | YieldInv#1 ();
633633 } else {
634- call dp := invalidate_sharers(ma, dirState-> iset, dp);
634+ par dp := invalidate_sharers(ma, dirState-> iset, dp) | YieldInv# 1 ( );
635635 par value := read_mem(ma, dp) | YieldInv#1 ();
636636 }
637637 call cache_read_resp#1 (i, ma, value, Exclusive(), drp, dp);
@@ -641,7 +641,6 @@ requires call YieldRead(i, ma, drp);
641641yield left procedure {:layer 2 } invalidate_sharers(ma: MemAddr, victims: Set CacheId, {:linear_in} {:layer 1 ,2 } dp: Set DirPermission)
642642 returns ({:linear} {:layer 1 ,2 } dp': Set DirPermission)
643643modifies cache;
644- preserves call YieldInv#1 ();
645644requires {:layer 2 } Set_IsSubset(Set((lambda x: DirPermission :: Set_Contains(victims, x-> i) && x-> ma == ma)), dp);
646645requires {:layer 2 } (forall i: CacheId, ca: CacheAddr:: (var line := cache[i][ca];
647646 line-> state == Invalid() ||
@@ -663,9 +662,9 @@ ensures {:layer 2} dp == dp';
663662 }
664663 victim := Choice(victims-> val);
665664 victims' := Set_Remove(victims, victim);
666- par dpOne, dp' := get_victim(victim, ma, dp') | YieldInv# 1 () ;
667- par cache_invalidate_shd#1 (victim, ma, Invalid(), dpOne) | dp' := invalidate_sharers(ma, victims', dp') | YieldInv# 1 () ;
668- par dp' := put_victim(dpOne, dp') | YieldInv# 1 () ;
665+ par dpOne, dp' := get_victim(victim, ma, dp');
666+ par cache_invalidate_shd#1 (victim, ma, Invalid(), dpOne) | dp' := invalidate_sharers(ma, victims', dp');
667+ par dp' := put_victim(dpOne, dp');
669668}
670669
671670yield procedure {:layer 1 } get_victim(victim: CacheId, ma: MemAddr, {:layer 1 } {:linear_in} dp: Set DirPermission)
0 commit comments