Exemplo n.º 1
0
def test(code_to_analyze):
    from pdb import set_trace
    # set_trace()
    #tac_blocks_cfg = tac_analysis.make_tacblock_cfg(code_to_analyze)
    tac_blocks_cfg = tac.make_tacblock_cfg(code_to_analyze)
    print("\n".join("# " + line for line in tac.cfg_to_lines(tac_blocks_cfg)))
    print()
    tac_to_ivy = TacToIvy()
    result = tac_to_ivy.tac_blocks_cfg_to_ivy(tac_blocks_cfg)
    open("ivy_file.ivy", 'w').write(result)
Exemplo n.º 2
0
    def tac_blocks_cfg_to_ivy(self, tac_blocks_cfg):
        self.python_vars = dict()
        self.python_lits = dict()
        block_ids = sorted(tac_blocks_cfg.nodes())
        first_block_id = block_ids[0]  # the smallest id is the first to run
        ivy_can_run_decls = "\n".join([
            "type basic_block",
            "relation can_run(B:basic_block)",
        ] + [
            "individual bb{}:basic_block".format(i)
            for i in block_ids
        ] + [
            "axiom bb{} ~= bb{}".format(i, j)
            for i, j in combinations(block_ids, 2)
        ] + [
            "axiom " + ivy_or(*("B = bb{}".format(i) for i in block_ids)),
            "init can_run(B) <-> B = bb{}".format(first_block_id)
        ]) + "\n\n"

        actions = []
        for i in block_ids:
            block_instructions = tac_blocks_cfg.node[i][tac.BLOCKNAME]
            successor_ids = tac_blocks_cfg.successors(i)
            ivy_instructions = (
                ["assume can_run(bb{})".format(i)] +
                self.block_instructions_to_ivy(block_instructions) +
                ["can_run(B) := {}".format(ivy_or(*(
                    "B = bb{}".format(j) for j in successor_ids
                )))]
            )

            actions.append(
                "action basic_block_{} = {{\n    ".format(i) +
                ";\n    ".join(ivy_instructions) +
                "\n}}\nexport basic_block_{}".format(i)
            )

        python_vars = sorted((v, x) for x, v in self.python_vars.items())
        ivy_python_vars_decls = "\n".join(
            "individual {}:python_object  # {}".format(v, x)
            for v, x in python_vars
        )

        python_lits = sorted((lit, x) for x, lit in self.python_lits.items())
        ivy_python_lits_decls = "\n".join(
            "individual {}:python_object  # {}\n".format(lit, x) +
            "axiom type_of({}) = {}".format(lit, self.ivy_type_of_lit(x))
            for lit, x in python_lits
        )

        return "\n\n\n".join(
            [
                "#lang ivy1.3",
                "\n".join("# " + line for line in tac.cfg_to_lines(tac_blocks_cfg)),
                ivy_type_decls,
                ivy_can_run_decls,
                ivy_python_lits_decls,
                ivy_python_vars_decls,
            ] +
            actions
        )