| #ifndef CONFIGURATION_PACKETS_H_ | |
| #define CONFIGURATION_PACKETS_H_ | |
| #include <array> | |
| #include <map> | |
| #include <memory> | |
| #include <unordered_map> | |
| #include "ecc.h" | |
| #include "header.h" | |
| class ConfigurationPackets { | |
| public: | |
| ConfigurationPackets(const std::string& arch); | |
| static const std::unordered_map<std::string, size_t> | |
| words_in_architecture; | |
| static std::shared_ptr<ConfigurationPackets> InitFromFile( | |
| const std::string& file, | |
| const std::string& arch); | |
| void AddAuxData(const std::string& file); | |
| void WriteBits(std::ostream& out); | |
| void SetBits(std::ifstream& ifs); | |
| private: | |
| using ConfigurationFrame = std::pair<uint32_t, std::vector<uint32_t>>; | |
| using ConfigurationFrames = std::map<uint32_t, std::vector<uint32_t>>; | |
| // Refer to UG470 page 109 for address of configuration registers and | |
| // commands | |
| const uint32_t kCmdWrite = 0x30008000; | |
| const uint32_t kFdriWrite = 0x30004000; | |
| const uint32_t kFarWrite = 0x30002000; | |
| const uint32_t kCrcWrite = 0x30000000; | |
| const uint32_t kNop = 0x20000000; | |
| const uint32_t kFarReg = 0x1; | |
| const uint32_t kFdriReg = 0x2; | |
| const uint32_t kCmdReg = 0x4; | |
| const uint32_t kWcfgCmd = 0x1; | |
| // Writing the RCRC(0x7) command in type 1 packet with 1 word to the CMD | |
| // register (0x30008001) | |
| const std::array<uint32_t, 2> kRCrcCmd = {{0x30008001, 0x7}}; | |
| size_t words_per_frame_; | |
| std::string architecture_; | |
| ConfigurationFrames configuration_data_packets_; | |
| std::vector<uint32_t> fpga_configuration_head_; | |
| std::vector<uint32_t> fpga_configuration_tail_; | |
| std::unique_ptr<Header> header_; | |
| ECC ecc_; | |
| void InitializeConfigurationData(const std::string& line); | |
| void InitializeFpgaConfigurationHead(const std::string& line); | |
| void InitializeFpgaConfigurationTail(const std::string& line); | |
| void InitializeHeader(const std::string& line); | |
| uint32_t GetCRC(ConfigurationFrames::const_iterator frame_citr, | |
| bool is_new_row = false) const; | |
| uint32_t GetFpgaConfigurationCRC() const; | |
| void UpdateECCs(); | |
| void SetBit(const std::string& line); | |
| void WriteConfiguration(std::ostream& out); | |
| void WriteFpgaConfiguration(std::ostream& out, | |
| const std::vector<uint32_t>& vect); | |
| void WritePacket(std::ostream& out, | |
| ConfigurationFrames::const_iterator frame_citr) const; | |
| bool IsDifferentRow( | |
| ConfigurationFrames::const_iterator frame_citr1, | |
| ConfigurationFrames::const_iterator frame_citr2) const; | |
| void Line2Vector(const std::string& line, std::vector<uint32_t>& vect); | |
| }; | |
| #endif // CONFIGURATION_PACKETS_H_ |