blob: 4df210525f821ca2ba04c46aab7d789574396af1 [file] [log] [blame]
#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