From 74373e65255cab28ec7b508571af215922d3118f Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Thu, 8 Mar 2018 19:18:57 -0600 Subject: [PATCH 1/5] Fixes/improvements to get_dot_dependency_graph(). - Fix a typo in an argument name. - Reverse the dependency edges, because it's more typical for the arrow to point to the instruction that the computation depends on, rather than the other way around. - Add a hook for customizing node attributes. --- pymbolic/imperative/utils.py | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/pymbolic/imperative/utils.py b/pymbolic/imperative/utils.py index 5221859..389dae6 100644 --- a/pymbolic/imperative/utils.py +++ b/pymbolic/imperative/utils.py @@ -34,8 +34,16 @@ logger = logging.getLogger(__name__) # {{{ graphviz / dot export -def get_dot_dependency_graph(instructions, use_insn_ids=False, - addtional_lines_hook=None): + +def _default_node_attr_hook(insn): + insn_repr = repr(insn.id)[1:-1] + return "label=\"{id}\",shape=\"box\",tooltip=\"{id}\"".format(id=insn_repr) + + +def get_dot_dependency_graph( + instructions, use_insn_ids=False, + additional_lines_hook=None, + node_attr_hook=_default_node_attr_hook): """Return a string in the `dot `_ language depicting dependencies among kernel instructions. """ @@ -54,12 +62,7 @@ def get_dot_dependency_graph(instructions, use_insn_ids=False, insn_label = str(insn) tooltip = insn.id - lines.append("\"%s\" [label=\"%s\",shape=\"box\",tooltip=\"%s\"];" - % ( - insn.id, - repr(insn_label)[1:-1], - repr(tooltip)[1:-1], - )) + lines.append("\"%s\" [%s];" % (insn.id, node_attr_hook(insn))) for dep in insn.depends_on: dep_graph.setdefault(insn.id, set()).add(dep) @@ -95,15 +98,15 @@ def get_dot_dependency_graph(instructions, use_insn_ids=False, for insn_1 in dep_graph: for insn_2 in dep_graph.get(insn_1, set()): - lines.append("%s -> %s" % (insn_2, insn_1)) + lines.append("%s -> %s [dir=\"back\"]" % (insn_2, insn_1)) for (insn_1, insn_2), annot in six.iteritems(annotation_dep_graph): lines.append( - "%s -> %s [label=\"%s\", style=dashed]" + "%s -> %s [dir=\"back\", label=\"%s\", style=dashed]" % (insn_2, insn_1, annot)) - if addtional_lines_hook is not None: - lines.extend(addtional_lines_hook()) + if additional_lines_hook is not None: + lines.extend(additional_lines_hook()) return "digraph code {\n%s\n}" % ( "\n".join(lines) -- GitLab From 287d9826c64b79ff909e5c598db4b767791aa81e Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Thu, 8 Mar 2018 19:30:01 -0600 Subject: [PATCH 2/5] flake8 fix --- pymbolic/imperative/utils.py | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/pymbolic/imperative/utils.py b/pymbolic/imperative/utils.py index 389dae6..64749f0 100644 --- a/pymbolic/imperative/utils.py +++ b/pymbolic/imperative/utils.py @@ -35,9 +35,18 @@ logger = logging.getLogger(__name__) # {{{ graphviz / dot export -def _default_node_attr_hook(insn): - insn_repr = repr(insn.id)[1:-1] - return "label=\"{id}\",shape=\"box\",tooltip=\"{id}\"".format(id=insn_repr) +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 get_dot_dependency_graph( @@ -55,14 +64,7 @@ def get_dot_dependency_graph( annotation_dep_graph = {} for insn in instructions: - if use_insn_ids: - insn_label = insn.id - tooltip = str(insn) - else: - insn_label = str(insn) - tooltip = insn.id - - lines.append("\"%s\" [%s];" % (insn.id, node_attr_hook(insn))) + lines.append("\"%s\" [%s];" % (insn.id, node_attr_hook(insn, use_insn_ids))) for dep in insn.depends_on: dep_graph.setdefault(insn.id, set()).add(dep) -- GitLab From c02b01c5957b104a3ad04531ec4975b3923b09d1 Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Thu, 8 Mar 2018 20:26:02 -0600 Subject: [PATCH 3/5] Allow customizing edge attributes --- pymbolic/imperative/utils.py | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/pymbolic/imperative/utils.py b/pymbolic/imperative/utils.py index 64749f0..16637d5 100644 --- a/pymbolic/imperative/utils.py +++ b/pymbolic/imperative/utils.py @@ -49,10 +49,20 @@ def _default_node_attr_hook(insn, use_insn_id): ) +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 get_dot_dependency_graph( instructions, use_insn_ids=False, additional_lines_hook=None, - node_attr_hook=_default_node_attr_hook): + node_attr_hook=_default_node_attr_hook, + edge_attr_hook=_default_edge_attr_hook, + annot_edge_attr_hook=_default_annot_edge_attr_hook): """Return a string in the `dot `_ language depicting dependencies among kernel instructions. """ @@ -100,12 +110,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 [dir=\"back\"]" % (insn_2, insn_1)) + lines.append("%s -> %s [%s]" % + (insn_2, insn_1, edge_attr_hook(insn_2, insn_1))) for (insn_1, insn_2), annot in six.iteritems(annotation_dep_graph): lines.append( - "%s -> %s [dir=\"back\", label=\"%s\", style=dashed]" - % (insn_2, insn_1, annot)) + "%s -> %s [%s]" + % (insn_2, insn_1, annot, + annot_edge_attr_hook(insn_2, insn_1, annot))) if additional_lines_hook is not None: lines.extend(additional_lines_hook()) -- GitLab From c16e6d1ab4fecb486c7926324d6c5d7d3fbb54e6 Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Thu, 8 Mar 2018 21:00:35 -0600 Subject: [PATCH 4/5] 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 `_ 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 From f68caffcf156884c200ec851b2d0abd034dcfa48 Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Thu, 8 Mar 2018 21:09:41 -0600 Subject: [PATCH 5/5] Fix wrong variable --- pymbolic/imperative/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pymbolic/imperative/utils.py b/pymbolic/imperative/utils.py index e609807..035f51a 100644 --- a/pymbolic/imperative/utils.py +++ b/pymbolic/imperative/utils.py @@ -66,7 +66,7 @@ def get_dot_dependency_graph( repr(tooltip)[1:-1], ) - lines = list(_default_preamble_hook()) + lines = list(preamble_hook()) dep_graph = {} # maps (oriented) edge onto annotation string -- GitLab