| #include <prjxray/xilinx/xc7series/frame_address.h> | |
| #include <iomanip> | |
| #include <prjxray/bit_ops.h> | |
| namespace prjxray { | |
| namespace xilinx { | |
| namespace xc7series { | |
| FrameAddress::FrameAddress(BlockType block_type, | |
| bool is_bottom_half_rows, | |
| uint8_t row, | |
| uint16_t column, | |
| uint8_t minor) { | |
| address_ = bit_field_set(0, 25, 23, block_type); | |
| address_ = bit_field_set(address_, 22, 22, is_bottom_half_rows); | |
| address_ = bit_field_set(address_, 21, 17, row); | |
| address_ = bit_field_set(address_, 16, 7, column); | |
| address_ = bit_field_set(address_, 6, 0, minor); | |
| } | |
| BlockType FrameAddress::block_type() const { | |
| return static_cast<BlockType>(bit_field_get(address_, 25, 23)); | |
| } | |
| bool FrameAddress::is_bottom_half_rows() const { | |
| return bit_field_get(address_, 22, 22); | |
| } | |
| uint8_t FrameAddress::row() const { | |
| return bit_field_get(address_, 21, 17); | |
| } | |
| uint16_t FrameAddress::column() const { | |
| return bit_field_get(address_, 16, 7); | |
| } | |
| uint8_t FrameAddress::minor() const { | |
| return bit_field_get(address_, 6, 0); | |
| } | |
| std::ostream& operator<<(std::ostream& o, const FrameAddress& addr) { | |
| o << "[" << std::hex << std::showbase << std::setw(10) | |
| << static_cast<uint32_t>(addr) << "] " | |
| << (addr.is_bottom_half_rows() ? "BOTTOM" : "TOP") | |
| << " Row=" << std::setw(2) << std::dec | |
| << static_cast<unsigned int>(addr.row()) << " Column=" << std::setw(2) | |
| << std::dec << addr.column() << " Minor=" << std::setw(2) << std::dec | |
| << static_cast<unsigned int>(addr.minor()) | |
| << " Type=" << addr.block_type(); | |
| return o; | |
| } | |
| } // namespace xc7series | |
| } // namespace xilinx | |
| } // namespace prjxray | |
| namespace YAML { | |
| namespace xc7series = prjxray::xilinx::xc7series; | |
| Node convert<xc7series::FrameAddress>::encode( | |
| const xc7series::FrameAddress& rhs) { | |
| Node node; | |
| node.SetTag("xilinx/xc7series/frame_address"); | |
| node["block_type"] = rhs.block_type(); | |
| node["row_half"] = (rhs.is_bottom_half_rows() ? "bottom" : "top"); | |
| node["row"] = static_cast<unsigned int>(rhs.row()); | |
| node["column"] = static_cast<unsigned int>(rhs.column()); | |
| node["minor"] = static_cast<unsigned int>(rhs.minor()); | |
| return node; | |
| } | |
| bool convert<xc7series::FrameAddress>::decode(const Node& node, | |
| xc7series::FrameAddress& lhs) { | |
| if (!(node.Tag() == "xilinx/xc7series/frame_address" || | |
| node.Tag() == "xilinx/xc7series/configuration_frame_address") || | |
| !node["block_type"] || !node["row_half"] || !node["row"] || | |
| !node["column"] || !node["minor"]) | |
| return false; | |
| bool row_half; | |
| if (node["row_half"].as<std::string>() == "top") { | |
| row_half = false; | |
| } else if (node["row_half"].as<std::string>() == "bottom") { | |
| row_half = true; | |
| } else { | |
| return false; | |
| } | |
| lhs = prjxray::xilinx::xc7series::FrameAddress( | |
| node["block_type"].as<xc7series::BlockType>(), row_half, | |
| node["row"].as<unsigned int>(), node["column"].as<unsigned int>(), | |
| node["minor"].as<unsigned int>()); | |
| return true; | |
| } | |
| } // namespace YAML |