| #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_ |