Skip to content

Commit d7b8e28

Browse files
committed
Accurate handling of reveced edges for pass and return.
1 parent 5c8b300 commit d7b8e28

File tree

3 files changed

+15
-11
lines changed

3 files changed

+15
-11
lines changed

cfpq_add_context/add_contexts.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from cfpq_matrix.block.block_matrix_space_impl import BlockMatrixSpaceImpl
1010
from cfpq_model.cnf_grammar_template import Symbol
1111
from cfpq_model.label_decomposed_graph import LabelDecomposedGraph
12+
from cfpq_add_context.utils import print_matrix_to_dot
1213

1314
import time
1415

@@ -39,8 +40,11 @@ def to_label_decomposed_graph(graph):
3940

4041
assign_r = Matrix(BOOL, graph.ncols, graph.nrows, name = "assign_r_after_intersection")
4142
assign_r << graph.select(graphblas.select.select_assign_r)
43+
assign_r << assign_r + graph.select(graphblas.select.select_pass_and_return).T
4244
print("Boolean matrix for assign_r nvals: ", assign_r.nvals)
4345

46+
#print_matrix_to_dot(assign_r,"assign_r.dot")
47+
4448
load_i = Matrix(UINT64, graph.ncols, graph.nrows, name = "load_i_after_intersection")
4549
load_i << graph.select(graphblas.select.select_load).apply(graphblas.unary.decode_load)
4650

cfpq_add_context/gen_automata.py

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,17 @@
88

99
def generate (number_of_contexts):
1010
start = 0
11-
nvertices = number_of_contexts * 2 + number_of_contexts * number_of_contexts * 4 + 1
11+
nvertices = number_of_contexts + number_of_contexts * number_of_contexts + 1
1212
final = nvertices
13-
first_level = [i for i in range(1, number_of_contexts * 2 + 1)]
13+
first_level = [i for i in range(1, number_of_contexts + 1)]
1414
#print("First level: ", first_level)
15-
second_level = [i for i in range(number_of_contexts * 2 + 1, nvertices)]
15+
second_level = [i for i in range(number_of_contexts + 1, nvertices)]
1616
def mk_open_context(i):
17-
if (i // number_of_contexts == 0):
1817
return mk_open_context_from_pass(i % number_of_contexts)
19-
else:
20-
return mk_open_context_from_ret_r(i % number_of_contexts)
18+
2119
def mk_close_context(i):
22-
if (i // number_of_contexts == 0):
2320
return mk_close_context_from_ret(i % number_of_contexts)
24-
else:
25-
return mk_close_context_from_pass_r(i % number_of_contexts)
21+
2622
edges = (
2723
[(start,start,SIGMA_WITHOUT_OPEN_CONTEXTS),(final,final,SIGMA)] +
2824
[
@@ -33,8 +29,8 @@ def mk_close_context(i):
3329
[
3430
edg
3531
for on_first_level in first_level
36-
for on_second_level in range(on_first_level * (number_of_contexts * 2) + 1, on_first_level * number_of_contexts * 2 + number_of_contexts * 2 + 1)
37-
for edg in ((on_first_level, on_second_level, mk_open_context(on_second_level % (number_of_contexts * 2))),(on_second_level, on_first_level, mk_close_context(on_second_level % (number_of_contexts * 2))))
32+
for on_second_level in range(on_first_level * number_of_contexts + 1, on_first_level * number_of_contexts + number_of_contexts + 1)
33+
for edg in ((on_first_level, on_second_level, mk_open_context(on_second_level % number_of_contexts )),(on_second_level, on_first_level, mk_close_context(on_second_level % number_of_contexts )))
3834
] +
3935
[(i,i,SIGMA_WITHOUT_CONTEXTS) for i in first_level + second_level] +
4036
[(i,final,ALL_OPEN_CONTEXTS) for i in second_level]

cfpq_add_context/labels.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,9 @@ def select_store_op(x,i,j,k):
8181
def select_store_r_op(x,i,j,k):
8282
return x & SIGMA_WITHOUT_CONTEXTS >= OFFSET and ((x & SIGMA_WITHOUT_CONTEXTS) - OFFSET) % 4 == 3
8383

84+
def select_pass_and_return_op(x,i,j,k):
85+
return (x & ALL_OPEN_CONTEXTS > 0 and ((x & ALL_OPEN_CONTEXTS) >> 43) % 2 == 1) or (x & ALL_CLOSE_CONTEXTS > 0 and ((x & ALL_CLOSE_CONTEXTS) >> 22) % 2 == 1)
86+
8487
def select_not_reversed_op(x,i,j,k):
8588
return ( (x & SIGMA_WITHOUT_CONTEXTS == ALLOC) or
8689
(x & SIGMA_WITHOUT_CONTEXTS == ASSIGN or (x & ALL_OPEN_CONTEXTS > 0 and ((x & ALL_OPEN_CONTEXTS) >> 43) % 2 == 1) or (x & ALL_CLOSE_CONTEXTS > 0 and ((x & ALL_CLOSE_CONTEXTS) >> 22) % 2 == 1)) or
@@ -97,6 +100,7 @@ def select_not_reversed_op(x,i,j,k):
97100
SelectOp.register_new("select_store", select_store_op)
98101
SelectOp.register_new("select_load_r", select_load_r_op)
99102
SelectOp.register_new("select_store_r", select_store_r_op)
103+
SelectOp.register_new("select_pass_and_return", select_pass_and_return_op)
100104
SelectOp.register_new("select_not_reversed", select_not_reversed_op)
101105

102106
def decode_load_op(x):

0 commit comments

Comments
 (0)