back.pysim: allow processes to evaluate expressions.
This commit is contained in:
parent
151d079f01
commit
3ad79ec690
|
@ -421,25 +421,30 @@ class Simulator:
|
||||||
|
|
||||||
def _run_process(self, process):
|
def _run_process(self, process):
|
||||||
try:
|
try:
|
||||||
stmt = process.send(None)
|
cmd = process.send(None)
|
||||||
except StopIteration:
|
while True:
|
||||||
self._processes.remove(process)
|
if isinstance(cmd, Delay):
|
||||||
self._passive.discard(process)
|
if cmd.interval is None:
|
||||||
return
|
interval = self._epsilon
|
||||||
|
else:
|
||||||
if isinstance(stmt, Delay):
|
interval = cmd.interval
|
||||||
self._wait_deadline[process] = self._timestamp + stmt.interval
|
self._wait_deadline[process] = self._timestamp + interval
|
||||||
self._suspended.add(process)
|
self._suspended.add(process)
|
||||||
|
|
||||||
elif isinstance(stmt, Tick):
|
elif isinstance(cmd, Tick):
|
||||||
self._wait_tick[process] = stmt.domain
|
self._wait_tick[process] = cmd.domain
|
||||||
self._suspended.add(process)
|
self._suspended.add(process)
|
||||||
|
|
||||||
elif isinstance(stmt, Passive):
|
elif isinstance(cmd, Passive):
|
||||||
self._passive.add(process)
|
self._passive.add(process)
|
||||||
|
|
||||||
elif isinstance(stmt, Assign):
|
elif isinstance(cmd, Value):
|
||||||
lhs_signals = stmt.lhs._lhs_signals()
|
funclet = _RHSValueCompiler(sensitivity=ValueSet())(cmd)
|
||||||
|
cmd = process.send(funclet(self._state))
|
||||||
|
continue
|
||||||
|
|
||||||
|
elif isinstance(cmd, Assign):
|
||||||
|
lhs_signals = cmd.lhs._lhs_signals()
|
||||||
for signal in lhs_signals:
|
for signal in lhs_signals:
|
||||||
if not signal in self._signals:
|
if not signal in self._signals:
|
||||||
raise ValueError("Process {!r} sent a request to set signal '{!r}', "
|
raise ValueError("Process {!r} sent a request to set signal '{!r}', "
|
||||||
|
@ -447,10 +452,11 @@ class Simulator:
|
||||||
.format(process, signal))
|
.format(process, signal))
|
||||||
if signal in self._comb_signals:
|
if signal in self._comb_signals:
|
||||||
raise ValueError("Process {!r} sent a request to set signal '{!r}', "
|
raise ValueError("Process {!r} sent a request to set signal '{!r}', "
|
||||||
"which is a part of combinatorial assignment in simulation"
|
"which is a part of combinatorial assignment in "
|
||||||
|
"simulation"
|
||||||
.format(process, signal))
|
.format(process, signal))
|
||||||
|
|
||||||
funclet = _StatementCompiler()(stmt)
|
funclet = _StatementCompiler()(cmd)
|
||||||
funclet(self._state)
|
funclet(self._state)
|
||||||
|
|
||||||
domains = set()
|
domains = set()
|
||||||
|
@ -459,8 +465,14 @@ class Simulator:
|
||||||
self._commit_sync_signals(domains)
|
self._commit_sync_signals(domains)
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise TypeError("Received unsupported statement '{!r}' from process {!r}"
|
raise TypeError("Received unsupported command '{!r}' from process {!r}"
|
||||||
.format(stmt, process))
|
.format(cmd, process))
|
||||||
|
|
||||||
|
break
|
||||||
|
|
||||||
|
except StopIteration:
|
||||||
|
self._processes.remove(process)
|
||||||
|
self._passive.discard(process)
|
||||||
|
|
||||||
def step(self, run_passive=False):
|
def step(self, run_passive=False):
|
||||||
deadline = None
|
deadline = None
|
||||||
|
|
|
@ -702,13 +702,16 @@ class Switch(Statement):
|
||||||
|
|
||||||
|
|
||||||
class Delay(Statement):
|
class Delay(Statement):
|
||||||
def __init__(self, interval):
|
def __init__(self, interval=None):
|
||||||
self.interval = float(interval)
|
self.interval = None if interval is None else float(interval)
|
||||||
|
|
||||||
def _rhs_signals(self):
|
def _rhs_signals(self):
|
||||||
return ValueSet()
|
return ValueSet()
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
if self.interval is None:
|
||||||
|
return "(delay ε)"
|
||||||
|
else:
|
||||||
return "(delay {:.3}us)".format(self.interval * 10e6)
|
return "(delay {:.3}us)".format(self.interval * 10e6)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue