litex/migen/pytholite/io.py

54 lines
1.3 KiB
Python
Raw Normal View History

import ast
2012-11-16 13:24:45 -05:00
from migen.fhdl.structure import *
2012-11-10 15:51:19 -05:00
from migen.flow.actor import *
from migen.actorlib.sim import *
2012-11-16 13:24:45 -05:00
from migen.pytholite.fsm import *
2012-11-10 15:51:19 -05:00
class Pytholite:
def get_fragment(self):
return self.fragment
class DFPytholite(Pytholite, Actor):
pass
def make_io_object(dataflow=None):
if dataflow is None:
return Pytholite()
else:
2012-11-16 13:24:45 -05:00
return DFPytholite(*dataflow)
2012-11-10 15:51:19 -05:00
2012-11-16 13:24:45 -05:00
def gen_df_io(compiler, to_model, from_model):
if len(to_model) == 1 or len(to_model) == 2:
epname = ast.literal_eval(to_model[0])
ep = compiler.ioo.endpoints[epname]
else:
raise TypeError("Token() takes 1 or 2 arguments")
if len(to_model) == 1:
# token pull from sink
raise NotImplementedError # TODO
else:
# token push to source
if from_model:
raise TypeError("Attempted to read from pushed token")
d = to_model[1]
if not isinstance(d, ast.Dict):
raise NotImplementedError
state = []
for akey, value in zip(d.keys, d.values):
key = ast.literal_eval(akey)
signal = getattr(ep.token, key)
state.append(signal.eq(compiler.ec.visit_expr(value)))
state += [
ep.stb.eq(1),
If(~ep.ack, AbstractNextState(state))
]
return [state], [state]
def gen_io(compiler, model, to_model, from_model):
2012-11-16 13:24:45 -05:00
if model == Token:
return gen_df_io(compiler, to_model, from_model)
else:
raise NotImplementedError