hexforge / data & API
Data & API
The site has no backend. Its “API” is a handful of static files served unchanged: the board matrix, the example set, the rejected-construct index and a release feed. The boards, reference and codes pages read them with a relative fetch; so can you.
| Path | Format | Items | Contents |
|---|---|---|---|
| /api/boards.json | JSON | 9+4 | nine boards and four devices with their resources |
| /api/examples.json | JSON | 8 | the bundled examples with LUT4/FF/BRAM and clock |
| /api/rejected.json | JSON | 16 | rejected constructs and warning codes |
| /api/refindex.json | JSON | 65 | flat search index behind the reference search box |
| /data/boards.csv | CSV | 9 | the board matrix as a flat table |
| /data/timing-report.txt | text | 1 | a full hxta report for uart_loopback, as the tool prints it |
| /feed.xml | Atom | 9 | one entry per release |
A board record
{
"id": "fenwick-a2",
"name": "Fenwick A2",
"device": "T4-25K",
"status": "full",
"verified": "0.7.1",
"config_mode": "spi-x1",
"notes": "Needs --config-mode spi-x1; the default four-bit
mode is wired differently here."
}
Every board points at a device by its part string, and the device carries the numbers (lut4, ff, bram, pll, io, bitstream_bytes). Keeping them separate means four boards that share the T4-25K do not repeat the resource figures four times, and cannot disagree.
Reading it
fetch("/api/boards.json")
.then(r => r.json())
.then(d => d.boards.filter(b => b.status === "full"));
# how many LUT4 does fenwick-a2's part have?
$ curl -s https://hexforge.cloud/api/boards.json \
| jq '.devices[] | select(.part=="T4-25K") | .lut4' # 24576
Stable points
- Board and device ids do not change within a 0.x line.
- Resource figures match the board matrix and the example occupancy exactly.
- Error codes in
rejected.jsonare stable across releases; only their message text may change. - The timing report is a captured sample, not generated live - it will drift only when the delay table revision does.