blob: aca3577ff6308d121af3ed7fea7916d40b7c49de [file] [log] [blame]
#ifndef ECC_H_
#define ECC_H_
#include <cstdint>
#include <string>
#include <unordered_map>
#include <vector>
class ECC {
public:
ECC(const std::string& architecture, size_t words_per_frame)
: architecture_(architecture),
frame_words_(words_per_frame),
ecc_word_(ecc_word_per_architecture.at(architecture)) {}
void UpdateFrameECC(std::vector<uint32_t>& data) const;
private:
const std::string architecture_;
const size_t frame_words_;
const size_t ecc_word_;
static const std::unordered_map<std::string, size_t>
ecc_word_per_architecture;
uint64_t CalculateECC(const std::vector<uint32_t>& words) const;
uint64_t GetUSEccFrameOffset(int word, int bit) const;
uint32_t GetSeries7WordEcc(uint32_t idx,
uint32_t data,
uint32_t ecc) const;
uint64_t GetUSWordEcc(uint32_t idx, uint32_t data, uint64_t ecc) const;
};
#endif // ECC_H_