mirror of https://github.com/openXC7/prjxray.git
72 lines
1.9 KiB
C++
72 lines
1.9 KiB
C++
/*
|
|
* 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
|