Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
b126af2
Turning the linker into an executable python module
JOOpdenhoevel Apr 22, 2026
5b11a49
Moving the linker resources into the python module
JOOpdenhoevel Apr 22, 2026
85345ea
Updating the resource path resolution as an intermediate solution
JOOpdenhoevel Apr 22, 2026
353dc01
Using importlib to load resources instead of the command config
JOOpdenhoevel Apr 22, 2026
45cdfd8
Adding a pyproject configuration
JOOpdenhoevel Apr 22, 2026
6e75568
Removing documentation references to the resource directory
JOOpdenhoevel Apr 22, 2026
a95e061
Adding an early check to the install step to check the AVED submodule
JOOpdenhoevel Apr 23, 2026
39a7865
Moving the AVED submodule to the top-level, and checking out AVED fre…
JOOpdenhoevel Apr 23, 2026
bf82490
Fixing the AMI path in ami.cmake
JOOpdenhoevel Apr 23, 2026
884afa8
Updating the root design build scripts
JOOpdenhoevel Apr 23, 2026
61e76c1
Lowering the required Python dependencies to what is available on Roc…
JOOpdenhoevel Apr 23, 2026
45d39a5
Using the wheel build flow for the DEB and RPM package builds
JOOpdenhoevel Apr 23, 2026
e6daf2e
Extending the dockerfiles and writing a script to build full packages…
JOOpdenhoevel Apr 24, 2026
b6b477c
Also setting and mounting the Xilinx license file
JOOpdenhoevel Apr 24, 2026
584d2b4
Building with bash instead of sh
JOOpdenhoevel Apr 24, 2026
6a23573
Also adding a dockerfile to run SLASH in docker
JOOpdenhoevel Apr 24, 2026
9b5fdb2
Moving the jinja2 templates into a dedicated module
JOOpdenhoevel Apr 27, 2026
697a9c5
Introducting a procedure to export a package
JOOpdenhoevel Apr 27, 2026
8f767eb
Also exporting the dcmac source directory
JOOpdenhoevel Apr 27, 2026
7c73310
Eliminating the use of directories as resources in the RM building step
JOOpdenhoevel Apr 27, 2026
007d3c0
Adding the LD_PRELOAD fix
JOOpdenhoevel Apr 27, 2026
2541d86
Moving the abstract shell import into the RM build functions
JOOpdenhoevel Apr 27, 2026
c45b126
Extending the LD_PRELOAD fix to rocky and installing more packages
JOOpdenhoevel Apr 28, 2026
d083c6e
[Abstract Shell] Generating the __init__.py files during installation
JOOpdenhoevel Apr 28, 2026
c68ee11
Adding my own tree walks since Path.walk() was only added in Python 3.12
JOOpdenhoevel Apr 29, 2026
60e3772
Modularizing the docker argument building and adding support for t ro…
JOOpdenhoevel Apr 29, 2026
b6dccdd
Merging the packaging and running scripts into one
JOOpdenhoevel Apr 29, 2026
314af9b
Not directly importing v80pp resources
JOOpdenhoevel Apr 29, 2026
f7fe592
Also adding a running container for Ubuntu
JOOpdenhoevel Apr 29, 2026
34ba507
Merge remote-tracking branch 'Xilinx/dev' into feature/linker_as_module
JOOpdenhoevel Apr 29, 2026
71d3f9b
Adding some usage information to the run-with-docker script
JOOpdenhoevel Apr 29, 2026
f889861
Adding a dependency of v80++ against libzmq3-dev on Ubuntu
JOOpdenhoevel Apr 29, 2026
b4fb6d9
Small compatibility fixes for Python 3.14
JOOpdenhoevel Apr 29, 2026
030e867
Updating the formatting check
JOOpdenhoevel May 5, 2026
10af6c8
Fixing the use of the exclude flag in autopep8
JOOpdenhoevel May 5, 2026
844ca44
Renaming v80++/v80pp to slashkit
JOOpdenhoevel May 5, 2026
02ab6a7
Updating some paths that weren't update yet
JOOpdenhoevel May 5, 2026
8f98a14
Renaming the "abstract shell" to "static shell"
JOOpdenhoevel May 5, 2026
e83782c
Fixing the autopep8 exclude flag (again)
JOOpdenhoevel May 6, 2026
3afc555
Merge remote-tracking branch 'Xilinx/dev' into feature/linker_as_module
JOOpdenhoevel May 6, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/linker-unit-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,4 @@ jobs:
run: cd linker && pytest

