From e770f16a22d5255de53f23f9a95e8ef3fc664107 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Tue, 26 Jun 2018 13:49:32 +0200 Subject: Added Save ASC option --- gui/ice40/mainwindow.cc | 39 ++++++++++++++++++++++++++++++++++++--- gui/ice40/mainwindow.h | 3 +++ gui/ice40/nextpnr.qrc | 1 + gui/ice40/resources/save_asc.png | Bin 0 -> 1384 bytes gui/ice40/worker.cc | 15 +++++++++++++++ gui/ice40/worker.h | 4 ++++ 6 files changed, 59 insertions(+), 3 deletions(-) create mode 100644 gui/ice40/resources/save_asc.png (limited to 'gui/ice40') diff --git a/gui/ice40/mainwindow.cc b/gui/ice40/mainwindow.cc index 34769abe..4c9ef0ef 100644 --- a/gui/ice40/mainwindow.cc +++ b/gui/ice40/mainwindow.cc @@ -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(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(budget_finish(bool)), this, SLOT(budget_finish(bool))); connect(task, SIGNAL(place_finished(bool)), this, SLOT(place_finished(bool))); @@ -107,6 +108,14 @@ void MainWindow::createMenu() connect(actionRoute, SIGNAL(triggered()), task, SIGNAL(route())); 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(); addToolBar(Qt::TopToolBarArea, taskFPGABar); @@ -115,12 +124,14 @@ void MainWindow::createMenu() taskFPGABar->addAction(actionAssignBudget); taskFPGABar->addAction(actionPlace); taskFPGABar->addAction(actionRoute); + taskFPGABar->addAction(actionSaveAsc); menu_Design->addAction(actionLoadPCF); menu_Design->addAction(actionPack); menu_Design->addAction(actionAssignBudget); menu_Design->addAction(actionPlace); menu_Design->addAction(actionRoute); + menu_Design->addAction(actionSaveAsc); actionPlay = new QAction("Play", this); QIcon iconPlay; @@ -169,7 +180,7 @@ void MainWindow::open() 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()) { tabWidget->setCurrentWidget(info); @@ -181,6 +192,16 @@ void MainWindow::open_pcf() bool MainWindow::save() { 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() { actionLoadPCF->setEnabled(false); @@ -188,6 +209,7 @@ void MainWindow::disableActions() actionAssignBudget->setEnabled(false); actionPlace->setEnabled(false); actionRoute->setEnabled(false); + actionSaveAsc->setEnabled(false); actionPlay->setEnabled(false); actionPause->setEnabled(false); @@ -217,6 +239,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) { disableActions(); @@ -253,9 +285,10 @@ void MainWindow::place_finished(bool status) void MainWindow::route_finished(bool status) { disableActions(); - if (status) + if (status) { log("Routing design successful.\n"); - else + actionSaveAsc->setEnabled(true); + } else log("Routing design failed.\n"); } diff --git a/gui/ice40/mainwindow.h b/gui/ice40/mainwindow.h index 66814d32..1e20f892 100644 --- a/gui/ice40/mainwindow.h +++ b/gui/ice40/mainwindow.h @@ -43,9 +43,11 @@ class MainWindow : public BaseMainWindow void open_pcf(); void budget(); void place(); + void save_asc(); void loadfile_finished(bool status); void loadpcf_finished(bool status); + void saveasc_finished(bool status); void pack_finished(bool status); void budget_finish(bool status); void place_finished(bool status); @@ -64,6 +66,7 @@ class MainWindow : public BaseMainWindow QAction *actionAssignBudget; QAction *actionPlace; QAction *actionRoute; + QAction *actionSaveAsc; QAction *actionPlay; QAction *actionPause; QAction *actionStop; diff --git a/gui/ice40/nextpnr.qrc b/gui/ice40/nextpnr.qrc index 4a73d791..40966dba 100644 --- a/gui/ice40/nextpnr.qrc +++ b/gui/ice40/nextpnr.qrc @@ -8,5 +8,6 @@ resources/route.png resources/time_add.png resources/open_pcf.png + resources/save_asc.png diff --git a/gui/ice40/resources/save_asc.png b/gui/ice40/resources/save_asc.png new file mode 100644 index 00000000..15b59ca1 Binary files /dev/null and b/gui/ice40/resources/save_asc.png differ diff --git a/gui/ice40/worker.cc b/gui/ice40/worker.cc index 9986ff3b..f6d6d261 100644 --- a/gui/ice40/worker.cc +++ b/gui/ice40/worker.cc @@ -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() { 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::loadpcf, worker, &Worker::loadpcf); + connect(this, &TaskManager::saveasc, worker, &Worker::saveasc); connect(this, &TaskManager::pack, worker, &Worker::pack); connect(this, &TaskManager::budget, worker, &Worker::budget); 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::loadfile_finished, this, &TaskManager::loadfile_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::budget_finish, this, &TaskManager::budget_finish); connect(worker, &Worker::place_finished, this, &TaskManager::place_finished); diff --git a/gui/ice40/worker.h b/gui/ice40/worker.h index 2995a851..18f4b2c2 100644 --- a/gui/ice40/worker.h +++ b/gui/ice40/worker.h @@ -36,6 +36,7 @@ class Worker : public QObject public Q_SLOTS: void loadfile(const std::string &); void loadpcf(const std::string &); + void saveasc(const std::string &); void pack(); void budget(double freq); void place(bool timing_driven); @@ -44,6 +45,7 @@ class Worker : public QObject void log(const std::string &text); void loadfile_finished(bool status); void loadpcf_finished(bool status); + void saveasc_finished(bool status); void pack_finished(bool status); void budget_finish(bool status); void place_finished(bool status); @@ -76,6 +78,7 @@ class TaskManager : public QObject void terminate(); void loadfile(const std::string &); void loadpcf(const std::string &); + void saveasc(const std::string &); void pack(); void budget(double freq); void place(bool timing_driven); @@ -85,6 +88,7 @@ class TaskManager : public QObject void log(const std::string &text); void loadfile_finished(bool status); void loadpcf_finished(bool status); + void saveasc_finished(bool status); void pack_finished(bool status); void budget_finish(bool status); void place_finished(bool status); -- cgit v1.2.3