| #ifndef PRJXRAY_LIB_XILINX_XCUSERIES_CONFIGURATION_COLUMN_H_ |
| #define PRJXRAY_LIB_XILINX_XCUSERIES_CONFIGURATION_COLUMN_H_ |
| |
| #include <algorithm> |
| #include <cassert> |
| |
| #include <absl/types/optional.h> |
| #include <prjxray/xilinx/xcuseries/frame_address.h> |
| #include <yaml-cpp/yaml.h> |
| |
| namespace prjxray { |
| namespace xilinx { |
| namespace xcuseries { |
| |
| // ConfigurationColumn represents an endpoint on a ConfigurationBus. |
| class ConfigurationColumn { |
| public: |
| ConfigurationColumn() = default; |
| ConfigurationColumn(unsigned int frame_count) |
| : frame_count_(frame_count) {} |
| |
| // Returns a ConfigurationColumn that describes a continguous range of |
| // minor addresses that encompasses the given |
| // FrameAddresses. The provided addresses must only |
| // differ only by their minor addresses. |
| template <typename T> |
| ConfigurationColumn(T first, T last); |
| |
| // Returns true if the minor field of the address is within the valid |
| // range of this column. |
| bool IsValidFrameAddress(FrameAddress address) const; |
| |
| // Returns the next address in numerical order. If the next address |
| // would be outside this column, return no object. |
| absl::optional<FrameAddress> GetNextFrameAddress( |
| FrameAddress address) const; |
| |
| private: |
| friend struct YAML::convert<ConfigurationColumn>; |
| |
| unsigned int frame_count_; |
| }; |
| |
| template <typename T> |
| ConfigurationColumn::ConfigurationColumn(T first, T last) { |
| assert( |
| std::all_of(first, last, [&](const typename T::value_type& addr) { |
| return (addr.block_type() == first->block_type() && |
| addr.is_bottom_half_rows() == |
| first->is_bottom_half_rows() && |
| addr.row() == first->row() && |
| addr.column() == first->column()); |
| })); |
| |
| auto max_minor = std::max_element( |
| first, last, [](const FrameAddress& lhs, const FrameAddress& rhs) { |
| return lhs.minor() < rhs.minor(); |
| }); |
| |
| frame_count_ = max_minor->minor() + 1; |
| } |
| |
| } // namespace xcuseries |
| } // namespace xilinx |
| } // namespace prjxray |
| |
| namespace YAML { |
| template <> |
| struct convert<prjxray::xilinx::xcuseries::ConfigurationColumn> { |
| static Node encode( |
| const prjxray::xilinx::xcuseries::ConfigurationColumn& rhs); |
| static bool decode( |
| const Node& node, |
| prjxray::xilinx::xcuseries::ConfigurationColumn& lhs); |
| }; |
| } // namespace YAML |
| |
| #endif // PRJXRAY_LIB_XILINX_XCUSERIES_CONFIGURATION_COLUMN_H_ |