-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcfg_visualizer.py
More file actions
47 lines (33 loc) · 1.07 KB
/
cfg_visualizer.py
File metadata and controls
47 lines (33 loc) · 1.07 KB
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
from graphviz import Digraph
class CFGVisualizer:
def __init__(self):
self.graph = Digraph()
self.node_id = 0
def new_node(self, label):
nid = f"N{self.node_id}"
self.node_id += 1
self.graph.node(nid, label)
return nid
def build(self, program):
nodes = {}
edges = []
prev = None
for instr in program:
nid = self.new_node(instr)
nodes[instr] = nid
if prev:
edges.append((prev, nid))
prev = nid
# detect jumps (simple CFG logic)
if instr.startswith("JMPZ"):
parts = instr.split()
target = parts[-1]
jump_node = self.new_node(f"→ {target}")
edges.append((nid, jump_node))
for a, b in edges:
self.graph.edge(a, b)
return self.graph
def render(self, program, filename="cfg"):
g = self.build(program)
g.render(filename, format="png", cleanup=True)
print(f"CFG saved as {filename}.png")