mirror of https://github.com/YosysHQ/icestorm.git
Merge pull request #184 from nathanrossi/nrossi/portable-chipdb
icetime: Add support for searching for chipdb relative to binary
This commit is contained in:
commit
90f0e40cb8
|
|
@ -26,10 +26,11 @@ share/$(CHIPDB_SUBDIR)/chipdb-5k.txt: ../icebox/chipdb-5k.txt
|
||||||
override LDFLAGS += --embed-file share
|
override LDFLAGS += --embed-file share
|
||||||
endif
|
endif
|
||||||
|
|
||||||
icetime$(EXE): icetime.o
|
icetime$(EXE): icetime.o iceutil.o
|
||||||
$(CXX) -o $@ $(LDFLAGS) $^ $(LDLIBS)
|
$(CXX) -o $@ $(LDFLAGS) $^ $(LDLIBS)
|
||||||
|
|
||||||
icetime.o: icetime.cc timings.inc
|
icetime.o: icetime.cc timings.inc
|
||||||
|
iceutil.o: iceutil.cc
|
||||||
|
|
||||||
timings.inc: timings.py ../icefuzz/timings_*.txt
|
timings.inc: timings.py ../icefuzz/timings_*.txt
|
||||||
python3 timings.py > timings.inc.new
|
python3 timings.py > timings.inc.new
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,8 @@
|
||||||
#include <emscripten.h>
|
#include <emscripten.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
std::string find_chipdb(std::string config_device);
|
||||||
|
|
||||||
// add this number of ns as estimate for clock distribution mismatch
|
// add this number of ns as estimate for clock distribution mismatch
|
||||||
#define GLOBAL_CLK_DIST_JITTER 0.1
|
#define GLOBAL_CLK_DIST_JITTER 0.1
|
||||||
|
|
||||||
|
|
@ -322,35 +324,18 @@ void read_config()
|
||||||
void read_chipdb()
|
void read_chipdb()
|
||||||
{
|
{
|
||||||
char buffer[1024];
|
char buffer[1024];
|
||||||
|
std::string filepath = chipdbfile;
|
||||||
|
|
||||||
if (!chipdbfile.empty()) {
|
if (filepath.empty())
|
||||||
snprintf(buffer, 1024, "%s", chipdbfile.c_str());
|
filepath = find_chipdb(config_device);
|
||||||
} else
|
if (filepath.empty()) {
|
||||||
if (PREFIX[0] == '~' && PREFIX[1] == '/') {
|
fprintf(stderr, "Can't find chipdb file for device %s\n", config_device.c_str());
|
||||||
std::string homedir;
|
exit(1);
|
||||||
#ifdef _WIN32
|
|
||||||
if (getenv("USERPROFILE") != nullptr) {
|
|
||||||
homedir += getenv("USERPROFILE");
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (getenv("HOMEDRIVE") != nullptr &&
|
|
||||||
getenv("HOMEPATH") != nullptr) {
|
|
||||||
homedir += getenv("HOMEDRIVE");
|
|
||||||
homedir += getenv("HOMEPATH");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
homedir += getenv("HOME");
|
|
||||||
#endif
|
|
||||||
snprintf(buffer, 1024, "%s%s/share/" CHIPDB_SUBDIR "/chipdb-%s.txt", homedir.c_str(), PREFIX+1, config_device.c_str());
|
|
||||||
} else {
|
|
||||||
snprintf(buffer, 1024, PREFIX "/share/" CHIPDB_SUBDIR "/chipdb-%s.txt", config_device.c_str());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE *fdb = fopen(buffer, "r");
|
FILE *fdb = fopen(filepath.c_str(), "r");
|
||||||
if (fdb == nullptr) {
|
if (fdb == nullptr) {
|
||||||
perror("Can't open chipdb file");
|
perror("Can't open chipdb file");
|
||||||
fprintf(stderr, " %s\n", buffer);
|
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,179 @@
|
||||||
|
/*
|
||||||
|
* yosys -- Yosys Open SYnthesis Suite
|
||||||
|
*
|
||||||
|
* Copyright (C) 2012 Clifford Wolf <clifford@clifford.at>
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <string>
|
||||||
|
#include <sstream>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
#ifdef _WIN32
|
||||||
|
# include <windows.h>
|
||||||
|
# include <io.h>
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
# include <mach-o/dyld.h>
|
||||||
|
# include <unistd.h>
|
||||||
|
#else
|
||||||
|
# include <unistd.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __FreeBSD__
|
||||||
|
# include <sys/sysctl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
|
|
||||||
|
#if defined(__linux__) || defined(__CYGWIN__)
|
||||||
|
std::string proc_self_dirname()
|
||||||
|
{
|
||||||
|
char path[PATH_MAX];
|
||||||
|
ssize_t buflen = readlink("/proc/self/exe", path, sizeof(path));
|
||||||
|
if (buflen < 0) {
|
||||||
|
fprintf(stderr, "fatal error: readlink(\"/proc/self/exe\") failed: %s\n", strerror(errno));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
while (buflen > 0 && path[buflen-1] != '/')
|
||||||
|
buflen--;
|
||||||
|
return std::string(path, buflen);
|
||||||
|
}
|
||||||
|
#elif defined(__FreeBSD__)
|
||||||
|
std::string proc_self_dirname()
|
||||||
|
{
|
||||||
|
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1};
|
||||||
|
size_t buflen;
|
||||||
|
char *buffer;
|
||||||
|
std::string path;
|
||||||
|
if (sysctl(mib, 4, NULL, &buflen, NULL, 0) != 0) {
|
||||||
|
fprintf(stderr, "fatal error: sysctl failed: %s\n", strerror(errno));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
buffer = (char*)malloc(buflen);
|
||||||
|
if (buffer == NULL) {
|
||||||
|
fprintf(stderr, "fatal error: malloc failed: %s\n", strerror(errno));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
if (sysctl(mib, 4, buffer, &buflen, NULL, 0) != 0) {
|
||||||
|
fprintf(stderr, "fatal error: sysctl failed: %s\n", strerror(errno));
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
while (buflen > 0 && buffer[buflen-1] != '/')
|
||||||
|
buflen--;
|
||||||
|
path.assign(buffer, buflen);
|
||||||
|
free(buffer);
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
std::string proc_self_dirname()
|
||||||
|
{
|
||||||
|
char *path = NULL;
|
||||||
|
uint32_t buflen = 0;
|
||||||
|
while (_NSGetExecutablePath(path, &buflen) != 0)
|
||||||
|
path = (char *) realloc((void *) path, buflen);
|
||||||
|
while (buflen > 0 && path[buflen-1] != '/')
|
||||||
|
buflen--;
|
||||||
|
return std::string(path, buflen);
|
||||||
|
}
|
||||||
|
#elif defined(_WIN32)
|
||||||
|
std::string proc_self_dirname()
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
# ifdef __MINGW32__
|
||||||
|
char longpath[MAX_PATH + 1];
|
||||||
|
char shortpath[MAX_PATH + 1];
|
||||||
|
# else
|
||||||
|
WCHAR longpath[MAX_PATH + 1];
|
||||||
|
TCHAR shortpath[MAX_PATH + 1];
|
||||||
|
# endif
|
||||||
|
if (!GetModuleFileName(0, longpath, MAX_PATH+1)) {
|
||||||
|
fprintf(stderr, "fatal error: GetModuleFileName() failed.\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
if (!GetShortPathName(longpath, shortpath, MAX_PATH+1)) {
|
||||||
|
fprintf(stderr, "fatal error: GetShortPathName() failed.\n");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
while (shortpath[i] != 0)
|
||||||
|
i++;
|
||||||
|
while (i > 0 && shortpath[i-1] != '/' && shortpath[i-1] != '\\')
|
||||||
|
shortpath[--i] = 0;
|
||||||
|
std::string path;
|
||||||
|
for (i = 0; shortpath[i]; i++)
|
||||||
|
path += char(shortpath[i]);
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
#elif defined(EMSCRIPTEN)
|
||||||
|
std::string proc_self_dirname()
|
||||||
|
{
|
||||||
|
return "/";
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#error Dont know how to determine process executable base path!
|
||||||
|
#endif
|
||||||
|
|
||||||
|
bool file_test_open(std::string path)
|
||||||
|
{
|
||||||
|
FILE *fdb = fopen(path.c_str(), "r");
|
||||||
|
if (fdb == nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
fclose(fdb);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern bool verbose;
|
||||||
|
|
||||||
|
std::string find_chipdb(std::string config_device)
|
||||||
|
{
|
||||||
|
if (PREFIX[0] == '~' && PREFIX[1] == '/') {
|
||||||
|
std::string homepath;
|
||||||
|
#ifdef _WIN32
|
||||||
|
if (getenv("USERPROFILE") != nullptr) {
|
||||||
|
homepath += getenv("USERPROFILE");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (getenv("HOMEDRIVE") != nullptr &&
|
||||||
|
getenv("HOMEPATH") != nullptr) {
|
||||||
|
homepath += getenv("HOMEDRIVE");
|
||||||
|
homepath += getenv("HOMEPATH");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
homepath += getenv("HOME");
|
||||||
|
#endif
|
||||||
|
homepath += std::string(PREFIX + 1) + "/" CHIPDB_SUBDIR "/chipdb-" + config_device + ".txt";
|
||||||
|
if (verbose)
|
||||||
|
fprintf(stderr, "Looking for chipdb '%s' at %s\n", config_device.c_str(), homepath.c_str());
|
||||||
|
if (file_test_open(homepath))
|
||||||
|
return homepath;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string prefixpath = PREFIX "/share/" CHIPDB_SUBDIR "/chipdb-" + config_device + ".txt";
|
||||||
|
if (verbose)
|
||||||
|
fprintf(stderr, "Looking for chipdb '%s' at %s\n", config_device.c_str(), prefixpath.c_str());
|
||||||
|
if (file_test_open(prefixpath))
|
||||||
|
return prefixpath;
|
||||||
|
|
||||||
|
std::string relbinarypath = proc_self_dirname() + "../share/" CHIPDB_SUBDIR "/chipdb-" + config_device + ".txt";
|
||||||
|
if (verbose)
|
||||||
|
fprintf(stderr, "Looking for chipdb '%s' at %s\n", config_device.c_str(), relbinarypath.c_str());
|
||||||
|
if (file_test_open(relbinarypath))
|
||||||
|
return relbinarypath;
|
||||||
|
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
|
||||||
Loading…
Reference in New Issue