#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
