pytholite: forward 'yield call' statements to io module

This commit is contained in:
Sebastien Bourdeauducq 2012-11-10 22:59:14 +01:00
parent 48acb1bcfd
commit 6ebd1e4503
2 changed files with 28 additions and 7 deletions

View File

@ -7,7 +7,7 @@ from migen.fhdl.structure import _Slice
from migen.fhdl import visit as fhdl
from migen.corelogic.fsm import FSM
from migen.pytholite import transel
from migen.pytholite.io import *
from migen.pytholite.io import make_io_object, gen_io
class FinalizeError(Exception):
pass
@ -62,7 +62,8 @@ class _AbstractNextState:
self.target_state = target_state
class _Compiler:
def __init__(self, symdict, registers):
def __init__(self, ioo, symdict, registers):
self.ioo = ioo
self.symdict = symdict
self.registers = registers
self.targetname = ""
@ -101,7 +102,7 @@ class _Compiler:
elif isinstance(statement, ast.If):
test = self.visit_expr(statement.test)
states_t, exit_states_t = self.visit_block(statement.body)
states_f, exit_states_f = self.visit_block(statement.orelse)
states_f, exit_states_f = self.visit_block(statement.orelse)
test_state_stmt = If(test, _AbstractNextState(states_t[0]))
test_state = [test_state_stmt]
@ -141,6 +142,17 @@ class _Compiler:
states += states_b
exit_states += last_exit_states
del self.symdict[target]
elif isinstance(statement, ast.Expr):
if isinstance(statement.value, ast.Yield):
yvalue = statement.value.value
if not isinstance(yvalue, ast.Call) or not isinstance(yvalue.func, ast.Name):
raise NotImplementedError("Unrecognized I/O sequence")
callee = self.symdict[yvalue.func.id]
states_i, exit_states_i = gen_io(self, callee, yvalue.args, [])
states += states_i
exit_states += exit_states_i
else:
raise NotImplementedError
else:
raise NotImplementedError
return states, exit_states
@ -321,13 +333,13 @@ def _create_fsm(states):
return fsm
def make_pytholite(func, **ioresources):
pl = make_io_object(**ioresources)
ioo = make_io_object(**ioresources)
tree = ast.parse(inspect.getsource(func))
symdict = func.__globals__.copy()
registers = []
states = _Compiler(symdict, registers).visit_top(tree)
states = _Compiler(ioo, symdict, registers).visit_top(tree)
regf = Fragment()
for register in registers:
@ -337,5 +349,5 @@ def make_pytholite(func, **ioresources):
fsm = _create_fsm(states)
fsmf = _LowerAbstractLoad().visit(fsm.get_fragment())
pl.fragment = regf + fsmf
return pl
ioo.fragment = regf + fsmf
return ioo

View File

@ -1,4 +1,7 @@
import ast
from migen.flow.actor import *
from migen.actorlib.sim import *
class Pytholite:
def get_fragment(self):
@ -13,3 +16,9 @@ def make_io_object(dataflow=None):
else:
return DFPytholite(dataflow)
def gen_io(compiler, model, to_model, from_model):
print(model)
for arg in to_model:
print(ast.dump(arg))
return [], []