diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 3b97c960..21ae0404 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -5,6 +5,7 @@ add_library(libprjxray xilinx/xc7series/bitstream_reader.cc xilinx/xc7series/block_type.cc xilinx/xc7series/configuration_frame_address.cc + xilinx/xc7series/configuration_frame_range.cc xilinx/xc7series/configuration_packet.cc xilinx/xc7series/configuration_register.cc ) diff --git a/lib/include/prjxray/xilinx/xc7series/configuration_frame_range.h b/lib/include/prjxray/xilinx/xc7series/configuration_frame_range.h new file mode 100644 index 00000000..97690d69 --- /dev/null +++ b/lib/include/prjxray/xilinx/xc7series/configuration_frame_range.h @@ -0,0 +1,48 @@ +#ifndef PRJXRAY_LIB_XILINX_XC7SERIES_CONFIGURATION_FRAME_RANGE_H_ +#define PRJXRAY_LIB_XILINX_XC7SERIES_CONFIGURATION_FRAME_RANGE_H_ + +#include + +#include +#include + +namespace prjxray { +namespace xilinx { +namespace xc7series { + +class ConfigurationFrameRange { + public: + ConfigurationFrameRange() : begin_(0), end_(0) {} + + ConfigurationFrameRange(ConfigurationFrameAddress begin, + ConfigurationFrameAddress end) + : begin_(begin), end_(end) {}; + + ConfigurationFrameAddress begin() const { return begin_; } + ConfigurationFrameAddress end() const { return end_; } + + size_t size() const { return end_ - begin_; } + bool empty() const { return size() == 0; } + + bool Contains(ConfigurationFrameAddress address) const; + + private: + ConfigurationFrameAddress begin_; + ConfigurationFrameAddress end_; +}; + +} // namespace xc7series +} // namespace xilinx +} // namespace prjxray + +namespace YAML { +template<> +struct convert { + static Node encode( + const prjxray::xilinx::xc7series::ConfigurationFrameRange &rhs); + static bool decode( + const Node& node, + prjxray::xilinx::xc7series::ConfigurationFrameRange &lhs); +}; +} // namespace YAML +#endif // PRJXRAY_LIB_XILINX_XC7SERIES_CONFIGURATION_FRAME_RANGE_H_ diff --git a/lib/xilinx/xc7series/configuration_frame_range.cc b/lib/xilinx/xc7series/configuration_frame_range.cc new file mode 100644 index 00000000..9113005d --- /dev/null +++ b/lib/xilinx/xc7series/configuration_frame_range.cc @@ -0,0 +1,42 @@ +#include + +namespace prjxray { +namespace xilinx { +namespace xc7series { + +bool ConfigurationFrameRange::Contains( + ConfigurationFrameAddress address) const { + return address >= begin_ && address < end_; +} + +} // namespace xc7series +} // namespace xilinx +} // namespace prjxray + +namespace xc7series = prjxray::xilinx::xc7series; + +namespace YAML { + +Node convert::encode( + const xc7series::ConfigurationFrameRange &rhs) { + Node node; + node.SetTag("xilinx/xc7series/configuration_frame_range"); + node["begin"] = rhs.begin(); + node["end"] = rhs.end(); + return node; +} + +bool convert::decode( + const Node &node, + xc7series::ConfigurationFrameRange &lhs) { + if (node.Tag() != "xilinx/xc7series/configuration_frame_range" || + !node["begin"] || + !node["end"]) return false; + + lhs = xc7series::ConfigurationFrameRange( + node["begin"].as(), + node["end"].as()); + return true; +} + +} // namespace YAML;