aboutsummaryrefslogtreecommitdiffstats
path: root/gui/ice40
diff options
context:
space:
mode:
authorMiodrag Milanovic <mmicko@gmail.com>2018-06-23 16:03:22 +0200
committerMiodrag Milanovic <mmicko@gmail.com>2018-06-23 16:03:49 +0200
commitc0b1078c12b80d9add270eec560bd7cdc433d4da (patch)
tree70b860e1c9235a416cf2ef8605918e70fd598071 /gui/ice40
parenta1681560a3c46a0b785c33eddd0038f4fd662675 (diff)
downloadnextpnr-c0b1078c12b80d9add270eec560bd7cdc433d4da.tar.gz
nextpnr-c0b1078c12b80d9add270eec560bd7cdc433d4da.tar.bz2
nextpnr-c0b1078c12b80d9add270eec560bd7cdc433d4da.zip
Added assign time budget and placement option
Diffstat (limited to 'gui/ice40')
-rw-r--r--gui/ice40/mainwindow.cc56
-rw-r--r--gui/ice40/mainwindow.h12
-rw-r--r--gui/ice40/nextpnr.qrc1
-rw-r--r--gui/ice40/resources/time_add.pngbin0 -> 827 bytes
-rw-r--r--gui/ice40/worker.cc22
-rw-r--r--gui/ice40/worker.h8
6 files changed, 90 insertions, 9 deletions
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 <QAction>
#include <QFileDialog>
#include <QIcon>
+#include <QInputDialog>
+#include <QLineEdit>
#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 @@
<file>resources/pack.png</file>
<file>resources/place.png</file>
<file>resources/route.png</file>
+ <file>resources/time_add.png</file>
</qresource>
</RCC>
diff --git a/gui/ice40/resources/time_add.png b/gui/ice40/resources/time_add.png
new file mode 100644
index 00000000..dcc45cb2
--- /dev/null
+++ b/gui/ice40/resources/time_add.png
Binary files 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();