diff options
author | David Shah <dave@ds0.me> | 2020-06-26 11:32:13 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-26 11:32:13 +0100 |
commit | 4f4aa53120b8857f1d526e5d5265155270e40508 (patch) | |
tree | 975f36dbd2b3f5b55e6696a817a5cf02719122c7 /common/embed.cc | |
parent | 2873133479a3ebbbb809b5cd107d32dae7e7c650 (diff) | |
parent | 89e0cc8078ecbb57ca450cc6c8a40f6b634b8c9c (diff) | |
download | nextpnr-4f4aa53120b8857f1d526e5d5265155270e40508.tar.gz nextpnr-4f4aa53120b8857f1d526e5d5265155270e40508.tar.bz2 nextpnr-4f4aa53120b8857f1d526e5d5265155270e40508.zip |
Merge pull request #460 from whitequark/better-embed
Simplify and improve chipdb embedding/loading
Diffstat (limited to 'common/embed.cc')
-rw-r--r-- | common/embed.cc | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/common/embed.cc b/common/embed.cc new file mode 100644 index 00000000..f8f439b5 --- /dev/null +++ b/common/embed.cc @@ -0,0 +1,46 @@ +#if defined(WIN32) +#include <windows.h> +#endif +#include <boost/iostreams/device/mapped_file.hpp> +#include <boost/filesystem.hpp> +#include "nextpnr.h" +#include "embed.h" + +NEXTPNR_NAMESPACE_BEGIN + +#if defined(EXTERNAL_CHIPDB_ROOT) + +const void *get_chipdb(const std::string &filename) { + static std::map<std::string, boost::iostreams::mapped_file> files; + if (!files.count(filename)) { + std::string full_filename = EXTERNAL_CHIPDB_ROOT "/" + filename; + if (boost::filesystem::exists(full_filename)) + files[filename].open(full_filename, boost::iostreams::mapped_file::priv); + } + if (files.count(filename)) + return files.at(filename).data(); + return nullptr; +} + +#elif defined(WIN32) + +const void *get_chipdb(const std::string &filename) { + HRSRC rc = ::FindResource(nullptr, filename.c_str(), RT_RCDATA); + HGLOBAL rcData = ::LoadResource(nullptr, rc); + return ::LockResource(rcData); +} + +#else + +EmbeddedFile *EmbeddedFile::head = nullptr; + +const void *get_chipdb(const std::string &filename) { + for (EmbeddedFile *file = EmbeddedFile::head; file; file = file->next) + if (file->filename == filename) + return file->content; + return nullptr; +} + +#endif + +NEXTPNR_NAMESPACE_END |