Skip to content

Commit 90f0dfa

Browse files
author
Sebastien Bourdeauducq
committedJan 27, 2014
Add 'passive' simulation functions that are not taken into account while determining when to stop the simulator
1 parent 63c1d7e commit 90f0dfa

File tree

5 files changed

+60
-43
lines changed

5 files changed

+60
-43
lines changed
 

Diff for: ‎migen/bus/lasmibus.py

+2
Original file line numberDiff line numberDiff line change
@@ -260,6 +260,7 @@ def do_simulation(self, selfp):
260260
else:
261261
selfp.bank.req_ack = 0
262262
selfp.bank.lock = bool(self.contents)
263+
do_simulation.passive = True
263264

264265
class Target(Module):
265266
def __init__(self, model, *ifargs, **ifkwargs):
@@ -305,3 +306,4 @@ def do_simulation(self, selfp):
305306
if done_wr_transaction is not None:
306307
self.model.write(done_wr_transaction[0], done_wr_transaction[1],
307308
selfp.bus.dat_w, selfp.bus.dat_we)
309+
do_simulation.passive = True

Diff for: ‎migen/bus/wishbone.py

+2
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ def do_simulation(self, selfp):
212212
transaction = TRead(selfp.bus.adr,
213213
selfp.bus.dat_r)
214214
self.handler(transaction)
215+
do_simulation.passive = True
215216

216217
class Initiator(Module):
217218
def __init__(self, generator, bus=None):
@@ -277,6 +278,7 @@ def do_simulation(self, selfp):
277278
bus.ack = 1
278279
else:
279280
bus.ack = 0
281+
do_simulation.passive = True
280282

281283
class SRAM(Module):
282284
def __init__(self, mem_or_size, read_only=None, init=None, bus=None):

Diff for: ‎migen/fhdl/module.py

+3-5
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from migen.fhdl.structure import *
66
from migen.fhdl.structure import _Fragment
77
from migen.fhdl.tools import rename_clock_domain
8-
from migen.sim.upper import GenSim, ProxySim
8+
from migen.sim.upper import gen_sim, proxy_sim
99

1010
class FinalizeError(Exception):
1111
pass
@@ -115,11 +115,9 @@ def __getattr__(self, name):
115115
except AttributeError:
116116
pass
117117
else:
118-
gs = GenSim(simg)
119-
simf = gs.do_simulation
118+
simf = gen_sim(simg)
120119
if simf is not None:
121-
ps = ProxySim(self, simf)
122-
simf = ps.do_simulation
120+
simf = proxy_sim(self, simf)
123121
sim = [] if simf is None else [simf]
124122
self._fragment = _Fragment(sim=sim)
125123
return self._fragment

Diff for: ‎migen/sim/generic.py

+20-15
Original file line numberDiff line numberDiff line change
@@ -72,32 +72,22 @@ def get(self, sockaddr):
7272
r += "\nendmodule"
7373
return r
7474

75-
def _call_sim(fragment, simulator):
76-
del_list = []
77-
for s in fragment.sim:
78-
try:
79-
s(simulator)
80-
except StopSimulation:
81-
del_list.append(s)
82-
for s in del_list:
83-
fragment.sim.remove(s)
84-
8575
class Simulator:
8676
def __init__(self, fragment, top_level=None, sim_runner=None, sockaddr="simsocket", **vopts):
8777
if not isinstance(fragment, _Fragment):
8878
fragment = fragment.get_fragment()
8979
if top_level is None:
9080
top_level = TopLevel()
9181
if sim_runner is None:
92-
sim_runner = icarus.Runner()
93-
self.fragment = fragment + _Fragment(clock_domains=top_level.clock_domains)
82+
sim_runner = icarus.Runner()
9483
self.top_level = top_level
9584
self.ipc = Initiator(sockaddr)
9685
self.sim_runner = sim_runner
9786

9887
c_top = self.top_level.get(sockaddr)
9988

