FastLED 3.9.15
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
11namespace fl {
12
13struct ChipsetTiming;
14
22struct Wave8Bit {
23 u8 data; // Each bit represents one pulse (MSB first)
24};
25
30struct FL_ALIGNAS(8) Wave8Byte {
31 Wave8Bit symbols[8]; // 8 bytes total (8 symbols × 1 byte each)
32};
33
34// ============================================================================
35// Nibble Lookup Table (LUT) Types and Generator
36// ============================================================================
37
45struct FL_ALIGNAS(8) Wave8BitExpansionLut {
46 Wave8Bit lut[16][4]; // nibble -> 4 Wave8Bit (4 bytes per nibble)
47};
48
56struct FL_ALIGNAS(8) Wave8ByteExpansionLut {
57 Wave8Byte lut[256]; // byte -> 8 Wave8Bit (8 bytes per byte)
58};
59
71Wave8BitExpansionLut buildWave8ExpansionLUT(const ChipsetTiming &timing);
72
78Wave8ByteExpansionLut buildWave8ByteExpansionLUT(const Wave8BitExpansionLut &nibble);
79
80// Forward declaration for inline function (implementation in detail/wave8.hpp)
81void wave8(u8 lane,
82 const Wave8BitExpansionLut &lut,
83 u8 (&FL_RESTRICT_PARAM output)[sizeof(Wave8Byte)]);
84
85// Public transposition functions (implementations in wave8.cpp)
87 const u8 (&FL_RESTRICT_PARAM lanes)[2],
88 const Wave8BitExpansionLut &lut,
89 u8 (&FL_RESTRICT_PARAM output)[2 * sizeof(Wave8Byte)]);
90
92 const u8 (&FL_RESTRICT_PARAM lanes)[4],
93 const Wave8BitExpansionLut &lut,
94 u8 (&FL_RESTRICT_PARAM output)[4 * sizeof(Wave8Byte)]);
95
97 const u8 (&FL_RESTRICT_PARAM lanes)[8],
98 const Wave8BitExpansionLut &lut,
99 u8 (&FL_RESTRICT_PARAM output)[8 * sizeof(Wave8Byte)]);
100
102 const u8 (&FL_RESTRICT_PARAM lanes)[16],
103 const Wave8BitExpansionLut &lut,
104 u8 (&FL_RESTRICT_PARAM output)[16 * sizeof(Wave8Byte)]);
105
106// Byte-LUT overloads (#2526): same semantics, faster expansion path.
108 const u8 (&FL_RESTRICT_PARAM lanes)[2],
109 const Wave8ByteExpansionLut &lut,
110 u8 (&FL_RESTRICT_PARAM output)[2 * sizeof(Wave8Byte)]);
111
113 const u8 (&FL_RESTRICT_PARAM lanes)[4],
114 const Wave8ByteExpansionLut &lut,
115 u8 (&FL_RESTRICT_PARAM output)[4 * sizeof(Wave8Byte)]);
116
118 const u8 (&FL_RESTRICT_PARAM lanes)[8],
119 const Wave8ByteExpansionLut &lut,
120 u8 (&FL_RESTRICT_PARAM output)[8 * sizeof(Wave8Byte)]);
121
123 const u8 (&FL_RESTRICT_PARAM lanes)[16],
124 const Wave8ByteExpansionLut &lut,
125 u8 (&FL_RESTRICT_PARAM output)[16 * sizeof(Wave8Byte)]);
126
135 const u8 (&FL_RESTRICT_PARAM lanes_a)[16],
136 const u8 (&FL_RESTRICT_PARAM lanes_b)[16],
137 const Wave8ByteExpansionLut &lut,
138 u8 (&FL_RESTRICT_PARAM output_a)[16 * sizeof(Wave8Byte)],
139 u8 (&FL_RESTRICT_PARAM output_b)[16 * sizeof(Wave8Byte)]);
140
149 const u8 (&FL_RESTRICT_PARAM lanes_a)[16],
150 const u8 (&FL_RESTRICT_PARAM lanes_b)[16],
151 const u8 (&FL_RESTRICT_PARAM lanes_c)[16],
152 const u8 (&FL_RESTRICT_PARAM lanes_d)[16],
153 const Wave8ByteExpansionLut &lut,
154 u8 (&FL_RESTRICT_PARAM output_a)[16 * sizeof(Wave8Byte)],
155 u8 (&FL_RESTRICT_PARAM output_b)[16 * sizeof(Wave8Byte)],
156 u8 (&FL_RESTRICT_PARAM output_c)[16 * sizeof(Wave8Byte)],
157 u8 (&FL_RESTRICT_PARAM output_d)[16 * sizeof(Wave8Byte)]);
158
161 const u8 (&FL_RESTRICT_PARAM lanes)[2],
162 const Wave8ByteExpansionLut &lut,
163 u8 (&FL_RESTRICT_PARAM output)[2 * sizeof(Wave8Byte)]);
164
167 const u8 (&FL_RESTRICT_PARAM lanes)[4],
168 const Wave8ByteExpansionLut &lut,
169 u8 (&FL_RESTRICT_PARAM output)[4 * sizeof(Wave8Byte)]);
170
173 const u8 (&FL_RESTRICT_PARAM lanes)[8],
174 const Wave8ByteExpansionLut &lut,
175 u8 (&FL_RESTRICT_PARAM output)[8 * sizeof(Wave8Byte)]);
176
185 const u8 (&FL_RESTRICT_PARAM lanes)[16],
186 const Wave8ByteExpansionLut &lut,
187 u8 (&FL_RESTRICT_PARAM output)[16 * sizeof(Wave8Byte)]);
188
196 const u8 (&FL_RESTRICT_PARAM lanes_a)[16],
197 const u8 (&FL_RESTRICT_PARAM lanes_b)[16],
198 const u8 (&FL_RESTRICT_PARAM lanes_c)[16],
199 const u8 (&FL_RESTRICT_PARAM lanes_d)[16],
200 const Wave8ByteExpansionLut &lut,
201 u8 (&FL_RESTRICT_PARAM output_a)[16 * sizeof(Wave8Byte)],
202 u8 (&FL_RESTRICT_PARAM output_b)[16 * sizeof(Wave8Byte)],
203 u8 (&FL_RESTRICT_PARAM output_c)[16 * sizeof(Wave8Byte)],
204 u8 (&FL_RESTRICT_PARAM output_d)[16 * sizeof(Wave8Byte)]);
205
206// Untranspose functions (for testing - reverse the transpose operation)
208 const u8 (&FL_RESTRICT_PARAM transposed)[2 * sizeof(Wave8Byte)],
209 u8 (&FL_RESTRICT_PARAM output)[2 * sizeof(Wave8Byte)]);
210
212 const u8 (&FL_RESTRICT_PARAM transposed)[4 * sizeof(Wave8Byte)],
213 u8 (&FL_RESTRICT_PARAM output)[4 * sizeof(Wave8Byte)]);
214
216 const u8 (&FL_RESTRICT_PARAM transposed)[8 * sizeof(Wave8Byte)],
217 u8 (&FL_RESTRICT_PARAM output)[8 * sizeof(Wave8Byte)]);
218
220 const u8 (&FL_RESTRICT_PARAM transposed)[16 * sizeof(Wave8Byte)],
221 u8 (&FL_RESTRICT_PARAM output)[16 * sizeof(Wave8Byte)]);
222
223} // namespace fl
224
225// Include inline implementations for optimal performance
226// This must be after the namespace to avoid the include-after-namespace linter error
Alignment macros and utilities for FastLED.
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)])
BF1 for 2-lane Wave8 (#2548 deep-dive followup).
unsigned char u8
Definition stdint.h:131
FL_OPTIMIZE_FUNCTION void wave8Untranspose_8(const u8(&FL_RESTRICT_PARAM transposed)[8 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output)[8 *sizeof(Wave8Byte)])
FL_OPTIMIZE_FUNCTION Wave8BitExpansionLut buildWave8ExpansionLUT(const ChipsetTiming &timing)
Build a Wave8BitExpansionLut from chipset timing data.
FL_OPTIMIZE_FUNCTION void wave8Untranspose_16(const u8(&FL_RESTRICT_PARAM transposed)[16 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output)[16 *sizeof(Wave8Byte)])
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)])
BF1: chipset-aware direct encode for 16-lane Wave8 (#2548 deep-dive).
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)])
Pipe2: transpose 16-lane × 2-byte-positions (#2548).
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)])
Definition wave8.cpp.hpp:73
FL_OPTIMIZE_FUNCTION void wave8Untranspose_4(const u8(&FL_RESTRICT_PARAM transposed)[4 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output)[4 *sizeof(Wave8Byte)])
FASTLED_FORCE_INLINE FL_IRAM FL_OPTIMIZE_FUNCTION void wave8(u8 lane, const Wave8BitExpansionLut &lut, u8(&FL_RESTRICT_PARAM output)[sizeof(Wave8Byte)])
Convert byte to 8 Wave8Bit structures using nibble LUT.
Definition wave8.hpp:514
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)])
Definition wave8.cpp.hpp:24
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)])
BF1 for 8-lane Wave8 (#2548 deep-dive followup).
Wave8ByteExpansionLut buildWave8ByteExpansionLUT(const Wave8BitExpansionLut &nibble)
Build a byte-indexed expansion LUT (#2526) from the nibble LUT.
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)])
Pipe4: transpose 16-lane × 4-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)])
BF1 for 4-lane Wave8 (#2548 deep-dive followup).
struct FL_ALIGNAS(4) Wave3BitExpansionLut
Lookup table for nibble-to-waveform expansion in wave3 format (32 bytes)
Definition wave3.h:31
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)])
BF1 + pipe4: 4-position-pipelined direct encode (#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)])
Definition wave8.cpp.hpp:57
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)])
Definition wave8.cpp.hpp:41
FL_OPTIMIZE_FUNCTION void wave8Untranspose_2(const u8(&FL_RESTRICT_PARAM transposed)[2 *sizeof(Wave8Byte)], u8(&FL_RESTRICT_PARAM output)[2 *sizeof(Wave8Byte)])
Base definition for an LED controller.
Definition crgb.hpp:179
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:22
#define FL_ALIGNAS(N)
#define FL_RESTRICT_PARAM