mirror of https://github.com/openXC7/prjxray.git
69 lines
2.0 KiB
C++
69 lines
2.0 KiB
C++
#ifndef PRJXRAY_LIB_XILINX_CONFIGURATION_PACKET_H
|
|
#define PRJXRAY_LIB_XILINX_CONFIGURATION_PACKET_H
|
|
|
|
#include <cstdint>
|
|
#include <ostream>
|
|
|
|
#include <absl/types/optional.h>
|
|
#include <absl/types/span.h>
|
|
#include <prjxray/xilinx/configuration_register.h>
|
|
|
|
namespace prjxray {
|
|
namespace xilinx {
|
|
|
|
// As described in the configuration user guide for Series-7
|
|
// (UG470, pg. 108) there are two types of configuration packets
|
|
enum ConfigurationPacketType { NONE, TYPE1, TYPE2 };
|
|
|
|
// Creates a Type1 or Type2 configuration packet.
|
|
// Specification of the packets for Series-7 can be found in UG470, pg. 108
|
|
// For Spartan6 UG380, pg. 98
|
|
template <typename ConfigRegType>
|
|
class ConfigurationPacket {
|
|
public:
|
|
typedef std::pair<absl::Span<uint32_t>,
|
|
absl::optional<ConfigurationPacket<ConfigRegType>>>
|
|
ParseResult;
|
|
|
|
// Opcodes as specified in UG470 page 108
|
|
enum Opcode {
|
|
NOP = 0,
|
|
Read = 1,
|
|
Write = 2,
|
|
/* reserved = 3 */
|
|
};
|
|
|
|
ConfigurationPacket(unsigned int header_type,
|
|
Opcode opcode,
|
|
ConfigRegType address,
|
|
const absl::Span<const uint32_t>& data)
|
|
: header_type_(header_type),
|
|
opcode_(opcode),
|
|
address_(address),
|
|
data_(std::move(data)) {}
|
|
|
|
unsigned int header_type() const { return header_type_; }
|
|
const Opcode opcode() const { return opcode_; }
|
|
const ConfigRegType address() const { return address_; }
|
|
const absl::Span<const uint32_t>& data() const { return data_; }
|
|
static ParseResult InitWithWords(
|
|
absl::Span<uint32_t> words,
|
|
const ConfigurationPacket<ConfigRegType>* previous_packet =
|
|
nullptr);
|
|
|
|
private:
|
|
unsigned int header_type_;
|
|
Opcode opcode_;
|
|
ConfigRegType address_;
|
|
absl::Span<const uint32_t> data_;
|
|
};
|
|
|
|
template <class ConfigRegType>
|
|
std::ostream& operator<<(std::ostream& o,
|
|
const ConfigurationPacket<ConfigRegType>& packet);
|
|
|
|
} // namespace xilinx
|
|
} // namespace prjxray
|
|
|
|
#endif // PRJXRAY_LIB_XILINX_CONFIGURATION_PACKET_H
|