back.pysim: preserve process locations through add_sync_process().
This commit is contained in:
parent
c4ba5a3915
commit
7108111ad0
|
@ -193,9 +193,9 @@ class Simulator:
|
||||||
def __init__(self, fragment, vcd_file=None, gtkw_file=None, traces=()):
|
def __init__(self, fragment, vcd_file=None, gtkw_file=None, traces=()):
|
||||||
self._fragment = fragment
|
self._fragment = fragment
|
||||||
|
|
||||||
self._domains = {} # str/domain -> ClockDomain
|
self._domains = dict() # str/domain -> ClockDomain
|
||||||
self._domain_triggers = ValueDict() # Signal -> str/domain
|
self._domain_triggers = ValueDict() # Signal -> str/domain
|
||||||
self._domain_signals = {} # str/domain -> {Signal}
|
self._domain_signals = dict() # str/domain -> {Signal}
|
||||||
|
|
||||||
self._signals = ValueSet() # {Signal}
|
self._signals = ValueSet() # {Signal}
|
||||||
self._comb_signals = ValueSet() # {Signal}
|
self._comb_signals = ValueSet() # {Signal}
|
||||||
|
@ -210,10 +210,11 @@ class Simulator:
|
||||||
self._state = _State()
|
self._state = _State()
|
||||||
|
|
||||||
self._processes = set() # {process}
|
self._processes = set() # {process}
|
||||||
|
self._process_loc = dict() # process -> str/loc
|
||||||
self._passive = set() # {process}
|
self._passive = set() # {process}
|
||||||
self._suspended = set() # {process}
|
self._suspended = set() # {process}
|
||||||
self._wait_deadline = {} # process -> float/timestamp
|
self._wait_deadline = dict() # process -> float/timestamp
|
||||||
self._wait_tick = {} # process -> str/domain
|
self._wait_tick = dict() # process -> str/domain
|
||||||
|
|
||||||
self._funclets = ValueDict() # Signal -> set(lambda)
|
self._funclets = ValueDict() # Signal -> set(lambda)
|
||||||
|
|
||||||
|
@ -224,7 +225,8 @@ class Simulator:
|
||||||
self._gtkw_file = gtkw_file
|
self._gtkw_file = gtkw_file
|
||||||
self._traces = traces
|
self._traces = traces
|
||||||
|
|
||||||
def _check_process(self, process):
|
@staticmethod
|
||||||
|
def _check_process(process):
|
||||||
if inspect.isgeneratorfunction(process):
|
if inspect.isgeneratorfunction(process):
|
||||||
process = process()
|
process = process()
|
||||||
if not inspect.isgenerator(process):
|
if not inspect.isgenerator(process):
|
||||||
|
@ -233,6 +235,13 @@ class Simulator:
|
||||||
.format(process))
|
.format(process))
|
||||||
return process
|
return process
|
||||||
|
|
||||||
|
def _name_process(self, process):
|
||||||
|
if process in self._process_loc:
|
||||||
|
return self._process_loc[process]
|
||||||
|
else:
|
||||||
|
frame = process.gi_frame
|
||||||
|
return "{}:{}".format(inspect.getfile(frame), inspect.getlineno(frame))
|
||||||
|
|
||||||
def add_process(self, process):
|
def add_process(self, process):
|
||||||
process = self._check_process(process)
|
process = self._check_process(process)
|
||||||
self._processes.add(process)
|
self._processes.add(process)
|
||||||
|
@ -245,10 +254,12 @@ class Simulator:
|
||||||
while True:
|
while True:
|
||||||
if result is None:
|
if result is None:
|
||||||
result = Tick(domain)
|
result = Tick(domain)
|
||||||
|
self._process_loc[sync_process] = self._name_process(process)
|
||||||
result = process.send((yield result))
|
result = process.send((yield result))
|
||||||
except StopIteration:
|
except StopIteration:
|
||||||
pass
|
pass
|
||||||
self.add_process(sync_process())
|
sync_process = sync_process()
|
||||||
|
self.add_process(sync_process)
|
||||||
|
|
||||||
def add_clock(self, period, phase=None, domain="sync"):
|
def add_clock(self, period, phase=None, domain="sync"):
|
||||||
if self._fastest_clock == self._epsilon or period < self._fastest_clock:
|
if self._fastest_clock == self._epsilon or period < self._fastest_clock:
|
||||||
|
@ -266,7 +277,7 @@ class Simulator:
|
||||||
yield Delay(half_period)
|
yield Delay(half_period)
|
||||||
yield clk.eq(0)
|
yield clk.eq(0)
|
||||||
yield Delay(half_period)
|
yield Delay(half_period)
|
||||||
self.add_process(clk_process())
|
self.add_process(clk_process)
|
||||||
|
|
||||||
def __enter__(self):
|
def __enter__(self):
|
||||||
if self._vcd_file:
|
if self._vcd_file:
|
||||||
|
@ -443,10 +454,6 @@ class Simulator:
|
||||||
# Otherwise, do one more round of updates.
|
# Otherwise, do one more round of updates.
|
||||||
|
|
||||||
def _run_process(self, process):
|
def _run_process(self, process):
|
||||||
def format_process(process):
|
|
||||||
frame = process.gi_frame
|
|
||||||
return "{}:{}".format(inspect.getfile(frame), inspect.getlineno(frame))
|
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cmd = process.send(None)
|
cmd = process.send(None)
|
||||||
while True:
|
while True:
|
||||||
|
@ -477,12 +484,12 @@ class Simulator:
|
||||||
if not signal in self._signals:
|
if not signal in self._signals:
|
||||||
raise ValueError("Process '{}' sent a request to set signal '{!r}', "
|
raise ValueError("Process '{}' sent a request to set signal '{!r}', "
|
||||||
"which is not a part of simulation"
|
"which is not a part of simulation"
|
||||||
.format(format_process(process), signal))
|
.format(self._name_process(process), signal))
|
||||||
if signal in self._comb_signals:
|
if signal in self._comb_signals:
|
||||||
raise ValueError("Process '{}' sent a request to set signal '{!r}', "
|
raise ValueError("Process '{}' sent a request to set signal '{!r}', "
|
||||||
"which is a part of combinatorial assignment in "
|
"which is a part of combinatorial assignment in "
|
||||||
"simulation"
|
"simulation"
|
||||||
.format(format_process(process), signal))
|
.format(self._name_process(process), signal))
|
||||||
|
|
||||||
compiler = _StatementCompiler()
|
compiler = _StatementCompiler()
|
||||||
funclet = compiler(cmd)
|
funclet = compiler(cmd)
|
||||||
|
@ -495,7 +502,7 @@ class Simulator:
|
||||||
|
|
||||||
else:
|
else:
|
||||||
raise TypeError("Received unsupported command '{!r}' from process '{}'"
|
raise TypeError("Received unsupported command '{!r}' from process '{}'"
|
||||||
.format(cmd, format_process(process)))
|
.format(cmd, self._name_process(process)))
|
||||||
|
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue