11// RUN: %parallel-boogie -lib:base -lib:node -timeLimit:0 -vcsSplitOnEveryAssert "%s" > "%t"
22// RUN: %diff "%s.expect" "%t"
33
4- datatype LocPiece { Right() }
5- function {:inline} AllLocPieces(): Set LocPiece {
6- Set_Add(Set_Empty(), Right())
7- }
8-
94type LocTreiberStack = Loc;
105type LocTreiberNode = Loc;
116type StackElem T = Node LocTreiberNode T;
@@ -61,41 +56,41 @@ invariant Map_At(TreiberPool, loc_t) == Abs(Map_At(TreiberPoolLow, loc_t));
6156yield invariant {:layer 4 } StackDom();
6257invariant TreiberPool-> dom == TreiberPoolLow-> dom;
6358
64- yield invariant {:layer 4 } PushLocInStack(loc_t: LocTreiberStack, node: StackElem X, new_loc_n: LocTreiberNode, {:linear} right_loc_piece: One (TaggedLoc LocPiece ));
59+ yield invariant {:layer 4 } PushLocInStack(loc_t: LocTreiberStack, node: StackElem X, new_loc_n: LocTreiberNode, {:linear} right_loc_piece: One (TaggedLoc Unit ));
6560invariant Map_Contains(TreiberPoolLow, loc_t);
6661invariant Set_Contains(Domain(TreiberPoolLow, loc_t), new_loc_n);
67- invariant right_loc_piece-> val == TaggedLoc(new_loc_n, Right ());
62+ invariant right_loc_piece-> val == TaggedLoc(new_loc_n, Unit ());
6863invariant (var t := TreiberPoolLow-> val[loc_t]; Map_At(t-> nodes, new_loc_n) == node && ! BetweenSet(t-> nodes-> val, t-> top, None())[new_loc_n]);
6964
7065/// Layered implementation
7166
72- atomic action {:layer 5 } AtomicAlloc() returns ({:linear} right_loc_piece: One (TaggedLoc LocPiece ))
67+ atomic action {:layer 5 } AtomicAlloc() returns ({:linear} right_loc_piece: One (TaggedLoc Unit ))
7368{
7469 var {:linear} one_loc_t: One LocTreiberStack;
75- var {:linear} loc_pieces: Set (TaggedLoc LocPiece );
70+ var {:linear} loc_pieces: Set (TaggedLoc Unit );
7671
77- call one_loc_t, loc_pieces := TaggedLocSet_New(AllLocPieces ());
78- call right_loc_piece := One_Get(loc_pieces, TaggedLoc(one_loc_t-> val, Right ()));
72+ call one_loc_t, loc_pieces := TaggedLocSet_New(UnitSet ());
73+ call right_loc_piece := One_Get(loc_pieces, TaggedLoc(one_loc_t-> val, Unit ()));
7974 assume ! Map_Contains(TreiberPool, one_loc_t-> val);
8075 TreiberPool := Map_Update(TreiberPool, one_loc_t-> val, Vec_Empty());
8176}
82- yield procedure {:layer 4 } Alloc() returns ({:linear} right_loc_piece: One (TaggedLoc LocPiece ))
77+ yield procedure {:layer 4 } Alloc() returns ({:linear} right_loc_piece: One (TaggedLoc Unit ))
8378refines AtomicAlloc;
8479ensures call TopInStack(right_loc_piece-> val-> loc);
8580ensures call ReachInStack(right_loc_piece-> val-> loc);
8681preserves call StackDom();
8782{
8883 var {:linear} one_loc_t: One LocTreiberStack;
89- var {:linear} loc_pieces: Set (TaggedLoc LocPiece );
84+ var {:linear} loc_pieces: Set (TaggedLoc Unit );
9085 var top: Option LocTreiberNode;
9186 var {:linear} stack: StackMap X;
9287 var {:linear} treiber: Treiber X;
9388
9489 top := None();
9590 call stack := Map_MakeEmpty();
9691 treiber := Treiber(top, stack);
97- call one_loc_t, loc_pieces := TaggedLocSet_New(AllLocPieces ());
98- call right_loc_piece := One_Get(loc_pieces, TaggedLoc(one_loc_t-> val, Right ()));
92+ call one_loc_t, loc_pieces := TaggedLocSet_New(UnitSet ());
93+ call right_loc_piece := One_Get(loc_pieces, TaggedLoc(one_loc_t-> val, Unit ()));
9994 call AllocTreiber#0 (one_loc_t, treiber);
10095 call {:layer 4 } TreiberPool := Copy(Map_Update(TreiberPool, one_loc_t-> val, Vec_Empty()));
10196 call {:layer 4 } AbsLemma(treiber);
@@ -118,7 +113,7 @@ preserves call StackDom();
118113{
119114 var loc_n: Option LocTreiberNode;
120115 var new_loc_n: LocTreiberNode;
121- var {:linear} right_loc_piece: One (TaggedLoc LocPiece );
116+ var {:linear} right_loc_piece: One (TaggedLoc Unit );
122117 var {:layer 4 } old_treiber: Treiber X;
123118
124119 call {:layer 4 } old_treiber := Copy(TreiberPoolLow-> val[loc_t]);
@@ -166,39 +161,39 @@ preserves call StackDom();
166161}
167162
168163atomic action {:layer 4 } AtomicCreateNewTopOfStack(loc_t: LocTreiberStack, x: X)
169- returns (loc_n: Option LocTreiberNode, new_loc_n: LocTreiberNode, {:linear} right_loc_piece: One (TaggedLoc LocPiece ))
164+ returns (loc_n: Option LocTreiberNode, new_loc_n: LocTreiberNode, {:linear} right_loc_piece: One (TaggedLoc Unit ))
170165asserts Map_Contains(TreiberPoolLow, loc_t);
171166{
172167 var {:linear} one_loc_t: One LocTreiberStack;
173168 var {:linear} treiber: Treiber X;
174169 var top: Option LocTreiberNode;
175170 var {:linear} stack: StackMap X;
176171 var {:linear} one_loc_n: One LocTreiberNode;
177- var {:linear} loc_pieces: Set (TaggedLoc LocPiece );
172+ var {:linear} loc_pieces: Set (TaggedLoc Unit );
178173
179174 call one_loc_t, treiber := Map_Get(TreiberPoolLow, loc_t);
180175 Treiber(top, stack) := treiber;
181176 assume loc_n is None || Map_Contains(stack, loc_n-> t);
182- call one_loc_n, loc_pieces := TaggedLocSet_New(AllLocPieces ());
177+ call one_loc_n, loc_pieces := TaggedLocSet_New(UnitSet ());
183178 new_loc_n := one_loc_n-> val;
184- call right_loc_piece := One_Get(loc_pieces, TaggedLoc(new_loc_n, Right ()));
179+ call right_loc_piece := One_Get(loc_pieces, TaggedLoc(new_loc_n, Unit ()));
185180 call Map_Put(stack, one_loc_n, Node(loc_n, x));
186181 treiber := Treiber(top, stack);
187182 call Map_Put(TreiberPoolLow, one_loc_t, treiber);
188183}
189184yield procedure {:layer 3 } CreateNewTopOfStack(loc_t: LocTreiberStack, x: X)
190- returns (loc_n: Option LocTreiberNode, new_loc_n: LocTreiberNode, {:linear} right_loc_piece: One (TaggedLoc LocPiece ))
185+ returns (loc_n: Option LocTreiberNode, new_loc_n: LocTreiberNode, {:linear} right_loc_piece: One (TaggedLoc Unit ))
191186preserves call TopInStack(loc_t);
192187ensures call LocInStackOrNone(loc_t, Some(new_loc_n));
193188refines AtomicCreateNewTopOfStack;
194189{
195190 var {:linear} one_loc_n: One LocTreiberNode;
196- var {:linear} loc_pieces: Set (TaggedLoc LocPiece );
191+ var {:linear} loc_pieces: Set (TaggedLoc Unit );
197192
198193 call loc_n := ReadTopOfStack#Push(loc_t);
199- call one_loc_n, loc_pieces := TaggedLocSet_New(AllLocPieces ());
194+ call one_loc_n, loc_pieces := TaggedLocSet_New(UnitSet ());
200195 new_loc_n := one_loc_n-> val;
201- call right_loc_piece := One_Get(loc_pieces, TaggedLoc(new_loc_n, Right ()));
196+ call right_loc_piece := One_Get(loc_pieces, TaggedLoc(new_loc_n, Unit ()));
202197 call AllocNode#0 (loc_t, one_loc_n, Node(loc_n, x));
203198}
204199
0 commit comments