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