about summary refs log tree commit diff stats
path: root/miasm2/core/graph.py
diff options
context:
space:
mode:
authorAjax <commial@gmail.com>2016-01-25 11:06:56 +0100
committerAjax <commial@gmail.com>2016-01-26 17:09:18 +0100
commit691b36840f2dd38173e3c2a21ec1f735e1cd48df (patch)
tree3faaa441cf60a93b5c7f0508cb492ca55c14b186 /miasm2/core/graph.py
parent455cfbe8b7aed7cb5be8e1b9aa1917a9f7d51821 (diff)
downloadmiasm-691b36840f2dd38173e3c2a21ec1f735e1cd48df.tar.gz
miasm-691b36840f2dd38173e3c2a21ec1f735e1cd48df.zip
Graph: introduce GraphSimplifier, counterpart of ExpressionSimplifier
for Graph
Diffstat (limited to 'miasm2/core/graph.py')
-rw-r--r--miasm2/core/graph.py34
1 files changed, 34 insertions, 0 deletions
diff --git a/miasm2/core/graph.py b/miasm2/core/graph.py
index 8199c22a..66dffdba 100644
--- a/miasm2/core/graph.py
+++ b/miasm2/core/graph.py
@@ -538,3 +538,37 @@ shape = "box"
                             done.add(current.node)
 
                         yield scc
+
+
+class DiGraphSimplifier(object):
+    """Wrapper on graph simplification passes.
+
+    Instance handle passes lists.
+    """
+
+    def __init__(self):
+        self.passes = []
+
+    def enable_passes(self, passes):
+        """Add @passes to passes to applied
+        @passes: sequence of function (DiGraphSimplifier, DiGraph) -> None
+        """
+        self.passes += passes
+
+    def apply_simp(self, graph):
+        """Apply enabled simplifications on graph @graph
+        @graph: DiGraph instance
+        """
+        while True:
+            new_graph = graph.copy()
+            for simp_func in self.passes:
+                simp_func(self, new_graph)
+
+            if new_graph == graph:
+                break
+            graph = new_graph
+        return new_graph
+
+    def __call__(self, graph):
+        """Wrapper on 'apply_simp'"""
+        return self.apply_simp(graph)