| #include <prjxray/xilinx/xcupseries/configuration_row.h> |
| |
| namespace prjxray { |
| namespace xilinx { |
| namespace xcupseries { |
| |
| bool Row::IsValidFrameAddress(FrameAddress address) const { |
| auto addr_bus = configuration_buses_.find(address.block_type()); |
| if (addr_bus == configuration_buses_.end()) |
| return false; |
| return addr_bus->second.IsValidFrameAddress(address); |
| } |
| |
| absl::optional<FrameAddress> Row::GetNextFrameAddress( |
| FrameAddress address) const { |
| // Find the bus for the current address. |
| auto addr_bus = configuration_buses_.find(address.block_type()); |
| |
| // If the current address isn't in a known bus, no way to know the next. |
| if (addr_bus == configuration_buses_.end()) |
| return {}; |
| |
| // Ask the bus for the next address. |
| absl::optional<FrameAddress> next_address = |
| addr_bus->second.GetNextFrameAddress(address); |
| if (next_address) |
| return next_address; |
| |
| // The current bus doesn't know what the next address is. Rows come next |
| // in frame address numerical order so punt back to the caller to figure |
| // it out. |
| return {}; |
| } |
| |
| } // namespace xcupseries |
| } // namespace xilinx |
| } // namespace prjxray |
| |
| namespace xcupseries = prjxray::xilinx::xcupseries; |
| |
| namespace YAML { |
| |
| Node convert<xcupseries::Row>::encode(const xcupseries::Row& rhs) { |
| Node node; |
| node.SetTag("xilinx/xcupseries/row"); |
| node["configuration_buses"] = rhs.configuration_buses_; |
| return node; |
| } |
| |
| bool convert<xcupseries::Row>::decode(const Node& node, xcupseries::Row& lhs) { |
| if (!node.Tag().empty() && node.Tag() != "xilinx/xcupseries/row") { |
| return false; |
| } |
| |
| lhs.configuration_buses_ = |
| node["configuration_buses"] |
| .as<std::map<xcupseries::BlockType, |
| xcupseries::ConfigurationBus>>(); |
| return true; |
| } |
| |
| } // namespace YAML |