These are wtf's defaults. ? in the window shows the keys of where you are; [keys] and [leader] in the config file change them (see the names below).
In the waveforms
Move
| Keys | Does |
|---|---|
| h l | cursor left / right |
| w b | next / prev change |
| gg G | start / end |
| z x | zoom in / out |
| c | center the cursor |
| H L | screen left / right |
| Ctrl-d/u | half a screen |
Rows
| Keys | Does |
|---|---|
| j k | select a row |
| Ctrl-f/b | a screen of rows |
| Enter | fold a group or bus |
| e | the whole value |
| yy yt | copy value / time |
Change
| Keys | Does |
|---|---|
| a | add signals |
| dd | remove |
| J K | move down / up |
| V | select rows; Esc ends |
| r | next radix |
| u Ctrl-r | undo / redo |
Search
| Keys | Does |
|---|---|
| / | search |
| n N | next / previous match |
Marks
| Keys | Does |
|---|---|
| m M | put / remove a mark |
| Tab/S-Tab | next / previous mark |
| '2..'9 | jump to a mark |
| '' | back before the jump |
Other
| Keys | Does |
|---|---|
| : | command |
| Space | leader menu |
| 5l 3w | a count repeats a key |
| q | quit |
Search expressions
| Type | Finds |
|---|---|
/0x40 | the selected row's value, in any radix |
/x /z | unknown, high impedance |
/valid && ready && data == 0x40 | several signals at once |
/@clk fell(valid) && !past(ready) | sampled at clk; also rose() stable() |
In the signal panel
a opens the panel: the trace's scopes and signals as a tree.
Move
| Keys | Does |
|---|---|
| j k | move |
| l h | open / close a scope |
| gg G | first / last line |
| / | search paths |
| n N | next / previous match |
Mark
| Keys | Does |
|---|---|
| Space | mark a signal or scope |
| V | mark a range |
| Ctrl-a | mark all matches |
Add
| Keys | Does |
|---|---|
| Enter | add as rows |
| Ctrl-g | add as a group |
| u Ctrl-r | undo / redo |
| a | close |
| Esc | clear marks / close |
New signals go below the selected row, at the accent line.
In the records table
:records opens it on a set of streams. The keys are fixed.
| Keys | Does |
|---|---|
| j k | move |
| Ctrl-f Ctrl-b | a screen of records |
| g G | first / last record |
| h l | scroll the columns |
| / | filter; Enter or Esc stops, Ctrl-u clears |
| s S | sort by the next column / reverse |
| = | group by the sorted field; again to ungroup |
| Tab Shift-Tab | next / previous set |
| Enter | jump to a record; on a group, keep its records |
| Esc q | close |
In the picker
:pick <source> opens it: typing edits the query. The keys are fixed.
| Keys | Does |
|---|---|
| Ctrl-n Ctrl-p Down Up | move |
| PageDown PageUp | a box of entries |
| Backspace | delete a character of the query |
| Tab | mark the signal and move on |
| Ctrl-s | next source |
| Enter | pick and close |
| Esc | close |
The Space menu
Space opens a menu of everything that has no key of its own. Groups open with their key; Backspace goes back up.
| Keys | Does | Runs |
|---|---|---|
| Space f | find a signal | :pick signals |
| Space m | marks | :pick marks |
| Space r | records | :pick records |
| Space : | commands | :pick commands |
| Space n | messages | :messages |
| Space ? | keys | :help |
Space v view
| Keys | Does | Runs |
|---|---|---|
| Space v g | group the selection… | :group |
| Space v r | rename the group… | :rename |
| Space v u | ungroup | :ungroup |
| Space v c | colour… | :color |
| Space v x | radix… | :radix |
Space t time
| Keys | Does | Runs |
|---|---|---|
| Space t f | zoom to fit | :fit |
| Space t z | zoom to… | :zoom |
| Space t m | mark at a time… | :cursor |
Space d decode
| Keys | Does | Runs |
|---|---|---|
| Space d d | decode an interface: the ones found in the trace, each with its line | :pick interfaces |
| Space d D | decode by hand… | :decode |
| Space d p | protocol… | :protocol |
| Space d s | computed signal… | :signal |
| Space d n | name values… | :names |
| Space d r | records where… | :records |
Space a agent
| Keys | Does | Runs |
|---|---|---|
| Space a f | follow…: the window shows its workspace as it works | :follow |
| Space a F | stop following: your own view back | :follow off |
| Space a t | trail: its steps; Enter jumps to one's time | :pick trail |
| Space a j | join a session…: the agents working on this machine | :pick sessions |
| Space a s | the agent's session: what it left while no window was open | :agent |
Space q session
| Keys | Does | Runs |
|---|---|---|
| Space q w | save: rows, marks and decodes, beside the trace | :w |
| Space q e | reload the trace: after the simulation ran again | :e |
| Space q q | quit: refused with unsaved changes | :q |
| Space q x | save and quit | :wq |
| Space q Q | quit without saving: unsaved changes are lost | :q! |
Commands
: opens the command line; Tab completes, and the card above it says what each command does.
| Command | Does |
|---|---|
:<time> | Move the cursor to a time, e.g. :2000ns |
:zoom <time> | Set the time per column, e.g. :zoom 1ns |
:add <path|pattern>... | Add signals below the selected row (after a selected group); a scope becomes a group, e.g. :add top.cpu.* |
:rm [path|pattern]... | Remove matching rows, or the selected row; :rm ** removes all |
:signal <name> = <signal> | Name a computed signal, e.g. :signal op = cmd[7:0] or :signal hdr = {a, b} |
:decode <name> <protocol> <role>=<signal>... | Decode a protocol into streams, e.g. :decode rx axis clock=clk tvalid=rx_tvalid tready=rx_tready tdata=rx_tdata tlast=rx_tlast |
:protocol <name> roles=<a,b> when=<expr> <field>=<expr>... | Define a protocol on its roles, a record per cycle where when holds, e.g. :protocol cmd roles=valid,ready,data when=valid && ready op=data[7:0]; :decode puts it on signals |
:names <signal> <value>=<name>... | Name a signal's values, shown by the enum radix and searched by name, e.g. :names state 0=IDLE 1=BUSY; off removes them |
:records <streams> [where <expr>] | Browse records as a table: a stream, a decode's results (:records bus), a glob; / filters, s sorts, = groups |
:scope [path] | Resolve names under a scope first, e.g. :scope top.cpu makes state top.cpu.state; none without a path |
:radix <name> | Set the radix: hex bin dec sdec oct ascii float enum, q4.12 / uq4.12 fixed point |
:color <name|off> | Colour the selected row or group: red orange yellow green cyan blue magenta gray; off for the theme's |
:group <name> | Group the selected rows (V selects them) |
:rename <name> | Rename the group the selected row is in |
:ungroup | Dissolve the group the selected row is in, keeping its signals |
:select <row> [<last row>] | Select a signal or group by name, or the rows from one to another |
:pick <source> | A fuzzy list with a preview: signals, marks, records |
:messages | Every message so far, with its time and who caused it: you or an agent |
:trail | The agent's steps; Enter jumps to a step's time |
:cursor <n> [time|off] [name=] [note=] | Put mark n at a time (1: the cursor), name it, remove it, or jump to it, e.g. :cursor 2 120ns name=bad write |
:undo | Undo the last change to the rows |
:redo | Redo a change undone with :undo |
:fit [<from> <to>] | Zoom to the whole simulation, or between cursors or times, e.g. :fit '2 '3 or :fit 10ns 20ns |
:agent | Show the session an agent left for this trace when no window was open |
:follow [<id>|off] | Follow an agent working on this trace: show its workspace and each change it makes |
:e | Reload the trace, keeping signals, groups, cursor and zoom |
:w [file] | Save the session |
:wq | Save the session and quit |
:help [topic] | Show the keys of the current mode (also ?), or a topic: names times radix expressions decode records workspace commands |
:q | Quit; refuses if the session has unsaved changes |
:q! | Quit without saving |
Names for [keys]
Each key's name in the config file's [keys] table, with its default. A count before a key marked count repeats it (5l), or numbers a mark (3m).
[keys]
zoom_in = "i" # z
start = "<C-g>" # gg
| Name | Default | Does |
|---|---|---|
left | h | cursor left, count |
right | l | cursor right, count |
next_change | w | next change, count |
prev_change | b | previous change, count |
down | j | next row, count |
up | k | previous row, count |
fold | <CR> | open / fold the row |
examine | e | the whole value |
start | gg | start of the trace |
end | G | end of the trace |
half_right | <C-d> | half a screen right, count |
half_left | <C-u> | half a screen left, count |
screen_left | H | screen left, count |
screen_right | L | screen right, count |
center | c | center the cursor |
page_down | <C-f> | a screen of rows down, count |
page_up | <C-b> | a screen of rows up, count |
zoom_in | z | zoom in, count |
zoom_out | x | zoom out, count |
panel | a | add signals |
remove | dd | remove the row |
move_down | J | move the row down, count |
move_up | K | move the row up, count |
range | V | select rows |
radix | r | next radix |
undo | u | undo |
redo | <C-r> | redo |
copy_value | yy | copy the value |
copy_time | yt | copy the cursor's time |
search | / | search a value |
next_match | n | next match, count |
prev_match | N | previous match, count |
mark | m | put mark N, count |
unmark | M | remove mark N, count |
next_mark | <Tab> | next mark |
prev_mark | <S-Tab> | previous mark |
jump | ' | jump to a cursor |
jump_back | '' | back before the jump |
command | : | command |
help | ? | keys |
quit | q | quit |
leader | <Space> | the leader menu |