100-
c_fragment, self.namespace = verilog.convert(self.fragment,
89+
fragment = fragment + _Fragment(clock_domains=top_level.clock_domains)
90+
c_fragment, self.namespace = verilog.convert(fragment,
10191
ios=self.top_level.ios,
10292
name=self.top_level.dut_type,
10393
return_ns=True,
@@ -110,16 +100,31 @@ def __init__(self, fragment, top_level=None, sim_runner=None, sockaddr="simsocke
110100
self.ipc.accept()
111101
reply = self.ipc.recv()
112102
assert(isinstance(reply, MessageTick))
103+
104+
self.sim_functions = fragment.sim
105+
self.active_sim_functions = set(f for f in fragment.sim if not hasattr(f, "passive") or not f.passive)
113106

114107
def run(self, ncycles=None):
115108
counter = 0
116-
while self.fragment.sim and (ncycles is None or counter < ncycles):
109+
while self.active_sim_functions and (ncycles is None or counter < ncycles):
117110
self.cycle_counter += 1
118111
counter += 1
119112
self.ipc.send(MessageGo())
120113
reply = self.ipc.recv()
121114
assert(isinstance(reply, MessageTick))
122-
_call_sim(self.fragment, self)
115+
116+
del_list = []
117+
for s in self.sim_functions:
118+
try:
119+
s(self)
120+
except StopSimulation:
121+
del_list.append(s)
122+
for s in del_list:
123+
self.sim_functions.remove(s)
124+
try:
125+
self.active_sim_functions.remove(s)
126+
except KeyError:
127+
pass
123128

124129
def rd(self, item, index=0):
125130
name = self.top_level.top_name + "." \

Diff for: ‎migen/sim/upper.py

+33-23
Original file line numberDiff line numberDiff line change
@@ -52,48 +52,58 @@ def __setitem__(self, key, value):
5252
assert(isinstance(item, Signal))
5353
self.simulator.wr(item, value)
5454

55-
class GenSim:
56-
def __init__(self, simg):
57-
self.simg = simg
58-
self.gens = dict()
59-
self.resume_cycle = 0
55+
def gen_sim(simg):
56+
gens = dict()
57+
resume_cycle = 0
58+
59+
def do_simulation(s):
60+
nonlocal resume_cycle, gens
6061

61-
def do_simulation(self, s):
6262
if isinstance(s, Proxy):
6363
simulator = s.simulator
6464
else:
6565
simulator = s
6666

67-
if simulator.cycle_counter >= self.resume_cycle:
67+
if simulator.cycle_counter >= resume_cycle:
6868
try:
69-
gen = self.gens[simulator]
69+
gen = gens[simulator]
7070
except KeyError:
71-
gen = self.simg(s)
72-
self.gens[simulator] = gen
71+
gen = simg(s)
72+
gens[simulator] = gen
7373
try:
7474
n = next(gen)
7575
except StopIteration:
76-
del self.gens[simulator]
76+
del gens[simulator]
7777
raise StopSimulation
7878
else:
7979
if n is None:
8080
n = 1
81-
self.resume_cycle = simulator.cycle_counter + n
81+
resume_cycle = simulator.cycle_counter + n
82+
83+
if hasattr(simg, "passive"):
84+
do_simulation.passive = simg.passive
85+
86+
return do_simulation
87+
8288

83-
class ProxySim:
84-
def __init__(self, target, simf):
85-
self.target = target
86-
self.simf = simf
87-
self.proxies = dict()
89+
def proxy_sim(target, simf):
90+
proxies = dict()
91+
92+
def do_simulation(simulator):
93+
nonlocal proxies
8894

89-
def do_simulation(self, simulator):
9095
try:
91-
proxy = self.proxies[simulator]
96+
proxy = proxies[simulator]
9297
except KeyError:
93-
proxy = Proxy(simulator, self.target)
94-
self.proxies[simulator] = proxy
98+
proxy = Proxy(simulator, target)
99+
proxies[simulator] = proxy
95100
try:
96-
self.simf(proxy)
101+
simf(proxy)
97102
except StopSimulation:
98-
del self.proxies[simulator]
103+
del proxies[simulator]
99104
raise
105+
106+
if hasattr(simf, "passive"):
107+
do_simulation.passive = simf.passive
108+
109+
return do_simulation

0 commit comments

Comments
 (0)
Please sign in to comment.