from migen.flow.network import *
from migen.flow.transactions import *
from migen.actorlib.sim import *
from migen.pytholite.compiler import Pytholite
from migen.sim.generic import run_simulation
from migen.fhdl import verilog

layout = [("r", 32)]

def number_gen(n):
	for i in range(n):
		yield Token("result", {"r": i})

class SimNumberGen(SimActor):
	def __init__(self):
		self.result = Source(layout)
		SimActor.__init__(self, number_gen(5))

def run_ng_sim(ng):
	g = DataFlowGraph()
	d = Dumper(layout)
	g.add_connection(ng, d)

	c = CompositeActor(g)
	run_simulation(c, ncycles=20)

def make_ng_pytholite():
	ng_pytholite = Pytholite(number_gen, 5)
	ng_pytholite.result = Source(layout)
	ng_pytholite.finalize()
	return ng_pytholite

def main():
	print("Simulating native Python:")
	ng_native = SimNumberGen()
	run_ng_sim(ng_native)

	print("Simulating Pytholite:")
	ng_pytholite = make_ng_pytholite()
	run_ng_sim(ng_pytholite)

	print("Converting Pytholite to Verilog:")
	ng_pytholite = make_ng_pytholite()
	print(verilog.convert(ng_pytholite))

main()