self.generator = generator
self.actor = actor
self.active = set()
+ self.busy = True
self.done = False
def _process_transactions(self, s):
else:
raise TypeError
self.active -= completed
+ if not self.active:
+ self.busy = True
def _next_transactions(self):
try:
transactions = next(self.generator)
except StopIteration:
self.done = True
+ self.busy = False
transactions = None
if isinstance(transactions, Token):
self.active = {transactions}
self.active = set()
else:
raise TypeError
+ if all(transaction.idle_wait for transaction in self.active):
+ self.busy = False
def do_simulation(self, s):
if not self.done:
self.token_exchanger = TokenExchanger(generator, self)
def update_busy(self, s):
- s.wr(self.busy, not self.token_exchanger.done)
+ s.wr(self.busy, self.token_exchanger.busy)
def get_fragment(self):
return self.token_exchanger.get_fragment() + Fragment(sim=[self.update_busy])
class Pytholite(UnifiedIOObject):
def __init__(self, dataflow=None, buses={}):
super().__init__(dataflow, buses)
+ if dataflow is not None:
+ self.busy.reset = 1
self.memory_ports = dict((mem, mem.get_port(write_capable=True, we_granularity=8))
for mem in self._memories)
def _gen_df_io(compiler, modelname, to_model, from_model):
epname = ast.literal_eval(to_model["endpoint"])
values = to_model["value"]
+ idle_wait = ast.literal_eval(to_model["idle_wait"])
ep = compiler.ioo.endpoints[epname]
+ if idle_wait:
+ state = [compiler.ioo.busy.eq(0)]
+ else:
+ state = []
if isinstance(values, ast.Name) and values.id == "None":
# token pull from sink
if not isinstance(ep, Sink):
raise TypeError("Attempted to pull from source")
ec = _TokenPullExprCompiler(compiler.symdict, modelname, ep)
- state = []
for target_regs, expr in from_model:
cexpr = ec.visit_expr(expr)
state += [reg.load(cexpr) for reg in target_regs]
raise TypeError("Attempted to read from pushed token")
if not isinstance(values, ast.Dict):
raise NotImplementedError
- state = []
for akey, value in zip(values.keys, values.values):
key = ast.literal_eval(akey)
signal = getattr(ep.token, key)
desc = [
"endpoint",
("value", ast.Name("None", ast.Load())),
+ ("idle_wait", ast.Name("False", ast.Load()))
]
args = _decode_args(desc, to_model, to_model_kw)
return _gen_df_io(compiler, modelname, args, from_model)