Skip to content

Commit 97bb96c

Browse files
authored
[Civl] Add type param to Loc (#1031)
1 parent 9887a95 commit 97bb96c

File tree

8 files changed

+200
-196
lines changed

8 files changed

+200
-196
lines changed

Source/Core/base.bpl

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -329,19 +329,19 @@ pure procedure Map_Put<K,V>({:linear} path: Map K V, {:linear_in} l: One K, {:li
329329
pure procedure Map_GetValue<K,V>({:linear} path: Map K V, k: K) returns ({:linear} v: V);
330330
pure procedure Map_PutValue<K,V>({:linear} path: Map K V, k: K, {:linear_in} v: V);
331331

332-
type Loc;
332+
type Loc _;
333333

334-
pure procedure {:inline 1} Loc_New() returns ({:linear} {:pool "Loc_New"} l: One Loc)
334+
pure procedure {:inline 1} Loc_New<V>() returns ({:linear} {:pool "Loc_New"} l: One (Loc V))
335335
{
336336
assume {:add_to_pool "Loc_New", l} true;
337337
}
338338

339-
datatype TaggedLoc<K> { TaggedLoc(loc: Loc, tag: K) }
339+
datatype TaggedLoc<V,T> { TaggedLoc(loc: Loc V, tag: T) }
340340

341-
pure procedure {:inline 1} TaggedLocSet_New<K>(ks: Set K) returns ({:linear} {:pool "Loc_New"} l: One Loc, {:linear} tagged_locs: Set (TaggedLoc K))
341+
pure procedure {:inline 1} TaggedLocSet_New<V,T>(tags: Set T) returns ({:linear} {:pool "Loc_New"} l: One (Loc V), {:linear} tagged_locs: Set (TaggedLoc V T))
342342
{
343343
assume {:add_to_pool "Loc_New", l} true;
344-
tagged_locs := Set((lambda x: TaggedLoc K :: x->loc == l->val && Set_Contains(ks, x->tag)));
344+
tagged_locs := Set((lambda x: TaggedLoc V T :: x->loc == l->val && Set_Contains(tags, x->tag)));
345345
}
346346

347347
procedure create_async<T>(PA: T);

Source/Core/node.bpl

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,77 @@
1-
datatype Node<K,T> { Node(next: Option K, val: T) }
1+
datatype Node<T> { Node(next: Option (Loc (Node T)), val: T) }
2+
type LocNode T = Loc (Node T);
23

3-
function Between<K,T>(f: [K]Node K T, x: Option K, y: Option K, z: Option K): bool;
4-
function Avoiding<K,T>(f: [K]Node K T, x: Option K, y: Option K, z: Option K): bool;
5-
function {:inline} BetweenSet<K,T>(f:[K]Node K T, x: Option K, z: Option K): [K]bool
4+
function Between<T>(f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T))): bool;
5+
function Avoiding<T>(f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T))): bool;
6+
function {:inline} BetweenSet<T>(f:[Loc (Node T)]Node T, x: Option (Loc (Node T)), z: Option (Loc (Node T))): [Loc (Node T)]bool
67
{
7-
(lambda y: K :: Between(f, x, Some(y), z))
8+
(lambda y: Loc (Node T) :: Between(f, x, Some(y), z))
89
}
910

1011
// reflexive
11-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K :: Between(f, x, x, x));
12+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)) :: Between(f, x, x, x));
1213

1314
// step
14-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: K ::
15+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Loc (Node T) ::
1516
{f[x]}
1617
Between(f, Some(x), f[x]->next, f[x]->next));
1718

1819
// reach
19-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: K, y: Option K ::
20+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Loc (Node T), y: Option (Loc (Node T)) ::
2021
{f[x], Between(f, Some(x), y, y)}
2122
Between(f, Some(x), y, y) ==> Some(x) == y || Between(f, Some(x), f[x]->next, y));
2223

