Skip to content

Commit 1e9ad79

Browse files
authored
Merge pull request #395 from pllab/dont-care-in-step-multiple
Add ability to specify dont-cares in expected output of step_multiple
2 parents 70c9f6e + 8757388 commit 1e9ad79

File tree

4 files changed

+55
-8
lines changed

4 files changed

+55
-8
lines changed

pyrtl/compilesim.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ def step_multiple(self, provided_inputs={}, expected_outputs={}, nsteps=None,
137137
138138
:param provided_inputs: a dictionary mapping wirevectors to their values for N steps
139139
:param expected_outputs: a dictionary mapping wirevectors to their expected values
140-
for N steps
140+
for N steps; use '?' to indicate you don't care what the value at that step is
141141
:param nsteps: number of steps to take (defaults to None, meaning step for each
142142
supplied input value)
143143
:param file: where to write the output (if there are unexpected outputs detected)
@@ -214,7 +214,10 @@ def step_multiple(self, provided_inputs={}, expected_outputs={}, nsteps=None,
214214
self.step({w: int(v[i]) for w, v in provided_inputs.items()})
215215

216216
for expvar in expected_outputs.keys():
217-
expected = int(expected_outputs[expvar][i])
217+
expected = expected_outputs[expvar][i]
218+
if expected == '?':
219+
continue
220+
expected = int(expected)
218221
actual = self.inspect(expvar)
219222
if expected != actual:
220223
failed.append((i, expvar, expected, actual))

pyrtl/simulation.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ def step_multiple(self, provided_inputs={}, expected_outputs={}, nsteps=None,
228228
229229
:param provided_inputs: a dictionary mapping wirevectors to their values for N steps
230230
:param expected_outputs: a dictionary mapping wirevectors to their expected values
231-
for N steps
231+
for N steps; use '?' to indicate you don't care what the value at that step is
232232
:param nsteps: number of steps to take (defaults to None, meaning step for each
233233
supplied input value)
234234
:param file: where to write the output (if there are unexpected outputs detected)
@@ -305,7 +305,10 @@ def step_multiple(self, provided_inputs={}, expected_outputs={}, nsteps=None,
305305
self.step({w: int(v[i]) for w, v in provided_inputs.items()})
306306

307307
for expvar in expected_outputs.keys():
308-
expected = int(expected_outputs[expvar][i])
308+
expected = expected_outputs[expvar][i]
309+
if expected == '?':
310+
continue
311+
expected = int(expected)
309312
actual = self.inspect(expvar)
310313
if expected != actual:
311314
failed.append((i, expvar, expected, actual))
@@ -556,7 +559,7 @@ def step_multiple(self, provided_inputs={}, expected_outputs={}, nsteps=None,
556559
557560
:param provided_inputs: a dictionary mapping wirevectors to their values for N steps
558561
:param expected_outputs: a dictionary mapping wirevectors to their expected values
559-
for N steps
562+
for N steps; use '?' to indicate you don't care what the value at that step is
560563
:param nsteps: number of steps to take (defaults to None, meaning step for each
561564
supplied input value)
562565
:param file: where to write the output (if there are unexpected outputs detected)
@@ -642,7 +645,10 @@ def to_num(v):
642645
self.step({w: to_num(v[i]) for w, v in provided_inputs.items()})
643646

644647
for expvar in expected_outputs.keys():
645-
expected = int(expected_outputs[expvar][i])
648+
expected = expected_outputs[expvar][i]
649+
if expected == '?':
650+
continue
651+
expected = int(expected)
646652
actual = self.inspect(expvar)
647653
if expected != actual:
648654
failed.append((i, expvar, expected, actual))

tests/test_compilesim.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ def setUp(self):
302302
out2 <<= in1 | in2
303303
self.inputs = {
304304
'in1': [0, 1, 3, 15, 14],
305-
'in2': [6, 6, 6, 6, 6],
305+
'in2': '66666', # When a string, assumes each input is a single digit integer
306306
}
307307

308308
def test_step_multiple_nsteps_no_inputs(self):
@@ -416,6 +416,25 @@ def test_step_multiple_no_errors(self):
416416
sim_trace.print_trace(output)
417417
self.assertEqual(output.getvalue(), correct_output)
418418

419+
def test_step_multiple_dont_care_expected(self):
420+
sim_trace = pyrtl.SimulationTrace()
421+
sim = self.sim(tracer=sim_trace)
422+
423+
expected = {
424+
'out1': [7, '?', 6, 10],
425+
'out2': '6?7?',
426+
}
427+
sim.step_multiple(self.inputs, expected, nsteps=4)
428+
429+
correct_output = (" --- Values in base 10 ---\n"
430+
"in1 0 1 3 15\n"
431+
"in2 6 6 6 6\n"
432+
"out1 7 8 6 10\n"
433+
"out2 6 7 7 15\n")
434+
output = six.StringIO()
435+
sim_trace.print_trace(output)
436+
self.assertEqual(output.getvalue(), correct_output)
437+
419438
def test_step_multiple_no_errors_nsteps_specified(self):
420439
sim_trace = pyrtl.SimulationTrace()
421440
sim = self.sim(tracer=sim_trace)

tests/test_simulation.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -547,7 +547,7 @@ def setUp(self):
547547
out2 <<= in1 | in2
548548
self.inputs = {
549549
'in1': [0, 1, 3, 15, 14],
550-
'in2': [6, 6, 6, 6, 6],
550+
'in2': '66666', # When a string, assumes each input is a single digit integer
551551
}
552552

553553
def test_step_multiple_nsteps_no_inputs(self):
@@ -663,6 +663,25 @@ def test_step_multiple_no_errors(self):
663663
sim_trace.print_trace(output)
664664
self.assertEqual(output.getvalue(), correct_output)
665665

666+
def test_step_multiple_dont_care_expected(self):
667+
sim_trace = pyrtl.SimulationTrace()
668+
sim = self.sim(tracer=sim_trace)
669+
670+
expected = {
671+
'out1': [7, '?', 6, 10],
672+
'out2': '6?7?',
673+
}
674+
sim.step_multiple(self.inputs, expected, nsteps=4)
675+
676+
correct_output = (" --- Values in base 10 ---\n"
677+
"in1 0 1 3 15\n"
678+
"in2 6 6 6 6\n"
679+
"out1 7 8 6 10\n"
680+
"out2 6 7 7 15\n")
681+
output = six.StringIO()
682+
sim_trace.print_trace(output)
683+
self.assertEqual(output.getvalue(), correct_output)
684+
666685
def test_step_multiple_no_errors_nsteps_specified(self):
667686
sim_trace = pyrtl.SimulationTrace()
668687
sim = self.sim(tracer=sim_trace)

0 commit comments

Comments
 (0)