From 464a09a4241d3553e5bdab69fc848ab68fb512ec Mon Sep 17 00:00:00 2001 From: Tomasz Michalak Date: Thu, 10 Oct 2019 13:00:52 +0200 Subject: [PATCH] bitstream_tools: Move frames template methods to header file Signed-off-by: Tomasz Michalak --- lib/CMakeLists.txt | 1 - lib/include/prjxray/xilinx/frames.h | 86 ++++++++++++++++++++++++- lib/xilinx/frames.cc | 99 ----------------------------- 3 files changed, 84 insertions(+), 102 deletions(-) delete mode 100644 lib/xilinx/frames.cc diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 9aee7afd..0aee1b1f 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -5,7 +5,6 @@ add_library(libprjxray xilinx/bitstream_writer.cc xilinx/configuration_packet.cc xilinx/configuration_register.cc - xilinx/frames.cc xilinx/configuration.cc # Series-7 specific xilinx/xc7series/frame_address.cc diff --git a/lib/include/prjxray/xilinx/frames.h b/lib/include/prjxray/xilinx/frames.h index 43747875..c39a125c 100644 --- a/lib/include/prjxray/xilinx/frames.h +++ b/lib/include/prjxray/xilinx/frames.h @@ -1,11 +1,15 @@ #ifndef PRJXRAY_LIB_XILINX_FRAMES_H #define PRJXRAY_LIB_XILINX_FRAMES_H +#include +#include #include #include #include +#include #include +#include namespace prjxray { namespace xilinx { @@ -29,15 +33,93 @@ class Frames { const absl::optional& part); // Returns the map with frame addresses and corresponding data - Frames2Data& getFrames(); + Frames2Data& getFrames() { return frames_data_; } private: Frames2Data frames_data_; - // Updates the ECC information in the frame. + // Updates the ECC information in the frame void updateECC(FrameData& data); }; +template +void Frames::updateECC(typename Frames::FrameData& data) { + xc7series::updateECC(data); +} + +template +int Frames::readFrames(const std::string& frm_file_str) { + assert(!frm_file_str.empty()); + + std::ifstream frm_file(frm_file_str); + if (!frm_file) { + std::cerr << "Unable to open frm file: " << frm_file_str + << std::endl; + return 1; + } + std::string frm_line; + + while (std::getline(frm_file, frm_line)) { + if (frm_line[0] == '#') + continue; + + std::pair frame_delta = + absl::StrSplit(frm_line, ' '); + + uint32_t frame_address = + std::stoul(frame_delta.first, nullptr, 16); + + std::vector frame_data_strings = + absl::StrSplit(frame_delta.second, ','); + + if (frame_data_strings.size() != ArchType::words_per_frame) { + std::cerr << "Frame " << std::hex << frame_address + << ": found " << std::dec + << frame_data_strings.size() + << " words instead of " + << ArchType::words_per_frame << std::endl; + continue; + } + + FrameData frame_data(frame_data_strings.size(), 0); + std::transform(frame_data_strings.begin(), + frame_data_strings.end(), frame_data.begin(), + [](const std::string& val) -> uint32_t { + return std::stoul(val, nullptr, 16); + }); + + updateECC(frame_data); + + // Insert the frame address and corresponding frame data to the + // map + typename ArchType::FrameAddress frm_addr(frame_address); + frames_data_.insert( + std::pair( + frm_addr, frame_data)); + } + return 0; +} + +template +void Frames::addMissingFrames( + const absl::optional& part) { + auto current_frame_address = + absl::optional( + typename ArchType::FrameAddress(0)); + do { + auto iter = frames_data_.find(*current_frame_address); + if (iter == frames_data_.end()) { + FrameData frame_data(ArchType::words_per_frame, 0); + frames_data_.insert( + std::pair(*current_frame_address, + frame_data)); + } + current_frame_address = + part->GetNextFrameAddress(*current_frame_address); + } while (current_frame_address); +} + } // namespace xilinx } // namespace prjxray diff --git a/lib/xilinx/frames.cc b/lib/xilinx/frames.cc deleted file mode 100644 index c2586c01..00000000 --- a/lib/xilinx/frames.cc +++ /dev/null @@ -1,99 +0,0 @@ -#include -#include - -#include - -#include -#include - -namespace prjxray { -namespace xilinx { - -template -typename Frames::Frames2Data& Frames::getFrames() { - return frames_data_; -} - -template -int Frames::readFrames(const std::string& frm_file_str) { - assert(!frm_file_str.empty()); - - std::ifstream frm_file(frm_file_str); - if (!frm_file) { - std::cerr << "Unable to open frm file: " << frm_file_str - << std::endl; - return 1; - } - std::string frm_line; - - while (std::getline(frm_file, frm_line)) { - if (frm_line[0] == '#') - continue; - - std::pair frame_delta = - absl::StrSplit(frm_line, ' '); - - uint32_t frame_address = - std::stoul(frame_delta.first, nullptr, 16); - - std::vector frame_data_strings = - absl::StrSplit(frame_delta.second, ','); - - if (frame_data_strings.size() != ArchType::words_per_frame) { - std::cerr << "Frame " << std::hex << frame_address - << ": found " << std::dec - << frame_data_strings.size() - << " words instead of " - << ArchType::words_per_frame << std::endl; - continue; - } - - FrameData frame_data(frame_data_strings.size(), 0); - std::transform(frame_data_strings.begin(), - frame_data_strings.end(), frame_data.begin(), - [](const std::string& val) -> uint32_t { - return std::stoul(val, nullptr, 16); - }); - - // Spartan6 doesn't have ECC - if (std::is_same::value) { - xc7series::updateECC(frame_data); - } - - // Insert the frame address and corresponding frame data to the - // map - typename ArchType::FrameAddress frm_addr(frame_address); - frames_data_.insert( - std::pair( - frm_addr, frame_data)); - } - return 0; -} - -template -void Frames::addMissingFrames( - const absl::optional& part) { - auto current_frame_address = - absl::optional( - typename ArchType::FrameAddress(0)); - do { - auto iter = frames_data_.find(*current_frame_address); - if (iter == frames_data_.end()) { - FrameData frame_data(ArchType::words_per_frame, 0); - frames_data_.insert( - std::pair(*current_frame_address, - frame_data)); - } - current_frame_address = - part->GetNextFrameAddress(*current_frame_address); - } while (current_frame_address); -} - -template Frames::Frames2Data& Frames::getFrames(); -template void Frames::addMissingFrames( - const absl::optional& part); -template int Frames::readFrames(const std::string&); - -} // namespace xilinx -} // namespace prjxray