aboutsummaryrefslogtreecommitdiffstats
path: root/common/embed.cc
diff options
context:
space:
mode:
Diffstat (limited to 'common/embed.cc')
-rw-r--r--common/embed.cc46
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