From 170169b01c26abcbd8b90b6d25ed2d946127f7c5 Mon Sep 17 00:00:00 2001 From: Tomasz Michalak Date: Thu, 17 Oct 2019 22:12:20 +0200 Subject: [PATCH] Refactor Configuration::createType2ConfigurationPacketData template method Signed-off-by: Tomasz Michalak --- lib/include/prjxray/xilinx/configuration.h | 29 +++++++++ lib/xilinx/configuration.cc | 74 ---------------------- 2 files changed, 29 insertions(+), 74 deletions(-) diff --git a/lib/include/prjxray/xilinx/configuration.h b/lib/include/prjxray/xilinx/configuration.h index e5430423..752ee7ff 100644 --- a/lib/include/prjxray/xilinx/configuration.h +++ b/lib/include/prjxray/xilinx/configuration.h @@ -65,6 +65,35 @@ class Configuration { FrameMap frames_; }; +template +typename Configuration::PacketData +Configuration::createType2ConfigurationPacketData( + const typename Frames::Frames2Data& frames, + absl::optional& part) { + PacketData packet_data; + // Certain configuration frames blocks are separated by Zero Frames, + // i.e. frames with words with all zeroes. For Series-7, US and US+ + // there zero frames separator consists of two frames. + static const int kZeroFramesSeparatorWords = + ArchType::words_per_frame * 2; + for (auto& frame : frames) { + std::copy(frame.second.begin(), frame.second.end(), + std::back_inserter(packet_data)); + + auto next_address = part->GetNextFrameAddress(frame.first); + if (next_address && + (next_address->block_type() != frame.first.block_type() || + next_address->is_bottom_half_rows() != + frame.first.is_bottom_half_rows() || + next_address->row() != frame.first.row())) { + packet_data.insert(packet_data.end(), + kZeroFramesSeparatorWords, 0); + } + } + packet_data.insert(packet_data.end(), kZeroFramesSeparatorWords, 0); + return packet_data; +} + template template absl::optional> diff --git a/lib/xilinx/configuration.cc b/lib/xilinx/configuration.cc index cff19d3d..71ea317d 100644 --- a/lib/xilinx/configuration.cc +++ b/lib/xilinx/configuration.cc @@ -18,80 +18,6 @@ namespace prjxray { namespace xilinx { -template <> -Configuration::PacketData -Configuration::createType2ConfigurationPacketData( - const Frames::Frames2Data& frames, - absl::optional& part) { - PacketData packet_data; - for (auto& frame : frames) { - std::copy(frame.second.begin(), frame.second.end(), - std::back_inserter(packet_data)); - - auto next_address = part->GetNextFrameAddress(frame.first); - if (next_address && - (next_address->block_type() != frame.first.block_type() || - next_address->is_bottom_half_rows() != - frame.first.is_bottom_half_rows() || - next_address->row() != frame.first.row())) { - packet_data.insert(packet_data.end(), 202, 0); - } - } - packet_data.insert(packet_data.end(), 202, 0); - return packet_data; -} - -template <> -Configuration::PacketData -Configuration::createType2ConfigurationPacketData( - const Frames::Frames2Data& frames, - absl::optional& part) { - PacketData packet_data; - for (auto& frame : frames) { - std::copy(frame.second.begin(), frame.second.end(), - std::back_inserter(packet_data)); - - auto next_address = part->GetNextFrameAddress(frame.first); - if (next_address && - (next_address->block_type() != frame.first.block_type() || - next_address->is_bottom_half_rows() != - frame.first.is_bottom_half_rows() || - next_address->row() != frame.first.row())) { - packet_data.insert(packet_data.end(), - UltraScale::words_per_frame * 2, 0); - } - } - packet_data.insert(packet_data.end(), UltraScale::words_per_frame * 2, - 0); - return packet_data; -} - -template <> -Configuration::PacketData -Configuration::createType2ConfigurationPacketData( - const Frames::Frames2Data& frames, - absl::optional& part) { - PacketData packet_data; - for (auto& frame : frames) { - std::copy(frame.second.begin(), frame.second.end(), - std::back_inserter(packet_data)); - - auto next_address = part->GetNextFrameAddress(frame.first); - if (next_address && - (next_address->block_type() != frame.first.block_type() || - next_address->is_bottom_half_rows() != - frame.first.is_bottom_half_rows() || - next_address->row() != frame.first.row())) { - packet_data.insert(packet_data.end(), - UltraScalePlus::words_per_frame * 2, - 0); - } - } - packet_data.insert(packet_data.end(), - UltraScalePlus::words_per_frame * 2, 0); - return packet_data; -} - template <> void Configuration::createConfigurationPackage( Series7::ConfigurationPackage& out_packets,