#include #include namespace prjxray { namespace xilinx { namespace xc7series { bool ConfigurationBus::IsValidFrameAddress(FrameAddress address) const { auto addr_column = configuration_columns_.find(address.column()); if (addr_column == configuration_columns_.end()) return false; return addr_column->second.IsValidFrameAddress(address); } absl::optional ConfigurationBus::GetNextFrameAddress( FrameAddress address) const { // Find the column for the current address. auto addr_column = configuration_columns_.find(address.column()); // If the current address isn't in a known column, no way to know the // next address. if (addr_column == configuration_columns_.end()) return {}; // Ask the column for the next address. absl::optional next_address = addr_column->second.GetNextFrameAddress(address); if (next_address) return next_address; // The current column doesn't know what the next address is. Assume // that the next valid address is the beginning of the next column. if (++addr_column != configuration_columns_.end()) { auto next_address = FrameAddress( address.block_type(), address.is_bottom_half_rows(), address.row(), addr_column->first, 0); if (addr_column->second.IsValidFrameAddress(next_address)) return next_address; } // Not in this bus. return {}; } } // namespace xc7series } // namespace xilinx } // namespace prjxray namespace xc7series = prjxray::xilinx::xc7series; namespace YAML { Node convert::encode( const xc7series::ConfigurationBus& rhs) { Node node; node.SetTag("xilinx/xc7series/configuration_bus"); node["configuration_columns"] = rhs.configuration_columns_; return node; } bool convert::decode( const Node& node, xc7series::ConfigurationBus& lhs) { if (!node.Tag().empty() && node.Tag() != "xilinx/xc7series/configuration_bus") { return false; } lhs.configuration_columns_ = node["configuration_columns"] .as>(); return true; } } // namespace YAML