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))
评论列表
文章目录