FA-89136 / Digital logic simulation / Open access
Unchanged samples written as value changes · case 01
The dump repeats values that did not change, with extra timestamp markers.
ROOT CAUSE
Samples are written without comparing against the current value of the signal.
VERIFIED REPAIR
Skip a sample whose value equals the signal's current value.
Unsuccessful approach: Comparing against the initial value suppresses a genuine return to the initial level.
Case contract
Input [sigs, samples]: sigs are [name, id, width, initial]; samples are time-sorted [t, name, value] with values as 0/1/x/z strings, possibly shorter than the width or redundant. Output starts with '#0' and one line per signal's initial value. Afterwards only real value changes are written, each timestamp marker '#t' at most once and only when a change happens at t. Width-1 signals print value+id; vectors print 'b'+value+' '+id with leading zeros removed (at least one digit kept) and a run of leading x or z collapsed to one character.
Why this case matters
Waveform dumps are how simulator results are inspected; missing, duplicated or mis-extended changes mislead debugging.
1 / The failure
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(*args):
sigs, samples = args
cur = {name: init for name, _, _, init in sigs}
ids = {name: (i, w) for name, i, w, _ in sigs}
def fmt(name, v):
i, w = ids[name]
if w == 1:
return v + i
s = v.lstrip('0') or '0'
if s[:1] in ('x', 'z'):
s = s[0] + s.lstrip(s[0])
return 'b' + s + ' ' + i
lines = ['#0'] + [fmt(name, init) for name, _, _, init in sigs]
last_t = 0
for t, name, v in samples:
if False:
continue
cur[name] = v
if t != last_t:
lines.append('#' + str(t))
last_t = t
lines.append(fmt(name, v))
return lines
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [11, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [8, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#8', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [5, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#5', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [10, 'clk', '1'], [10, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [3, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#3', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [4, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [7, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %'])], [('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [12, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#12', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [9, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#9', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [6, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#6', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [11, 'clk', '1'], [11, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#11', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [4, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#4', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [5, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#5', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [8, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#8', 'bx %'])], [('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [13, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#13', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [10, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#10', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [7, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#7', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [12, 'clk', '1'], [12, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#12', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [5, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#5', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [6, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#6', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [9, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#9', 'bx %'])], [('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [14, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#14', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [11, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#11', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [8, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#8', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [13, 'clk', '1'], [13, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#13', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [6, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#6', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [7, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#7', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [10, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#10', 'bx %'])], [('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [15, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#15', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [12, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#12', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [9, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#9', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [14, 'clk', '1'], [14, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#14', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [7, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#7', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [8, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#8', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [11, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#11', 'bx %'])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| clock toggles | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!'] | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!'] | Passed |
| redundant samples suppressed | ['#0', '0!', 'b0 "', 'bx %', '#3', 'b0 "', '#4', 'b11 "', '#6', '0!', '#8', '1!'] | ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#8', '1!'] | Failed |
| return to initial value | ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#5', '0!'] | ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#5', '0!'] | Passed |
| redundant then real change at one time | ['#0', '0!', 'b0 "', 'bx %', '#5', 'b0 "', '1!', '#10', '1!', 'b1000 "'] | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', 'b1000 "'] | Failed |
| vector back to all zeros | ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#3', 'b0 "'] | ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#3', 'b0 "'] | Passed |
| short vector values | ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %'] | ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %'] | Passed |
| unknown left extension | ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %'] | ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %'] | Passed |
SHA-256 / 4cffa24daa7f5cd644a59ed0a63df9d8bc4229da63d27e9b624c5699449d4cae
2 / The unsuccessful fix
Exit 1"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(*args):
sigs, samples = args
cur = {name: init for name, _, _, init in sigs}
ids = {name: (i, w) for name, i, w, _ in sigs}
def fmt(name, v):
i, w = ids[name]
if w == 1:
return v + i
s = v.lstrip('0') or '0'
if s[:1] in ('x', 'z'):
s = s[0] + s.lstrip(s[0])
return 'b' + s + ' ' + i
lines = ['#0'] + [fmt(name, init) for name, _, _, init in sigs]
last_t = 0
for t, name, v in samples:
if dict((s[0], s[3]) for s in sigs)[name] == v:
continue
cur[name] = v
if t != last_t:
lines.append('#' + str(t))
last_t = t
lines.append(fmt(name, v))
return lines
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [11, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [8, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#8', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [5, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#5', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [10, 'clk', '1'], [10, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [3, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#3', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [4, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [7, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %'])], [('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [12, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#12', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [9, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#9', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [6, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#6', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [11, 'clk', '1'], [11, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#11', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [4, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#4', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [5, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#5', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [8, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#8', 'bx %'])], [('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [13, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#13', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [10, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#10', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [7, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#7', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [12, 'clk', '1'], [12, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#12', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [5, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#5', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [6, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#6', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [9, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#9', 'bx %'])], [('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [14, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#14', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [11, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#11', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [8, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#8', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [13, 'clk', '1'], [13, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#13', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [6, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#6', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [7, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#7', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [10, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#10', 'bx %'])], [('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [15, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#15', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [12, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#12', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [9, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#9', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [14, 'clk', '1'], [14, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#14', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [7, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#7', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [8, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#8', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [11, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#11', 'bx %'])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| clock toggles | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#11', '1!'] | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!'] | Failed |
| redundant samples suppressed | ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#8', '1!'] | ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#8', '1!'] | Passed |
| return to initial value | ['#0', '0!', 'b0 "', 'bx %', '#2', '1!'] | ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#5', '0!'] | Failed |
| redundant then real change at one time | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '1!', 'b1000 "'] | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', 'b1000 "'] | Failed |
| vector back to all zeros | ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "'] | ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#3', 'b0 "'] | Failed |
| short vector values | ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %'] | ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %'] | Passed |
| unknown left extension | ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %'] | ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %'] | Failed |
SHA-256 / 0340749e1da562ccb39e4d90058373ce813e4d28f5df85989882c90584e93f3d
3 / The verified repair
Exit 0"""Failure Map reference implementation. Python standard library only."""
import json
N = 1
observations = []
def solve(*args):
sigs, samples = args
cur = {name: init for name, _, _, init in sigs}
ids = {name: (i, w) for name, i, w, _ in sigs}
def fmt(name, v):
i, w = ids[name]
if w == 1:
return v + i
s = v.lstrip('0') or '0'
if s[:1] in ('x', 'z'):
s = s[0] + s.lstrip(s[0])
return 'b' + s + ' ' + i
lines = ['#0'] + [fmt(name, init) for name, _, _, init in sigs]
last_t = 0
for t, name, v in samples:
if cur[name] == v:
continue
cur[name] = v
if t != last_t:
lines.append('#' + str(t))
last_t = t
lines.append(fmt(name, v))
return lines
def check(label, actual, expected):
observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [11, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [8, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#8', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [5, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#5', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [10, 'clk', '1'], [10, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [3, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#3', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [4, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [7, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %'])], [('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [12, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#12', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [9, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#9', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [6, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#6', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [11, 'clk', '1'], [11, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#11', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [4, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#4', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [5, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#5', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [8, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#8', 'bx %'])], [('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [13, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#13', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [10, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#10', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [7, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#7', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [12, 'clk', '1'], [12, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#12', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [5, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#5', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [6, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#6', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [9, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#9', 'bx %'])], [('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [14, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#14', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [11, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#11', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [8, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#8', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [13, 'clk', '1'], [13, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#13', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [6, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#6', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [7, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#7', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [10, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#10', 'bx %'])], [('clock toggles', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'clk', '1'], [10, 'clk', '0'], [15, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#15', '1!']), ('redundant samples suppressed', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '0000'], [4, 'bus', '0011'], [6, 'clk', '0'], [12, 'clk', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#12', '1!']), ('return to initial value', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[2, 'clk', '1'], [9, 'clk', '0']]], ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#9', '0!']), ('redundant then real change at one time', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[5, 'bus', '0000'], [5, 'clk', '1'], [14, 'clk', '1'], [14, 'bus', '1000']]], ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#14', 'b1000 "']), ('vector back to all zeros', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[1, 'bus', '0100'], [7, 'bus', '0000']]], ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#7', 'b0 "']), ('short vector values', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[3, 'bus', '1'], [8, 'st', '1']]], ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#8', 'b1 %']), ('unknown left extension', [[['clk', '!', 1, '0'], ['bus', '"', 4, '0000'], ['st', '%', 3, 'xxx']], [[4, 'st', 'xx1'], [5, 'st', 'zz0'], [11, 'st', 'xxx']]], ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#11', 'bx %'])]]
for label, args, expected in fixtures[N-1]:
check(label, solve(*args), expected)
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
| Boundary fixture | Actual | Expected | Outcome |
|---|---|---|---|
| clock toggles | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!'] | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!'] | Passed |
| redundant samples suppressed | ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#8', '1!'] | ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#8', '1!'] | Passed |
| return to initial value | ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#5', '0!'] | ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#5', '0!'] | Passed |
| redundant then real change at one time | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', 'b1000 "'] | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', 'b1000 "'] | Passed |
| vector back to all zeros | ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#3', 'b0 "'] | ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#3', 'b0 "'] | Passed |
| short vector values | ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %'] | ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %'] | Passed |
| unknown left extension | ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %'] | ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %'] | Passed |
SHA-256 / cde980ed572a2d7507687fa01f098b8b13db92d6bd1b0946cf9bd5d4a24d9ac0
Verification & scope
A deterministic bounded teaching model of one simulator rule set; the contract is stipulated and is not a claim of conformance to any HDL standard or commercial simulator. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.
Observations recorded using Python 3.12.14 at 2026-09-29T14:51:14.656459+00:00.
Case digest / 01e0d27c7caf6682f577054a0551b2cacdbe37454447272989b3d5e6a1491e65