31#ifndef ETL_CRC_IMPLEMENTATION_INCLUDED
32#define ETL_CRC_IMPLEMENTATION_INCLUDED
36#include "../static_assert.h"
44#if defined(ETL_COMPILER_KEIL)
45#pragma diag_suppress 1300
55 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect, TAccumulator Entry>
60 static ETL_CONSTANT
bool Do_Poly = Reflect ? (Entry & TAccumulator(1U)) != 0U
61 : (Entry & (TAccumulator(1U) << (Accumulator_Bits - 1U))) != 0U;
66 : TAccumulator(Do_Poly ? (Entry << 1U) ^ Polynomial : (Entry << 1U));
69 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect, TAccumulator Entry>
70 ETL_CONSTANT TAccumulator crc_partial_table_entry<TAccumulator, Accumulator_Bits, Polynomial, Reflect, Entry>::value;
75 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index, u
int8_t Chunk_Bits>
78 ETL_STATIC_ASSERT((Chunk_Bits == 2U) || (Chunk_Bits == 4U) || (Chunk_Bits == 8U),
"Chunk bits must be 2, 4 or 8");
83 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
84 class crc_table_entry<TAccumulator, Accumulator_Bits, Polynomial, Reflect, Index, 2U>
88 static ETL_CONSTANT
size_t Shift_Bits = size_t(Accumulator_Bits - 2U);
89 static ETL_CONSTANT TAccumulator Entry = Reflect ? TAccumulator(Index) : TAccumulator(TAccumulator(Index) << Shift_Bits);
91 static ETL_CONSTANT TAccumulator value =
crc_partial_table_entry<TAccumulator, Accumulator_Bits, Polynomial, Reflect,
92 crc_partial_table_entry<TAccumulator, Accumulator_Bits, Polynomial, Reflect, Entry>::value>::value;
95 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
98 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
101 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
106 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
111 static ETL_CONSTANT
size_t Shift_Bits = size_t(Accumulator_Bits - 4U);
112 static ETL_CONSTANT TAccumulator Entry = Reflect ? TAccumulator(Index) : TAccumulator(TAccumulator(Index) << Shift_Bits);
114 static ETL_CONSTANT TAccumulator value =
crc_partial_table_entry<TAccumulator, Accumulator_Bits, Polynomial, Reflect,
117 crc_partial_table_entry<TAccumulator, Accumulator_Bits, Polynomial, Reflect, Entry>::value>::value>::value>::value;
120 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
123 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
126 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
131 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
136 static ETL_CONSTANT
size_t Shift_Bits = size_t(Accumulator_Bits - 8U);
137 static ETL_CONSTANT TAccumulator Entry = Reflect ? TAccumulator(Index) : TAccumulator(TAccumulator(Index) << Shift_Bits);
139 static ETL_CONSTANT TAccumulator value =
crc_partial_table_entry<TAccumulator, Accumulator_Bits, Polynomial, Reflect,
146 crc_partial_table_entry<TAccumulator, Accumulator_Bits, Polynomial, Reflect, Entry>::value>::value>::value>::value>::value>::value>::value>::value;
149 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
152 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
155 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
165 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask,
bool Reflect>
166 static ETL_CONSTEXPR14
168 crc_update_chunk(TAccumulator crc, uint8_t value,
const TAccumulator table[])
172 uint8_t index = (crc >> (Accumulator_Bits - Chunk_Bits)) ^ value;
183 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask,
bool Reflect>
184 static ETL_CONSTEXPR14
186 crc_update_chunk(TAccumulator crc, uint8_t value,
const TAccumulator table[])
190 uint8_t index = (crc & Chunk_Mask) ^ value;
201 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask,
bool Reflect>
202 static ETL_CONSTEXPR14
203 typename etl::enable_if<(Accumulator_Bits == Chunk_Bits) && !Reflect, TAccumulator>::type
204 crc_update_chunk(TAccumulator crc, uint8_t value,
const TAccumulator table[])
208 uint8_t index = (crc >> (Accumulator_Bits - Chunk_Bits)) ^ value;
218 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask,
bool Reflect>
219 static ETL_CONSTEXPR14
220 typename etl::enable_if<(Accumulator_Bits == Chunk_Bits) && Reflect, TAccumulator>::type
221 crc_update_chunk(TAccumulator crc, uint8_t value,
const TAccumulator table[])
225 uint8_t index = (crc & Chunk_Mask) ^ value;
235 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect,
size_t Table_Size>
240 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect>
241 struct crc_table<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Polynomial, Reflect, 4U>
245 TAccumulator add(TAccumulator crc, uint8_t value)
const
248 static ETL_CONSTANT TAccumulator table[4U] =
256 ETL_CONSTEXPR14 TAccumulator add(TAccumulator crc, uint8_t value)
const
259 if ETL_IF_CONSTEXPR(Reflect)
261 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, value, table);
262 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, (value >> (Chunk_Bits * 1U)), table);
263 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, (value >> (Chunk_Bits * 2U)), table);
264 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, (value >> (Chunk_Bits * 3U)), table);
268 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, (value >> (Chunk_Bits * 3U)), table);
269 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, (value >> (Chunk_Bits * 2U)), table);
270 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, (value >> (Chunk_Bits * 1U)), table);
271 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, value, table);
278 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect>
284 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect>
285 struct crc_table<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Polynomial, Reflect, 16U>
289 TAccumulator add(TAccumulator crc, uint8_t value)
const
292 static ETL_CONSTANT TAccumulator table[16U] =
312 ETL_CONSTEXPR14 TAccumulator add(TAccumulator crc, uint8_t value)
const
315 if ETL_IF_CONSTEXPR(Reflect)
317 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, value, table);
318 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, value >> Chunk_Bits, table);
322 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, value >> Chunk_Bits, table);
323 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, value, table);
330 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect>
336 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect>
337 struct crc_table<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Polynomial, Reflect, 256U>
341 TAccumulator add(TAccumulator crc, uint8_t value)
const
344 static ETL_CONSTANT TAccumulator table[256U]=
604 ETL_CONSTEXPR14 TAccumulator add(TAccumulator crc, uint8_t value)
const
608 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, value, table);
614 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect>
620 template <
typename TCrcParameters,
size_t Table_Size>
625 template <
typename TCrcParameters>
627 TCrcParameters::Accumulator_Bits,
630 TCrcParameters::Polynomial,
631 TCrcParameters::Reflect,
634 typedef typename TCrcParameters::accumulator_type accumulator_type;
635 typedef accumulator_type value_type;
638 ETL_CONSTEXPR accumulator_type initial()
const
641 : TCrcParameters::Initial;
645 ETL_CONSTEXPR accumulator_type
final(accumulator_type crc)
const
647 return crc ^ TCrcParameters::Xor_Out;
653 template <
typename TCrcParameters>
655 TCrcParameters::Accumulator_Bits,
658 TCrcParameters::Polynomial,
659 TCrcParameters::Reflect,
662 typedef typename TCrcParameters::accumulator_type accumulator_type;
663 typedef accumulator_type value_type;
666 ETL_CONSTEXPR accumulator_type initial()
const
669 : TCrcParameters::Initial;
673 ETL_CONSTEXPR accumulator_type
final(accumulator_type crc)
const
675 return crc ^ TCrcParameters::Xor_Out;
681 template <
typename TCrcParameters>
683 TCrcParameters::Accumulator_Bits,
686 TCrcParameters::Polynomial,
687 TCrcParameters::Reflect,
690 typedef typename TCrcParameters::accumulator_type accumulator_type;
691 typedef accumulator_type value_type;
694 ETL_CONSTEXPR accumulator_type initial()
const
697 : TCrcParameters::Initial;
701 ETL_CONSTEXPR accumulator_type
final(accumulator_type crc)
const
703 return crc ^ TCrcParameters::Xor_Out;
711 template <
typename TCrcParameters,
size_t Table_Size>
716 ETL_STATIC_ASSERT((Table_Size == 4U) || (Table_Size == 16U) || (Table_Size == 256U),
"Table size must be 4, 16 or 256");
731 template<
typename TIterator>
ETL_CONSTEXPR14 crc_type(TIterator begin, const TIterator end)
Definition crc_implementation.h:732
ETL_CONSTEXPR14 crc_type()
Default constructor.
Definition crc_implementation.h:721
CRC Partial Table Entry.
Definition crc_implementation.h:57
CRC Table Entry.
Definition crc_implementation.h:77
ETL_CONSTEXPR14 void add(TIterator begin, const TIterator end)
Definition frame_check_sequence.h:144
ETL_CONSTEXPR14 void reset()
Definition frame_check_sequence.h:133
Definition frame_check_sequence.h:98
enable_if
Definition type_traits_generator.h:1254
bitset_ext
Definition absolute.h:39
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition iterator.h:962
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition iterator.h:992
Definition crc_implementation.h:621
Definition crc_implementation.h:236