Metadata-Version: 2.4
Name: ravel-hls
Version: 1.6.0
Summary: Rate-Aware Vectorized Engine for Low-latency FPGA inference
License-Expression: Apache-2.0
Project-URL: Repository, https://github.com/albertc9/RAVEL
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: hls4ml==1.2.0
Requires-Dist: hgq2==0.1.7
Requires-Dist: Jinja2==3.1.6
Requires-Dist: keras==3.12.1
Requires-Dist: numpy==1.26.4
Requires-Dist: quantizers==1.2.2
Requires-Dist: PyYAML==6.0.3
Requires-Dist: tensorflow-cpu==2.20.0; platform_system == "Linux"
Provides-Extra: test
Requires-Dist: pytest<10,>=8; extra == "test"
Dynamic: license-file

[![GitHub](https://img.shields.io/badge/GitHub-albertc9%2FRAVEL-181717?logo=github)](https://github.com/albertc9/RAVEL) [![PyPI](https://img.shields.io/pypi/v/ravel-hls?logo=pypi&logoColor=white)](https://pypi.org/project/ravel-hls/) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
# RAVEL

RAVEL (Rate-Aware Vectorized Engine for Low-latency) generates a specialized,
hls4ml-compatible FPGA inference project. Aria 1.6.0 adds PHARA, a pool-aligned
P8/D4 specialization with proven hybrid constant arithmetic. New conversions
default to P8/D4. P2 and P4 remain available through explicit configuration.
Each sample frame contains one value from each of four 8-bit ADC channels.
Each input chunk contains 256 such frames:
8,192 bits, or 1 KiB, of raw input. One PHARA core processes an estimated
40.1 Gb/s. An optimistic 16-core KU5P configuration processes 642 Gb/s,
equivalent to 20.1 GSa/s on each of the four synchronous channels.
The example model distinguishes in real time between neutrino signals generated by Askaryn Radiation and noise, and can detect over 99% of neutrinos at a trigger rate of 1 Hz.

## Performance

### Like-for-like comparison

The table uses the same example model, KU5P target, and 5 ns clock constraint.
Resources and WNS are single-core Vivado 2023.2 post-route results. Resource
counts are followed by KU5P utilization. II means initiation interval.

| Flow | II | Latency (cycles) | BRAM tile | DSP | registers | LUTs | 1-core raw input (Gb/s) | 70% parallel raw input (Gb/s) | Fmax (MHz) | WNS (ns) |
|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
| Vanilla hls4ml | 3076 | 3084 | 5.5 (1.15%) | 1 (0.05%) | 21745 (5.01%) | 18312 (8.44%) | 0.556 | 4.4 | 208.6 | +0.206 |
| RAVEL Aria 1.1.0 P2/D1 | 178 | 183 | 1.0 (0.21%) | 7 (0.38%) | 2953 (0.68%) | 5332 (2.46%) | 11.9 | 332 | 257.8 | +1.121 |
| RAVEL Aria 1.3.0 P4/D2 | 94 | 99 | 0.5 (0.10%) | 14 (0.77%) | 3709 (0.85%) | 7861 (3.62%) | 20.8 | 396 | 239.1 | +0.817 |
| RAVEL Aria 1.4.0 P4/D2 | 94 | 99 | 1.5 (0.31%) | 15 (0.82%) | 3622 (0.83%) | 6981 (3.22%) | 19.5 | 409 | 223.4 | +0.524 |
| RAVEL Aria 1.6.0 PHARA P8/D4 | 51 | 56 | 2.5 (0.52%) | 79 (4.33%) | 3840 (0.88%) | 4930 (2.27%) | 40.1 | 642 | 249.8 | +0.997 |

The raw input chunk sized `4 x 256 x 8 bits`. The single-core rate is
`Fmax / II * 8,192`, with the corresponding unit conversion. The parallel
estimate allows up to 70% of every listed
KU5P resource and linearly replicates 8/28/19/21/16 cores for the five rows.
LUTs limit the first four estimates; DSPs limit PHARA. These values exclude
shared infrastructure, I/O limits, and multi-core routing overhead.

At 200 MHz, 1 GSa/s per channel equals 3.90625 million 256-frame chunks/s and
requires
60.08/3.48/1.84/1.84/1.00 equivalent cores for vanilla/Aria 1.1/1.3/1.4/1.6.
PHARA processes 1.004 GSa/s per channel per core. Relative to Aria 1.4, it
reduces II by
45.7%, latency by 43.4%, and OOC LUTs by 29.4%. Registers increase by 6.0%,
BRAM tiles increase from 1.5 to 2.5, and DSP use increases from 15 to 79.

At the timing-estimated 249.8 MHz, one PHARA core processes 4.898 million
chunks/s. This equals 1.254 GSa/s per channel across four channels, or 40.1 Gb/s
of raw input. Sixteen cores reach an estimated 20.1 GSa/s per channel and
642 Gb/s, or 80.3 GB/s, while using 36.4% of LUTs, 14.2% of registers, 69.3% of
DSPs, and 8.3% of BRAM tiles.

The [Aria 1.6.0 PHARA qualification snapshot](references/qualification/aria_1_6_0_phara/README.md)
records the source commit, three-model RTL CoSim results, arithmetic proofs,
and canonical post-route measurements.

The throughput requirements of ARIANNA, RNO-G, and IceCube-Gen2 are already met by the current system design ([AI Trigger System, v3.3.0](https://github.com/NuDAQ/AI-Trigger-System/tree/v3.3.0)). For models with similar architectures and size, processing speed and power consumption are no longer limiting factors.

More Information about the reference implementation, please see the [performance](https://github.com/NuDAQ/CNN-Core-Generator/tree/d37a0a6dc31cf5a38f0d241f47e21263e0fe9e67#performance) of the CNN-Core-Generator.

## Install

Use a clean Python 3.11 virtual environment on Linux:

```bash
python -m pip install ravel-hls
```

## Python API

```python
import ravel_hls as ravel

config = {
    "HLS": {
        "Backend": "Vitis",
        "IOType": "io_stream",
        "Part": "xcku5p-ffvb676-2-e",
        "ClockPeriod": 5.0,
    },
    "Verification": {"Mode": "required", "Samples": 32, "Seed": 19},
    "Vitis": {"Run": False},
}

analysis = ravel.analyze("model.keras", config)
project = ravel.convert("model.keras", "cnn_core", config)
print(project.status)
```

`Optimization` is optional. Omission selects the versioned aggressive default:

```python
config["Optimization"] = {
    "TemporalPacking": 8,  # 2, 4, or 8
    "DenseParallelism": 4,  # 1, 2, or 4
}
```

The supported pairs are P2/D1, P2/D2, P4/D1, P4/D2, and P8/D4. An omitted axis
inherits the aggressive P8/D4 default. `ravel.refresh(project,
model_or_parameters)` reuses the recorded architecture envelope and rejects
changes that require an ordinary conversion.

`Vitis.Run` defaults to `False`. Set it to `True` to run
`vitis_hls -f build_prj.tcl` after atomic project publication and automatically
record the synthesis report. The default Vitis stages are reset and synthesis;
CSim, CoSim, validation, export, and Vivado synthesis remain disabled unless
their booleans under `Vitis.Stages` are enabled explicitly. The same operation
can be requested later with `project.build()`.

The concise project lifecycle is `analyze`, `convert`, `refresh`,
`Project.open(path)`,
`project.build()`, `project.record(report_dir)`, and `project.link()`. The CLI
command `ravel-hls inspect PROJECT --json` performs full source-integrity
checking; add `--fast` when payload hashing should be skipped.

## Parameter packages

`Parameters` stores portable generation-relevant inference state without
generated HLS sources or executable Python objects:

```python
parameters = ravel.Parameters.extract(model)
parameters.save("trained.ravelparams")

project = ravel.Project.open("cnn_core")
project.refresh(ravel.Parameters.load("trained.ravelparams"))
```

The schema-v2 deterministic archive contains JSON plus NPY arrays compiled from
the clean `ModelGraph`. Tensors are addressed by canonical operation and role,
not Keras layer names or variable order. Structure, numeric descriptors, and
layered hashes are checked before complete staged regeneration. Without
embedded known-answer evidence, package refresh can prove baseline-to-optimized
equivalence in `auto` mode but `required` mode rejects it. A package is not
encrypted.

## Other Information

See the executable [CNN-for-Arianna reference](references/cnn_for_arianna/README.md),
[architecture](docs/architecture.md), [compatibility](docs/compatibility.md), and
[project format](docs/project-format.md) for the full contracts. The
[Aria 1.5.1 RTL evidence](references/qualification/aria_1_5_1_full_width/README.md)
records the previous three-model subset.

## Our Project used RAVEL

- [CNN Core Generator](https://github.com/NuDAQ/CNN-Core-Generator)
- [AI Trigger System](https://github.com/NuDAQ/AI-Trigger-System)
- [Hi-Lo Gated CNN Trigger](https://github.com/NuDAQ/Hi-Lo-Gated-CNN-Trigger)
- And more!

## The Future Plan

RAVEL will evolve from the closed, qualified specialization flow into a
general rate-aware FPGA inference generator. Plans for higher versions
are tentative.

Higher versions will focus primarily on expanding functionality and model support. At present, Nocturne 2.0 is expected to bring the target model into its highest practical throughput range. Further versions may still achieve higher throughput, but the remaining headroom is expected to be quite limited.

- **Aria 1.x** Continue improving the closed P2/P4/P8 specialization set,
  deterministic project lifecycle, verification, and tool compatibility. For this version,
  RAVEL's goal is simply to design an efficient converter for models currently in 
  use or planned for use for 
  high-energy neutrino experiments, e.g., ARIANNA, RNO-G, and IceCube-Gen2.
- **Nocturne 2.x** Generalize model support and derive balanced layer-level
  parallelism from system bandwidth and resource limits.
- **Rhapsody 3.x** Support multiple independent inference contexts
  within one IP, with configurable resource sharing, duplication.
- **Requiem 4.x** Select internal parallelism, IP
  replication, and lane scheduling according to input rate, internal interval, latency, and FPGA resource constraints.

## License
This project licensed under Apache-2.0. See [LICENSE](LICENSE).
