Skip to content

Commit

Permalink
Merge pull request #149 from srivatsansoft/master
Browse files Browse the repository at this point in the history
A single simulation instance fix for issue #104
  • Loading branch information
jandecaluwe committed Mar 1, 2016
2 parents 8c4ae9d + 41081e3 commit 9711dde
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 8 deletions.
20 changes: 14 additions & 6 deletions myhdl/_Simulation.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ class _error:
_error.ArgType = "Inappriopriate argument type"
_error.MultipleCosim = "Only a single cosimulator argument allowed"
_error.DuplicatedArg = "Duplicated argument"
_error.MultipleSim = "Only a single Simulation instance is allowed"

class Simulation(object):

Expand All @@ -54,6 +55,7 @@ class Simulation(object):
run -- run a simulation for some duration
"""
_no_of_instances = 0

def __init__(self, *args):
""" Construct a simulation object.
Expand All @@ -65,13 +67,16 @@ def __init__(self, *args):
_simulator._time = 0
arglist = _flatten(*args)
self._waiters, self._cosim = _makeWaiters(arglist)
if Simulation._no_of_instances > 0:
raise SimulationError(_error.MultipleSim)
Simulation._no_of_instances += 1
if not self._cosim and _simulator._cosim:
warn("Cosimulation not registered as Simulation argument")
self._finished = False
del _futureEvents[:]
del _siglist[:]


def _finalize(self):
cosim = self._cosim
if cosim:
Expand All @@ -85,9 +90,12 @@ def _finalize(self):
# clean up for potential new run with same signals
for s in _signals:
s._clear()
Simulation._no_of_instances = 0
self._finished = True



def quit(self):
self._finalize()

def runc(self, duration=0, quiet=0):
simrunc.run(sim=self, duration=duration, quiet=quiet)

Expand Down Expand Up @@ -201,7 +209,7 @@ def run(self, duration=None, quiet=0):
self._finalize()
# now reraise the exepction
raise


def _makeWaiters(arglist):
waiters = []
Expand Down Expand Up @@ -231,4 +239,4 @@ def _makeWaiters(arglist):
if hasattr(sig, '_waiter'):
waiters.append(sig._waiter)
return waiters, cosim

43 changes: 43 additions & 0 deletions myhdl/test/bugs/test_issue_104.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
from __future__ import print_function
import pytest
from myhdl import Simulation, delay, SimulationError, instance, now
from myhdl._Simulation import _error
from helpers import raises_kind

def test():
@instance
def tbstim():
yield delay(10)
print("{0:<8d} ".format(now()))
yield delay(1000)
print("{0:<8d} ".format(now()))
for _ in range(10):
yield delay(1000)

return tbstim


def issue_104_quit_method():
sim = Simulation(test())
sim.run(1000)
sim.run(500)
sim.quit()
return sim._finished

def issue_104_multiple_instance():
sim1 = Simulation(test())
sim1.run(1000)
# sim1 is "puased"

# try and create a second, third, forth simulation instance
for ii in range(4):
with raises_kind(SimulationError, _error.MultipleSim):
another_sim = Simulation(test())
# generating more sims should have failed
sim1.run(1000)
sim1.quit()

def test_issue_104():

assert issue_104_quit_method() == True
issue_104_multiple_instance()
8 changes: 6 additions & 2 deletions myhdl/test/core/test_traceSignals.py
Original file line number Diff line number Diff line change
Expand Up @@ -155,12 +155,16 @@ def testHierarchicalTrace2(self, vcd_dir):
assert not path.exists(psub)

def testTristateTrace(self, vcd_dir):
Simulation(topTristate()).run(100, quiet=QUIET)
sim = Simulation(topTristate())
sim.run(100, quiet=QUIET)
sim.quit()

def testBackupOutputFile(self, vcd_dir):
p = "%s.vcd" % fun.__name__
dut = traceSignals(fun)
Simulation(dut).run(1000, quiet=QUIET)
sim = Simulation(dut)
sim.run(1000, quiet=QUIET)
sim.quit()
_simulator._tf.close()
_simulator._tracing = 0
size = path.getsize(p)
Expand Down

0 comments on commit 9711dde

Please sign in to comment.