| /* | |
| * Copyright (C) 2017-2020 The Project X-Ray Authors. | |
| * | |
| * Use of this source code is governed by a ISC-style | |
| * license that can be found in the LICENSE file or at | |
| * https://opensource.org/licenses/ISC | |
| * | |
| * SPDX-License-Identifier: ISC | |
| */ | |
| #include <prjxray/xilinx/xc7series/configuration_row.h> | |
| namespace prjxray { | |
| namespace xilinx { | |
| namespace xc7series { | |
| 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 xc7series | |
| } // namespace xilinx | |
| } // namespace prjxray | |
| namespace xc7series = prjxray::xilinx::xc7series; | |
| namespace YAML { | |
| Node convert<xc7series::Row>::encode(const xc7series::Row& rhs) { | |
| Node node; | |
| node.SetTag("xilinx/xc7series/row"); | |
| node["configuration_buses"] = rhs.configuration_buses_; | |
| return node; | |
| } | |
| bool convert<xc7series::Row>::decode(const Node& node, xc7series::Row& lhs) { | |
| if (!node.Tag().empty() && node.Tag() != "xilinx/xc7series/row") { | |
| return false; | |
| } | |
| lhs.configuration_buses_ = | |
| node["configuration_buses"] | |
| .as<std::map<xc7series::BlockType, | |
| xc7series::ConfigurationBus>>(); | |
| return true; | |
| } | |
| } // namespace YAML |