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