Merge branch 'master' of gitlab.com:SymbioticEDA/nextpnr

This commit is contained in:
David Shah 2018-06-26 14:22:47 +02:00
commit 2073403f41
11 changed files with 129 additions and 27 deletions

View File

@ -90,27 +90,35 @@ void BaseMainWindow::writeInfo(std::string text) { info->info(text); }
void BaseMainWindow::createMenusAndBars() void BaseMainWindow::createMenusAndBars()
{ {
QAction *actionNew = new QAction("New", this);
QIcon iconNew;
iconNew.addFile(QStringLiteral(":/icons/resources/new.png"));
actionNew->setIcon(iconNew);
actionNew->setShortcuts(QKeySequence::New);
actionNew->setStatusTip("New project file");
connect(actionNew, SIGNAL(triggered()), this, SLOT(new_proj()));
QAction *actionOpen = new QAction("Open", this); QAction *actionOpen = new QAction("Open", this);
QIcon icon1; QIcon iconOpen;
icon1.addFile(QStringLiteral(":/icons/resources/open.png")); iconOpen.addFile(QStringLiteral(":/icons/resources/open.png"));
actionOpen->setIcon(icon1); actionOpen->setIcon(iconOpen);
actionOpen->setShortcuts(QKeySequence::Open); actionOpen->setShortcuts(QKeySequence::Open);
actionOpen->setStatusTip("Open an existing JSON file"); actionOpen->setStatusTip("Open an existing project file");
connect(actionOpen, SIGNAL(triggered()), this, SLOT(open())); connect(actionOpen, SIGNAL(triggered()), this, SLOT(open_proj()));
QAction *actionSave = new QAction("Save", this); QAction *actionSave = new QAction("Save", this);
QIcon icon2; QIcon iconSave;
icon2.addFile(QStringLiteral(":/icons/resources/save.png")); iconSave.addFile(QStringLiteral(":/icons/resources/save.png"));
actionSave->setIcon(icon2); actionSave->setIcon(iconSave);
actionSave->setShortcuts(QKeySequence::Save); actionSave->setShortcuts(QKeySequence::Save);
actionSave->setStatusTip("Save the ASC to disk"); actionSave->setStatusTip("Save existing project to disk");
connect(actionSave, SIGNAL(triggered()), this, SLOT(save())); connect(actionSave, SIGNAL(triggered()), this, SLOT(save_proj()));
actionSave->setEnabled(false); actionSave->setEnabled(false);
QAction *actionExit = new QAction("Exit", this); QAction *actionExit = new QAction("Exit", this);
QIcon icon3; QIcon iconExit;
icon3.addFile(QStringLiteral(":/icons/resources/exit.png")); iconExit.addFile(QStringLiteral(":/icons/resources/exit.png"));
actionExit->setIcon(icon3); actionExit->setIcon(iconExit);
actionExit->setShortcuts(QKeySequence::Quit); actionExit->setShortcuts(QKeySequence::Quit);
actionExit->setStatusTip("Exit the application"); actionExit->setStatusTip("Exit the application");
connect(actionExit, SIGNAL(triggered()), this, SLOT(close())); connect(actionExit, SIGNAL(triggered()), this, SLOT(close()));
@ -131,12 +139,14 @@ void BaseMainWindow::createMenusAndBars()
statusBar = new QStatusBar(); statusBar = new QStatusBar();
setStatusBar(statusBar); setStatusBar(statusBar);
menu_File->addAction(actionNew);
menu_File->addAction(actionOpen); menu_File->addAction(actionOpen);
menu_File->addAction(actionSave); menu_File->addAction(actionSave);
menu_File->addSeparator(); menu_File->addSeparator();
menu_File->addAction(actionExit); menu_File->addAction(actionExit);
menu_Help->addAction(actionAbout); menu_Help->addAction(actionAbout);
mainToolBar->addAction(actionNew);
mainToolBar->addAction(actionOpen); mainToolBar->addAction(actionOpen);
mainToolBar->addAction(actionSave); mainToolBar->addAction(actionSave);
} }

View File

@ -49,8 +49,9 @@ class BaseMainWindow : public QMainWindow
protected Q_SLOTS: protected Q_SLOTS:
void writeInfo(std::string text); void writeInfo(std::string text);
virtual void open() = 0; virtual void new_proj() = 0;
virtual bool save() = 0; virtual void open_proj() = 0;
virtual bool save_proj() = 0;
protected: protected:
Context *ctx; Context *ctx;

View File

@ -41,8 +41,10 @@ void MainWindow::createMenu()
menuBar->addAction(menu_Custom->menuAction()); menuBar->addAction(menu_Custom->menuAction());
} }
void MainWindow::open() {} void MainWindow::new_proj() {}
bool MainWindow::save() { return false; } void MainWindow::open_proj() {}
bool MainWindow::save_proj() { return false; }
NEXTPNR_NAMESPACE_END NEXTPNR_NAMESPACE_END

