diff options
| author | Ajax <commial@gmail.com> | 2016-01-25 11:06:56 +0100 |
|---|---|---|
| committer | Ajax <commial@gmail.com> | 2016-01-26 17:09:18 +0100 |
| commit | 691b36840f2dd38173e3c2a21ec1f735e1cd48df (patch) | |
| tree | 3faaa441cf60a93b5c7f0508cb492ca55c14b186 /miasm2/core/graph.py | |
| parent | 455cfbe8b7aed7cb5be8e1b9aa1917a9f7d51821 (diff) | |
| download | miasm-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.py | 34 |
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) |