2018-12-18 11:05:37 -07:00
|
|
|
import functools
|
|
|
|
import collections
|
|
|
|
import inspect
|
2018-12-14 09:22:18 -07:00
|
|
|
from ...back.pysim import *
|
|
|
|
|
|
|
|
|
2018-12-18 11:05:37 -07:00
|
|
|
__all__ = ["run_simulation", "passive"]
|
2018-12-14 09:22:18 -07:00
|
|
|
|
|
|
|
|
|
|
|
def run_simulation(fragment_or_module, generators, clocks={"sync": 10}, vcd_name=None,
|
|
|
|
special_overrides={}):
|
|
|
|
assert not special_overrides
|
|
|
|
|
|
|
|
if hasattr(fragment_or_module, "get_fragment"):
|
2019-01-25 19:31:12 -07:00
|
|
|
fragment = fragment_or_module.get_fragment()
|
2018-12-14 09:22:18 -07:00
|
|
|
else:
|
|
|
|
fragment = fragment_or_module
|
|
|
|
|
|
|
|
if not isinstance(generators, dict):
|
|
|
|
generators = {"sync": generators}
|
|
|
|
|
|
|
|
with Simulator(fragment, vcd_file=open(vcd_name, "w") if vcd_name else None) as sim:
|
|
|
|
for domain, period in clocks.items():
|
2018-12-14 09:46:16 -07:00
|
|
|
sim.add_clock(period / 1e9, domain=domain)
|
2018-12-18 11:05:37 -07:00
|
|
|
for domain, processes in generators.items():
|
|
|
|
if isinstance(processes, collections.Iterable) and not inspect.isgenerator(processes):
|
|
|
|
for process in processes:
|
|
|
|
sim.add_sync_process(process, domain=domain)
|
|
|
|
else:
|
|
|
|
sim.add_sync_process(processes, domain=domain)
|
2018-12-14 09:22:18 -07:00
|
|
|
sim.run()
|
2018-12-18 11:05:37 -07:00
|
|
|
|
|
|
|
|
|
|
|
def passive(generator):
|
|
|
|
@functools.wraps(generator)
|
|
|
|
def wrapper(*args, **kwargs):
|
|
|
|
yield Passive()
|
|
|
|
yield from generator(*args, **kwargs)
|
|
|
|
return wrapper
|