예제 #1
0
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
예제 #2
0
파일: __init__.py 프로젝트: cmsquared/loopy
    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)
예제 #3
0
파일: __init__.py 프로젝트: navjotk/loopy
    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)
예제 #4
0
파일: __init__.py 프로젝트: arghdos/loopy
    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)
예제 #5
0
파일: __init__.py 프로젝트: tj-sun/loopy
    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)
예제 #6
0
파일: __init__.py 프로젝트: dokempf/loopy
    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)
예제 #7
0
파일: __init__.py 프로젝트: inducer/loopy
    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)