-
Notifications
You must be signed in to change notification settings - Fork 0
/
readcfg.py
137 lines (102 loc) · 3.77 KB
/
readcfg.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# -*- coding: utf-8 -*-
"""
Created on Thu May 17 14:55:22 2018
@author: moth
"""
import os
import sys
import networkx as nx
import abstractstate as abst
def createGraph(file):
sg = nx.DiGraph()
if not os.path.isfile(file):
print("File path {} does not exist. Exiting...".format(file))
sys.exit()
CFG = None
nodes = []
edges = []
nodes_info = {}
n = []
with open(file) as fp:
cnt = 0
for line in fp:
#print("line {} contents {}".format(cnt, line))
if "Nodes:" in line:
s = line.find("{")+1
e = line.find("}")
nodeline = line[s:e]
nodes = nodeline.split(",")
sg.add_nodes_from(nodes)
if "Edges:" in line:
s = line.find("{")+1
e = line.find("}")
edgeline = line[s:e]
edges = edgeline.split(",")
# sg.add_edges_from(edges)
for node in nodes:
if '|'+node+'|' in line:
#print (line)
s = line.find("{")+1
e = line.find("}")
nodeinfoline = line[s:e]
node_info = nodeinfoline.split(",")
ab_state = get_ab_state(node_info[0])
ex_str = get_function(node_info[1])
cond_str = get_function(node_info[2])
ex_f = ""
cond_f = ""
if ex_str != "":
ex_f = eval(ex_str)
cond_f = eval(cond_str)
sg.add_node(node, cond=cond_f, ex=ex_f, ab = ab_state, loopbound=1)
return sg
#print("foudn var {0}; condition{1}; expression{2}".format(var, condition, expression))
# cnt += 1
#def getNodes(line):
#def getEdges(line):
def get_ab_state(abstring) :
#print(abstring)
s = abstring.find("(")+1
e = abstring.find(")")
data = abstring[s:e]
#print (data)
split_data = data.split(";")
recorder = split_data[0]
#print(recorder)
s = split_data[1].find("[")+1
e = split_data[1].find("]")
#print(split_data[1])
ranges = split_data[1][s:e]
ranges = ranges.split("-")
#print(ranges)
range_s = ranges[0]
range_e = ranges[1]
if range_e == range_s : #just to make humans feel comfortable
range_e = int(range_e) + 1
abstract_store = list(range(int(range_s), int(range_e)))
abstract_state = abst.AbstractState(recorder, abstract_store)
#print (abstract_state._abstract_store)
#print (abstract_state._recorder)
return abstract_state
def get_function(f_string):
# ex = "x : x+1 if x%3 else x+3"
# cond = "x<200"
exp = f_string.split('\"')
if exp[1] == "" :
return ""
lambda_f = "lambda " + exp[1]
#print(lambda_f)
return lambda_f
def getRules(line):
scopegraph = nx.DiGraph()
abstract_state_main = abst.AbstractState(-1, [1])
scopegraph.add_node("main", cond="", ex="", ab = abstract_state_main, loopbound=1)
cond_ol = lambda x: x<10
ex_ol = lambda x : x+1
abstract_state_outer = abst.AbstractState(1, list(range(1,2)))
scopegraph.add_node("outer_loop", cond = cond_ol, ex = ex_ol, ab = abstract_state_outer, loopbound=1)
cond_il = lambda x: x<20
ex_il = lambda x : x+2
abstract_state_inner = abst.AbstractState(1, list(range(1,2)))
scopegraph.add_node("inner_loop", cond = cond_il, ex = ex_il, ab = abstract_state_inner, loopbound=1)
scopegraph.add_path(["main", "outer_loop", "inner_loop"])