FAILURE MAP
← Case archive

FA-89156 / Digital logic simulation / Open access

Leading unknown run not collapsed · case 01

An all-unknown vector is dumped as 'bxxx' instead of 'bx'.

Verified by executionVariant 1 · 7 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

Only leading zeros are removed; the x/z left-extension rule is not applied.

VERIFIED REPAIR

Collapse a leading run of x or z to a single character.

Unsuccessful approach: Stripping the unknowns entirely changes the value, since left-extension needs one x kept.

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 False:
            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 fixtureActualExpectedOutcome
clock toggles['#0', '0!', 'b0 "', 'bxxx %', '#5', '1!', '#10', '0!', '#11', '1!']['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', '0!', '#11', '1!']Failed
redundant samples suppressed['#0', '0!', 'b0 "', 'bxxx %', '#4', 'b11 "', '#8', '1!']['#0', '0!', 'b0 "', 'bx %', '#4', 'b11 "', '#8', '1!']Failed
return to initial value['#0', '0!', 'b0 "', 'bxxx %', '#2', '1!', '#5', '0!']['#0', '0!', 'b0 "', 'bx %', '#2', '1!', '#5', '0!']Failed
redundant then real change at one time['#0', '0!', 'b0 "', 'bxxx %', '#5', '1!', '#10', 'b1000 "']['#0', '0!', 'b0 "', 'bx %', '#5', '1!', '#10', 'b1000 "']Failed
vector back to all zeros['#0', '0!', 'b0 "', 'bxxx %', '#1', 'b100 "', '#3', 'b0 "']['#0', '0!', 'b0 "', 'bx %', '#1', 'b100 "', '#3', 'b0 "']Failed
short vector values['#0', '0!', 'b0 "', 'bxxx %', '#3', 'b1 "', '#4', 'b1 %']['#0', '0!', 'b0 "', 'bx %', '#3', 'b1 "', '#4', 'b1 %']Failed
unknown left extension['#0', '0!', 'b0 "', 'bxxx %', '#4', 'bxx1 %', '#5', 'bzz0 %', '#7', 'bxxx %']['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %']Failed

SHA-256 / fd2dc3e99dc01cdb1eaa1f4fab38f5bdf874c537434d4906a6022d3257583db9

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.lstrip('xz') or 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 fixtureActualExpectedOutcome
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', 'b1 %', '#5', 'b0 %', '#7', 'bx %']['#0', '0!', 'b0 "', 'bx %', '#4', 'bx1 %', '#5', 'bz0 %', '#7', 'bx %']Failed

SHA-256 / 26d867e8de500d796f2d6b5a639f195238e2a66cd10a39aa14fbb28183ee3be1

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 fixtureActualExpectedOutcome
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.784040+00:00.

Case digest / 2998fcd37612201c25639d196339c89eefbdf0ac809774346e8ff91dbf9ec7b8