FastLED 3.10.8
Loading...
Searching...
No Matches
wave8.h
Go to the documentation of this file.
2
3#pragma once
4
5// allow-include-after-namespace
6
7#include "fl/stl/align.h"
9#include "fl/stl/stdint.h"
10#include "fl/stl/noexcept.h"
11
12namespace fl {
13
14struct ChipsetTiming;
15
23struct Wave8Bit {
24 u8 data; // Each bit represents one pulse (MSB first)
25};
26
31struct FL_ALIGNAS(8) Wave8Byte {
32 Wave8Bit symbols[8]; // 8 bytes total (8 symbols × 1 byte each)
33};
34
35// ============================================================================
36// Nibble Lookup Table (LUT) Types and Generator
37// ============================================================================
38
46struct FL_ALIGNAS(8) Wave8BitExpansionLut {
47 Wave8Bit lut[16][4]; // nibble -> 4 Wave8Bit (4 bytes per nibble)
48};
49
57struct FL_ALIGNAS(8) Wave8ByteExpansionLut {
58 Wave8Byte lut[256]; // byte -> 8 Wave8Bit (8 bytes per byte)
59};
60
72Wave8BitExpansionLut buildWave8ExpansionLUT(const ChipsetTiming &timing) FL_NO_EXCEPT;
73
79Wave8ByteExpansionLut buildWave8ByteExpansionLUT(const Wave8BitExpansionLut &nibble) FL_NO_EXCEPT;
80
86void buildWave8ByteExpansionLUT(const Wave8BitExpansionLut &nibble,
87 Wave8ByteExpansionLut &out) FL_NO_EXCEPT;
88
89// Forward declaration; implementation is out-of-line in detail/wave8.cpp.hpp
90void wave8(u8 lane,
91 const Wave8BitExpansionLut &lut,
92 u8 (&FL_RESTRICT_PARAM output)[sizeof(Wave8Byte)]) FL_NO_EXCEPT;
93
94// Public transposition functions (implementations in wave8.cpp)
96 const u8 (&FL_RESTRICT_PARAM lanes)[2],
97 const Wave8BitExpansionLut &lut,
98 u8 (&FL_RESTRICT_PARAM output)[2 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
99
101 const u8 (&FL_RESTRICT_PARAM lanes)[4],
102 const Wave8BitExpansionLut &lut,
103 u8 (&FL_RESTRICT_PARAM output)[4 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
104
106 const u8 (&FL_RESTRICT_PARAM lanes)[8],
107 const Wave8BitExpansionLut &lut,
108 u8 (&FL_RESTRICT_PARAM output)[8 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
109
111 const u8 (&FL_RESTRICT_PARAM lanes)[16],
112 const Wave8BitExpansionLut &lut,
113 u8 (&FL_RESTRICT_PARAM output)[16 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
114
115// Byte-LUT overloads (#2526): same semantics, faster expansion path.
117 const u8 (&FL_RESTRICT_PARAM lanes)[2],
118 const Wave8ByteExpansionLut &lut,
119 u8 (&FL_RESTRICT_PARAM output)[2 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
120
122 const u8 (&FL_RESTRICT_PARAM lanes)[4],
123 const Wave8ByteExpansionLut &lut,
124 u8 (&FL_RESTRICT_PARAM output)[4 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
125
127 const u8 (&FL_RESTRICT_PARAM lanes)[8],
128 const Wave8ByteExpansionLut &lut,
129 u8 (&FL_RESTRICT_PARAM output)[8 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
130
132 const u8 (&FL_RESTRICT_PARAM lanes)[16],
133 const Wave8ByteExpansionLut &lut,
134 u8 (&FL_RESTRICT_PARAM output)[16 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
135
144 const u8 (&FL_RESTRICT_PARAM lanes_a)[16],
145 const u8 (&FL_RESTRICT_PARAM lanes_b)[16],
146 const Wave8ByteExpansionLut &lut,
147 u8 (&FL_RESTRICT_PARAM output_a)[16 * sizeof(Wave8Byte)],
148 u8 (&FL_RESTRICT_PARAM output_b)[16 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
149
158 const u8 (&FL_RESTRICT_PARAM lanes_a)[16],
159 const u8 (&FL_RESTRICT_PARAM lanes_b)[16],
160 const u8 (&FL_RESTRICT_PARAM lanes_c)[16],
161 const u8 (&FL_RESTRICT_PARAM lanes_d)[16],
162 const Wave8ByteExpansionLut &lut,
163 u8 (&FL_RESTRICT_PARAM output_a)[16 * sizeof(Wave8Byte)],
164 u8 (&FL_RESTRICT_PARAM output_b)[16 * sizeof(Wave8Byte)],
165 u8 (&FL_RESTRICT_PARAM output_c)[16 * sizeof(Wave8Byte)],
166 u8 (&FL_RESTRICT_PARAM output_d)[16 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
167
170 const u8 (&FL_RESTRICT_PARAM lanes)[2],
171 const Wave8ByteExpansionLut &lut,
172 u8 (&FL_RESTRICT_PARAM output)[2 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
173
176 const u8 (&FL_RESTRICT_PARAM lanes)[4],
177 const Wave8ByteExpansionLut &lut,
178 u8 (&FL_RESTRICT_PARAM output)[4 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
179
182 const u8 (&FL_RESTRICT_PARAM lanes)[8],
183 const Wave8ByteExpansionLut &lut,
184 u8 (&FL_RESTRICT_PARAM output)[8 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
185
194 const u8 (&FL_RESTRICT_PARAM lanes)[16],
195 const Wave8ByteExpansionLut &lut,
196 u8 (&FL_RESTRICT_PARAM output)[16 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
197
205 const u8 (&FL_RESTRICT_PARAM lanes_a)[16],
206 const u8 (&FL_RESTRICT_PARAM lanes_b)[16],
207 const u8 (&FL_RESTRICT_PARAM lanes_c)[16],
208 const u8 (&FL_RESTRICT_PARAM lanes_d)[16],
209 const Wave8ByteExpansionLut &lut,
210 u8 (&FL_RESTRICT_PARAM output_a)[16 * sizeof(Wave8Byte)],
211 u8 (&FL_RESTRICT_PARAM output_b)[16 * sizeof(Wave8Byte)],
212 u8 (&FL_RESTRICT_PARAM output_c)[16 * sizeof(Wave8Byte)],
213 u8 (&FL_RESTRICT_PARAM output_d)[16 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
214
215// Untranspose functions (for testing - reverse the transpose operation)
217 const u8 (&FL_RESTRICT_PARAM transposed)[2 * sizeof(Wave8Byte)],
218 u8 (&FL_RESTRICT_PARAM output)[2 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
219
221 const u8 (&FL_RESTRICT_PARAM transposed)[4 * sizeof(Wave8Byte)],
222 u8 (&FL_RESTRICT_PARAM output)[4 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
223
225 const u8 (&FL_RESTRICT_PARAM transposed)[8 * sizeof(Wave8Byte)],
226 u8 (&FL_RESTRICT_PARAM output)[8 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
227
229 const u8 (&FL_RESTRICT_PARAM transposed)[16 * sizeof(Wave8Byte)],
230 u8 (&FL_RESTRICT_PARAM output)[16 * sizeof(Wave8Byte)]) FL_NO_EXCEPT;
231
232} // namespace fl
233
234// Include inline implementations for optimal performance
235// This must be after the namespace to avoid the include-after-namespace linter error
Alignment macros and utilities for FastLED.
unsigned char u8
Definition stdint.h:131
FL_OPTIMIZE_FUNCTION FL_IRAM void wave8Transpose_4(const u8(&FL_RESTRICT_PARAM lanes)[4], const Wave8BitExpansionLut &lut, u8(&FL_RESTRICT_PARAM output)[4 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
Definition wave8.cpp.hpp:43
FL_OPTIMIZE_FUNCTION FL_IRAM void wave8Transpose_16x4_pipe4(const u8(&FL_RESTRICT_PARAM lanes_a)[16], const u8(&FL_RESTRICT_PARAM lanes_b)[16], const u8(&FL_RESTRICT_PARAM lanes_c)[16], const u8(&FL_RESTRICT_PARAM lanes_d)[16], const Wave8ByteExpansionLut &lut, u8(&FL_RESTRICT_PARAM output_a)[16 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output_b)[16 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output_c)[16 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output_d)[16 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
Pipe4: transpose 16-lane × 4-byte-positions (#2548).
u8 u8 fract8 blur_amount FL_NO_EXCEPT
Definition blur.h:186
FL_OPTIMIZE_FUNCTION void wave8Untranspose_2(const u8(&FL_RESTRICT_PARAM transposed)[2 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output)[2 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
FL_IRAM FL_OPTIMIZE_FUNCTION void wave8(u8 lane, const Wave8BitExpansionLut &lut, u8(&FL_RESTRICT_PARAM output)[sizeof(Wave8Byte)]) FL_NO_EXCEPT
Public single-lane wave8 encoder.
FL_OPTIMIZE_FUNCTION FL_IRAM void wave8Transpose_2_bf1(const u8(&FL_RESTRICT_PARAM lanes)[2], const Wave8ByteExpansionLut &lut, u8(&FL_RESTRICT_PARAM output)[2 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
BF1 for 2-lane Wave8 (#2548 deep-dive followup).
FL_OPTIMIZE_FUNCTION FL_IRAM void wave8Transpose_8_bf1(const u8(&FL_RESTRICT_PARAM lanes)[8], const Wave8ByteExpansionLut &lut, u8(&FL_RESTRICT_PARAM output)[8 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
BF1 for 8-lane Wave8 (#2548 deep-dive followup).
FL_OPTIMIZE_FUNCTION FL_IRAM void wave8Transpose_2(const u8(&FL_RESTRICT_PARAM lanes)[2], const Wave8BitExpansionLut &lut, u8(&FL_RESTRICT_PARAM output)[2 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
Definition wave8.cpp.hpp:26
FL_OPTIMIZE_FUNCTION FL_IRAM void wave8Transpose_16_bf1(const u8(&FL_RESTRICT_PARAM lanes)[16], const Wave8ByteExpansionLut &lut, u8(&FL_RESTRICT_PARAM output)[16 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
BF1: chipset-aware direct encode for 16-lane Wave8 (#2548 deep-dive).
FL_OPTIMIZE_FUNCTION FL_IRAM void wave8Transpose_8(const u8(&FL_RESTRICT_PARAM lanes)[8], const Wave8BitExpansionLut &lut, u8(&FL_RESTRICT_PARAM output)[8 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
Definition wave8.cpp.hpp:59
FL_OPTIMIZE_FUNCTION void wave8Untranspose_4(const u8(&FL_RESTRICT_PARAM transposed)[4 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output)[4 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
void buildWave8ByteExpansionLUT(const Wave8BitExpansionLut &nibble, Wave8ByteExpansionLut &out) FL_NO_EXCEPT
Out-param overload: fill an existing 2 KB LUT in place.
FL_OPTIMIZE_FUNCTION FL_IRAM void wave8Transpose_16x4_bf1_pipe4(const u8(&FL_RESTRICT_PARAM lanes_a)[16], const u8(&FL_RESTRICT_PARAM lanes_b)[16], const u8(&FL_RESTRICT_PARAM lanes_c)[16], const u8(&FL_RESTRICT_PARAM lanes_d)[16], const Wave8ByteExpansionLut &lut, u8(&FL_RESTRICT_PARAM output_a)[16 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output_b)[16 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output_c)[16 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output_d)[16 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
BF1 + pipe4: 4-position-pipelined direct encode (#2548 deep-dive).
struct FL_ALIGNAS(4) Wave3BitExpansionLut
Lookup table for nibble-to-waveform expansion in wave3 format (32 bytes)
Definition wave3.h:32
FL_OPTIMIZE_FUNCTION void wave8Untranspose_16(const u8(&FL_RESTRICT_PARAM transposed)[16 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output)[16 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
FL_OPTIMIZE_FUNCTION FL_IRAM void wave8Transpose_16(const u8(&FL_RESTRICT_PARAM lanes)[16], const Wave8BitExpansionLut &lut, u8(&FL_RESTRICT_PARAM output)[16 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
Definition wave8.cpp.hpp:75
FL_OPTIMIZE_FUNCTION Wave8BitExpansionLut buildWave8ExpansionLUT(const ChipsetTiming &timing) FL_NO_EXCEPT
Build a Wave8BitExpansionLut from chipset timing data.
FL_OPTIMIZE_FUNCTION FL_IRAM void wave8Transpose_16x2_pipe2(const u8(&FL_RESTRICT_PARAM lanes_a)[16], const u8(&FL_RESTRICT_PARAM lanes_b)[16], const Wave8ByteExpansionLut &lut, u8(&FL_RESTRICT_PARAM output_a)[16 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output_b)[16 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
Pipe2: transpose 16-lane × 2-byte-positions (#2548).
FL_OPTIMIZE_FUNCTION FL_IRAM void wave8Transpose_4_bf1(const u8(&FL_RESTRICT_PARAM lanes)[4], const Wave8ByteExpansionLut &lut, u8(&FL_RESTRICT_PARAM output)[4 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
BF1 for 4-lane Wave8 (#2548 deep-dive followup).
FL_OPTIMIZE_FUNCTION void wave8Untranspose_8(const u8(&FL_RESTRICT_PARAM transposed)[8 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output)[8 *sizeof(Wave8Byte)]) FL_NO_EXCEPT
Base definition for an LED controller.
Generic chipset timing entry Provides T1, T2, T3 timing parameters in nanoseconds for any LED protoco...
Definition led_timing.h:86
Type-safe container for packed 8-bit wave pulse pattern.
Definition wave8.h:23
#define FL_ALIGNAS(N)
#define FL_RESTRICT_PARAM