FA-89146 / Digital logic simulation / Open access
All-zero vector written with no digits · case 01
A vector returning to zero is dumped as 'b <id>' with an empty value.
ROOT CAUSE
Leading-zero stripping removes every digit of an all-zero vector.
VERIFIED REPAIR
Keep a single 0 when stripping leaves nothing.
Unsuccessful approach: Falling back to the full-width string keeps redundant leading zeros.
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')
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!', 'b "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!'] | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!'] | Failed |
| redundant samples suppressed | ['#0', '0!', 'b "', 'bx %', '#4', 'b11 "', '#8', '1!'] | ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#8', '1!'] | Failed |
| return to initial value | ['#0', '0!', 'b "', 'bx %', '#2', '1!', '#5', '0!'] | ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#5', '0!'] | Failed |
| redundant then real change at one time | ['#0', '0!', 'b "', 'bx %', '#5', '1!', '#10', 'b1000 "'] | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', 'b1000 "'] | Failed |
| vector back to all zeros | ['#0', '0!', 'b "', 'bx %', '#1', 'b100 "', '#3', 'b "'] | ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#3', 'b0 "'] | Failed |
| short vector values | ['#0', '0!', 'b "', 'bx %', '#3', 'b1 "', '#4', 'b1 %'] | ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %'] | Failed |
| unknown left extension | ['#0', '0!', 'b "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %'] | ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %'] | Failed |
SHA-256 / 68cf41f6ca26252839784d90b542c0f665569c3a11617e70e416ac45d4811f53
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 v
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!', 'b0000 "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!'] | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!'] | Failed |
| redundant samples suppressed | ['#0', '0!', 'b0000 "', 'bx %', '#4', 'b11 "', '#8', '1!'] | ['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#8', '1!'] | Failed |
| return to initial value | ['#0', '0!', 'b0000 "', 'bx %', '#2', '1!', '#5', '0!'] | ['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#5', '0!'] | Failed |
| redundant then real change at one time | ['#0', '0!', 'b0000 "', 'bx %', '#5', '1!', '#10', 'b1000 "'] | ['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', 'b1000 "'] | Failed |
| vector back to all zeros | ['#0', '0!', 'b0000 "', 'bx %', '#1', 'b100 "', '#3', 'b0000 "'] | ['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#3', 'b0 "'] | Failed |
| short vector values | ['#0', '0!', 'b0000 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %'] | ['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %'] | Failed |
| unknown left extension | ['#0', '0!', 'b0000 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %'] | ['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %'] | Failed |
SHA-256 / ffcf0afbc8389714782257fb6485ceadb86c368431cace383cda330eeefe2977
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.698328+00:00.
Case digest / 4f3bbd8dbfbea3fa7eccd626360014e8462e175e727cdfbdaf5cc6a4b15556e5