#ifndef CONFIGURATION_PACKETS_H_ #define CONFIGURATION_PACKETS_H_ #include #include #include #include #include "ecc.h" #include "header.h" class ConfigurationPackets { public: ConfigurationPackets(const std::string& arch); static const std::unordered_map words_in_architecture; static std::shared_ptr 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>; using ConfigurationFrames = std::map>; // 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 kRCrcCmd = {{0x30008001, 0x7}}; size_t words_per_frame_; std::string architecture_; ConfigurationFrames configuration_data_packets_; std::vector fpga_configuration_head_; std::vector fpga_configuration_tail_; std::unique_ptr
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& 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& vect); }; #endif // CONFIGURATION_PACKETS_H_