View File

@ -36,8 +36,9 @@ class MainWindow : public BaseMainWindow
void createMenu(); void createMenu();
protected Q_SLOTS: protected Q_SLOTS:
virtual void open(); virtual void new_proj();
virtual bool save(); virtual void open_proj();
virtual bool save_proj();
}; };
NEXTPNR_NAMESPACE_END NEXTPNR_NAMESPACE_END

View File

@ -48,6 +48,7 @@ MainWindow::MainWindow(Context *_ctx, QWidget *parent) : BaseMainWindow(_ctx, pa
connect(task, SIGNAL(loadfile_finished(bool)), this, SLOT(loadfile_finished(bool))); connect(task, SIGNAL(loadfile_finished(bool)), this, SLOT(loadfile_finished(bool)));
connect(task, SIGNAL(loadpcf_finished(bool)), this, SLOT(loadpcf_finished(bool))); connect(task, SIGNAL(loadpcf_finished(bool)), this, SLOT(loadpcf_finished(bool)));
connect(task, SIGNAL(saveasc_finished(bool)), this, SLOT(saveasc_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(budget_finish(bool)), this, SLOT(budget_finish(bool)));
connect(task, SIGNAL(place_finished(bool)), this, SLOT(place_finished(bool))); connect(task, SIGNAL(place_finished(bool)), this, SLOT(place_finished(bool)));
@ -67,6 +68,14 @@ void MainWindow::createMenu()
QMenu *menu_Design = new QMenu("&Design", menuBar); QMenu *menu_Design = new QMenu("&Design", menuBar);
menuBar->addAction(menu_Design->menuAction()); menuBar->addAction(menu_Design->menuAction());
actionLoadJSON = new QAction("Open JSON", this);
QIcon iconLoadJSON;
iconLoadJSON.addFile(QStringLiteral(":/icons/resources/open_json.png"));
actionLoadJSON->setIcon(iconLoadJSON);
actionLoadJSON->setStatusTip("Open an existing JSON file");
connect(actionLoadJSON, SIGNAL(triggered()), this, SLOT(open_json()));
actionLoadJSON->setEnabled(false);
actionLoadPCF = new QAction("Open PCF", this); actionLoadPCF = new QAction("Open PCF", this);
QIcon iconLoadPCF; QIcon iconLoadPCF;
iconLoadPCF.addFile(QStringLiteral(":/icons/resources/open_pcf.png")); iconLoadPCF.addFile(QStringLiteral(":/icons/resources/open_pcf.png"));
@ -107,20 +116,32 @@ void MainWindow::createMenu()
connect(actionRoute, SIGNAL(triggered()), task, SIGNAL(route())); connect(actionRoute, SIGNAL(triggered()), task, SIGNAL(route()));
actionRoute->setEnabled(false); actionRoute->setEnabled(false);
actionSaveAsc = new QAction("Save ASC", this);
QIcon iconSaveAsc;
iconSaveAsc.addFile(QStringLiteral(":/icons/resources/save_asc.png"));
actionSaveAsc->setIcon(iconSaveAsc);
actionSaveAsc->setStatusTip("Save ASC file");
connect(actionSaveAsc, SIGNAL(triggered()), this, SLOT(save_asc()));
actionSaveAsc->setEnabled(false);
QToolBar *taskFPGABar = new QToolBar(); QToolBar *taskFPGABar = new QToolBar();
addToolBar(Qt::TopToolBarArea, taskFPGABar); addToolBar(Qt::TopToolBarArea, taskFPGABar);
taskFPGABar->addAction(actionLoadJSON);
taskFPGABar->addAction(actionLoadPCF); taskFPGABar->addAction(actionLoadPCF);
taskFPGABar->addAction(actionPack); taskFPGABar->addAction(actionPack);
taskFPGABar->addAction(actionAssignBudget); taskFPGABar->addAction(actionAssignBudget);
taskFPGABar->addAction(actionPlace); taskFPGABar->addAction(actionPlace);
taskFPGABar->addAction(actionRoute); taskFPGABar->addAction(actionRoute);
taskFPGABar->addAction(actionSaveAsc);
menu_Design->addAction(actionLoadJSON);
menu_Design->addAction(actionLoadPCF); menu_Design->addAction(actionLoadPCF);
menu_Design->addAction(actionPack); menu_Design->addAction(actionPack);
menu_Design->addAction(actionAssignBudget); menu_Design->addAction(actionAssignBudget);
menu_Design->addAction(actionPlace); menu_Design->addAction(actionPlace);
menu_Design->addAction(actionRoute); menu_Design->addAction(actionRoute);
menu_Design->addAction(actionSaveAsc);
actionPlay = new QAction("Play", this); actionPlay = new QAction("Play", this);
QIcon iconPlay; QIcon iconPlay;
@ -154,9 +175,26 @@ void MainWindow::createMenu()
taskToolBar->addAction(actionStop); taskToolBar->addAction(actionStop);
} }
void MainWindow::open() void MainWindow::new_proj()
{ {
QString fileName = QFileDialog::getOpenFileName(this, QString(), QString(), QString("*.json")); disableActions();
actionLoadJSON->setEnabled(true);
}
void MainWindow::open_proj()
{
QString fileName = QFileDialog::getOpenFileName(this, QString("Open Project"), QString(), QString("*.npnr"));
if (!fileName.isEmpty()) {
tabWidget->setCurrentWidget(info);
std::string fn = fileName.toStdString();
disableActions();
}
}
void MainWindow::open_json()
{
QString fileName = QFileDialog::getOpenFileName(this, QString("Open JSON"), QString(), QString("*.json"));
if (!fileName.isEmpty()) { if (!fileName.isEmpty()) {
tabWidget->setCurrentWidget(info); tabWidget->setCurrentWidget(info);
@ -169,7 +207,7 @@ void MainWindow::open()
void MainWindow::open_pcf() void MainWindow::open_pcf()
{ {
QString fileName = QFileDialog::getOpenFileName(this, QString(), QString(), QString("*.pcf")); QString fileName = QFileDialog::getOpenFileName(this, QString("Open PCF"), QString(), QString("*.pcf"));
if (!fileName.isEmpty()) { if (!fileName.isEmpty()) {
tabWidget->setCurrentWidget(info); tabWidget->setCurrentWidget(info);
@ -179,15 +217,27 @@ void MainWindow::open_pcf()
} }
} }
bool MainWindow::save() { return false; } bool MainWindow::save_proj() { return false; }
void MainWindow::save_asc()
{
QString fileName = QFileDialog::getSaveFileName(this, QString("Save ASC"), QString(), QString("*.asc"));
if (!fileName.isEmpty()) {
std::string fn = fileName.toStdString();
disableActions();
Q_EMIT task->saveasc(fn);
}
}
void MainWindow::disableActions() void MainWindow::disableActions()
{ {
actionLoadJSON->setEnabled(false);
actionLoadPCF->setEnabled(false); actionLoadPCF->setEnabled(false);
actionPack->setEnabled(false); actionPack->setEnabled(false);
actionAssignBudget->setEnabled(false); actionAssignBudget->setEnabled(false);
actionPlace->setEnabled(false); actionPlace->setEnabled(false);
actionRoute->setEnabled(false); actionRoute->setEnabled(false);
actionSaveAsc->setEnabled(false);
actionPlay->setEnabled(false); actionPlay->setEnabled(false);
actionPause->setEnabled(false); actionPause->setEnabled(false);
@ -217,6 +267,16 @@ void MainWindow::loadpcf_finished(bool status)
} }
} }
void MainWindow::saveasc_finished(bool status)
{
disableActions();
if (status) {
log("Saving ASC successful.\n");
} else {
log("Saving ASC failed.\n");
}
}
void MainWindow::pack_finished(bool status) void MainWindow::pack_finished(bool status)
{ {
disableActions(); disableActions();
@ -253,9 +313,10 @@ void MainWindow::place_finished(bool status)
void MainWindow::route_finished(bool status) void MainWindow::route_finished(bool status)
{ {
disableActions(); disableActions();
if (status) if (status) {
log("Routing design successful.\n"); log("Routing design successful.\n");
else actionSaveAsc->setEnabled(true);
} else
log("Routing design failed.\n"); log("Routing design failed.\n");
} }

View File

@ -37,15 +37,19 @@ class MainWindow : public BaseMainWindow
void createMenu(); void createMenu();
protected Q_SLOTS: protected Q_SLOTS:
virtual void open(); virtual void new_proj();
virtual bool save(); virtual void open_proj();
virtual bool save_proj();
void open_json();
void open_pcf(); void open_pcf();
void budget(); void budget();
void place(); void place();
void save_asc();
void loadfile_finished(bool status); void loadfile_finished(bool status);
void loadpcf_finished(bool status); void loadpcf_finished(bool status);
void saveasc_finished(bool status);
void pack_finished(bool status); void pack_finished(bool status);
void budget_finish(bool status); void budget_finish(bool status);
void place_finished(bool status); void place_finished(bool status);
@ -59,11 +63,13 @@ class MainWindow : public BaseMainWindow
void disableActions(); void disableActions();
TaskManager *task; TaskManager *task;
QAction *actionLoadJSON;
QAction *actionLoadPCF; QAction *actionLoadPCF;
QAction *actionPack; QAction *actionPack;
QAction *actionAssignBudget; QAction *actionAssignBudget;
QAction *actionPlace; QAction *actionPlace;
QAction *actionRoute; QAction *actionRoute;
QAction *actionSaveAsc;
QAction *actionPlay; QAction *actionPlay;
QAction *actionPause; QAction *actionPause;
QAction *actionStop; QAction *actionStop;

View File

@ -8,5 +8,7 @@
<file>resources/route.png</file> <file>resources/route.png</file>
<file>resources/time_add.png</file> <file>resources/time_add.png</file>
<file>resources/open_pcf.png</file> <file>resources/open_pcf.png</file>
<file>resources/save_asc.png</file>
<file>resources/open_json.png</file>
</qresource> </qresource>
</RCC> </RCC>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -80,6 +80,19 @@ void Worker::loadpcf(const std::string &filename)
} }
} }
void Worker::saveasc(const std::string &filename)
{
Q_EMIT taskStarted();
std::string fn = filename;
std::ofstream f(fn);
try {
write_asc(ctx, f);
Q_EMIT saveasc_finished(true);
} catch (WorkerInterruptionRequested) {
Q_EMIT taskCanceled();
}
}
void Worker::pack() void Worker::pack()
{ {
Q_EMIT taskStarted(); Q_EMIT taskStarted();
@ -132,6 +145,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::loadpcf, worker, &Worker::loadpcf); connect(this, &TaskManager::loadpcf, worker, &Worker::loadpcf);
connect(this, &TaskManager::saveasc, worker, &Worker::saveasc);
connect(this, &TaskManager::pack, worker, &Worker::pack); connect(this, &TaskManager::pack, worker, &Worker::pack);
connect(this, &TaskManager::budget, worker, &Worker::budget); connect(this, &TaskManager::budget, worker, &Worker::budget);
connect(this, &TaskManager::place, worker, &Worker::place); connect(this, &TaskManager::place, worker, &Worker::place);
@ -140,6 +154,7 @@ TaskManager::TaskManager(Context *ctx) : toTerminate(false), toPause(false)
connect(worker, &Worker::log, this, &TaskManager::info); connect(worker, &Worker::log, this, &TaskManager::info);
connect(worker, &Worker::loadfile_finished, this, &TaskManager::loadfile_finished); connect(worker, &Worker::loadfile_finished, this, &TaskManager::loadfile_finished);
connect(worker, &Worker::loadpcf_finished, this, &TaskManager::loadpcf_finished); connect(worker, &Worker::loadpcf_finished, this, &TaskManager::loadpcf_finished);
connect(worker, &Worker::saveasc_finished, this, &TaskManager::saveasc_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::budget_finish, this, &TaskManager::budget_finish);
connect(worker, &Worker::place_finished, this, &TaskManager::place_finished); connect(worker, &Worker::place_finished, this, &TaskManager::place_finished);

View File

@ -36,6 +36,7 @@ class Worker : public QObject
public Q_SLOTS: public Q_SLOTS:
void loadfile(const std::string &); void loadfile(const std::string &);
void loadpcf(const std::string &); void loadpcf(const std::string &);
void saveasc(const std::string &);
void pack(); void pack();
void budget(double freq); void budget(double freq);
void place(bool timing_driven); void place(bool timing_driven);
@ -44,6 +45,7 @@ class Worker : public QObject
void log(const std::string &text); void log(const std::string &text);
void loadfile_finished(bool status); void loadfile_finished(bool status);
void loadpcf_finished(bool status); void loadpcf_finished(bool status);
void saveasc_finished(bool status);
void pack_finished(bool status); void pack_finished(bool status);
void budget_finish(bool status); void budget_finish(bool status);
void place_finished(bool status); void place_finished(bool status);
@ -76,6 +78,7 @@ class TaskManager : public QObject
void terminate(); void terminate();
void loadfile(const std::string &); void loadfile(const std::string &);
void loadpcf(const std::string &); void loadpcf(const std::string &);
void saveasc(const std::string &);
void pack(); void pack();
void budget(double freq); void budget(double freq);
void place(bool timing_driven); void place(bool timing_driven);
@ -85,6 +88,7 @@ class TaskManager : public QObject
void log(const std::string &text); void log(const std::string &text);
void loadfile_finished(bool status); void loadfile_finished(bool status);
void loadpcf_finished(bool status); void loadpcf_finished(bool status);
void saveasc_finished(bool status);
void pack_finished(bool status); void pack_finished(bool status);
void budget_finish(bool status); void budget_finish(bool status);
void place_finished(bool status); void place_finished(bool status);