Skip to content

Commit 832cf60

Browse files
committed
Unit type
1 parent 22f01f7 commit 832cf60

File tree

2 files changed

+25
-25
lines changed

2 files changed

+25
-25
lines changed

Source/Core/base.bpl

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -358,4 +358,9 @@ pure procedure Assume(b: bool);
358358
ensures b;
359359

360360
pure procedure Move<T>({:linear_in} v: T, {:linear_out} v': T);
361-
requires v == v';
361+
requires v == v';
362+
363+
datatype Unit { Unit() }
364+
function {:inline} UnitSet(): Set Unit {
365+
Set_Add(Set_Empty(), Unit())
366+
}

Test/civl/large-samples/treiber-stack.bpl

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,6 @@
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-
94
type LocTreiberStack = Loc;
105
type LocTreiberNode = Loc;
116
type StackElem T = Node LocTreiberNode T;
@@ -61,41 +56,41 @@ invariant Map_At(TreiberPool, loc_t) == Abs(Map_At(TreiberPoolLow, loc_t));
6156
yield invariant {:layer 4} StackDom();
6257
invariant 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));
6560
invariant Map_Contains(TreiberPoolLow, loc_t);
6661
invariant 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());
6863
invariant (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))
8378
refines AtomicAlloc;
8479
ensures call TopInStack(right_loc_piece->val->loc);
8580
ensures call ReachInStack(right_loc_piece->val->loc);
8681
preserves 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

168163
atomic 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))
170165
asserts 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
}
189184
yield 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))
191186
preserves call TopInStack(loc_t);
192187
ensures call LocInStackOrNone(loc_t, Some(new_loc_n));
193188
refines 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

Comments
 (0)