def dot_dataflow_graph(code, max_node_label_length=30, label_wrap_width=50): origins = {} node_names = {} result = [ "initial [label=\"initial\"]" "result [label=\"result\"]"] for num, insn in enumerate(code.instructions): node_name = "node%d" % num node_names[insn] = node_name node_label = str(insn) if max_node_label_length is not None: node_label = node_label[:max_node_label_length] if label_wrap_width is not None: from pytools import word_wrap node_label = word_wrap(node_label, label_wrap_width, wrap_using="\n ") node_label = node_label.replace("\n", "\\l") + "\\l" result.append("%s [ label=\"p%d: %s\" shape=box ];" % ( node_name, insn.priority, node_label)) for assignee in insn.get_assignees(): origins[assignee] = node_name def get_orig_node(expr): from pymbolic.primitives import Variable if isinstance(expr, Variable): return origins.get(expr.name, "initial") else: return "initial" def gen_expr_arrow(expr, target_node): result.append("%s -> %s [label=\"%s\"];" % (get_orig_node(expr), target_node, expr)) for insn in code.instructions: for dep in insn.get_dependencies(): gen_expr_arrow(dep, node_names[insn]) from pytools.obj_array import is_obj_array if is_obj_array(code.result): for subexp in code.result: gen_expr_arrow(subexp, "result") else: gen_expr_arrow(code.result, "result") return "digraph dataflow {\n%s\n}\n" % "\n".join(result)
def dot_dataflow_graph(code: "Code", max_node_label_length: int = 30, label_wrap_width: int = 50) -> str: origins = {} node_names = {} result = ['initial [label="initial"]' 'result [label="result"]'] for num, insn in enumerate(code.instructions): node_name = f"node{num}" node_names[insn] = node_name node_label = str(insn) if max_node_label_length is not None: node_label = node_label[:max_node_label_length] if label_wrap_width is not None: from pytools import word_wrap node_label = word_wrap(node_label, label_wrap_width, wrap_using="\n ") node_label = node_label.replace("\n", "\\l") + "\\l" result.append(f"{node_name} [ " f'label="p{insn.priority}: {node_label}" shape=box ];') for assignee in insn.get_assignees(): origins[assignee] = node_name def get_orig_node(expr): from pymbolic.primitives import Variable if isinstance(expr, Variable): return origins.get(expr.name, "initial") else: return "initial" def gen_expr_arrow(expr, target_node): orig_node = get_orig_node(expr) result.append(f'{orig_node} -> {target_node} [label="{expr}"];') for insn in code.instructions: for dep in insn.get_dependencies(): gen_expr_arrow(dep, node_names[insn]) code_res = code.result if isinstance(code_res, np.ndarray) and code_res.dtype.char == "O": for subexp in code_res: gen_expr_arrow(subexp, "result") else: gen_expr_arrow(code_res, "result") return "digraph dataflow {\n%s\n}\n" % "\n".join(result)
def dot_dataflow_graph(code, max_node_label_length=30, label_wrap_width=50): origins = {} node_names = {} result = ["initial [label=\"initial\"]" "result [label=\"result\"]"] for num, insn in enumerate(code.instructions): node_name = "node%d" % num node_names[insn] = node_name node_label = str(insn) if (max_node_label_length is not None and not isinstance(insn, LoopyKernelInstruction)): node_label = node_label[:max_node_label_length] if label_wrap_width is not None: from pytools import word_wrap node_label = word_wrap(node_label, label_wrap_width, wrap_using="\n ") node_label = node_label.replace("\n", "\\l") + "\\l" result.append("%s [ label=\"p%d: %s\" shape=box ];" % (node_name, insn.priority, node_label)) for assignee in insn.get_assignees(): origins[assignee] = node_name def get_orig_node(expr): from pymbolic.primitives import Variable if isinstance(expr, Variable): return origins.get(expr.name, "initial") else: return "initial" def gen_expr_arrow(expr, target_node): result.append("%s -> %s [label=\"%s\"];" % (get_orig_node(expr), target_node, expr)) for insn in code.instructions: for dep in insn.get_dependencies(): gen_expr_arrow(dep, node_names[insn]) from pytools.obj_array import is_obj_array if is_obj_array(code.result): for subexp in code.result: gen_expr_arrow(subexp, "result") else: gen_expr_arrow(code.result, "result") return "digraph dataflow {\n%s\n}\n" % "\n".join(result)