From c0b1078c12b80d9add270eec560bd7cdc433d4da Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 23 Jun 2018 16:03:22 +0200 Subject: Added assign time budget and placement option --- gui/ice40/mainwindow.cc | 56 +++++++++++++++++++++++++++++++++++++-- gui/ice40/mainwindow.h | 12 +++++++++ gui/ice40/nextpnr.qrc | 1 + gui/ice40/resources/time_add.png | Bin 0 -> 827 bytes gui/ice40/worker.cc | 22 +++++++++++---- gui/ice40/worker.h | 8 ++++-- 6 files changed, 90 insertions(+), 9 deletions(-) create mode 100644 gui/ice40/resources/time_add.png (limited to 'gui') diff --git a/gui/ice40/mainwindow.cc b/gui/ice40/mainwindow.cc index a0739f92..b4cb14ed 100644 --- a/gui/ice40/mainwindow.cc +++ b/gui/ice40/mainwindow.cc @@ -21,6 +21,8 @@ #include #include #include +#include +#include #include "bitstream.h" #include "design_utils.h" #include "jsonparse.h" @@ -35,7 +37,7 @@ static void initMainResource() { Q_INIT_RESOURCE(nextpnr); } NEXTPNR_NAMESPACE_BEGIN MainWindow::MainWindow(Context *_ctx, QWidget *parent) - : BaseMainWindow(_ctx, parent) + : BaseMainWindow(_ctx, parent), timing_driven(false) { initMainResource(); @@ -48,6 +50,7 @@ MainWindow::MainWindow(Context *_ctx, QWidget *parent) connect(task, SIGNAL(loadfile_finished(bool)), this, SLOT(loadfile_finished(bool))); connect(task, SIGNAL(pack_finished(bool)), this, SLOT(pack_finished(bool))); + connect(task, SIGNAL(budget_finish(bool)), this, SLOT(budget_finish(bool))); connect(task, SIGNAL(place_finished(bool)), this, SLOT(place_finished(bool))); connect(task, SIGNAL(route_finished(bool)), this, @@ -57,6 +60,10 @@ MainWindow::MainWindow(Context *_ctx, QWidget *parent) connect(task, SIGNAL(taskStarted()), this, SLOT(taskStarted())); connect(task, SIGNAL(taskPaused()), this, SLOT(taskPaused())); + + connect(this, SIGNAL(budget(double)), task, SIGNAL(budget(double))); + connect(this, SIGNAL(place(bool)), task, SIGNAL(place(bool))); + createMenu(); } @@ -75,12 +82,20 @@ void MainWindow::createMenu() connect(actionPack, SIGNAL(triggered()), task, SIGNAL(pack())); actionPack->setEnabled(false); + actionAssignBudget = new QAction("Assign Budget", this); + QIcon iconAssignBudget; + iconAssignBudget.addFile(QStringLiteral(":/icons/resources/time_add.png")); + actionAssignBudget->setIcon(iconAssignBudget); + actionAssignBudget->setStatusTip("Assign time budget for current design"); + connect(actionAssignBudget, SIGNAL(triggered()), this, SLOT(budget())); + actionAssignBudget->setEnabled(false); + actionPlace = new QAction("Place", this); QIcon iconPlace; iconPlace.addFile(QStringLiteral(":/icons/resources/place.png")); actionPlace->setIcon(iconPlace); actionPlace->setStatusTip("Place current design"); - connect(actionPlace, SIGNAL(triggered()), task, SIGNAL(place())); + connect(actionPlace, SIGNAL(triggered()), this, SLOT(place())); actionPlace->setEnabled(false); actionRoute = new QAction("Route", this); @@ -95,10 +110,12 @@ void MainWindow::createMenu() addToolBar(Qt::TopToolBarArea, taskFPGABar); taskFPGABar->addAction(actionPack); + taskFPGABar->addAction(actionAssignBudget); taskFPGABar->addAction(actionPlace); taskFPGABar->addAction(actionRoute); menu_Design->addAction(actionPack); + menu_Design->addAction(actionAssignBudget); menu_Design->addAction(actionPlace); menu_Design->addAction(actionRoute); @@ -143,6 +160,7 @@ void MainWindow::open() std::string fn = fileName.toStdString(); disableActions(); + timing_driven = false; Q_EMIT task->loadfile(fn); } } @@ -152,6 +170,7 @@ bool MainWindow::save() { return false; } void MainWindow::disableActions() { actionPack->setEnabled(false); + actionAssignBudget->setEnabled(false); actionPlace->setEnabled(false); actionRoute->setEnabled(false); @@ -176,10 +195,23 @@ void MainWindow::pack_finished(bool status) if (status) { log("Packing design successful.\n"); actionPlace->setEnabled(true); + actionAssignBudget->setEnabled(true); } else { log("Packing design failed.\n"); } } + +void MainWindow::budget_finish(bool status) +{ + disableActions(); + if (status) { + log("Assigning timing budget successful.\n"); + actionPlace->setEnabled(true); + } else { + log("Assigning timing budget failed.\n"); + } +} + void MainWindow::place_finished(bool status) { disableActions(); @@ -219,4 +251,24 @@ void MainWindow::taskPaused() actionStop->setEnabled(true); } +void MainWindow::budget() +{ + bool ok; + double freq = QInputDialog::getDouble(this, "Assign timing budget", + "Frequency [MHz]:", + 50, 0, 250, 2, &ok); + if (ok) { + freq *= 1e6; + timing_driven = true; + Q_EMIT budget(freq); + } + +} + +void MainWindow::place() +{ + Q_EMIT place(timing_driven); +} + + NEXTPNR_NAMESPACE_END \ No newline at end of file diff --git a/gui/ice40/mainwindow.h b/gui/ice40/mainwindow.h index c0c4bef8..9857adf8 100644 --- a/gui/ice40/mainwindow.h +++ b/gui/ice40/mainwindow.h @@ -36,11 +36,20 @@ class MainWindow : public BaseMainWindow public: void createMenu(); + Q_SIGNALS: + void budget(double freq); + void place(bool timing_driven); + protected Q_SLOTS: virtual void open(); virtual bool save(); + + void budget(); + void place(); + void loadfile_finished(bool status); void pack_finished(bool status); + void budget_finish(bool status); void place_finished(bool status); void route_finished(bool status); @@ -53,11 +62,14 @@ class MainWindow : public BaseMainWindow TaskManager *task; QAction *actionPack; + QAction *actionAssignBudget; QAction *actionPlace; QAction *actionRoute; QAction *actionPlay; QAction *actionPause; QAction *actionStop; + + bool timing_driven; }; NEXTPNR_NAMESPACE_END diff --git a/gui/ice40/nextpnr.qrc b/gui/ice40/nextpnr.qrc index 3bc68978..33f72ad8 100644 --- a/gui/ice40/nextpnr.qrc +++ b/gui/ice40/nextpnr.qrc @@ -6,5 +6,6 @@ resources/pack.png resources/place.png resources/route.png + resources/time_add.png diff --git a/gui/ice40/resources/time_add.png b/gui/ice40/resources/time_add.png new file mode 100644 index 00000000..dcc45cb2 Binary files /dev/null and b/gui/ice40/resources/time_add.png differ diff --git a/gui/ice40/worker.cc b/gui/ice40/worker.cc index ecf473ce..3f2a381b 100644 --- a/gui/ice40/worker.cc +++ b/gui/ice40/worker.cc @@ -72,20 +72,30 @@ void Worker::pack() { Q_EMIT taskStarted(); try { - Q_EMIT pack_finished(pack_design(ctx)); + bool res = pack_design(ctx); + print_utilisation(ctx); + Q_EMIT pack_finished(res); } catch (WorkerInterruptionRequested) { Q_EMIT taskCanceled(); } } -void Worker::place() +void Worker::budget(double freq) { Q_EMIT taskStarted(); try { - double freq = 50e6; assign_budget(ctx, freq); - print_utilisation(ctx); - Q_EMIT place_finished(place_design_sa(ctx)); + Q_EMIT budget_finish(true); + } catch (WorkerInterruptionRequested) { + Q_EMIT taskCanceled(); + } +} + +void Worker::place(bool timing_driven) +{ + Q_EMIT taskStarted(); + try { + Q_EMIT place_finished(place_design_sa(ctx, timing_driven)); } catch (WorkerInterruptionRequested) { Q_EMIT taskCanceled(); } @@ -110,6 +120,7 @@ TaskManager::TaskManager(Context *ctx) : toTerminate(false), toPause(false) connect(this, &TaskManager::loadfile, worker, &Worker::loadfile); connect(this, &TaskManager::pack, worker, &Worker::pack); + connect(this, &TaskManager::budget, worker, &Worker::budget); connect(this, &TaskManager::place, worker, &Worker::place); connect(this, &TaskManager::route, worker, &Worker::route); @@ -117,6 +128,7 @@ TaskManager::TaskManager(Context *ctx) : toTerminate(false), toPause(false) connect(worker, &Worker::loadfile_finished, this, &TaskManager::loadfile_finished); connect(worker, &Worker::pack_finished, this, &TaskManager::pack_finished); + connect(worker, &Worker::budget_finish, this, &TaskManager::budget_finish); connect(worker, &Worker::place_finished, this, &TaskManager::place_finished); connect(worker, &Worker::route_finished, this, diff --git a/gui/ice40/worker.h b/gui/ice40/worker.h index ae4dd146..d599e993 100644 --- a/gui/ice40/worker.h +++ b/gui/ice40/worker.h @@ -36,12 +36,14 @@ class Worker : public QObject public Q_SLOTS: void loadfile(const std::string &); void pack(); - void place(); + void budget(double freq); + void place(bool timing_driven); void route(); Q_SIGNALS: void log(const std::string &text); void loadfile_finished(bool status); void pack_finished(bool status); + void budget_finish(bool status); void place_finished(bool status); void route_finished(bool status); void taskCanceled(); @@ -72,13 +74,15 @@ class TaskManager : public QObject void terminate(); void loadfile(const std::string &); void pack(); - void place(); + void budget(double freq); + void place(bool timing_driven); void route(); // redirected signals void log(const std::string &text); void loadfile_finished(bool status); void pack_finished(bool status); + void budget_finish(bool status); void place_finished(bool status); void route_finished(bool status); void taskCanceled(); -- cgit v1.2.3