def knl_to_json(knl, what=None, with_dependencies=False, use_separators=True): if knl == None: return None all_what = set([ "name", "arguments", "domains", "tags", "variables", "rules", "instructions", "Dependencies", "schedule", ]) first_letter_to_what = dict((w[0], w) for w in all_what) assert len(first_letter_to_what) == len(all_what) if what is None: what = all_what.copy() if not with_dependencies: what.remove("Dependencies") if isinstance(what, str): if "," in what: what = what.split(",") what = set(s.strip() for s in what) else: what = set(first_letter_to_what[w] for w in what) if not (what <= all_what): raise LoopyError("invalid 'what' passed: %s" % ", ".join(what - all_what)) lines = {} kernel = knl if "name" in what: lines['p_name'] = kernel.name if "arguments" in what: lines['p_arguments'] = [] for arg_name in natsorted(kernel.arg_dict): if isinstance(kernel.arg_dict[arg_name], lp.GlobalArg): typ = "global" if isinstance(kernel.arg_dict[arg_name], lp.ValueArg): typ = "value" lines['p_arguments'].append( [arg_name, str(kernel.arg_dict[arg_name]), typ]) if "domains" in what: lines['p_domains'] = [] for dom, parents in zip(kernel.domains, kernel.all_parents_per_domain()): lines['p_domains'].append(len(parents) * " " + str(dom)) if "tags" in what: lines['p_tags'] = [] for iname in natsorted(kernel.all_inames()): tags = kernel.iname_to_tag.get(iname, frozenset()) if not tags: lines['p_tags'].append((str(iname), [])) else: if not isinstance(tags, collections.Iterable): tags = [ tags, ] lines['p_tags'].append((str(iname), [str(t) for t in tags])) if "variables" in what and kernel.temporary_variables: lines['p_variables'] = [] for tv in natsorted(six.itervalues(kernel.temporary_variables), key=lambda tv: tv.name): lines['p_variables'].append(str(tv)) if "rules" in what and kernel.substitutions: lines['p_rules'] = [] for rule_name in natsorted(six.iterkeys(kernel.substitutions)): lines['p_rules'].append( (rule_name, str(kernel.substitutions[rule_name]))) if "instructions" in what: lines['p_instructions'] = [] loop_list_width = 35 # {{{ topological sort printed_insn_ids = set() printed_insn_order = [] def insert_insn_into_order(insn): if insn.id in printed_insn_ids: return printed_insn_ids.add(insn.id) for dep_id in natsorted(insn.depends_on): insert_insn_into_order(kernel.id_to_insn[dep_id]) printed_insn_order.append(insn) for insn in kernel.instructions: insert_insn_into_order(insn) # }}} Fore = kernel.options._fore # noqa Style = kernel.options._style # noqa from loopy.kernel.tools import draw_dependencies_as_unicode_arrows deps = draw_dependencies_as_unicode_arrows(printed_insn_order, fore=Fore, style=Style) if not isinstance(deps, list): deps = [deps] for insn, (arrows, extender) in zip(printed_insn_order, deps): if isinstance(insn, lp.MultiAssignmentBase): lhs = ", ".join(str(a) for a in insn.assignees) rhs = str(insn.expression) trailing = [] elif isinstance(insn, lp.CInstruction): lhs = ", ".join(str(a) for a in insn.assignees) rhs = "CODE(%s|%s)" % (", ".join( str(x) for x in insn.read_variables), ", ".join( "%s=%s" % (name, expr) for name, expr in insn.iname_exprs)) trailing = [" " + l for l in insn.code.split("\n")] elif isinstance(insn, lp.BarrierInstruction): lhs = "" rhs = "... %sbarrier" % insn.kind[0] trailing = [] elif isinstance(insn, lp.NoOpInstruction): lhs = "" rhs = "... nop" trailing = [] else: raise LoopyError("unexpected instruction type: %s" % type(insn).__name__) order = kernel._get_iname_order_for_printing() loop_list = ",".join( sorted(kernel.insn_inames(insn), key=lambda iname: order[iname])) options = [Fore.GREEN + insn.id + Style.RESET_ALL] if insn.priority: options.append("priority=%d" % insn.priority) if insn.tags: options.append("tags=%s" % ":".join(insn.tags)) if isinstance(insn, lp.Assignment) and insn.atomicity: options.append("atomic=%s" % ":".join(str(a) for a in insn.atomicity)) if insn.groups: options.append("groups=%s" % ":".join(insn.groups)) if insn.conflicts_with_groups: options.append("conflicts=%s" % ":".join(insn.conflicts_with_groups)) if insn.no_sync_with: options.append( "no_sync_with=%s" % ":".join("%s@%s" % entry for entry in sorted(insn.no_sync_with))) if lhs: core = "%s <- %s" % ( Fore.CYAN + lhs + Style.RESET_ALL, Fore.MAGENTA + rhs + Style.RESET_ALL, ) else: core = Fore.MAGENTA + rhs + Style.RESET_ALL if len(loop_list) > loop_list_width: lines['p_instructions'].append("%s [%s]" % (arrows, loop_list)) lines['p_instructions'].append( "%s %s%s # %s" % (extender, (loop_list_width + 2) * " ", core, ", ".join(options))) else: lines['p_instructions'].append( "%s [%s]%s%s # %s" % (arrows, loop_list, " " * (loop_list_width - len(loop_list)), core, ",".join(options))) lines['p_instructions'].extend(trailing) if insn.predicates: lines['p_instructions'].append( 10 * " " + "if (%s)" % " && ".join([str(x) for x in insn.predicates])) dep_lines = [] for insn in kernel.instructions: if insn.depends_on: dep_lines.append("%s : %s" % (insn.id, ",".join(insn.depends_on))) if "Dependencies" in what and dep_lines: lines['p_dependencies'] = dep_lines if "schedule" in what and kernel.schedule is not None: from loopy.schedule import dump_schedule lines['p_schedule'] = dump_schedule(kernel, kernel.schedule) return lines
def stringify(self, what=None, with_dependencies=False): all_what = set([ "name", "arguments", "domains", "tags", "variables", "rules", "instructions", "Dependencies", "schedule", ]) first_letter_to_what = dict( (w[0], w) for w in all_what) assert len(first_letter_to_what) == len(all_what) if what is None: what = all_what.copy() if not with_dependencies: what.remove("Dependencies") if isinstance(what, str): if "," in what: what = what.split(",") what = set(s.strip() for s in what) else: what = set( first_letter_to_what[w] for w in what) if not (what <= all_what): raise LoopyError("invalid 'what' passed: %s" % ", ".join(what-all_what)) lines = [] from loopy.preprocess import add_default_dependencies kernel = add_default_dependencies(self) sep = 75*"-" if "name" in what: lines.append(sep) lines.append("KERNEL: " + kernel.name) if "arguments" in what: lines.append(sep) lines.append("ARGUMENTS:") for arg_name in sorted(kernel.arg_dict): lines.append(str(kernel.arg_dict[arg_name])) if "domains" in what: lines.append(sep) lines.append("DOMAINS:") for dom, parents in zip(kernel.domains, kernel.all_parents_per_domain()): lines.append(len(parents)*" " + str(dom)) if "tags" in what: lines.append(sep) lines.append("INAME IMPLEMENTATION TAGS:") for iname in sorted(kernel.all_inames()): line = "%s: %s" % (iname, kernel.iname_to_tag.get(iname)) lines.append(line) if "variables" in what and kernel.temporary_variables: lines.append(sep) lines.append("TEMPORARIES:") for tv in sorted(six.itervalues(kernel.temporary_variables), key=lambda tv: tv.name): lines.append(str(tv)) if "rules" in what and kernel.substitutions: lines.append(sep) lines.append("SUBSTIUTION RULES:") for rule_name in sorted(six.iterkeys(kernel.substitutions)): lines.append(str(kernel.substitutions[rule_name])) if "instructions" in what: lines.append(sep) lines.append("INSTRUCTIONS:") loop_list_width = 35 printed_insn_ids = set() Fore = self.options._fore Style = self.options._style def print_insn(insn): if insn.id in printed_insn_ids: return printed_insn_ids.add(insn.id) for dep_id in sorted(insn.depends_on): print_insn(kernel.id_to_insn[dep_id]) if isinstance(insn, lp.MultiAssignmentBase): lhs = ", ".join(str(a) for a in insn.assignees) rhs = str(insn.expression) trailing = [] elif isinstance(insn, lp.CInstruction): lhs = ", ".join(str(a) for a in insn.assignees) rhs = "CODE(%s|%s)" % ( ", ".join(str(x) for x in insn.read_variables), ", ".join("%s=%s" % (name, expr) for name, expr in insn.iname_exprs)) trailing = [" "+l for l in insn.code.split("\n")] loop_list = ",".join(sorted(kernel.insn_inames(insn))) options = [Fore.GREEN+insn.id+Style.RESET_ALL] if insn.priority: options.append("priority=%d" % insn.priority) if insn.tags: options.append("tags=%s" % ":".join(insn.tags)) if isinstance(insn, lp.Assignment) and insn.atomicity: options.append("atomic=%s" % ":".join( str(a) for a in insn.atomicity)) if insn.groups: options.append("groups=%s" % ":".join(insn.groups)) if insn.conflicts_with_groups: options.append( "conflicts=%s" % ":".join(insn.conflicts_with_groups)) if insn.no_sync_with: options.append("no_sync_with=%s" % ":".join(insn.no_sync_with)) if len(loop_list) > loop_list_width: lines.append("[%s]" % loop_list) lines.append("%s%s <- %s # %s" % ( (loop_list_width+2)*" ", Fore.BLUE+lhs+Style.RESET_ALL, Fore.MAGENTA+rhs+Style.RESET_ALL, ", ".join(options))) else: lines.append("[%s]%s%s <- %s # %s" % ( loop_list, " "*(loop_list_width-len(loop_list)), Fore.BLUE + lhs + Style.RESET_ALL, Fore.MAGENTA+rhs+Style.RESET_ALL, ",".join(options))) lines.extend(trailing) if insn.predicates: lines.append(10*" " + "if (%s)" % " && ".join(insn.predicates)) import loopy as lp for insn in kernel.instructions: print_insn(insn) dep_lines = [] for insn in kernel.instructions: if insn.depends_on: dep_lines.append("%s : %s" % (insn.id, ",".join(insn.depends_on))) if "Dependencies" in what and dep_lines: lines.append(sep) lines.append("DEPENDENCIES: " "(use loopy.show_dependency_graph to visualize)") lines.extend(dep_lines) if "schedule" in what and kernel.schedule is not None: lines.append(sep) lines.append("SCHEDULE:") from loopy.schedule import dump_schedule lines.append(dump_schedule(kernel, kernel.schedule)) lines.append(sep) return "\n".join(lines)
def stringify(self, with_dependencies=False): lines = [] from loopy.preprocess import add_default_dependencies kernel = add_default_dependencies(self) sep = 75*"-" lines.append(sep) lines.append("KERNEL: " + kernel.name) lines.append(sep) lines.append("ARGUMENTS:") for arg_name in sorted(kernel.arg_dict): lines.append(str(kernel.arg_dict[arg_name])) lines.append(sep) lines.append("DOMAINS:") for dom, parents in zip(kernel.domains, kernel.all_parents_per_domain()): lines.append(len(parents)*" " + str(dom)) lines.append(sep) lines.append("INAME IMPLEMENTATION TAGS:") for iname in sorted(kernel.all_inames()): line = "%s: %s" % (iname, kernel.iname_to_tag.get(iname)) lines.append(line) if kernel.temporary_variables: lines.append(sep) lines.append("TEMPORARIES:") for tv in sorted(six.itervalues(kernel.temporary_variables), key=lambda tv: tv.name): lines.append(str(tv)) if kernel.substitutions: lines.append(sep) lines.append("SUBSTIUTION RULES:") for rule_name in sorted(six.iterkeys(kernel.substitutions)): lines.append(str(kernel.substitutions[rule_name])) lines.append(sep) lines.append("INSTRUCTIONS:") loop_list_width = 35 printed_insn_ids = set() def print_insn(insn): if insn.id in printed_insn_ids: return printed_insn_ids.add(insn.id) for dep_id in sorted(insn.insn_deps): print_insn(kernel.id_to_insn[dep_id]) if isinstance(insn, lp.Assignment): lhs = str(insn.assignee) rhs = str(insn.expression) trailing = [] elif isinstance(insn, lp.CInstruction): lhs = ", ".join(str(a) for a in insn.assignees) rhs = "CODE(%s|%s)" % ( ", ".join(str(x) for x in insn.read_variables), ", ".join("%s=%s" % (name, expr) for name, expr in insn.iname_exprs)) trailing = [" "+l for l in insn.code.split("\n")] loop_list = ",".join(sorted(kernel.insn_inames(insn))) options = [insn.id] if insn.priority: options.append("priority=%d" % insn.priority) if insn.tags: options.append("tags=%s" % ":".join(insn.tags)) if insn.groups: options.append("groups=%s" % ":".join(insn.groups)) if insn.conflicts_with_groups: options.append("conflicts=%s" % ":".join(insn.conflicts_with_groups)) if len(loop_list) > loop_list_width: lines.append("[%s]" % loop_list) lines.append("%s%s <- %s # %s" % ( (loop_list_width+2)*" ", lhs, rhs, ", ".join(options))) else: lines.append("[%s]%s%s <- %s # %s" % ( loop_list, " "*(loop_list_width-len(loop_list)), lhs, rhs, ",".join(options))) lines.extend(trailing) if insn.predicates: lines.append(10*" " + "if (%s)" % " && ".join(insn.predicates)) import loopy as lp for insn in kernel.instructions: print_insn(insn) dep_lines = [] for insn in kernel.instructions: if insn.insn_deps: dep_lines.append("%s : %s" % (insn.id, ",".join(insn.insn_deps))) if dep_lines: lines.append(sep) lines.append("DEPENDENCIES: " "(use loopy.show_dependency_graph to visualize)") if with_dependencies: lines.extend(dep_lines) lines.append(sep) if kernel.schedule is not None: lines.append("SCHEDULE:") from loopy.schedule import dump_schedule lines.append(dump_schedule(kernel, kernel.schedule)) lines.append(sep) return "\n".join(lines)
def stringify(self, what=None, with_dependencies=False): all_what = set([ "name", "arguments", "domains", "tags", "variables", "rules", "instructions", "Dependencies", "schedule", ]) first_letter_to_what = dict((w[0], w) for w in all_what) assert len(first_letter_to_what) == len(all_what) if what is None: what = all_what.copy() if not with_dependencies: what.remove("Dependencies") if isinstance(what, str): if "," in what: what = what.split(",") what = set(s.strip() for s in what) else: what = set(first_letter_to_what[w] for w in what) if not (what <= all_what): raise LoopyError("invalid 'what' passed: %s" % ", ".join(what - all_what)) lines = [] kernel = self sep = 75 * "-" if "name" in what: lines.append(sep) lines.append("KERNEL: " + kernel.name) if "arguments" in what: lines.append(sep) lines.append("ARGUMENTS:") for arg_name in sorted(kernel.arg_dict): lines.append(str(kernel.arg_dict[arg_name])) if "domains" in what: lines.append(sep) lines.append("DOMAINS:") for dom, parents in zip(kernel.domains, kernel.all_parents_per_domain()): lines.append(len(parents) * " " + str(dom)) if "tags" in what: lines.append(sep) lines.append("INAME IMPLEMENTATION TAGS:") for iname in sorted(kernel.all_inames()): line = "%s: %s" % (iname, kernel.iname_to_tag.get(iname)) lines.append(line) if "variables" in what and kernel.temporary_variables: lines.append(sep) lines.append("TEMPORARIES:") for tv in sorted(six.itervalues(kernel.temporary_variables), key=lambda tv: tv.name): lines.append(str(tv)) if "rules" in what and kernel.substitutions: lines.append(sep) lines.append("SUBSTIUTION RULES:") for rule_name in sorted(six.iterkeys(kernel.substitutions)): lines.append(str(kernel.substitutions[rule_name])) if "instructions" in what: lines.append(sep) lines.append("INSTRUCTIONS:") loop_list_width = 35 # {{{ topological sort printed_insn_ids = set() printed_insn_order = [] def insert_insn_into_order(insn): if insn.id in printed_insn_ids: return printed_insn_ids.add(insn.id) for dep_id in sorted(insn.depends_on): insert_insn_into_order(kernel.id_to_insn[dep_id]) printed_insn_order.append(insn) for insn in kernel.instructions: insert_insn_into_order(insn) # }}} import loopy as lp Fore = self.options._fore # noqa Style = self.options._style # noqa from loopy.kernel.tools import draw_dependencies_as_unicode_arrows for insn, (arrows, extender) in zip( printed_insn_order, draw_dependencies_as_unicode_arrows(printed_insn_order, fore=Fore, style=Style)): if isinstance(insn, lp.MultiAssignmentBase): lhs = ", ".join(str(a) for a in insn.assignees) rhs = str(insn.expression) trailing = [] elif isinstance(insn, lp.CInstruction): lhs = ", ".join(str(a) for a in insn.assignees) rhs = "CODE(%s|%s)" % (", ".join( str(x) for x in insn.read_variables), ", ".join( "%s=%s" % (name, expr) for name, expr in insn.iname_exprs)) trailing = [" " + l for l in insn.code.split("\n")] elif isinstance(insn, lp.BarrierInstruction): lhs = "" rhs = "... %sbarrier" % insn.kind[0] trailing = [] elif isinstance(insn, lp.NoOpInstruction): lhs = "" rhs = "... nop" trailing = [] else: raise LoopyError("unexpected instruction type: %s" % type(insn).__name__) loop_list = ",".join(sorted(kernel.insn_inames(insn))) options = [Fore.GREEN + insn.id + Style.RESET_ALL] if insn.priority: options.append("priority=%d" % insn.priority) if insn.tags: options.append("tags=%s" % ":".join(insn.tags)) if isinstance(insn, lp.Assignment) and insn.atomicity: options.append("atomic=%s" % ":".join(str(a) for a in insn.atomicity)) if insn.groups: options.append("groups=%s" % ":".join(insn.groups)) if insn.conflicts_with_groups: options.append("conflicts=%s" % ":".join(insn.conflicts_with_groups)) if insn.no_sync_with: # FIXME: Find a syntax to express scopes. options.append("no_sync_with=%s" % ":".join(id for id, _ in insn.no_sync_with)) if lhs: core = "%s <- %s" % ( Fore.CYAN + lhs + Style.RESET_ALL, Fore.MAGENTA + rhs + Style.RESET_ALL, ) else: core = Fore.MAGENTA + rhs + Style.RESET_ALL if len(loop_list) > loop_list_width: lines.append("%s[%s]" % (arrows, loop_list)) lines.append("%s%s%s # %s" % (extender, (loop_list_width + 2) * " ", core, ", ".join(options))) else: lines.append("%s[%s]%s%s # %s" % (arrows, loop_list, " " * (loop_list_width - len(loop_list)), core, ",".join(options))) lines.extend(trailing) if insn.predicates: lines.append(10 * " " + "if (%s)" % " && ".join([str(x) for x in insn.predicates])) dep_lines = [] for insn in kernel.instructions: if insn.depends_on: dep_lines.append("%s : %s" % (insn.id, ",".join(insn.depends_on))) if "Dependencies" in what and dep_lines: lines.append(sep) lines.append("DEPENDENCIES: " "(use loopy.show_dependency_graph to visualize)") lines.extend(dep_lines) if "schedule" in what and kernel.schedule is not None: lines.append(sep) lines.append("SCHEDULE:") from loopy.schedule import dump_schedule lines.append(dump_schedule(kernel, kernel.schedule)) lines.append(sep) return "\n".join(lines)
def stringify(self, what=None, with_dependencies=False, use_separators=True, show_labels=True): all_what = set([ "name", "arguments", "domains", "tags", "variables", "rules", "instructions", "Dependencies", "schedule", ]) first_letter_to_what = dict( (w[0], w) for w in all_what) assert len(first_letter_to_what) == len(all_what) if what is None: what = all_what.copy() if not with_dependencies: what.remove("Dependencies") if isinstance(what, str): if "," in what: what = what.split(",") what = set(s.strip() for s in what) else: what = set( first_letter_to_what[w] for w in what) if not (what <= all_what): raise LoopyError("invalid 'what' passed: %s" % ", ".join(what-all_what)) lines = [] kernel = self if use_separators: sep = [75*"-"] else: sep = [] if "name" in what: lines.extend(sep) lines.append("KERNEL: " + kernel.name) if "arguments" in what: lines.extend(sep) if show_labels: lines.append("ARGUMENTS:") for arg_name in natsorted(kernel.arg_dict): lines.append(str(kernel.arg_dict[arg_name])) if "domains" in what: lines.extend(sep) if show_labels: lines.append("DOMAINS:") for dom, parents in zip(kernel.domains, kernel.all_parents_per_domain()): lines.append(len(parents)*" " + str(dom)) if "tags" in what: lines.extend(sep) if show_labels: lines.append("INAME IMPLEMENTATION TAGS:") for iname in natsorted(kernel.all_inames()): line = "%s: %s" % (iname, kernel.iname_to_tag.get(iname)) lines.append(line) if "variables" in what and kernel.temporary_variables: lines.extend(sep) if show_labels: lines.append("TEMPORARIES:") for tv in natsorted(six.itervalues(kernel.temporary_variables), key=lambda tv: tv.name): lines.append(str(tv)) if "rules" in what and kernel.substitutions: lines.extend(sep) if show_labels: lines.append("SUBSTITUTION RULES:") for rule_name in natsorted(six.iterkeys(kernel.substitutions)): lines.append(str(kernel.substitutions[rule_name])) if "instructions" in what: lines.extend(sep) if show_labels: lines.append("INSTRUCTIONS:") from loopy.kernel.tools import stringify_instruction_list lines.extend(stringify_instruction_list(kernel)) dep_lines = [] for insn in kernel.instructions: if insn.depends_on: dep_lines.append("%s : %s" % (insn.id, ",".join(insn.depends_on))) if "Dependencies" in what and dep_lines: lines.extend(sep) if show_labels: lines.append("DEPENDENCIES: " "(use loopy.show_dependency_graph to visualize)") lines.extend(dep_lines) if "schedule" in what and kernel.schedule is not None: lines.extend(sep) if show_labels: lines.append("SCHEDULE:") from loopy.schedule import dump_schedule lines.append(dump_schedule(kernel, kernel.schedule)) lines.extend(sep) return "\n".join(lines)
def stringify(self, what=None, with_dependencies=False): all_what = set([ "name", "arguments", "domains", "tags", "variables", "rules", "instructions", "Dependencies", "schedule", ]) first_letter_to_what = dict((w[0], w) for w in all_what) assert len(first_letter_to_what) == len(all_what) if what is None: what = all_what.copy() if not with_dependencies: what.remove("Dependencies") if isinstance(what, str): if "," in what: what = what.split(",") what = set(s.strip() for s in what) else: what = set(first_letter_to_what[w] for w in what) if not (what <= all_what): raise LoopyError("invalid 'what' passed: %s" % ", ".join(what - all_what)) lines = [] from loopy.preprocess import add_default_dependencies kernel = add_default_dependencies(self) sep = 75 * "-" if "name" in what: lines.append(sep) lines.append("KERNEL: " + kernel.name) if "arguments" in what: lines.append(sep) lines.append("ARGUMENTS:") for arg_name in sorted(kernel.arg_dict): lines.append(str(kernel.arg_dict[arg_name])) if "domains" in what: lines.append(sep) lines.append("DOMAINS:") for dom, parents in zip(kernel.domains, kernel.all_parents_per_domain()): lines.append(len(parents) * " " + str(dom)) if "tags" in what: lines.append(sep) lines.append("INAME IMPLEMENTATION TAGS:") for iname in sorted(kernel.all_inames()): line = "%s: %s" % (iname, kernel.iname_to_tag.get(iname)) lines.append(line) if "variables" in what and kernel.temporary_variables: lines.append(sep) lines.append("TEMPORARIES:") for tv in sorted(six.itervalues(kernel.temporary_variables), key=lambda tv: tv.name): lines.append(str(tv)) if "rules" in what and kernel.substitutions: lines.append(sep) lines.append("SUBSTIUTION RULES:") for rule_name in sorted(six.iterkeys(kernel.substitutions)): lines.append(str(kernel.substitutions[rule_name])) if "instructions" in what: lines.append(sep) lines.append("INSTRUCTIONS:") loop_list_width = 35 printed_insn_ids = set() Fore = self.options._fore Style = self.options._style def print_insn(insn): if insn.id in printed_insn_ids: return printed_insn_ids.add(insn.id) for dep_id in sorted(insn.depends_on): print_insn(kernel.id_to_insn[dep_id]) if isinstance(insn, lp.MultiAssignmentBase): lhs = ", ".join(str(a) for a in insn.assignees) rhs = str(insn.expression) trailing = [] elif isinstance(insn, lp.CInstruction): lhs = ", ".join(str(a) for a in insn.assignees) rhs = "CODE(%s|%s)" % (", ".join( str(x) for x in insn.read_variables), ", ".join( "%s=%s" % (name, expr) for name, expr in insn.iname_exprs)) trailing = [" " + l for l in insn.code.split("\n")] loop_list = ",".join(sorted(kernel.insn_inames(insn))) options = [Fore.GREEN + insn.id + Style.RESET_ALL] if insn.priority: options.append("priority=%d" % insn.priority) if insn.tags: options.append("tags=%s" % ":".join(insn.tags)) if isinstance(insn, lp.Assignment) and insn.atomicity: options.append("atomic=%s" % ":".join(str(a) for a in insn.atomicity)) if insn.groups: options.append("groups=%s" % ":".join(insn.groups)) if insn.conflicts_with_groups: options.append("conflicts=%s" % ":".join(insn.conflicts_with_groups)) if insn.no_sync_with: options.append("no_sync_with=%s" % ":".join(insn.no_sync_with)) if len(loop_list) > loop_list_width: lines.append("[%s]" % loop_list) lines.append("%s%s <- %s # %s" % ((loop_list_width + 2) * " ", Fore.BLUE + lhs + Style.RESET_ALL, Fore.MAGENTA + rhs + Style.RESET_ALL, ", ".join(options))) else: lines.append( "[%s]%s%s <- %s # %s" % (loop_list, " " * (loop_list_width - len(loop_list)), Fore.BLUE + lhs + Style.RESET_ALL, Fore.MAGENTA + rhs + Style.RESET_ALL, ",".join(options))) lines.extend(trailing) if insn.predicates: lines.append(10 * " " + "if (%s)" % " && ".join(insn.predicates)) import loopy as lp for insn in kernel.instructions: print_insn(insn) dep_lines = [] for insn in kernel.instructions: if insn.depends_on: dep_lines.append("%s : %s" % (insn.id, ",".join(insn.depends_on))) if "Dependencies" in what and dep_lines: lines.append(sep) lines.append("DEPENDENCIES: " "(use loopy.show_dependency_graph to visualize)") lines.extend(dep_lines) if "schedule" in what and kernel.schedule is not None: lines.append(sep) lines.append("SCHEDULE:") from loopy.schedule import dump_schedule lines.append(dump_schedule(kernel, kernel.schedule)) lines.append(sep) return "\n".join(lines)
def stringify(self, what=None, with_dependencies=False, use_separators=True, show_labels=True): all_what = set([ "name", "arguments", "domains", "tags", "variables", "rules", "instructions", "Dependencies", "schedule", ]) first_letter_to_what = dict( (w[0], w) for w in all_what) assert len(first_letter_to_what) == len(all_what) if what is None: what = all_what.copy() if not with_dependencies: what.remove("Dependencies") if isinstance(what, str): if "," in what: what = what.split(",") what = set(s.strip() for s in what) else: what = set( first_letter_to_what[w] for w in what) if not (what <= all_what): raise LoopyError("invalid 'what' passed: %s" % ", ".join(what-all_what)) lines = [] kernel = self if use_separators: sep = [75*"-"] else: sep = [] if "name" in what: lines.extend(sep) lines.append("KERNEL: " + kernel.name) if "arguments" in what: lines.extend(sep) if show_labels: lines.append("ARGUMENTS:") for arg_name in natsorted(kernel.arg_dict): lines.append(str(kernel.arg_dict[arg_name])) if "domains" in what: lines.extend(sep) if show_labels: lines.append("DOMAINS:") for dom, parents in zip(kernel.domains, kernel.all_parents_per_domain()): lines.append(len(parents)*" " + str(dom)) if "tags" in what: lines.extend(sep) if show_labels: lines.append("INAME IMPLEMENTATION TAGS:") for iname in natsorted(kernel.all_inames()): tags = kernel.iname_tags(iname) if not tags: tags_str = "None" else: tags_str = ", ".join(str(tag) for tag in tags) line = "%s: %s" % (iname, tags_str) lines.append(line) if "variables" in what and kernel.temporary_variables: lines.extend(sep) if show_labels: lines.append("TEMPORARIES:") for tv in natsorted(six.itervalues(kernel.temporary_variables), key=lambda tv: tv.name): lines.append(str(tv)) if "rules" in what and kernel.substitutions: lines.extend(sep) if show_labels: lines.append("SUBSTITUTION RULES:") for rule_name in natsorted(six.iterkeys(kernel.substitutions)): lines.append(str(kernel.substitutions[rule_name])) if "instructions" in what: lines.extend(sep) if show_labels: lines.append("INSTRUCTIONS:") from loopy.kernel.tools import stringify_instruction_list lines.extend(stringify_instruction_list(kernel)) dep_lines = [] for insn in kernel.instructions: if insn.depends_on: dep_lines.append("%s : %s" % (insn.id, ",".join(insn.depends_on))) if "Dependencies" in what and dep_lines: lines.extend(sep) if show_labels: lines.append("DEPENDENCIES: " "(use loopy.show_dependency_graph to visualize)") lines.extend(dep_lines) if "schedule" in what and kernel.schedule is not None: lines.extend(sep) if show_labels: lines.append("SCHEDULE:") from loopy.schedule import dump_schedule lines.append(dump_schedule(kernel, kernel.schedule)) lines.extend(sep) return "\n".join(lines)