| #ifndef PRJXRAY_LIB_XILINX_XCUSERIES_CRC_H_ | |
| #define PRJXRAY_LIB_XILINX_XCUSERIES_CRC_H_ | |
| #include <cstdint> | |
| constexpr uint32_t kCrc32CastagnoliPolynomial = 0x82F63B78; | |
| namespace prjxray { | |
| namespace xilinx { | |
| namespace xcuseries { | |
| // The CRC is calculated from each written data word and the current | |
| // register address the data is written to. | |
| // Extend the current CRC value with one register address (5bit) and | |
| // frame data (32bit) pair and return the newly computed CRC value. | |
| uint32_t icap_crc(uint32_t addr, uint32_t data, uint32_t prev) { | |
| constexpr int kAddressBitWidth = 5; | |
| constexpr int kDataBitWidth = 32; | |
| uint64_t poly = static_cast<uint64_t>(kCrc32CastagnoliPolynomial) << 1; | |
| uint64_t val = (static_cast<uint64_t>(addr) << 32) | data; | |
| uint64_t crc = prev; | |
| for (int i = 0; i < kAddressBitWidth + kDataBitWidth; i++) { | |
| if ((val & 1) != (crc & 1)) | |
| crc ^= poly; | |
| val >>= 1; | |
| crc >>= 1; | |
| } | |
| return crc; | |
| } | |
| } // namespace xcuseries | |
| } // namespace xilinx | |
| } // namespace prjxray | |
| #endif // PRJXRAY_LIB_XILINX_XCUSERIES_CRC_H_ |