blob: cdf992e651b7240c4b5897a794de6079f0b69be3 [file] [log] [blame]
#ifndef PRJXRAY_LIB_XILINX_ARCHITECTURES_H_
#define PRJXRAY_LIB_XILINX_ARCHITECTURES_H_
#include <absl/types/variant.h>
#include <memory>
#include <vector>
#include <prjxray/xilinx/configuration_packet.h>
#include <prjxray/xilinx/spartan6/frame_address.h>
#include <prjxray/xilinx/spartan6/part.h>
#include <prjxray/xilinx/xc7series/frame_address.h>
#include <prjxray/xilinx/xc7series/part.h>
namespace prjxray {
namespace xilinx {
class Spartan6;
class Series7;
class UltraScale;
class UltraScalePlus;
class Architecture {
public:
using Container =
absl::variant<Series7, UltraScale, UltraScalePlus, Spartan6>;
Architecture(const std::string& name) : name_(name) {}
const std::string& name() const { return name_; }
virtual ~Architecture() {}
private:
const std::string name_;
};
class Spartan6 : public Architecture {
public:
using ConfRegType = Spartan6ConfigurationRegister;
using Part = spartan6::Part;
using ConfigurationPackage =
std::vector<std::unique_ptr<ConfigurationPacket<ConfRegType>>>;
using FrameAddress = spartan6::FrameAddress;
using WordType = uint16_t;
Spartan6() : Architecture("Spartan6") {}
static constexpr int words_per_frame = 65;
};
class Series7 : public Architecture {
public:
using ConfRegType = Series7ConfigurationRegister;
using Part = xc7series::Part;
using ConfigurationPackage =
std::vector<std::unique_ptr<ConfigurationPacket<ConfRegType>>>;
using FrameAddress = xc7series::FrameAddress;
using WordType = uint32_t;
Series7() : Architecture("Series7") {}
Series7(const std::string& name) : Architecture(name) {}
static constexpr int words_per_frame = 101;
};
class UltraScalePlus : public Series7 {
public:
UltraScalePlus() : Series7("UltraScalePlus") {}
static constexpr int words_per_frame = 93;
};
class UltraScale : public Series7 {
public:
UltraScale() : Series7("UltraScale") {}
static constexpr int words_per_frame = 123;
};
class ArchitectureFactory {
public:
static Architecture::Container create_architecture(
const std::string& arch) {
if (arch == "Spartan6") {
return Spartan6();
} else if (arch == "Series7") {
return Series7();
} else if (arch == "UltraScale") {
return UltraScale();
} else if (arch == "UltraScalePlus") {
return UltraScalePlus();
} else {
return Architecture::Container();
}
}
};
} // namespace xilinx
} // namespace prjxray
#endif // PRJXRAY_LIB_XILINX_ARCHITECTURES_H_