31#ifndef ETL_CRC_IMPLEMENTATION_INCLUDED
32#define ETL_CRC_IMPLEMENTATION_INCLUDED
37#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 : (Entry & (TAccumulator(1U) << (Accumulator_Bits - 1U))) != 0U;
64 static ETL_CONSTANT TAccumulator value =
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 =
93 crc_partial_table_entry<TAccumulator, Accumulator_Bits, Polynomial, Reflect, Entry>::value>::value;
96 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
99 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
102 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
107 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
112 static ETL_CONSTANT
size_t Shift_Bits = size_t(Accumulator_Bits - 4U);
113 static ETL_CONSTANT TAccumulator Entry = Reflect ? TAccumulator(Index) : TAccumulator(TAccumulator(Index) << Shift_Bits);
116 TAccumulator, Accumulator_Bits, Polynomial, Reflect,
118 TAccumulator, Accumulator_Bits, Polynomial, Reflect,
120 crc_partial_table_entry<TAccumulator, Accumulator_Bits, Polynomial, Reflect, Entry>::value>::value>::value>::value;
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>
129 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
134 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
139 static ETL_CONSTANT
size_t Shift_Bits = size_t(Accumulator_Bits - 8U);
140 static ETL_CONSTANT TAccumulator Entry = Reflect ? TAccumulator(Index) : TAccumulator(TAccumulator(Index) << Shift_Bits);
143 TAccumulator, Accumulator_Bits, Polynomial, Reflect,
145 TAccumulator, Accumulator_Bits, Polynomial, Reflect,
147 TAccumulator, Accumulator_Bits, Polynomial, Reflect,
149 TAccumulator, Accumulator_Bits, Polynomial, Reflect,
154 Polynomial, Reflect, Entry>::value>::
155 value>::value>::value>::value>::value>::value>::value;
158 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
161 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
164 template <
typename TAccumulator,
size_t Accumulator_Bits, TAccumulator Polynomial,
bool Reflect,
size_t Index>
174 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask,
bool Reflect>
175 static ETL_CONSTEXPR14
typename etl::enable_if<(Accumulator_Bits > Chunk_Bits) && !Reflect, TAccumulator>
::type
176 crc_update_chunk(TAccumulator crc, uint8_t value,
const TAccumulator table[])
180 uint8_t index = (crc >> (Accumulator_Bits - Chunk_Bits)) ^ value;
191 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask,
bool Reflect>
192 static ETL_CONSTEXPR14
typename etl::enable_if<(Accumulator_Bits > Chunk_Bits) && Reflect, TAccumulator>
::type
193 crc_update_chunk(TAccumulator crc, uint8_t value,
const TAccumulator table[])
197 uint8_t index = (crc & Chunk_Mask) ^ value;
208 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask,
bool Reflect>
209 static ETL_CONSTEXPR14
typename etl::enable_if<(Accumulator_Bits == Chunk_Bits) && !Reflect, TAccumulator>
::type
210 crc_update_chunk(TAccumulator crc, uint8_t value,
const TAccumulator table[])
214 uint8_t index = (crc >> (Accumulator_Bits - Chunk_Bits)) ^ value;
224 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask,
bool Reflect>
225 static ETL_CONSTEXPR14
typename etl::enable_if<(Accumulator_Bits == Chunk_Bits) && Reflect, TAccumulator>::type
226 crc_update_chunk(TAccumulator crc, uint8_t value,
const TAccumulator table[])
230 uint8_t index = (crc & Chunk_Mask) ^ value;
240 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, uint8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect,
246 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect>
247 struct crc_table<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Polynomial, Reflect, 4U>
251 TAccumulator add(TAccumulator crc, uint8_t value)
const
259 ETL_CONSTEXPR14 TAccumulator add(TAccumulator crc, uint8_t value)
const
262 if ETL_IF_CONSTEXPR (Reflect)
264 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, value, table);
265 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, (value >> (Chunk_Bits * 1U)), table);
266 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, (value >> (Chunk_Bits * 2U)), table);
267 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, (value >> (Chunk_Bits * 3U)), table);
271 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, (value >> (Chunk_Bits * 3U)), table);
272 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, (value >> (Chunk_Bits * 2U)), table);
273 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, (value >> (Chunk_Bits * 1U)), table);
274 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, value, table);
281 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect>
287 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect>
288 struct crc_table<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Polynomial, Reflect, 16U>
292 TAccumulator add(TAccumulator crc, uint8_t value)
const
313 ETL_CONSTEXPR14 TAccumulator add(TAccumulator crc, uint8_t value)
const
316 if ETL_IF_CONSTEXPR (Reflect)
318 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, value, table);
319 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 >> Chunk_Bits, table);
324 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, value, table);
331 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect>
337 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect>
338 struct crc_table<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Polynomial, Reflect, 256U>
342 TAccumulator add(TAccumulator crc, uint8_t value)
const
603 ETL_CONSTEXPR14 TAccumulator add(TAccumulator crc, uint8_t value)
const
607 crc = crc_update_chunk<TAccumulator, Accumulator_Bits, Chunk_Bits, Chunk_Mask, Reflect>(crc, value, table);
613 template <
typename TAccumulator,
size_t Accumulator_Bits,
size_t Chunk_Bits, u
int8_t Chunk_Mask, TAccumulator Polynomial,
bool Reflect>
619 template <
typename TCrcParameters,
size_t Table_Size>
624 template <
typename TCrcParameters>
626 :
public crc_table<typename TCrcParameters::accumulator_type, TCrcParameters::Accumulator_Bits, 8U, 0xFFU, TCrcParameters::Polynomial,
627 TCrcParameters::Reflect, 256U>
629 typedef typename TCrcParameters::accumulator_type accumulator_type;
630 typedef accumulator_type value_type;
633 ETL_CONSTEXPR accumulator_type initial()
const
639 ETL_CONSTEXPR accumulator_type
final(accumulator_type crc)
const
641 return crc ^ TCrcParameters::Xor_Out;
647 template <
typename TCrcParameters>
649 :
public crc_table<typename TCrcParameters::accumulator_type, TCrcParameters::Accumulator_Bits, 4U, 0x0FU, TCrcParameters::Polynomial,
650 TCrcParameters::Reflect, 16U>
652 typedef typename TCrcParameters::accumulator_type accumulator_type;
653 typedef accumulator_type value_type;
656 ETL_CONSTEXPR accumulator_type initial()
const
662 ETL_CONSTEXPR accumulator_type
final(accumulator_type crc)
const
664 return crc ^ TCrcParameters::Xor_Out;
670 template <
typename TCrcParameters>
672 :
public crc_table<typename TCrcParameters::accumulator_type, TCrcParameters::Accumulator_Bits, 2U, 0x03U, TCrcParameters::Polynomial,
673 TCrcParameters::Reflect, 4U>
675 typedef typename TCrcParameters::accumulator_type accumulator_type;
676 typedef accumulator_type value_type;
679 ETL_CONSTEXPR accumulator_type initial()
const
685 ETL_CONSTEXPR accumulator_type
final(accumulator_type crc)
const
687 return crc ^ TCrcParameters::Xor_Out;
695 template <
typename TCrcParameters,
size_t Table_Size>
700 ETL_STATIC_ASSERT((Table_Size == 4U) || (Table_Size == 16U) || (Table_Size == 256U),
"Table size must be 4, 16 or 256");
715 template <
typename TIterator>
ETL_CONSTEXPR14 crc_type(TIterator begin, const TIterator end)
Definition crc_implementation.h:716
ETL_CONSTEXPR14 crc_type()
Default constructor.
Definition crc_implementation.h:705
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:145
ETL_CONSTEXPR14 void reset()
Definition frame_check_sequence.h:134
Definition frame_check_sequence.h:98
bitset_ext
Definition absolute.h:40
ETL_CONSTEXPR TContainer::iterator begin(TContainer &container)
Definition iterator.h:967
ETL_CONSTEXPR TContainer::iterator end(TContainer &container)
Definition iterator.h:997
Definition crc_implementation.h:620
Definition crc_implementation.h:242