| #include <prjxray/xilinx/xc7series/global_clock_region.h> | |
| 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<FrameAddress> 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<FrameAddress> 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<xc7series::GlobalClockRegion>::encode( | |
| const xc7series::GlobalClockRegion& rhs) { | |
| Node node; | |
| node.SetTag("xilinx/xc7series/global_clock_region"); | |
| node["rows"] = rhs.rows_; | |
| return node; | |
| } | |
| bool convert<xc7series::GlobalClockRegion>::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<std::map<unsigned int, xc7series::Row>>(); | |
| return true; | |
| } | |
| } // namespace YAML |