2324
// cycle
24-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: K, y: Option K ::
25+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Loc (Node T), y: Option (Loc (Node T)) ::
2526
{f[x], Between(f, Some(x), y, y)}
2627
f[x]->next == Some(x) && Between(f, Some(x), y, y) ==> Some(x) == y);
2728

2829
// sandwich
29-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K ::
30+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)) ::
3031
{Between(f, x, y, x)}
3132
Between(f, x, y, x) ==> x == y);
3233

3334
// order1
34-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K ::
35+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)) ::
3536
{Between(f, x, y, y), Between(f, x, z, z)}
3637
Between(f, x, y, y) && Between(f, x, z, z) ==> Between(f, x, y, z) || Between(f, x, z, y));
3738

3839
// order2
39-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K ::
40+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)) ::
4041
{Between(f, x, y, z)}
4142
Between(f, x, y, z) ==> Between(f, x, y, y) && Between(f, y, z, z));
4243

4344
// transitive1
44-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K ::
45+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)) ::
4546
{Between(f, x, y, y), Between(f, y, z, z)}
4647
Between(f, x, y, y) && Between(f, y, z, z) ==> Between(f, x, z, z));
4748

4849
// transitive2
49-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K, w: Option K ::
50+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)), w: Option (Loc (Node T)) ::
5051
{Between(f, x, y, z), Between(f, y, w, z)}
5152
Between(f, x, y, z) && Between(f, y, w, z) ==> Between(f, x, y, w) && Between(f, x, w, z));
5253

5354
// transitive3
54-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K, w: Option K ::
55+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)), w: Option (Loc (Node T)) ::
5556
{Between(f, x, y, z), Between(f, x, w, y)}
5657
Between(f, x, y, z) && Between(f, x, w, y) ==> Between(f, x, w, z) && Between(f, w, y, z));
5758

5859
// This axiom is required to deal with the incompleteness of the trigger for the reflexive axiom.
5960
// It cannot be proved using the rest of the axioms.
60-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, u: Option K, x: Option K ::
61+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, u: Option (Loc (Node T)), x: Option (Loc (Node T)) ::
6162
{Between(f, u, x, x)}
6263
Between(f, u, x, x) ==> Between(f, u, u, x));
6364

6465
// relation between Avoiding and Between
65-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K ::
66+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)) ::
6667
{Avoiding(f, x, y, z)}
6768
Avoiding(f, x, y, z) <==> Between(f, x, y, z) || (Between(f, x, y, y) && !Between(f, x, z, z)));
68-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, x: Option K, y: Option K, z: Option K ::
69+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, x: Option (Loc (Node T)), y: Option (Loc (Node T)), z: Option (Loc (Node T)) ::
6970
{Between(f, x, y, z)}
7071
Between(f, x, y, z) <==> Avoiding(f, x, y, z) && Avoiding(f, x, z, z));
7172

7273
// update
73-
axiom {:ctor "Node"} (forall<K,T> f: [K]Node K T, u: Option K, v: Option K, x: Option K, p: K, q: Node K T ::
74+
axiom {:ctor "Node"} (forall<T> f: [Loc (Node T)]Node T, u: Option (Loc (Node T)), v: Option (Loc (Node T)), x: Option (Loc (Node T)), p: Loc (Node T), q: Node T ::
7475
{Avoiding(f[p := q], u, v, x)}
7576
Avoiding(f[p := q], u, v, x) <==>
7677
(Avoiding(f, u, v, Some(p)) && Avoiding(f, u, v, x)) ||

Test/civl/large-samples/GC.bpl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
// Copyright (c) Microsoft Corporation. All rights reserved.
33
//
44

5-
// RUN: %parallel-boogie -lib:set_size "%s" > "%t"
5+
// RUN: %parallel-boogie -lib:set_size -timeLimit:0 -vcsSplitOnEveryAssert "%s" > "%t"
66
// RUN: %diff "%s.expect" "%t"
77

88
// Tid(i, ps) represents a linear thread id for thread number i, where i > 0 and ps = {Left(i), Right(i)}.

0 commit comments

Comments
 (0)