#include <prjxray/xilinx/xc7series/configuration_column.h>

namespace prjxray {
namespace xilinx {
namespace xc7series {

bool ConfigurationColumn::IsValidFrameAddress(FrameAddress address) const {
	return address.minor() < frame_count_;
}

absl::optional<FrameAddress> ConfigurationColumn::GetNextFrameAddress(
    FrameAddress address) const {
	if (!IsValidFrameAddress(address))
		return {};

	if (static_cast<unsigned int>(address.minor() + 1) < frame_count_) {
		return address + 1;
	}

	// Next address is not in this column.
	return {};
}

}  // namespace xc7series
}  // namespace xilinx
}  // namespace prjxray

namespace xc7series = prjxray::xilinx::xc7series;

namespace YAML {

Node convert<xc7series::ConfigurationColumn>::encode(
    const xc7series::ConfigurationColumn& rhs) {
	Node node;
	node.SetTag("xilinx/xc7series/configuration_column");
	node["frame_count"] = rhs.frame_count_;
	return node;
}

bool convert<xc7series::ConfigurationColumn>::decode(
    const Node& node,
    xc7series::ConfigurationColumn& lhs) {
	if (!node.Tag().empty() &&
	    node.Tag() != "xilinx/xc7series/configuration_column") {
		return false;
	}

	lhs.frame_count_ = node["frame_count"].as<unsigned int>();
	return true;
}

}  // namespace YAML
