def run_analysis(cfg): import graph_utils as gu import networkx as nx Analysis = ConsProp def compute_transfer_function(): pass gu.node_data_map_inplace(cfg, attr='transfer', f=lambda n, d: compute_transfer_function(d)) nx.set_node_attributes(cfg, 'out', {n:Analysis() for n in cfg.nodes_iter()}) dataflow(cfg, 0, {}, Analysis)
def dataflow(g:'graph', start:'node', start_value, Analysis=ConsProp): import networkx as nx import graph_utils as gu gu.node_data_map_inplace(g, f=lambda n, d: Analysis.single_block_update, attr='transfer_function') nx.set_node_attributes(g, 'outb', {v: Analysis.initial() for v in g.nodes()}) nx.set_node_attributes(g, 'inb', {v: Analysis.initial() for v in g.nodes()}) g.node[start]['inb'] = Analysis.initial() wl = set(g.nodes()) while wl: u = wl.pop() udata = g.node[u] inb = udata['inb'] Analysis.join(inb, [g.node[x]['outb'] for x in g.predecessors(u)]) outb = udata['transfer_function'](udata[BLOCKNAME], inb) if outb != udata['outb']: udata['outb'] = outb wl.update(g.successors(u))