Repository navigation
Releases
wtf 0.4.0
Decoding works from forms: fill in a bus's signals in a card and wtf checks and decodes them,
select a V range to decode the interface its signals play, or turn a clocked search into a table
of its matches. Conditions read X and Z as SystemVerilog does, a name the trace doesn't have
answers with the names it does, and the agent has fewer tools to choose from. wtf is on crates.io:
cargo install --locked wtf-wave.
Breaking:
- A condition is three-valued, as in SystemVerilog:
data != 5no longer matches wheredatais
unknown,0 && xis 0,1 || xis 1 and!xis unknown. Searchdata == xfor the unknown
stretches. - The
value_attool is gone:valueswithouttoanswers one time. - The
useandreloadtools are gone:openwithsessiongoes back to one of the server's
workspaces, andopenwith neither re-reads the current file as:edoes, saying which signals
the file dropped. - The agent writes every pattern as a regex in slashes (
/^top\.cpu\./), insignals, in
command'saddandrmand inrecords; a bare word is a name, and a glob is an error that
gives the regex form. Space d ris gone:Space d llists the decodes, andEnterthere opens one's records.- A session writes a bit added from a bus as
top.x[1], nottop.x[1:1].
New:
:decodealone, orSpace d D, opens a form: name, protocol, clock and roles as fields, each
suggesting what fits and checked as you fill it in, with the:decodeline shown underneath.
It reads no values, so it opens fast on a 1 GB trace.Space d Don aVrange decodes the range's signals: each plays the role its name ends in,
and the clock is found. The right-click menu'sDecode as ▸does the same.:protocolalone, orSpace d p, opens a form for a protocol;:protocol search, orSpace d m
after a clocked search, fills it from the search, decodes it and opens the matches as records.:decodes, orSpace d l, lists the decodes with their record counts:Enteropens the
records,eedits one andddremoves it.:decode <name> offremoves one from the command
line.:namesalone, orSpace d n, lists the values a signal takes and how often, and takes a name
beside each.- A name the trace doesn't have lists the nearest names, a scope says what it holds, and a word
from another tool names the form meant:rose(x),past(x),==for=. contains(x, "text")is true where a string signal's or a text field's text holdstext.axiliteandaxi4taketimeout=: a request left unanswered longer becomesno response
instead of pairing every later response with the wrong request.>groups the selected rows orVrange and names the group in place,<takes rows out or
dissolves a group,Rrenames a group, andddkeeps what it removed forp/P.:addtakes a slice or a bit of a bus as a row of its own::add data[7:4] state[1].:signal <name> offremoves a computed signal, or says which signal or decode still reads it.- A terminal too small for wtf says so with both sizes and draws what fits; a card bigger than the
screen shows what fits too. - The agent's
helphas a topic per concept, and each tool's description and annotations stand
alone: what an argument is, what a call changes and what to try next. cargo install --locked wtf-waveinstalls wtf from crates.io.
Fixed:
- A bad time says what a time is and how to fix it: quotes, a space before the unit, an unknown
unit or no number. - A bit slice of an array element adds, names and saves as
grid[1][3], and a session row that
isn't in the trace by its full path is reported missing instead of loading a look-alike. - Names resolve again after unused computed signals are dropped, where a lookup could panic.
wtf 0.3.0
wtf opens to a start screen and works from a menu on Space. A picker finds signals and decodes
the interfaces wtf found in the trace, and :records opens a table that sorts, groups and
filters. An agent working on a trace shows in every window on it, step by step.
Breaking:
- Enter folds groups, buses, streams and composite rows, as Space is now the leader key. A click
on the fold marker still folds. wtf --attachis gone. Open the trace withwtf <trace>: an agent working on it joins the
window, and:followfollows it.:protocol, a session's[[protocol]]and theworkspacetool's protocols takerolesand no
clock. The clock goes on the decode::decode req hs clock=clk valid=req_valid.:recordsopens the records table. Awherethat keeps no records is no longer an error; the
table says none match.- The decode answers of
commandlist the results, then the violations, then the streams they
are made from.
New:
- A start screen when wtf opens without a trace, with the recent traces and the agents on this
machine. A trace without a session opens to where to start and the interfaces wtf found. - Space opens a menu of commands in groups, and which-key shows what can follow a key.
[keys]and[leader]in the config move them. - One picker (
Space f) for signals, marks, records, commands, sessions, the agent's trail and
the interfaces found, with a preview.Tabmarks several signals,Ctrl-schanges the source. Space d ddecodes one of the interfaces wtf found, andSpace d Dstarts a:decodeline.- The records table:
ssorts,=groups by the sorted field,/filters,Tabgoes to the
next set andEnterjumps to a record.recordstakes a decode name, a glob or several names. - The command line completes every command's arguments and shows short docs in a card.
- Notifications fade out, and
:messageslists them again. - A new look: cards, Nerd Font icons (
--glyphs nerd), a status line in segments, Name and
Value headers, a value column of stable width and marks as tabs on the ruler. - Marks have a name and a note (
:cursor 2 60ns name=late note=...), and undo covers marks. - An agent's queries and changes are a trail in the user's window (
:trail). When no window is
open,presentkeeps the evidence for the next one opened on the trace. - A site with a quick start, recipes and every key: https://xtrollyj00.github.io/wtf
Fixed:
:groupon rows inside a group moves them out into the new group.zoomgiven two times points tofit.- A record's field that really is z draws; only the time between records is blank (#28).
- Computed signals nothing uses are dropped, and
presentreplaces the window's decodes. - The signal panel keeps its place when computed signals are added (#35).
- A session from a newer wtf changes nothing.
- An agent's message never replaces the user's own on the status line.
wtf 0.2.0
The mouse does what GTKWave and Surfer users reach for, the keys have one mode, and structs,
records and arrays are one row each.
Breaking:
- View and Edit mode are one mode.
iand theEDITbadge are gone:dd,J/K,r,
Vanduwork next to the time keys, andEscends aVrange. /on the rows always searches values. To find a signal by name, open the panel witha,
then/.a, or thesignals ▸button at the bottom left, opens and closes the signal panel.J/Kmove a wholeVrange.- Sessions write what is open under a row as
open = ["state"];expanded = trueis no longer
read. - Every index in a path is
[i]whatever the simulator wrote (types.gen[0].p,grid[1][2]).
Names in either HDL's form are still found, and older sessions still load.
New:
- The mouse: click to select and put the cursor, the wheel to move,
Ctrl+ wheel to zoom.
Drag a row by its name to move it,Ctrl+ click to select a range, drag across the
waveforms or the time axis to zoom to that range. Double click or drag a signal out of the
panel to add it. Click a mark's number in the ruler to jump to it, drag it to move it. - A right click opens a menu of what can be done there, each item with its key.
- A struct, record or array is one row that opens a level at a time, with its whole value;
adding one takes all of its signals. - Each field under a row, a struct's or a stream's, can have its own radix and colour (
r,
:radix,:color, the menu), kept in the session. - VHDL's
grid(1, 2)names an array element.
Fixed:
- wellen's panic on a GHW file with a multidimensional array is an open error, not a crash.
value_atanswers at the time asked, not at the end of the tick it falls in.signalssays(real)or(string)instead of(real or string).- Zero shows as a bare
0on a ps or fs trace, not0ps. - A composite row's name no longer lands over its value.
The spec describes wtf as it is meant to work. The shortcuts taken so far are GitHub issues
labelled known-limit.
wtf 0.1.0
The first release.
- A Vim-like terminal viewer for VCD and FST: View and Edit modes, a searchable signal tree,
groups, buses split into bits, radixes (hex, binary, decimal, signed, octal, ASCII, float,
fixed point, FST enum names) and computed signals (data[7:4],{a, b}). - Search by value or expression, cycle by cycle with a clock (
/@clk fell(valid) && !past(ready)). - The cursor and eight marks, with the time between them on a ruler.
- Decoders for AXI-Stream, AXI4-Lite, AXI4, SPI and UART into records with latencies and protocol
errors, and protocols of your own in a few lines. - Sessions in a TOML file next to the trace;
:eand a rerun of the simulation reload it. wtf --mcp: an MCP server through which an AI agent opens the trace, decodes it and shows its
evidence in your window.- Dark and light themes, the config file,
unicode,boxandasciiglyph sets chosen on the
first start,NO_COLOR, the mouse. --snapshotrenders a screen as text or, with--ansi, in colour, after--keys.- Linux and macOS, x86_64 and arm64.