diff options
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 |