wavepeek 1.0.1

Command-line tool for RTL waveform inspection with deterministic machine-friendly output.
Documentation
# FSDB Development

FSDB support is an optional native backend for `wavepeek`. Default builds remain VCD/FST-only and do not require Synopsys Verdi. FSDB-enabled builds are local Linux x86_64 builds that link against a user-provided Verdi FSDB Reader SDK.

## User and command contract

Build FSDB support explicitly:

```sh
VERDI_HOME=/path/to/verdi cargo install wavepeek --features fsdb
```

An FSDB-enabled binary keeps the same user-facing command surface as VCD/FST for supported data:

```sh
wavepeek info     --waves dump.fsdb --json
wavepeek scope    --waves dump.fsdb --max-depth 3
wavepeek signal   --waves dump.fsdb --scope top.u0 --recursive
wavepeek value    --waves dump.fsdb --scope top.u0 --signals clk,data --at 10ns
wavepeek change   --waves dump.fsdb --scope top.u0 --signals state --on 'posedge clk'
wavepeek property --waves dump.fsdb --scope top.u0 --on 'posedge clk' --eval 'valid && ready'
```

Supported FSDB command coverage is digital bit-vector/integral data for `info`, `scope`, `signal`, `value`, `change`, and `property`. Real and string FSDB value decoding are not supported; commands that need those values fail with the existing `signal` error category.

A default binary that sees FSDB-looking input reports that FSDB support requires rebuilding with the `fsdb` Cargo feature and a local Verdi SDK.

## Verdi SDK contract

`VERDI_HOME` must point at a local licensed Verdi installation containing the FSDB Reader SDK. FSDB builds also require a system zlib runtime library (`libz.so.1`); Verdi `libnffr.so` uses gzip symbols but may not declare that dependency itself. The build and helper checks expect at least:

```text
$VERDI_HOME/share/FsdbReader/ffrAPI.h
$VERDI_HOME/share/FsdbReader/ffrKit.h
$VERDI_HOME/share/FsdbReader/fsdbShr.h
$VERDI_HOME/share/FsdbReader/<abi>/libnffr.so
$VERDI_HOME/share/FsdbReader/<abi>/libnsys.so
```

The default Reader ABI directory is `linux64`. Override it only for local SDK/toolchain compatibility:

- `WAVEPEEK_FSDB_ABI=<name>` selects `$VERDI_HOME/share/FsdbReader/<name>`; for example `linux64_gcc950`.
- `WAVEPEEK_FSDB_READER_LIBDIR=<path>` selects an explicit Reader library directory.

`WAVEPEEK_FSDB_READER_LIBDIR` changes the library directory only; `VERDI_HOME` is still required for headers.

By default, `build.rs` embeds the selected Reader library directory as an ELF rpath/RUNPATH. This makes local FSDB binaries runnable without extra `LD_LIBRARY_PATH` setup on the build machine. Set `WAVEPEEK_FSDB_EMBED_RPATH=0` only for packaging or loader environments that provide the Verdi libraries another way.

## Devcontainer behavior

The devcontainer sets `VERDI_HOME=/opt/verdi`. Before container startup, `.devcontainer/initialize.sh` prepares `~/.config/wavepeek-dev/verdi` from the host `VERDI_HOME`; the container bind-mounts that path at `/opt/verdi`. An empty `/opt/verdi` means Verdi is unavailable, not broken.

Use the helper probe to distinguish available, skipped, and broken states:

```sh
just check-fsdb-env
python3 -B tools/fsdb/check_fsdb_env.py --require
```

The devcontainer also exposes selected Verdi FSDB utilities on `PATH` through `.devcontainer/verdi-tool-wrapper.sh`, including tools such as `vcd2fsdb`, `fst2vcd`, `fsdb2vcd`, `fsdbdebug`, and `fsdbextract`. Use those wrapper commands for local debugging and fixture conversion instead of hard-coding `$VERDI_HOME/bin/...` paths.

## Quality gates

The main gates are FSDB-aware but not Verdi-mandatory:

- `just lint` runs `just lint-fsdb` when Verdi is available.
- `just check` runs `just check-fsdb-build` when Verdi is available.
- `just test` and `just ci` run `just test-fsdb` when Verdi is available; this path prepares only hand-written VCD-derived FSDB test fixtures.
- `just bench-e2e-smoke-commit` runs `just bench-e2e-fsdb-smoke-commit` when Verdi is available; the pre-commit smoke prepares only the filtered RTL FSDB artifacts it executes.

When Verdi is absent, the wrapper prints the `skip: fsdb: ...` message from `tools/fsdb/check_fsdb_env.py` and continues. If Verdi-related environment variables are set but inconsistent, the gates fail instead of silently skipping.

Focused FSDB recipes:

```sh
just check-fsdb-env
just lint-fsdb
just check-fsdb-build
just prepare-fsdb-fixtures
just prepare-fsdb-test-fixtures
just test-fsdb
just bench-e2e-fsdb-smoke-commit
```

## Fixtures and benchmarks

Do not commit generated `.fsdb` fixtures. `just prepare-fsdb-fixtures` creates ignored FSDB files from two sources:

- committed hand-written VCD fixtures under `tests/fixtures/hand/`, written to `tests/fixtures/fsdb/`;
- RTL `.fst` artifacts under `RTL_ARTIFACTS_DIR`, written as neighboring ignored `.fsdb` files for benchmark parity.

`just prepare-fsdb-test-fixtures` limits preparation to the hand-written VCD-derived test fixtures. FSDB benchmark smoke recipes prepare the narrower RTL subset they execute; full FSDB benchmark recipes prepare and verify the complete generated FSDB benchmark catalog.

`bench/e2e/tests_fsdb.json` is generated from `bench/e2e/tests.json` by replacing RTL artifact `.fst` paths with `.fsdb` paths. Update the FST catalog first, then run:

```sh
just update-bench-e2e-fsdb-catalog
just check-bench-e2e-fsdb-catalog
```

FSDB benchmark baselines live under `bench/e2e/runs/baseline_fsdb/`. Refresh them only in a Verdi-equipped environment with the dedicated FSDB benchmark recipes.

## Repository safety policy

The public repository may contain project-owned source that optionally integrates with local Verdi headers and libraries. It must not contain proprietary Verdi payloads or derived copies.

Do not commit:

- Verdi headers, libraries, installed documentation, or excerpts from installed documentation;
- generated bindings or copied declarations derived from proprietary headers;
- generated `.fsdb` fixtures unless redistribution rights are explicit and documented;
- converter logs or debug dumps that expose proprietary design contents.

Treat `.fst` and `.fsdb` waveform dumps as binary data. Inspect them through `wavepeek`, Verdi tools, fixture helpers, or binary-safe metadata commands such as `find`, `stat`, `ls`, `du`, and checksums.

## Local Verdi research surface

If deeper local SDK research is needed, keep it local and cite only paths or public behavior in repository docs. Useful starting points inside a licensed installation are:

```text
$VERDI_HOME/share/FsdbReader/
$VERDI_HOME/doc/HTML/index.html
$VERDI_HOME/doc/HTML/pdf/verdi_fsdb_reader.pdf
```

Do not copy local manual text, headers, examples, or generated API extracts into the repository. Summarize project decisions in this file, source comments, or public docs without reproducing proprietary material.