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