mirror of https://github.com/openXC7/prjxray.git
66 lines
2.5 KiB
C++
66 lines
2.5 KiB
C++
#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_
|