aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiodrag Milanovic <mmicko@gmail.com>2018-06-21 17:44:18 +0200
committerMiodrag Milanovic <mmicko@gmail.com>2018-06-21 17:44:18 +0200
commit54549d36e911aac8d0b0a2eea6074654c06c9717 (patch)
treebacd09c5c7637ed7ffc918f222b2ce50fef9d73d
parentfcfb85e9dc7cc4a858c938692a8612cef3c9538b (diff)
downloadnextpnr-54549d36e911aac8d0b0a2eea6074654c06c9717.tar.gz
nextpnr-54549d36e911aac8d0b0a2eea6074654c06c9717.tar.bz2
nextpnr-54549d36e911aac8d0b0a2eea6074654c06c9717.zip
log_error now trows exception, main is covering catch
-rw-r--r--common/log.cc6
-rw-r--r--common/log.h4
-rw-r--r--dummy/main.cc165
-rw-r--r--gui/basewindow.cc1
-rw-r--r--gui/basewindow.h2
-rw-r--r--gui/dummy/mainwindow.cc9
-rw-r--r--gui/dummy/mainwindow.h2
-rw-r--r--gui/ice40/mainwindow.cc8
-rw-r--r--gui/ice40/worker.cc16
-rw-r--r--gui/ice40/worker.h18
-rw-r--r--ice40/main.cc472
11 files changed, 355 insertions, 348 deletions
diff --git a/common/log.cc b/common/log.cc
index b0cd802a..495f83b1 100644
--- a/common/log.cc
+++ b/common/log.cc
@@ -150,12 +150,8 @@ void logv_error(const char *format, va_list ap)
#ifdef EMSCRIPTEN
log_files = backup_log_files;
- throw 0;
-#elif defined(_MSC_VER)
- _exit(EXIT_FAILURE);
-#else
- _Exit(EXIT_FAILURE);
#endif
+ throw log_execution_error_exception();
}
void log(const char *format, ...)
diff --git a/common/log.h b/common/log.h
index 381843b3..65b3f178 100644
--- a/common/log.h
+++ b/common/log.h
@@ -43,6 +43,10 @@ struct log_cmd_error_exception
{
};
+struct log_execution_error_exception
+{
+};
+
extern std::vector<FILE *> log_files;
extern std::vector<std::ostream *> log_streams;
extern FILE *log_errfile;
diff --git a/dummy/main.cc b/dummy/main.cc
index cef70235..110c5b6c 100644
--- a/dummy/main.cc
+++ b/dummy/main.cc
@@ -32,87 +32,96 @@ USING_NEXTPNR_NAMESPACE
int main(int argc, char *argv[])
{
- namespace po = boost::program_options;
- int rc = 0;
-
- log_files.push_back(stdout);
-
- po::options_description options("Allowed options");
- options.add_options()("help,h", "show help");
- options.add_options()("verbose,v", "verbose output");
- options.add_options()("force,f", "keep running after errors");
- options.add_options()("gui", "start gui");
- options.add_options()("run", po::value<std::vector<std::string>>(),
- "python file to execute");
- options.add_options()("version,V", "show version");
- po::positional_options_description pos;
- pos.add("run", -1);
-
- po::variables_map vm;
try {
- po::parsed_options parsed = po::command_line_parser(argc, argv)
- .options(options)
- .positional(pos)
- .run();
- po::store(parsed, vm);
-
- po::notify(vm);
- }
-
- catch (std::exception &e) {
- std::cout << e.what() << "\n";
- return 1;
- }
-
- if (vm.count("help") || argc == 1) {
- std::cout << boost::filesystem::basename(argv[0])
- << " -- Next Generation Place and Route (git "
- "sha1 " GIT_COMMIT_HASH_STR ")\n";
- std::cout << "\n";
- std::cout << options << "\n";
- return argc != 1;
- }
-
- if (vm.count("version")) {
- std::cout << boost::filesystem::basename(argv[0])
- << " -- Next Generation Place and Route (git "
- "sha1 " GIT_COMMIT_HASH_STR ")\n";
- return 1;
- }
-
- Context ctx(ArchArgs{});
- init_python(argv[0]);
- python_export_global("ctx", ctx);
-
- if (vm.count("verbose")) {
- ctx.verbose = true;
- }
-
- if (vm.count("force")) {
- ctx.force = true;
- }
-
- if (vm.count("seed")) {
- ctx.rngseed(vm["seed"].as<int>());
- }
-
- if (vm.count("run")) {
- std::vector<std::string> files =
- vm["run"].as<std::vector<std::string>>();
- for (auto filename : files)
- execute_python_file(filename.c_str());
- }
-
- if (vm.count("gui")) {
- QApplication a(argc, argv);
- MainWindow w(&ctx);
- w.show();
-
- rc = a.exec();
+ namespace po = boost::program_options;
+ int rc = 0;
+
+ log_files.push_back(stdout);
+
+ po::options_description options("Allowed options");
+ options.add_options()("help,h", "show help");
+ options.add_options()("verbose,v", "verbose output");
+ options.add_options()("force,f", "keep running after errors");
+ options.add_options()("gui", "start gui");
+ options.add_options()("run", po::value<std::vector<std::string>>(),
+ "python file to execute");
+ options.add_options()("version,V", "show version");
+ po::positional_options_description pos;
+ pos.add("run", -1);
+
+ po::variables_map vm;
+ try {
+ po::parsed_options parsed = po::command_line_parser(argc, argv)
+ .options(options)
+ .positional(pos)
+ .run();
+
+ po::store(parsed, vm);
+
+ po::notify(vm);
+ }
+
+ catch (std::exception &e) {
+ std::cout << e.what() << "\n";
+ return 1;
+ }
+
+ if (vm.count("help") || argc == 1) {
+ std::cout << boost::filesystem::basename(argv[0])
+ << " -- Next Generation Place and Route (git "
+ "sha1 " GIT_COMMIT_HASH_STR ")\n";
+ std::cout << "\n";
+ std::cout << options << "\n";
+ return argc != 1;
+ }
+
+ if (vm.count("version")) {
+ std::cout << boost::filesystem::basename(argv[0])
+ << " -- Next Generation Place and Route (git "
+ "sha1 " GIT_COMMIT_HASH_STR ")\n";
+ return 1;
+ }
+
+ Context ctx(ArchArgs{});
+ init_python(argv[0]);
+ python_export_global("ctx", ctx);
+
+ if (vm.count("verbose")) {
+ ctx.verbose = true;
+ }
+
+ if (vm.count("force")) {
+ ctx.force = true;
+ }
+
+ if (vm.count("seed")) {
+ ctx.rngseed(vm["seed"].as<int>());
+ }
+
+ if (vm.count("run")) {
+ std::vector<std::string> files =
+ vm["run"].as<std::vector<std::string>>();
+ for (auto filename : files)
+ execute_python_file(filename.c_str());
+ }
+
+ if (vm.count("gui")) {
+ QApplication a(argc, argv);
+ MainWindow w(&ctx);
+ w.show();
+
+ rc = a.exec();
+ }
+ deinit_python();
+ return rc;
+ } catch (log_execution_error_exception) {
+#if defined(_MSC_VER)
+ _exit(EXIT_FAILURE);
+#else
+ _Exit(EXIT_FAILURE);
+#endif
}
- deinit_python();
- return rc;
}
#endif
diff --git a/gui/basewindow.cc b/gui/basewindow.cc
index 1e6b171f..9020a719 100644
--- a/gui/basewindow.cc
+++ b/gui/basewindow.cc
@@ -10,7 +10,6 @@
#include "mainwindow.h"
#include "pythontab.h"
-
BaseMainWindow::BaseMainWindow(Context *_ctx, QWidget *parent)
: QMainWindow(parent), ctx(_ctx)
{
diff --git a/gui/basewindow.h b/gui/basewindow.h
index d6915ae9..b20d4621 100644
--- a/gui/basewindow.h
+++ b/gui/basewindow.h
@@ -30,7 +30,7 @@ class BaseMainWindow : public QMainWindow
protected Q_SLOTS:
void writeInfo(std::string text);
-
+
virtual void open() = 0;
virtual bool save() = 0;
diff --git a/gui/dummy/mainwindow.cc b/gui/dummy/mainwindow.cc
index f714e30e..7982c5f5 100644
--- a/gui/dummy/mainwindow.cc
+++ b/gui/dummy/mainwindow.cc
@@ -17,11 +17,6 @@ void MainWindow::createMenu()
menuBar->addAction(menu_Custom->menuAction());
}
-void MainWindow::open()
-{
-}
+void MainWindow::open() {}
-bool MainWindow::save()
-{
- return false;
-} \ No newline at end of file
+bool MainWindow::save() { return false; } \ No newline at end of file
diff --git a/gui/dummy/mainwindow.h b/gui/dummy/mainwindow.h
index ea4480fb..c9690f2c 100644
--- a/gui/dummy/mainwindow.h
+++ b/gui/dummy/mainwindow.h
@@ -19,7 +19,7 @@ class MainWindow : public BaseMainWindow
protected Q_SLOTS:
virtual void open();
- virtual bool save();
+ virtual bool save();
};
#endif // MAINWINDOW_H
diff --git a/gui/ice40/mainwindow.cc b/gui/ice40/mainwindow.cc
index dafd92e9..934798bb 100644
--- a/gui/ice40/mainwindow.cc
+++ b/gui/ice40/mainwindow.cc
@@ -20,8 +20,7 @@ MainWindow::MainWindow(Context *_ctx, QWidget *parent)
createMenu();
task = new TaskManager(_ctx);
- connect(task, SIGNAL(log(std::string)), this,
- SLOT(writeInfo(std::string)));
+ connect(task, SIGNAL(log(std::string)), this, SLOT(writeInfo(std::string)));
}
MainWindow::~MainWindow() {}
@@ -43,7 +42,4 @@ void MainWindow::open()
task->parsejson(fn);
}
}
-bool MainWindow::save()
-{
- return false;
-} \ No newline at end of file
+bool MainWindow::save() { return false; } \ No newline at end of file
diff --git a/gui/ice40/worker.cc b/gui/ice40/worker.cc
index bd22f552..92a0f6ac 100644
--- a/gui/ice40/worker.cc
+++ b/gui/ice40/worker.cc
@@ -1,13 +1,13 @@
#include "worker.h"
#include <fstream>
+#include "bitstream.h"
+#include "design_utils.h"
#include "jsonparse.h"
#include "log.h"
#include "pack.h"
#include "pcf.h"
#include "place_sa.h"
#include "route.h"
-#include "bitstream.h"
-#include "design_utils.h"
#include "timing.h"
Worker::Worker(Context *_ctx) : ctx(_ctx)
@@ -15,7 +15,7 @@ Worker::Worker(Context *_ctx) : ctx(_ctx)
log_write_function = [this](std::string text) { Q_EMIT log(text); };
}
-void Worker::parsejson(const std::string &filename)
+void Worker::parsejson(const std::string &filename)
{
std::string fn = filename;
std::ifstream f(fn);
@@ -35,8 +35,7 @@ void Worker::parsejson(const std::string &filename)
Q_EMIT log("done");
}
-
-TaskManager::TaskManager(Context *ctx)
+TaskManager::TaskManager(Context *ctx)
{
Worker *worker = new Worker(ctx);
worker->moveToThread(&workerThread);
@@ -46,13 +45,10 @@ TaskManager::TaskManager(Context *ctx)
workerThread.start();
}
-TaskManager::~TaskManager()
+TaskManager::~TaskManager()
{
workerThread.quit();
workerThread.wait();
}
-void TaskManager::info(const std::string &result)
-{
- Q_EMIT log(result);
-} \ No newline at end of file
+void TaskManager::info(const std::string &result) { Q_EMIT log(result); } \ No newline at end of file
diff --git a/gui/ice40/worker.h b/gui/ice40/worker.h
index 5dc25d89..12d740dd 100644
--- a/gui/ice40/worker.h
+++ b/gui/ice40/worker.h
@@ -1,8 +1,8 @@
#ifndef WORKER_H
#define WORKER_H
-#include "nextpnr.h"
#include <QThread>
+#include "nextpnr.h"
// FIXME
USING_NEXTPNR_NAMESPACE
@@ -10,13 +10,14 @@ USING_NEXTPNR_NAMESPACE
class Worker : public QObject
{
Q_OBJECT
-public:
+ public:
Worker(Context *ctx);
-public Q_SLOTS:
+ public Q_SLOTS:
void parsejson(const std::string &filename);
-Q_SIGNALS:
+ Q_SIGNALS:
void log(const std::string &text);
-private:
+
+ private:
Context *ctx;
};
@@ -24,12 +25,13 @@ class TaskManager : public QObject
{
Q_OBJECT
QThread workerThread;
-public:
+
+ public:
TaskManager(Context *ctx);
~TaskManager();
-public Q_SLOTS:
+ public Q_SLOTS:
void info(const std::string &text);
-Q_SIGNALS:
+ Q_SIGNALS:
void parsejson(const std::string &);
void log(const std::string &text);
};
diff --git a/ice40/main.cc b/ice40/main.cc
index 76c059b8..67d71dc1 100644
--- a/ice40/main.cc
+++ b/ice40/main.cc
@@ -60,276 +60,286 @@ void svg_dump_el(const GraphicElement &el)
int main(int argc, char *argv[])
{
- namespace po = boost::program_options;
- int rc = 0;
- std::string str;
-
- log_files.push_back(stdout);
-
- po::options_description options("Allowed options");
- options.add_options()("help,h", "show help");
- options.add_options()("verbose,v", "verbose output");
- options.add_options()("debug", "debug output");
- options.add_options()("force,f", "keep running after errors");
- options.add_options()("gui", "start gui");
- options.add_options()("svg", "dump SVG file");
- options.add_options()("pack-only",
- "pack design only without placement or routing");
-
- options.add_options()("run", po::value<std::vector<std::string>>(),
- "python file to execute");
- options.add_options()("json", po::value<std::string>(),
- "JSON design file to ingest");
- options.add_options()("pcf", po::value<std::string>(),
- "PCF constraints file to ingest");
- options.add_options()("asc", po::value<std::string>(),
- "asc bitstream file to write");
- options.add_options()("seed", po::value<int>(),
- "seed value for random number generator");
- options.add_options()("version,V", "show version");
- options.add_options()("tmfuzz", "run path delay estimate fuzzer");
- options.add_options()("lp384", "set device type to iCE40LP384");
- options.add_options()("lp1k", "set device type to iCE40LP1K");
- options.add_options()("lp8k", "set device type to iCE40LP8K");
- options.add_options()("hx1k", "set device type to iCE40HX1K");
- options.add_options()("hx8k", "set device type to iCE40HX8K");
- options.add_options()("up5k", "set device type to iCE40UP5K");
- options.add_options()("freq", po::value<double>(),
- "set target frequency for design in MHz");
- options.add_options()("package", po::value<std::string>(),
- "set device package");
- po::positional_options_description pos;
- pos.add("run", -1);
-
- po::variables_map vm;
try {
- po::parsed_options parsed = po::command_line_parser(argc, argv)
- .options(options)
- .positional(pos)
- .run();
-
- po::store(parsed, vm);
-
- po::notify(vm);
- }
+ namespace po = boost::program_options;
+ int rc = 0;
+ std::string str;
+
+ log_files.push_back(stdout);
+
+ po::options_description options("Allowed options");
+ options.add_options()("help,h", "show help");
+ options.add_options()("verbose,v", "verbose output");
+ options.add_options()("debug", "debug output");
+ options.add_options()("force,f", "keep running after errors");
+ options.add_options()("gui", "start gui");
+ options.add_options()("svg", "dump SVG file");
+ options.add_options()("pack-only",
+ "pack design only without placement or routing");
+
+ options.add_options()("run", po::value<std::vector<std::string>>(),
+ "python file to execute");
+ options.add_options()("json", po::value<std::string>(),
+ "JSON design file to ingest");
+ options.add_options()("pcf", po::value<std::string>(),
+ "PCF constraints file to ingest");
+ options.add_options()("asc", po::value<std::string>(),
+ "asc bitstream file to write");
+ options.add_options()("seed", po::value<int>(),
+ "seed value for random number generator");
+ options.add_options()("version,V", "show version");
+ options.add_options()("tmfuzz", "run path delay estimate fuzzer");
+ options.add_options()("lp384", "set device type to iCE40LP384");
+ options.add_options()("lp1k", "set device type to iCE40LP1K");
+ options.add_options()("lp8k", "set device type to iCE40LP8K");
+ options.add_options()("hx1k", "set device type to iCE40HX1K");
+ options.add_options()("hx8k", "set device type to iCE40HX8K");
+ options.add_options()("up5k", "set device type to iCE40UP5K");
+ options.add_options()("freq", po::value<double>(),
+ "set target frequency for design in MHz");
+ options.add_options()("package", po::value<std::string>(),
+ "set device package");
+ po::positional_options_description pos;
+ pos.add("run", -1);
+
+ po::variables_map vm;
+ try {
+ po::parsed_options parsed = po::command_line_parser(argc, argv)
+ .options(options)
+ .positional(pos)
+ .run();
+
+ po::store(parsed, vm);
+
+ po::notify(vm);
+ }
- catch (std::exception &e) {
- std::cout << e.what() << "\n";
- return 1;
- }
+ catch (std::exception &e) {
+ std::cout << e.what() << "\n";
+ return 1;
+ }
- if (vm.count("help") || argc == 1) {
- help:
- std::cout << boost::filesystem::basename(argv[0])
- << " -- Next Generation Place and Route (git "
- "sha1 " GIT_COMMIT_HASH_STR ")\n";
- std::cout << "\n";
- std::cout << options << "\n";
- return argc != 1;
- }
+ if (vm.count("help") || argc == 1) {
+ help:
+ std::cout << boost::filesystem::basename(argv[0])
+ << " -- Next Generation Place and Route (git "
+ "sha1 " GIT_COMMIT_HASH_STR ")\n";
+ std::cout << "\n";
+ std::cout << options << "\n";
+ return argc != 1;
+ }
- if (vm.count("version")) {
- std::cout << boost::filesystem::basename(argv[0])
- << " -- Next Generation Place and Route (git "
- "sha1 " GIT_COMMIT_HASH_STR ")\n";
- return 1;
- }
+ if (vm.count("version")) {
+ std::cout << boost::filesystem::basename(argv[0])
+ << " -- Next Generation Place and Route (git "
+ "sha1 " GIT_COMMIT_HASH_STR ")\n";
+ return 1;
+ }
- ArchArgs chipArgs;
+ ArchArgs chipArgs;
- if (vm.count("lp384")) {
- if (chipArgs.type != ArchArgs::NONE)
- goto help;
- chipArgs.type = ArchArgs::LP384;
- chipArgs.package = "qn32";
- }
+ if (vm.count("lp384")) {
+ if (chipArgs.type != ArchArgs::NONE)
+ goto help;
+ chipArgs.type = ArchArgs::LP384;
+ chipArgs.package = "qn32";
+ }
- if (vm.count("lp1k")) {
- if (chipArgs.type != ArchArgs::NONE)
- goto help;
- chipArgs.type = ArchArgs::LP1K;
- chipArgs.package = "tq144";
- }
+ if (vm.count("lp1k")) {
+ if (chipArgs.type != ArchArgs::NONE)
+ goto help;
+ chipArgs.type = ArchArgs::LP1K;
+ chipArgs.package = "tq144";
+ }
- if (vm.count("lp8k")) {
- if (chipArgs.type != ArchArgs::NONE)
- goto help;
- chipArgs.type = ArchArgs::LP8K;
- chipArgs.package = "ct256";
- }
+ if (vm.count("lp8k")) {
+ if (chipArgs.type != ArchArgs::NONE)
+ goto help;
+ chipArgs.type = ArchArgs::LP8K;
+ chipArgs.package = "ct256";
+ }
- if (vm.count("hx1k")) {
- if (chipArgs.type != ArchArgs::NONE)
- goto help;
- chipArgs.type = ArchArgs::HX1K;
- chipArgs.package = "tq144";
- }
+ if (vm.count("hx1k")) {
+ if (chipArgs.type != ArchArgs::NONE)
+ goto help;
+ chipArgs.type = ArchArgs::HX1K;
+ chipArgs.package = "tq144";
+ }
- if (vm.count("hx8k")) {
- if (chipArgs.type != ArchArgs::NONE)
- goto help;
- chipArgs.type = ArchArgs::HX8K;
- chipArgs.package = "ct256";
- }
+ if (vm.count("hx8k")) {
+ if (chipArgs.type != ArchArgs::NONE)
+ goto help;
+ chipArgs.type = ArchArgs::HX8K;
+ chipArgs.package = "ct256";
+ }
- if (vm.count("up5k")) {
- if (chipArgs.type != ArchArgs::NONE)
- goto help;
- chipArgs.type = ArchArgs::UP5K;
- chipArgs.package = "sg48";
- }
+ if (vm.count("up5k")) {
+ if (chipArgs.type != ArchArgs::NONE)
+ goto help;
+ chipArgs.type = ArchArgs::UP5K;
+ chipArgs.package = "sg48";
+ }
- if (chipArgs.type == ArchArgs::NONE) {
- chipArgs.type = ArchArgs::HX1K;
- chipArgs.package = "tq144";
- }
+ if (chipArgs.type == ArchArgs::NONE) {
+ chipArgs.type = ArchArgs::HX1K;
+ chipArgs.package = "tq144";
+ }
#ifdef ICE40_HX1K_ONLY
- if (chipArgs.type != ArchArgs::HX1K) {
- std::cout << "This version of nextpnr-ice40 is built with HX1K-support "
- "only.\n";
- return 1;
- }
+ if (chipArgs.type != ArchArgs::HX1K) {
+ std::cout << "This version of nextpnr-ice40 is built with "
+ "HX1K-support "
+ "only.\n";
+ return 1;
+ }
#endif
- if (vm.count("package"))
- chipArgs.package = vm["package"].as<std::string>();
+ if (vm.count("package"))
+ chipArgs.package = vm["package"].as<std::string>();
- Context ctx(chipArgs);
- init_python(argv[0]);
- python_export_global("ctx", ctx);
+ Context ctx(chipArgs);
+ init_python(argv[0]);
+ python_export_global("ctx", ctx);
- if (vm.count("verbose")) {
- ctx.verbose = true;
- }
-
- if (vm.count("debug")) {
- ctx.verbose = true;
- ctx.debug = true;
- }
-
- if (vm.count("force")) {
- ctx.force = true;
- }
+ if (vm.count("verbose")) {
+ ctx.verbose = true;
+ }
- if (vm.count("seed")) {
- ctx.rngseed(vm["seed"].as<int>());
- }
+ if (vm.count("debug")) {
+ ctx.verbose = true;
+ ctx.debug = true;
+ }
- if (vm.count("svg")) {
- std::cout << "<svg xmlns=\"http://www.w3.org/2000/svg\" "
- "xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n";
- for (auto bel : ctx.getBels()) {
- std::cout << "<!-- " << ctx.getBelName(bel).str(&ctx) << " -->\n";
- for (auto &el : ctx.getBelGraphics(bel))
- svg_dump_el(el);
+ if (vm.count("force")) {
+ ctx.force = true;
}
- std::cout << "<!-- Frame -->\n";
- for (auto &el : ctx.getFrameGraphics())
- svg_dump_el(el);
- std::cout << "</svg>\n";
- }
- if (vm.count("tmfuzz")) {
- std::vector<WireId> src_wires, dst_wires;
+ if (vm.count("seed")) {
+ ctx.rngseed(vm["seed"].as<int>());
+ }
- /*for (auto w : ctx.getWires())
- src_wires.push_back(w);*/
- for (auto b : ctx.getBels()) {
- if (ctx.getBelType(b) == TYPE_ICESTORM_LC) {
- src_wires.push_back(ctx.getWireBelPin(b, PIN_O));
- }
- if (ctx.getBelType(b) == TYPE_SB_IO) {
- src_wires.push_back(ctx.getWireBelPin(b, PIN_D_IN_0));
+ if (vm.count("svg")) {
+ std::cout << "<svg xmlns=\"http://www.w3.org/2000/svg\" "
+ "xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n";
+ for (auto bel : ctx.getBels()) {
+ std::cout << "<!-- " << ctx.getBelName(bel).str(&ctx)
+ << " -->\n";
+ for (auto &el : ctx.getBelGraphics(bel))
+ svg_dump_el(el);
}
+ std::cout << "<!-- Frame -->\n";
+ for (auto &el : ctx.getFrameGraphics())
+ svg_dump_el(el);
+ std::cout << "</svg>\n";
}
- for (auto b : ctx.getBels()) {
- if (ctx.getBelType(b) == TYPE_ICESTORM_LC) {
- dst_wires.push_back(ctx.getWireBelPin(b, PIN_I0));
- dst_wires.push_back(ctx.getWireBelPin(b, PIN_I1));
- dst_wires.push_back(ctx.getWireBelPin(b, PIN_I2));
- dst_wires.push_back(ctx.getWireBelPin(b, PIN_I3));
- dst_wires.push_back(ctx.getWireBelPin(b, PIN_CEN));
- dst_wires.push_back(ctx.getWireBelPin(b, PIN_CIN));
+ if (vm.count("tmfuzz")) {
+ std::vector<WireId> src_wires, dst_wires;
+
+ /*for (auto w : ctx.getWires())
+ src_wires.push_back(w);*/
+ for (auto b : ctx.getBels()) {
+ if (ctx.getBelType(b) == TYPE_ICESTORM_LC) {
+ src_wires.push_back(ctx.getWireBelPin(b, PIN_O));
+ }
+ if (ctx.getBelType(b) == TYPE_SB_IO) {
+ src_wires.push_back(ctx.getWireBelPin(b, PIN_D_IN_0));
+ }
}
- if (ctx.getBelType(b) == TYPE_SB_IO) {
- dst_wires.push_back(ctx.getWireBelPin(b, PIN_D_OUT_0));
- dst_wires.push_back(ctx.getWireBelPin(b, PIN_OUTPUT_ENABLE));
+
+ for (auto b : ctx.getBels()) {
+ if (ctx.getBelType(b) == TYPE_ICESTORM_LC) {
+ dst_wires.push_back(ctx.getWireBelPin(b, PIN_I0));
+ dst_wires.push_back(ctx.getWireBelPin(b, PIN_I1));
+ dst_wires.push_back(ctx.getWireBelPin(b, PIN_I2));
+ dst_wires.push_back(ctx.getWireBelPin(b, PIN_I3));
+ dst_wires.push_back(ctx.getWireBelPin(b, PIN_CEN));
+ dst_wires.push_back(ctx.getWireBelPin(b, PIN_CIN));
+ }
+ if (ctx.getBelType(b) == TYPE_SB_IO) {
+ dst_wires.push_back(ctx.getWireBelPin(b, PIN_D_OUT_0));
+ dst_wires.push_back(
+ ctx.getWireBelPin(b, PIN_OUTPUT_ENABLE));
+ }
}
- }
- ctx.shuffle(src_wires);
- ctx.shuffle(dst_wires);
-
- for (int i = 0; i < int(src_wires.size()) && i < int(dst_wires.size());
- i++) {
- delay_t actual_delay;
- WireId src = src_wires[i], dst = dst_wires[i];
- if (!get_actual_route_delay(&ctx, src, dst, actual_delay))
- continue;
- printf("%s %s %.3f %.3f %d %d %d %d %d %d\n",
- ctx.getWireName(src).c_str(&ctx),
- ctx.getWireName(dst).c_str(&ctx),
- ctx.getDelayNS(actual_delay),
- ctx.getDelayNS(ctx.estimateDelay(src, dst)),
- ctx.chip_info->wire_data[src.index].x,
- ctx.chip_info->wire_data[src.index].y,
- ctx.chip_info->wire_data[src.index].type,
- ctx.chip_info->wire_data[dst.index].x,
- ctx.chip_info->wire_data[dst.index].y,
- ctx.chip_info->wire_data[dst.index].type);
+ ctx.shuffle(src_wires);
+ ctx.shuffle(dst_wires);
+
+ for (int i = 0;
+ i < int(src_wires.size()) && i < int(dst_wires.size()); i++) {
+ delay_t actual_delay;
+ WireId src = src_wires[i], dst = dst_wires[i];
+ if (!get_actual_route_delay(&ctx, src, dst, actual_delay))
+ continue;
+ printf("%s %s %.3f %.3f %d %d %d %d %d %d\n",
+ ctx.getWireName(src).c_str(&ctx),
+ ctx.getWireName(dst).c_str(&ctx),
+ ctx.getDelayNS(actual_delay),
+ ctx.getDelayNS(ctx.estimateDelay(src, dst)),
+ ctx.chip_info->wire_data[src.index].x,
+ ctx.chip_info->wire_data[src.index].y,
+ ctx.chip_info->wire_data[src.index].type,
+ ctx.chip_info->wire_data[dst.index].x,
+ ctx.chip_info->wire_data[dst.index].y,
+ ctx.chip_info->wire_data[dst.index].type);
+ }
}
- }
- if (vm.count("json")) {
- std::string filename = vm["json"].as<std::string>();
- std::ifstream f(filename);
+ if (vm.count("json")) {
+ std::string filename = vm["json"].as<std::string>();
+ std::ifstream f(filename);
+ parse_json_file(f, filename, &ctx);
- parse_json_file(f, filename, &ctx);
+ if (vm.count("pcf")) {
+ std::ifstream pcf(vm["pcf"].as<std::string>());
+ apply_pcf(&ctx, pcf);
+ }
- if (vm.count("pcf")) {
- std::ifstream pcf(vm["pcf"].as<std::string>());
- apply_pcf(&ctx, pcf);
+ if (!pack_design(&ctx) && !ctx.force)
+ log_error("Packing design failed.\n");
+ double freq = 50e6;
+ if (vm.count("freq"))
+ freq = vm["freq"].as<double>() * 1e6;
+ assign_budget(&ctx, freq);
+ print_utilisation(&ctx);
+
+ if (!vm.count("pack-only")) {
+ if (!place_design_sa(&ctx) && !ctx.force)
+ log_error("Placing design failed.\n");
+ if (!route_design(&ctx) && !ctx.force)
+ log_error("Routing design failed.\n");
+ }
}
- if (!pack_design(&ctx) && !ctx.force)
- log_error("Packing design failed.\n");
- double freq = 50e6;
- if (vm.count("freq"))
- freq = vm["freq"].as<double>() * 1e6;
- assign_budget(&ctx, freq);
- print_utilisation(&ctx);
-
- if (!vm.count("pack-only")) {
- if (!place_design_sa(&ctx) && !ctx.force)
- log_error("Placing design failed.\n");
- if (!route_design(&ctx) && !ctx.force)
- log_error("Routing design failed.\n");
+ if (vm.count("asc")) {
+ std::string filename = vm["asc"].as<std::string>();
+ std::ofstream f(filename);
+ write_asc(&ctx, f);
}
- }
- if (vm.count("asc")) {
- std::string filename = vm["asc"].as<std::string>();
- std::ofstream f(filename);
- write_asc(&ctx, f);
- }
-
- if (vm.count("run")) {
- std::vector<std::string> files =
- vm["run"].as<std::vector<std::string>>();
- for (auto filename : files)
- execute_python_file(filename.c_str());
- }
+ if (vm.count("run")) {
+ std::vector<std::string> files =
+ vm["run"].as<std::vector<std::string>>();
+ for (auto filename : files)
+ execute_python_file(filename.c_str());
+ }
- if (vm.count("gui")) {
- QApplication a(argc, argv);
- MainWindow w(&ctx);
- w.show();
+ if (vm.count("gui")) {
+ QApplication a(argc, argv);
+ MainWindow w(&ctx);
+ w.show();
- rc = a.exec();
+ rc = a.exec();
+ }
+ deinit_python();
+ return rc;
+ } catch (log_execution_error_exception) {
+#if defined(_MSC_VER)
+ _exit(EXIT_FAILURE);
+#else
+ _Exit(EXIT_FAILURE);
+#endif
}
- deinit_python();
- return rc;
}
#endif