- name: Check formatting
run: cd linker && autopep8 -r --diff --exit-code src/ test/
run: cd linker && autopep8 -r --diff --exit-code --exclude 'slashkit/resources/*' slashkit/ test/
2 changes: 1 addition & 1 deletion .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
path = submodules/qdma_drv
url = https://github.com/Xilinx/dma_ip_drivers.git
[submodule "AVED"]
path = linker/resources/submodules/AVED
path = submodules/AVED
url = https://github.com/Xilinx/AVED.git
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ Key components:

- **VRT** (V80 RunTime) — C++17 API for kernel execution, buffer management, and device control
- **v80-smi** — command-line tool for board management, programming, and diagnostics
- **v80++** — Python-based linker that packages HLS kernels into deployable *vrtbin* archives
- **slashkit** — Python-based linker that packages HLS kernels into deployable *vrtbin* archives
- **slash** — Linux kernel module and driver stack

## Architecture
Expand Down Expand Up @@ -39,7 +39,7 @@ and communicates with adjacent layers through well-defined interfaces.
Two additional components sit alongside the stack:

- **v80-smi** — CLI for listing, programming, resetting, and validating V80 boards.
- **v80++ (linker)** — links HLS kernels into *vrtbin* archives for deployment.
- **slashkit** — links HLS kernels into *vrtbin* archives for deployment.

## Repository Layout

Expand All @@ -48,7 +48,7 @@ Two additional components sit alongside the stack:
| [`vrt/`](vrt/) | VRT | C++17 runtime library — [README](vrt/README.md) |
| [`driver/`](driver/) | Kernel module + libslash | Linux driver and C wrapper — [README](driver/libslash/README.md) |
| [`smi/`](smi/) | v80-smi | CLI management tool — [README](smi/README.md) |
| [`linker/`](linker/) | v80++ | Python-based kernel linker |
| [`linker/`](linker/) | slashkit | Python-based kernel linker |
| [`cmake/`](cmake/) | CMake modules | Build system integration — [README](cmake/README.md) |
| [`examples/`](examples/) | Examples | Demo projects — [README](examples/README.md) |
| [`docs/`](docs/) | Documentation | Sphinx / ReadTheDocs site |
Expand Down
4 changes: 2 additions & 2 deletions cmake/CheckSlashInstall.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ if(NOT DEFINED INSTALL_DIR OR "${INSTALL_DIR}" STREQUAL "")
endif()

