libbsdl: scaffold + working BSDL parser (struct + JSON, C ABI)

Standalone LGPL-2.1 parser for BSDL (IEEE 1149.1), shared by essim and
bs_explorer. The parser is ported from the Viveris JTAG Core loader,
decoupled from jtag_core, and extended with two extractions the original
lacks:
  - PIN_MAP_STRING -> per-port physical package pin, scalar and vector;
  - TAP_SCAN_*     -> TAP signal roles (TDI/TDO/TMS/TCK/TRST).

Exposes a stable C ABI (bsdl_parse_file/buffer -> bsdl_t, bsdl_to_json)
with a dependency-free JSON serializer and a bsdl2json CLI. CMake builds a
versioned shared library with install/export rules for find_package(bsdl).

Verified against m2gl010t, xcku040 and xcku15p (100% pin mapping, correct
IDCODEs and TAP roles); api and parse regression tests pass, clean build.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-03 10:27:13 +02:00
parent c78ff82923
commit 6b56ab5c42
16 changed files with 2764 additions and 0 deletions

View File

@@ -0,0 +1,74 @@
# libbsdl
A small, standalone parser for **BSDL** (IEEE 1149.1 Boundary-Scan Description
Language) files, exposing a **stable C ABI** plus an optional **JSON** output.
It is designed to be shared by two consumers:
- **bs_explorer** (C) — links the library and reads the `bsdl_t` struct directly
(boundary chain, instructions) to drive JTAG hardware.
- **essim** (C++) — consumes it either out-of-process via the `bsdl2json` CLI,
or in-process through the `extern "C"` API, for connectivity verification.
The parser core is seeded from the Viveris JTAG Core BSDL loader and extended
with the two attributes that loader omits but a netlist cross-check needs:
- **`PIN_MAP_STRING`** → each port's physical package ball/pin (`physical_pin`);
- **`TAP_SCAN_*`** → each TAP signal's role (TDI/TDO/TMS/TCK/TRST, `tap_role`).
## Status
Working. The parser extracts entity, IDCODE (+ mask), port directions, the
scalar **and** vector `PIN_MAP_STRING` (physical pins), `TAP_SCAN_*` roles, the
boundary register (with pin↔cell links) and the instruction opcodes. Verified
against real devices — `m2gl010t` (484 pins), `xcku040` (1156), `xcku15p`
(1517) — with 100% pin mapping and correct IDCODEs/TAP roles. `api` and `parse`
regression tests pass.
## Build
```sh
cmake -S . -B build
cmake --build build
ctest --test-dir build --output-on-failure
```
Produces `libbsdl.so` (+ `.so.0` / `.so.0.1.0`), the `bsdl2json` tool, and runs
the test suite. Options: `-DBSDL_BUILD_CLI=OFF`, `-DBSDL_BUILD_TESTS=OFF`,
`-DBUILD_SHARED_LIBS=OFF` (static).
## Use from CMake
```cmake
find_package(bsdl REQUIRED)
target_link_libraries(my_app PRIVATE bsdl::bsdl)
```
## API
```c
#include <bsdl/bsdl.h>
bsdl_opts_t opts;
bsdl_opts_default(&opts);
bsdl_t* m = bsdl_parse_file("device.bsd", &opts);
if (m) {
char* json = bsdl_to_json(m); /* compact JSON; free with bsdl_string_free */
/* ... or walk m->pins / m->chain / m->instructions directly ... */
bsdl_string_free(json);
bsdl_free(m);
}
```
See `include/bsdl/bsdl.h` for the full contract. The `bsdl_t` model is a
superset: extend it **additively** so the shared ABI stays stable for both
consumers.
## License
LGPL-2.1-or-later — see [LICENSE](LICENSE). The same license as its two
consumers (essim and bs_explorer are both LGPL-2.1), so code and the parser
can be shared freely; dynamic linking keeps the library replaceable. Derived
from the Viveris JTAG Core BSDL loader (© 20082024 Viveris Technologies,
Jean-François DEL NERO), also LGPL-2.1.