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)
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 )