diff --git a/lib/include/prjxray/xilinx/configuration.h b/lib/include/prjxray/xilinx/configuration.h index 0a883547..4721f8db 100644 --- a/lib/include/prjxray/xilinx/configuration.h +++ b/lib/include/prjxray/xilinx/configuration.h @@ -75,6 +75,44 @@ class Configuration { FrameMap frames_; }; +// The explicit specializations below are defined in configuration.cc. +// They must be declared before use in every translation unit +// ([temp.expl.spec]): without these declarations, a TU that calls +// createType2ConfigurationPacketData instantiates the primary +// template defined further down in this header, and that COMDAT copy +// collides with the strong definition from configuration.cc when linking +// with mingw-w64 ld ("multiple definition"); ELF linkers silently +// resolve the collision in favour of the strong symbol. +template <> +Configuration::PacketData +Configuration::createType2ConfigurationPacketData( + const Frames::Frames2Data& frames, + absl::optional& part); + +template <> +void Configuration::createConfigurationPackage( + Spartan6::ConfigurationPackage& out_packets, + const PacketData& packet_data, + absl::optional& part); + +template <> +void Configuration::createConfigurationPackage( + Series7::ConfigurationPackage& out_packets, + const PacketData& packet_data, + absl::optional& part); + +template <> +void Configuration::createConfigurationPackage( + UltraScale::ConfigurationPackage& out_packets, + const PacketData& packet_data, + absl::optional& part); + +template <> +void Configuration::createConfigurationPackage( + UltraScalePlus::ConfigurationPackage& out_packets, + const PacketData& packet_data, + absl::optional& part); + template typename Configuration::PacketData Configuration::createType2ConfigurationPacketData(