set(_required_files
"abs_shell_service_layer.dcp"
"abs_shell_slash.dcp"
"static_shell_service_layer.dcp"
"static_shell_slash.dcp"
"amd_v80_gen5x8_25.1.pdi"
"top_wrapper_routed_bb.dcp"
)
Expand Down
20 changes: 10 additions & 10 deletions cmake/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,20 +56,20 @@ add_vbin(

**Linker detection** (two modes, tried in order):

1. **Installed** — finds `v80++` on PATH
1. **Installed** — finds `slashkit` on PATH
2. **Source tree** — uses `SLASH_REPO_ROOT` (or auto-detects from
`../linker/src/main.py` relative to this directory). Requires
Python 3.

Variables set after loading:

| Variable | Description |
|--------------------|-------------------------------------------|
| `SLASH_FOUND` | `TRUE` when SlashTools is ready |
| `V80PP_EXECUTABLE` | Path to `v80++` (installed mode) |
| `SLASH_REPO_ROOT` | Path to SLASH repo root (source mode) |
| `VIVADO_BINARY` | Path to `vivado` (from FindVivado) |
| `VITIS_ROOT_DIR` | Path to Vitis root (from FindVitis) |
| Variable | Description |
|-----------------------|-------------------------------------------|
| `SLASH_FOUND` | `TRUE` when SlashTools is ready |
| `SLASHKIT_EXECUTABLE` | Path to `slashkit` (installed mode) |
| `SLASH_REPO_ROOT` | Path to SLASH repo root (source mode) |
| `VIVADO_BINARY` | Path to `vivado` (from FindVivado) |
| `VITIS_ROOT_DIR` | Path to Vitis root (from FindVitis) |

### BuildHLS — `build_hls()`, `build_hls_dir()`, `build_hls_clean()`

Expand Down Expand Up @@ -197,8 +197,8 @@ include(CheckSlashInstall)
Checks for four required files in `INSTALL_DIR` (default
`/opt/amd/slash`):

- `abs_shell_service_layer.dcp`
- `abs_shell_slash.dcp`
- `static_shell_service_layer.dcp`
- `static_shell_slash.dcp`
- `amd_v80_gen5x8_25.1.pdi`
- `top_wrapper_routed_bb.dcp`

Expand Down
28 changes: 14 additions & 14 deletions cmake/SlashTools.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -30,37 +30,36 @@ find_package(Vivado REQUIRED)

# --- Locate the SLASH linker ---
# Two modes:
# 1. Installed: v80++ executable on PATH (preferred)
# 1. Installed: slashkit executable on PATH (preferred)
# 2. Source tree: SLASH_REPO_ROOT points to the repository root
set(_SLASH_TOOLS_USE_INSTALLED FALSE)
set(_SLASH_TOOLS_USE_REPO FALSE)

find_program(V80PP_EXECUTABLE NAMES v80++)
if(V80PP_EXECUTABLE)
find_program(SLASHKIT_EXECUTABLE NAMES slashkit)
if(SLASHKIT_EXECUTABLE)
set(_SLASH_TOOLS_USE_INSTALLED TRUE)
message(STATUS "SlashTools: Found installed v80++ at ${V80PP_EXECUTABLE}")
message(STATUS "SlashTools: Found installed slashkit at ${SLASHKIT_EXECUTABLE}")
endif()

if(NOT DEFINED SLASH_REPO_ROOT)
# Try to detect if we are in the source tree
get_filename_component(_slash_tools_candidate_root "${CMAKE_CURRENT_LIST_DIR}/.." REALPATH)
if(EXISTS "${_slash_tools_candidate_root}/linker/src/main.py")
if(EXISTS "${_slash_tools_candidate_root}/linker/slashkit/__main__.py")
set(SLASH_REPO_ROOT "${_slash_tools_candidate_root}")
endif()
endif()

if(DEFINED SLASH_REPO_ROOT AND EXISTS "${SLASH_REPO_ROOT}/linker/src/main.py")
if(DEFINED SLASH_REPO_ROOT AND EXISTS "${SLASH_REPO_ROOT}/linker/slashkit/__main__.py")
set(_SLASH_TOOLS_USE_REPO TRUE)
set(SLASH_LINKER_DIR "${SLASH_REPO_ROOT}/linker/")
set(SLASH_MAIN_PY "${SLASH_LINKER_DIR}/src/main.py")
set(SLASH_LINKER_DIR "${SLASH_REPO_ROOT}/linker")
find_package(Python3 REQUIRED COMPONENTS Interpreter)
message(STATUS "SlashTools: Found SLASH repo at ${SLASH_REPO_ROOT}")
endif()

if(NOT _SLASH_TOOLS_USE_INSTALLED AND NOT _SLASH_TOOLS_USE_REPO)
message(FATAL_ERROR
"SlashTools: Cannot find the SLASH linker. Either:\n"
" - Install the v80++ package (provides /usr/bin/v80++), or\n"
" - Install the slashkit package (provides /usr/bin/slashkit), or\n"
" - Set SLASH_REPO_ROOT to the SLASH repository root.")
endif()

Expand All @@ -80,7 +79,8 @@ function(add_vbin)
set(SLASH_VBIN_FILE "${CMAKE_CURRENT_BINARY_DIR}/${SLASH_VBIN_TARGET}.vbin")

if(_SLASH_TOOLS_USE_REPO)
# Source-tree mode: invoke main.py directly
# Source-tree mode: invoke the slashkit package as a module from the
# linker directory so that `import slashkit` resolves to ./slashkit/.
if(DEFINED Python3_EXECUTABLE AND NOT "${Python3_EXECUTABLE}" STREQUAL "")
set(_py "${Python3_EXECUTABLE}")
else()
Expand All @@ -89,21 +89,21 @@ function(add_vbin)

add_custom_command(
OUTPUT "${SLASH_VBIN_FILE}"
COMMAND "${_py}" "${SLASH_MAIN_PY}" "link"
COMMAND "${_py}" "-m" "slashkit" "link"
"-c" "${SLASH_VBIN_CFG}"
"-p" "${SLASH_VBIN_PLATFORM}"
"-o" "${SLASH_VBIN_FILE}"
"-k" ${SLASH_VBIN_KERNELS}
"--vivado" "${VIVADO_BINARY}"
BYPRODUCTS "${SLASH_VBIN_FILE}.prj"
DEPENDS "${SLASH_VBIN_CFG}" "${SLASH_VBIN_KERNELS}"
WORKING_DIRECTORY "${SLASH_LINKER_DIR}/src"
WORKING_DIRECTORY "${SLASH_LINKER_DIR}"
)
else()
# Installed mode: invoke the v80++ wrapper
# Installed mode: invoke the slashkit wrapper
add_custom_command(
OUTPUT "${SLASH_VBIN_FILE}"
COMMAND "${V80PP_EXECUTABLE}" "link"
COMMAND "${SLASHKIT_EXECUTABLE}" "link"
"-c" "${SLASH_VBIN_CFG}"
"-p" "${SLASH_VBIN_PLATFORM}"
"-o" "${SLASH_VBIN_FILE}"
Expand Down
2 changes: 1 addition & 1 deletion docs/explanation/architecture.rst
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ Two additional components sit alongside the stack:

- **v80-smi** — command-line system management interface for listing, programming,
resetting, and validating V80 boards.
- **v80++ (linker)** — Python-based toolchain that links HLS kernels into
- **slashkit** — Python-based toolchain that links HLS kernels into
*vrtbin* archives for deployment.

Layer Descriptions
Expand Down
4 changes: 2 additions & 2 deletions docs/explanation/vrtbin-format.rst
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ Overview
========

A vrtbin is a **gzip-compressed tar archive** produced by the SLASH linker
(``v80++``) via the ``add_vbin()`` CMake function. VRT extracts the archive
(``slashkit``) via the ``add_vbin()`` CMake function. VRT extracts the archive
at runtime when you construct a ``vrt::Device``.

.. code-block:: text
Expand Down Expand Up @@ -180,7 +180,7 @@ reference.
Creating a Vrtbin
=================

Vrtbin archives are produced by the SLASH linker (``v80++``) through the
Vrtbin archives are produced by the SLASH linker (``slashkit``) through the
CMake ``add_vbin()`` function:

.. code-block:: cmake
Expand Down
4 changes: 2 additions & 2 deletions docs/howto/build-from-source.rst
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ Install:

sudo cmake --install build

v80++ (Linker) — Static Shell
slashkit — Static Shell
==============================

After installing ``v80-smi``, the linker's static shell must be built
Expand Down Expand Up @@ -163,7 +163,7 @@ local IP repository before building:

1. Download the SMBus IP from https://www.xilinx.com/member/v80.html
(AMD account required).
2. Copy the downloaded IP directory into ``linker/resources/base/iprepo/``
2. Copy the downloaded IP directory into ``linker/slashkit/resources/base/iprepo/``
so that Vivado can locate it during synthesis.

See the `AVED rebuild guide <https://xilinx.github.io/AVED/>`_ for
Expand Down
31 changes: 18 additions & 13 deletions docs/howto/install-from-packages.rst
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ Development packages (required when building applications or HLS kernels):
- Headers and CMake targets for ``libvrtd`` / ``libvrtdpp``.
* - ``libvrt-dev``
- Headers and CMake targets for ``libvrt``.
* - ``v80++``
* - ``slashkit``
- Python-based kernel linker that packages compiled HLS IP into
``.vbin`` archives. Provides the ``build_hls_dir()`` and
``add_vbin()`` CMake functions via the ``SlashTools`` module.
Expand Down Expand Up @@ -194,7 +194,7 @@ single transaction:
./deb/libvrtd_<version>_amd64.deb \
./deb/libvrt_<version>_amd64.deb \
./deb/v80-smi_<version>_amd64.deb \
./deb/v80++_<version>_amd64.deb
./deb/slashkit_<version>_amd64.deb

.. tab-item:: RHEL / Rocky / Fedora

Expand All @@ -207,7 +207,7 @@ single transaction:
./rpm/libvrtd-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrt-<version>-1.<dist>.x86_64.rpm \
./rpm/v80-smi-<version>-1.<dist>.x86_64.rpm \
./rpm/v80++-<version>-1.<dist>.x86_64.rpm
./rpm/slashkit-<version>-1.<dist>.x86_64.rpm

.. note::

Expand Down Expand Up @@ -269,8 +269,13 @@ from ``v80-smi list``, e.g. ``03:00``):

.. code-block:: bash

# For Ubuntu 22.04
sudo ami_tool cfgmem_program -d <BDF> -t primary -p 0 \
-i /usr/share/v80++/abstract_shell/amd_v80_gen5x8_25.1.pdi
-i /usr/lib/python3.10/dist-packages/slashkit/resources/static_shell/amd_v80_gen5x8_25.1.pdi

# For Rocky 9
sudo ami_tool cfgmem_program -d <BDF> -t primary -p 0 \
-i /usr/lib/python3.9/site-packages/slashkit/resources/static_shell/amd_v80_gen5x8_25.1.pdi

After programming completes, reboot the system for the new flash contents
to take effect:
Expand All @@ -295,7 +300,7 @@ kernels, install the development metapackage:
./deb/libslash-dev_<version>_amd64.deb \
./deb/libvrtd-dev_<version>_amd64.deb \
./deb/libvrt-dev_<version>_amd64.deb \
./deb/v80++_<version>_amd64.deb
./deb/slashkit_<version>_amd64.deb

.. tab-item:: RHEL / Rocky / Fedora

Expand All @@ -305,14 +310,14 @@ kernels, install the development metapackage:
./rpm/libslash-devel-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrtd-devel-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrt-devel-<version>-1.<dist>.x86_64.rpm \
./rpm/v80++-<version>-1.<dist>.x86_64.rpm
./rpm/slashkit-<version>-1.<dist>.x86_64.rpm

This installs:

- C++ headers under ``/usr/include/vrt/``, ``/usr/include/vrtd/``, and
``/usr/include/slash/``
- CMake package files under ``/usr/lib/cmake/``
- The ``v80++`` linker and the ``SlashTools`` CMake module
- The ``slashkit`` linker and the ``SlashTools`` CMake module

CMake projects can then discover VRT with:

Expand Down Expand Up @@ -360,7 +365,7 @@ V80 board, install the ``slash-sim-emu`` subset:
./deb/libslash-dev_<version>_amd64.deb \
./deb/libvrtd-dev_<version>_amd64.deb \
./deb/libvrt-dev_<version>_amd64.deb \
./deb/v80++_<version>_amd64.deb
./deb/slashkit_<version>_amd64.deb

.. tab-item:: RHEL / Rocky / Fedora

Expand All @@ -379,7 +384,7 @@ V80 board, install the ``slash-sim-emu`` subset:
./rpm/libslash-devel-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrtd-devel-<version>-1.<dist>.x86_64.rpm \
./rpm/libvrt-devel-<version>-1.<dist>.x86_64.rpm \
./rpm/v80++-<version>-1.<dist>.x86_64.rpm
./rpm/slashkit-<version>-1.<dist>.x86_64.rpm

No board and no kernel module are required on emulation/simulation hosts.
The daemon is still needed if any component connects to ``vrtd``, but you
Expand Down Expand Up @@ -413,14 +418,14 @@ Upgrade and Removal
./deb/libvrtd_<new-version>_amd64.deb \
./deb/libvrt_<new-version>_amd64.deb \
./deb/v80-smi_<new-version>_amd64.deb \
./deb/v80++_<new-version>_amd64.deb
./deb/slashkit_<new-version>_amd64.deb

To remove all SLASH and AMI packages:

.. code-block:: bash

sudo apt remove ami slash-dkms libslash libvrtd libvrt \
v80-smi v80++ vrtd
v80-smi slashkit vrtd
sudo apt autoremove

.. tab-item:: RHEL / Rocky / Fedora
Expand All @@ -437,13 +442,13 @@ Upgrade and Removal
./rpm/libvrtd-<new-version>-1.<dist>.x86_64.rpm \
./rpm/libvrt-<new-version>-1.<dist>.x86_64.rpm \
./rpm/v80-smi-<new-version>-1.<dist>.x86_64.rpm \
./rpm/v80++-<new-version>-1.<dist>.x86_64.rpm
./rpm/slashkit-<new-version>-1.<dist>.x86_64.rpm

To remove:

.. code-block:: bash

sudo dnf remove ami slash-dkms libslash libvrtd libvrt v80-smi v80++ vrtd
sudo dnf remove ami slash-dkms libslash libvrtd libvrt v80-smi slashkit vrtd

.. note::

Expand Down
6 changes: 3 additions & 3 deletions docs/reference/cmake/slashtools.rst
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ Operating Modes
``add_vbin()`` supports two modes for locating the SLASH linker:

**Installed mode** (preferred)
If ``v80++`` is found on ``PATH``, the function invokes it directly.
If ``slashkit`` is found on ``PATH``, the function invokes it directly.

**Source-tree mode**
If ``SLASH_REPO_ROOT`` is set (or auto-detected from the module's location),
Expand All @@ -87,8 +87,8 @@ Configuration Variables
Path to the SLASH repository root. Auto-detected when the CMake module is
located inside the repository tree.

``V80PP_EXECUTABLE``
Path to the installed ``v80++`` linker. Auto-detected via ``find_program()``.
``SLASHKIT_EXECUTABLE``
Path to the installed ``slashkit`` linker. Auto-detected via ``find_program()``.

Example
=======
Expand Down
Loading
Loading