import networkx as nx

from migen.fhdl.structure import *
from migen.flow.actor import *
from migen.corelogic.misc import optree

class CompositeActor(Actor):
	def __init__(self, dfg): # TODO: endpoints
		self.dfg = dfg
		Actor.__init__(self,
			SchedulingModel(SchedulingModel.DYNAMIC))
	
	def get_fragment(self):
		this_fragments = [get_conn_fragment(x[0].endpoints[x[2]["source"]], x[1].endpoints[x[2]["sink"]])
			for x in self.dfg.edges(data=True)]
		this = sum(this_fragments, Fragment())
		others = sum([node.get_fragment() for node in self.dfg], Fragment())
		busy = Fragment([self.busy.eq(optree("|", [node.busy for node in self.dfg]))])
		return this + others + busy

def add_connection(dfg, source_node, sink_node, source_ep=None, sink_ep=None):
	if source_ep is None:
		source_eps = source_node.sources()
		assert(len(source_eps) == 1)
		source_ep = source_eps[0]
	if sink_ep is None:
		sink_eps = sink_node.sinks()
		assert(len(sink_eps) == 1)
		sink_ep = sink_eps[0]
	dfg.add_edge(source_node, sink_node, source=source_ep, sink=sink_ep)