From c16e6d1ab4fecb486c7926324d6c5d7d3fbb54e6 Mon Sep 17 00:00:00 2001
From: Matt Wala <wala1@illinois.edu>
Date: Thu, 8 Mar 2018 21:00:35 -0600
Subject: [PATCH] Change function to replace node and edge hooks with a
 preamble_hook.

---
 pymbolic/imperative/utils.py | 64 +++++++++++++++++-------------------
 1 file changed, 30 insertions(+), 34 deletions(-)

diff --git a/pymbolic/imperative/utils.py b/pymbolic/imperative/utils.py
index 16637d5..e609807 100644
--- a/pymbolic/imperative/utils.py
+++ b/pymbolic/imperative/utils.py
@@ -34,47 +34,46 @@ logger = logging.getLogger(__name__)
 
 # {{{ graphviz / dot export
 
-
-def _default_node_attr_hook(insn, use_insn_id):
-    if use_insn_id:
-        insn_label = insn.id
-        tooltip = str(insn)
-    else:
-        insn_label = str(insn)
-        tooltip = insn.id
-
-    return "label=\"%s\",shape=\"box\",tooltip=\"%s\"" % (
-            repr(insn_label)[1:-1],
-            repr(tooltip)[1:-1],
-            )
-
-
-def _default_edge_attr_hook(insn_from, insn_to):
-    return "dir=\"back\""
-
-
-def _default_annot_edge_attr_hook(insn_from, insn_to, annotation):
-    return "label=\"%s\",dir=\"back\",style=\"dashed\"" % annotation
+def _default_preamble_hook():
+    # Sets default attributes for nodes and edges.
+    yield "node [shape=\"box\"];"
+    yield "edge [dir=\"back\"];"
 
 
 def get_dot_dependency_graph(
         instructions, use_insn_ids=False,
-        additional_lines_hook=None,
-        node_attr_hook=_default_node_attr_hook,
-        edge_attr_hook=_default_edge_attr_hook,
-        annot_edge_attr_hook=_default_annot_edge_attr_hook):
+        preamble_hook=_default_preamble_hook,
+        additional_lines_hook=list):
     """Return a string in the `dot <http://graphviz.org/>`_ language depicting
     dependencies among kernel instructions.
+
+    :arg preamble_hook: A function that returns an iterable of lines
+        to add at the beginning of the graph
+    :arg additional_lines_hook: A function that returns an iterable
+        of lines to add at the end of the graph
     """
 
-    lines = []
+    def get_node_attrs(insn):
+        if use_insn_ids:
+            insn_label = insn.id
+            tooltip = str(insn)
+        else:
+            insn_label = str(insn)
+            tooltip = insn.id
+
+        return "label=\"%s\",shape=\"box\",tooltip=\"%s\"" % (
+                repr(insn_label)[1:-1],
+                repr(tooltip)[1:-1],
+                )
+
+    lines = list(_default_preamble_hook())
     dep_graph = {}
 
     # maps (oriented) edge onto annotation string
     annotation_dep_graph = {}
 
     for insn in instructions:
-        lines.append("\"%s\" [%s];" % (insn.id, node_attr_hook(insn, use_insn_ids)))
+        lines.append("\"%s\" [%s];" % (insn.id, get_node_attrs(insn)))
         for dep in insn.depends_on:
             dep_graph.setdefault(insn.id, set()).add(dep)
 
@@ -110,17 +109,14 @@ def get_dot_dependency_graph(
 
     for insn_1 in dep_graph:
         for insn_2 in dep_graph.get(insn_1, set()):
-            lines.append("%s -> %s [%s]" %
-                         (insn_2, insn_1, edge_attr_hook(insn_2, insn_1)))
+            lines.append("%s -> %s" % (insn_2, insn_1))
 
     for (insn_1, insn_2), annot in six.iteritems(annotation_dep_graph):
             lines.append(
-                    "%s -> %s  [%s]"
-                    % (insn_2, insn_1, annot,
-                       annot_edge_attr_hook(insn_2, insn_1, annot)))
+                    "%s -> %s  [label=\"%s\",style=\"dashed\"]"
+                    % (insn_2, insn_1, annot))
 
-    if additional_lines_hook is not None:
-        lines.extend(additional_lines_hook())
+    lines.extend(additional_lines_hook())
 
     return "digraph code {\n%s\n}" % (
             "\n".join(lines)
-- 
GitLab