diff options
author | whitequark <whitequark@whitequark.org> | 2020-06-25 15:11:47 +0000 |
---|---|---|
committer | whitequark <whitequark@whitequark.org> | 2020-06-26 08:36:07 +0000 |
commit | 89e0cc8078ecbb57ca450cc6c8a40f6b634b8c9c (patch) | |
tree | e34454964eff6bf4d14f40b4f1c271cadea6d1fa /common/embed.cc | |
parent | dc209f6344545196de8bf4de7abff2fcbd55732e (diff) | |
download | nextpnr-89e0cc8078ecbb57ca450cc6c8a40f6b634b8c9c.tar.gz nextpnr-89e0cc8078ecbb57ca450cc6c8a40f6b634b8c9c.tar.bz2 nextpnr-89e0cc8078ecbb57ca450cc6c8a40f6b634b8c9c.zip |
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 |