Added assign time budget and placement option

This commit is contained in:
Miodrag Milanovic 2018-06-23 16:03:22 +02:00
parent a1681560a3
commit c0b1078c12
6 changed files with 90 additions and 9 deletions

View File

@ -21,6 +21,8 @@
#include <QAction> #include <QAction>
#include <QFileDialog> #include <QFileDialog>
#include <QIcon> #include <QIcon>
#include <QInputDialog>
#include <QLineEdit>
#include "bitstream.h" #include "bitstream.h"
#include "design_utils.h" #include "design_utils.h"
#include "jsonparse.h" #include "jsonparse.h"
@ -35,7 +37,7 @@ static void initMainResource() { Q_INIT_RESOURCE(nextpnr); }
NEXTPNR_NAMESPACE_BEGIN NEXTPNR_NAMESPACE_BEGIN
MainWindow::MainWindow(Context *_ctx, QWidget *parent) MainWindow::MainWindow(Context *_ctx, QWidget *parent)
: BaseMainWindow(_ctx, parent) : BaseMainWindow(_ctx, parent), timing_driven(false)
{ {
initMainResource(); initMainResource();
@ -48,6 +50,7 @@ MainWindow::MainWindow(Context *_ctx, QWidget *parent)
connect(task, SIGNAL(loadfile_finished(bool)), this, connect(task, SIGNAL(loadfile_finished(bool)), this,
SLOT(loadfile_finished(bool))); SLOT(loadfile_finished(bool)));
connect(task, SIGNAL(pack_finished(bool)), this, SLOT(pack_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, connect(task, SIGNAL(place_finished(bool)), this,
SLOT(place_finished(bool))); SLOT(place_finished(bool)));
connect(task, SIGNAL(route_finished(bool)), this, 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(taskStarted()), this, SLOT(taskStarted()));
connect(task, SIGNAL(taskPaused()), this, SLOT(taskPaused())); 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(); createMenu();
} }
@ -75,12 +82,20 @@ void MainWindow::createMenu()
connect(actionPack, SIGNAL(triggered()), task, SIGNAL(pack())); connect(actionPack, SIGNAL(triggered()), task, SIGNAL(pack()));
actionPack->setEnabled(false); 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); actionPlace = new QAction("Place", this);
QIcon iconPlace; QIcon iconPlace;
iconPlace.addFile(QStringLiteral(":/icons/resources/place.png")); iconPlace.addFile(QStringLiteral(":/icons/resources/place.png"));
actionPlace->setIcon(iconPlace); actionPlace->setIcon(iconPlace);
actionPlace->setStatusTip("Place current design"); actionPlace->setStatusTip("Place current design");
connect(actionPlace, SIGNAL(triggered()), task, SIGNAL(place())); connect(actionPlace, SIGNAL(triggered()), this, SLOT(place()));
actionPlace->setEnabled(false); actionPlace->setEnabled(false);
actionRoute = new QAction("Route", this); actionRoute = new QAction("Route", this);
@ -95,10 +110,12 @@ void MainWindow::createMenu()
addToolBar(Qt::TopToolBarArea, taskFPGABar); addToolBar(Qt::TopToolBarArea, taskFPGABar);
taskFPGABar->addAction(actionPack); taskFPGABar->addAction(actionPack);
taskFPGABar->addAction(actionAssignBudget);
taskFPGABar->addAction(actionPlace); taskFPGABar->addAction(actionPlace);
taskFPGABar->addAction(actionRoute); taskFPGABar->addAction(actionRoute);
menu_Design->addAction(actionPack); menu_Design->addAction(actionPack);
menu_Design->addAction(actionAssignBudget);
menu_Design->addAction(actionPlace); menu_Design->addAction(actionPlace);
menu_Design->addAction(actionRoute); menu_Design->addAction(actionRoute);
@ -143,6 +160,7 @@ void MainWindow::open()
std::string fn = fileName.toStdString(); std::string fn = fileName.toStdString();
disableActions(); disableActions();
timing_driven = false;
Q_EMIT task->loadfile(fn); Q_EMIT task->loadfile(fn);
} }
} }
@ -152,6 +170,7 @@ bool MainWindow::save() { return false; }
void MainWindow::disableActions() void MainWindow::disableActions()
{ {
actionPack->setEnabled(false); actionPack->setEnabled(false);
actionAssignBudget->setEnabled(false);
actionPlace->setEnabled(false); actionPlace->setEnabled(false);
actionRoute->setEnabled(false); actionRoute->setEnabled(false);
@ -176,10 +195,23 @@ void MainWindow::pack_finished(bool status)
if (status) { if (status) {
log("Packing design successful.\n"); log("Packing design successful.\n");
actionPlace->setEnabled(true); actionPlace->setEnabled(true);
actionAssignBudget->setEnabled(true);
} else { } else {
log("Packing design failed.\n"); 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) void MainWindow::place_finished(bool status)
{ {
disableActions(); disableActions();
@ -219,4 +251,24 @@ void MainWindow::taskPaused()
actionStop->setEnabled(true); 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 NEXTPNR_NAMESPACE_END

View File

@ -36,11 +36,20 @@ class MainWindow : public BaseMainWindow
public: public:
void createMenu(); void createMenu();
Q_SIGNALS:
void budget(double freq);
void place(bool timing_driven);
protected Q_SLOTS: protected Q_SLOTS:
virtual void open(); virtual void open();
virtual bool save(); virtual bool save();
void budget();
void place();
void loadfile_finished(bool status); void loadfile_finished(bool status);
void pack_finished(bool status); void pack_finished(bool status);
void budget_finish(bool status);
void place_finished(bool status); void place_finished(bool status);
void route_finished(bool status); void route_finished(bool status);
@ -53,11 +62,14 @@ class MainWindow : public BaseMainWindow
TaskManager *task; TaskManager *task;
QAction *actionPack; QAction *actionPack;
QAction *actionAssignBudget;
QAction *actionPlace; QAction *actionPlace;
QAction *actionRoute; QAction *actionRoute;
QAction *actionPlay; QAction *actionPlay;
QAction *actionPause; QAction *actionPause;
QAction *actionStop; QAction *actionStop;
bool timing_driven;
}; };
NEXTPNR_NAMESPACE_END NEXTPNR_NAMESPACE_END

View File

@ -6,5 +6,6 @@
<file>resources/pack.png</file> <file>resources/pack.png</file>
<file>resources/place.png</file> <file>resources/place.png</file>
<file>resources/route.png</file> <file>resources/route.png</file>
<file>resources/time_add.png</file>
</qresource> </qresource>
</RCC> </RCC>

Binary file not shown.

After

Width:  |  Height:  |  Size: 827 B

View File

@ -72,20 +72,30 @@ void Worker::pack()
{ {
Q_EMIT taskStarted(); Q_EMIT taskStarted();
try { try {
Q_EMIT pack_finished(pack_design(ctx)); bool res = pack_design(ctx);
print_utilisation(ctx);
Q_EMIT pack_finished(res);
} catch (WorkerInterruptionRequested) { } catch (WorkerInterruptionRequested) {
Q_EMIT taskCanceled(); Q_EMIT taskCanceled();
} }
} }
void Worker::place() void Worker::budget(double freq)
{ {
Q_EMIT taskStarted(); Q_EMIT taskStarted();
try { try {
double freq = 50e6;
assign_budget(ctx, freq); assign_budget(ctx, freq);
print_utilisation(ctx); Q_EMIT budget_finish(true);
Q_EMIT place_finished(place_design_sa(ctx)); } 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) { } catch (WorkerInterruptionRequested) {
Q_EMIT taskCanceled(); 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::loadfile, worker, &Worker::loadfile);
connect(this, &TaskManager::pack, worker, &Worker::pack); connect(this, &TaskManager::pack, worker, &Worker::pack);
connect(this, &TaskManager::budget, worker, &Worker::budget);
connect(this, &TaskManager::place, worker, &Worker::place); connect(this, &TaskManager::place, worker, &Worker::place);
connect(this, &TaskManager::route, worker, &Worker::route); 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, connect(worker, &Worker::loadfile_finished, this,
&TaskManager::loadfile_finished); &TaskManager::loadfile_finished);
connect(worker, &Worker::pack_finished, this, &TaskManager::pack_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, connect(worker, &Worker::place_finished, this,
&TaskManager::place_finished); &TaskManager::place_finished);
connect(worker, &Worker::route_finished, this, connect(worker, &Worker::route_finished, this,

View File

@ -36,12 +36,14 @@ class Worker : public QObject
public Q_SLOTS: public Q_SLOTS:
void loadfile(const std::string &); void loadfile(const std::string &);
void pack(); void pack();
void place(); void budget(double freq);
void place(bool timing_driven);
void route(); void route();
Q_SIGNALS: Q_SIGNALS:
void log(const std::string &text); void log(const std::string &text);
void loadfile_finished(bool status); void loadfile_finished(bool status);
void pack_finished(bool status); void pack_finished(bool status);
void budget_finish(bool status);
void place_finished(bool status); void place_finished(bool status);
void route_finished(bool status); void route_finished(bool status);
void taskCanceled(); void taskCanceled();
@ -72,13 +74,15 @@ class TaskManager : public QObject
void terminate(); void terminate();
void loadfile(const std::string &); void loadfile(const std::string &);
void pack(); void pack();
void place(); void budget(double freq);
void place(bool timing_driven);
void route(); void route();
// redirected signals // redirected signals
void log(const std::string &text); void log(const std::string &text);
void loadfile_finished(bool status); void loadfile_finished(bool status);
void pack_finished(bool status); void pack_finished(bool status);
void budget_finish(bool status);
void place_finished(bool status); void place_finished(bool status);
void route_finished(bool status); void route_finished(bool status);
void taskCanceled(); void taskCanceled();