aboutsummaryrefslogtreecommitdiffstats
path: root/gui
diff options
context:
space:
mode:
Diffstat (limited to 'gui')
-rw-r--r--gui/base.qrc1
-rw-r--r--gui/basewindow.cc156
-rw-r--r--gui/basewindow.h26
-rwxr-xr-xgui/create_img.sh5
-rw-r--r--gui/ecp5/mainwindow.cc46
-rw-r--r--gui/ecp5/mainwindow.h13
-rw-r--r--gui/generic/mainwindow.cc5
-rw-r--r--gui/generic/mainwindow.h2
-rw-r--r--gui/ice40/mainwindow.cc19
-rw-r--r--gui/ice40/mainwindow.h6
-rw-r--r--gui/resources/save_json.pngbin0 -> 1546 bytes
-rw-r--r--gui/worker.cc4
12 files changed, 95 insertions, 188 deletions
diff --git a/gui/base.qrc b/gui/base.qrc
index 644b16a6..85d1432a 100644
--- a/gui/base.qrc
+++ b/gui/base.qrc
@@ -22,6 +22,7 @@
<file>resources/route.png</file>
<file>resources/time_add.png</file>
<file>resources/open_json.png</file>
+ <file>resources/save_json.png</file>
<file>resources/py.png</file>
</qresource>
</RCC>
diff --git a/gui/basewindow.cc b/gui/basewindow.cc
index 346efb88..550a4b93 100644
--- a/gui/basewindow.cc
+++ b/gui/basewindow.cc
@@ -29,17 +29,17 @@
#include "designwidget.h"
#include "fpgaviewwidget.h"
#include "jsonparse.h"
+#include "jsonwrite.h"
#include "log.h"
#include "mainwindow.h"
-#include "project.h"
#include "pythontab.h"
static void initBasenameResource() { Q_INIT_RESOURCE(base); }
NEXTPNR_NAMESPACE_BEGIN
-BaseMainWindow::BaseMainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent)
- : QMainWindow(parent), chipArgs(args), ctx(std::move(context)), timing_driven(false)
+BaseMainWindow::BaseMainWindow(std::unique_ptr<Context> context, CommandHandler *handler, QWidget *parent)
+ : QMainWindow(parent), handler(handler), ctx(std::move(context)), timing_driven(false)
{
initBasenameResource();
qRegisterMetaType<std::string>();
@@ -130,25 +130,6 @@ void BaseMainWindow::writeInfo(std::string text) { console->info(text); }
void BaseMainWindow::createMenusAndBars()
{
// File menu / project toolbar actions
- actionNew = new QAction("New", this);
- actionNew->setIcon(QIcon(":/icons/resources/new.png"));
- actionNew->setShortcuts(QKeySequence::New);
- actionNew->setStatusTip("New project file");
- connect(actionNew, &QAction::triggered, this, &BaseMainWindow::new_proj);
-
- actionOpen = new QAction("Open", this);
- actionOpen->setIcon(QIcon(":/icons/resources/open.png"));
- actionOpen->setShortcuts(QKeySequence::Open);
- actionOpen->setStatusTip("Open an existing project file");
- connect(actionOpen, &QAction::triggered, this, &BaseMainWindow::open_proj);
-
- actionSave = new QAction("Save", this);
- actionSave->setIcon(QIcon(":/icons/resources/save.png"));
- actionSave->setShortcuts(QKeySequence::Save);
- actionSave->setStatusTip("Save existing project to disk");
- actionSave->setEnabled(false);
- connect(actionSave, &QAction::triggered, this, &BaseMainWindow::save_proj);
-
QAction *actionExit = new QAction("Exit", this);
actionExit->setIcon(QIcon(":/icons/resources/exit.png"));
actionExit->setShortcuts(QKeySequence::Quit);
@@ -158,13 +139,26 @@ void BaseMainWindow::createMenusAndBars()
// Help menu actions
QAction *actionAbout = new QAction("About", this);
- // Design menu options
+ // Gile menu options
+ actionNew = new QAction("New", this);
+ actionNew->setIcon(QIcon(":/icons/resources/new.png"));
+ actionNew->setShortcuts(QKeySequence::New);
+ actionNew->setStatusTip("New project");
+ connect(actionNew, &QAction::triggered, this, &BaseMainWindow::new_proj);
+
actionLoadJSON = new QAction("Open JSON", this);
actionLoadJSON->setIcon(QIcon(":/icons/resources/open_json.png"));
actionLoadJSON->setStatusTip("Open an existing JSON file");
actionLoadJSON->setEnabled(true);
connect(actionLoadJSON, &QAction::triggered, this, &BaseMainWindow::open_json);
+ actionSaveJSON = new QAction("Save JSON", this);
+ actionSaveJSON->setIcon(QIcon(":/icons/resources/save_json.png"));
+ actionSaveJSON->setStatusTip("Write to JSON file");
+ actionSaveJSON->setEnabled(true);
+ connect(actionSaveJSON, &QAction::triggered, this, &BaseMainWindow::save_json);
+
+ // Design menu options
actionPack = new QAction("Pack", this);
actionPack->setIcon(QIcon(":/icons/resources/pack.png"));
actionPack->setStatusTip("Pack current design");
@@ -244,13 +238,12 @@ void BaseMainWindow::createMenusAndBars()
// Add File menu actions
menuFile->addAction(actionNew);
- menuFile->addAction(actionOpen);
- menuFile->addAction(actionSave);
+ menuFile->addAction(actionLoadJSON);
+ menuFile->addAction(actionSaveJSON);
menuFile->addSeparator();
menuFile->addAction(actionExit);
// Add Design menu actions
- menuDesign->addAction(actionLoadJSON);
menuDesign->addAction(actionPack);
menuDesign->addAction(actionAssignBudget);
menuDesign->addAction(actionPlace);
@@ -261,17 +254,13 @@ void BaseMainWindow::createMenusAndBars()
// Add Help menu actions
menuHelp->addAction(actionAbout);
- // Project toolbar
- QToolBar *projectToolBar = new QToolBar("Project");
- addToolBar(Qt::TopToolBarArea, projectToolBar);
- projectToolBar->addAction(actionNew);
- projectToolBar->addAction(actionOpen);
- projectToolBar->addAction(actionSave);
-
// Main action bar
mainActionBar = new QToolBar("Main");
addToolBar(Qt::TopToolBarArea, mainActionBar);
+ mainActionBar->addAction(actionNew);
mainActionBar->addAction(actionLoadJSON);
+ mainActionBar->addAction(actionSaveJSON);
+ mainActionBar->addSeparator();
mainActionBar->addAction(actionPack);
mainActionBar->addAction(actionAssignBudget);
mainActionBar->addAction(actionPlace);
@@ -304,25 +293,29 @@ void BaseMainWindow::createMenusAndBars()
setStatusBar(statusBar);
}
-void BaseMainWindow::load_json(std::string filename)
+void BaseMainWindow::open_json()
{
- disableActions();
- std::ifstream f(filename);
- if (parse_json_file(f, filename, ctx.get())) {
- log("Loading design successful.\n");
+ QString fileName = QFileDialog::getOpenFileName(this, QString("Open JSON"), QString(), QString("*.json"));
+ if (!fileName.isEmpty()) {
+ disableActions();
+ ctx = handler->load_json(fileName.toStdString());
+ Q_EMIT contextChanged(ctx.get());
Q_EMIT updateTreeView();
- updateLoaded();
- } else {
- actionLoadJSON->setEnabled(true);
- log("Loading design failed.\n");
+ log("Loading design successful.\n");
+ updateActions();
}
}
-void BaseMainWindow::open_json()
+void BaseMainWindow::save_json()
{
- QString fileName = QFileDialog::getOpenFileName(this, QString("Open JSON"), QString(), QString("*.json"));
+ QString fileName = QFileDialog::getSaveFileName(this, QString("Save JSON"), QString(), QString("*.json"));
if (!fileName.isEmpty()) {
- load_json(fileName.toStdString());
+ std::string fn = fileName.toStdString();
+ std::ofstream f(fn);
+ if (write_json_file(f, fn, ctx.get()))
+ log("Saving JSON successful.\n");
+ else
+ log("Saving JSON failed.\n");
}
}
@@ -332,9 +325,7 @@ void BaseMainWindow::pack_finished(bool status)
if (status) {
log("Packing design successful.\n");
Q_EMIT updateTreeView();
- actionPlace->setEnabled(true);
- actionAssignBudget->setEnabled(true);
- onPackFinished();
+ updateActions();
} else {
log("Packing design failed.\n");
}
@@ -345,8 +336,7 @@ void BaseMainWindow::budget_finish(bool status)
disableActions();
if (status) {
log("Assigning timing budget successful.\n");
- actionPlace->setEnabled(true);
- onBudgetFinished();
+ updateActions();
} else {
log("Assigning timing budget failed.\n");
}
@@ -358,8 +348,7 @@ void BaseMainWindow::place_finished(bool status)
if (status) {
log("Placing design successful.\n");
Q_EMIT updateTreeView();
- actionRoute->setEnabled(true);
- onPlaceFinished();
+ updateActions();
} else {
log("Placing design failed.\n");
}
@@ -370,7 +359,7 @@ void BaseMainWindow::route_finished(bool status)
if (status) {
log("Routing design successful.\n");
Q_EMIT updateTreeView();
- onRouteFinished();
+ updateActions();
} else
log("Routing design failed.\n");
}
@@ -386,9 +375,6 @@ void BaseMainWindow::taskStarted()
disableActions();
actionPause->setEnabled(true);
actionStop->setEnabled(true);
-
- actionNew->setEnabled(false);
- actionOpen->setEnabled(false);
}
void BaseMainWindow::taskPaused()
@@ -396,9 +382,6 @@ void BaseMainWindow::taskPaused()
disableActions();
actionPlay->setEnabled(true);
actionStop->setEnabled(true);
-
- actionNew->setEnabled(false);
- actionOpen->setEnabled(false);
}
void BaseMainWindow::budget()
@@ -416,52 +399,32 @@ void BaseMainWindow::place() { Q_EMIT task->place(timing_driven); }
void BaseMainWindow::disableActions()
{
- actionLoadJSON->setEnabled(false);
+ actionLoadJSON->setEnabled(true);
actionPack->setEnabled(false);
actionAssignBudget->setEnabled(false);
actionPlace->setEnabled(false);
actionRoute->setEnabled(false);
+
actionExecutePy->setEnabled(true);
actionPlay->setEnabled(false);
actionPause->setEnabled(false);
actionStop->setEnabled(false);
- actionNew->setEnabled(true);
- actionOpen->setEnabled(true);
-
- if (ctx->settings.find(ctx->id("input/json")) != ctx->settings.end())
- actionSave->setEnabled(true);
- else
- actionSave->setEnabled(false);
-
onDisableActions();
}
-void BaseMainWindow::updateLoaded()
-{
- disableActions();
- actionPack->setEnabled(true);
- onJsonLoaded();
- onProjectLoaded();
-}
-
-void BaseMainWindow::projectLoad(std::string filename)
+void BaseMainWindow::updateActions()
{
- ProjectHandler proj;
- disableActions();
- ctx = proj.load(filename);
- Q_EMIT contextChanged(ctx.get());
- log_info("Loaded project %s...\n", filename.c_str());
- updateLoaded();
-}
+ if (ctx->settings.find(ctx->id("pack")) == ctx->settings.end())
+ actionPack->setEnabled(true);
+ else if (ctx->settings.find(ctx->id("place")) == ctx->settings.end()) {
+ actionAssignBudget->setEnabled(true);
+ actionPlace->setEnabled(true);
+ } else if (ctx->settings.find(ctx->id("route")) == ctx->settings.end())
+ actionRoute->setEnabled(true);
-void BaseMainWindow::open_proj()
-{
- QString fileName = QFileDialog::getOpenFileName(this, QString("Open Project"), QString(), QString("*.proj"));
- if (!fileName.isEmpty()) {
- projectLoad(fileName.toStdString());
- }
+ onUpdateActions();
}
void BaseMainWindow::execute_python()
@@ -473,18 +436,5 @@ void BaseMainWindow::execute_python()
}
void BaseMainWindow::notifyChangeContext() { Q_EMIT contextChanged(ctx.get()); }
-void BaseMainWindow::save_proj()
-{
- if (currentProj.empty()) {
- QString fileName = QFileDialog::getSaveFileName(this, QString("Save Project"), QString(), QString("*.proj"));
- if (fileName.isEmpty())
- return;
- currentProj = fileName.toStdString();
- }
- if (!currentProj.empty()) {
- ProjectHandler proj;
- proj.save(ctx.get(), currentProj);
- }
-}
NEXTPNR_NAMESPACE_END
diff --git a/gui/basewindow.h b/gui/basewindow.h
index 0b2d3fbc..305cb6c9 100644
--- a/gui/basewindow.h
+++ b/gui/basewindow.h
@@ -20,6 +20,7 @@
#ifndef BASEMAINWINDOW_H
#define BASEMAINWINDOW_H
+#include "command.h"
#include "nextpnr.h"
#include "worker.h"
@@ -45,25 +46,19 @@ class BaseMainWindow : public QMainWindow
Q_OBJECT
public:
- explicit BaseMainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent = 0);
+ explicit BaseMainWindow(std::unique_ptr<Context> context, CommandHandler *handler, QWidget *parent = 0);
virtual ~BaseMainWindow();
Context *getContext() { return ctx.get(); }
- void updateLoaded();
- void projectLoad(std::string filename);
+ void updateActions();
+
void notifyChangeContext();
protected:
void createMenusAndBars();
void disableActions();
- void load_json(std::string filename);
virtual void onDisableActions(){};
- virtual void onJsonLoaded(){};
- virtual void onProjectLoaded(){};
- virtual void onPackFinished(){};
- virtual void onBudgetFinished(){};
- virtual void onPlaceFinished(){};
- virtual void onRouteFinished(){};
+ virtual void onUpdateActions(){};
protected Q_SLOTS:
void writeInfo(std::string text);
@@ -71,10 +66,8 @@ class BaseMainWindow : public QMainWindow
virtual void new_proj() = 0;
- void open_proj();
- void save_proj();
-
void open_json();
+ void save_json();
void budget();
void place();
@@ -95,7 +88,7 @@ class BaseMainWindow : public QMainWindow
protected:
// state variables
- ArchArgs chipArgs;
+ CommandHandler *handler;
std::unique_ptr<Context> ctx;
TaskManager *task;
bool timing_driven;
@@ -116,10 +109,9 @@ class BaseMainWindow : public QMainWindow
QProgressBar *progressBar;
QAction *actionNew;
- QAction *actionOpen;
- QAction *actionSave;
-
QAction *actionLoadJSON;
+ QAction *actionSaveJSON;
+
QAction *actionPack;
QAction *actionAssignBudget;
QAction *actionPlace;
diff --git a/gui/create_img.sh b/gui/create_img.sh
index 1508d023..2e7b1f87 100755
--- a/gui/create_img.sh
+++ b/gui/create_img.sh
@@ -2,5 +2,6 @@ convert -font helvetica -fill red -pointsize 8 -gravity center -draw "text 2,8 '
convert -font helvetica -fill red -pointsize 8 -gravity center -draw "text 2,8 'PCF'" resources/open.png ice40/resources/open_pcf.png
convert -font helvetica -fill red -pointsize 8 -gravity center -draw "text 2,8 'BASE'" resources/open.png ecp5/resources/open_base.png
convert -font helvetica -fill red -pointsize 8 -gravity center -draw "text 2,8 'LPF'" resources/open.png ecp5/resources/open_lpf.png
-convert -font helvetica -fill red -pointsize 8 -gravity center -draw "text 2,8 'ASC'" resources/save.png ice40/resources/save_asc.png
-convert -font helvetica -fill red -pointsize 7 -gravity center -draw "text 2,8 'CONFIG'" resources/save.png ecp5/resources/save_config.png \ No newline at end of file
+convert -font helvetica -fill red -pointsize 8 -gravity center -draw "text 2,8 'ASC'" resources/save.png ice40/resources/save_asc.png
+convert -font helvetica -fill red -pointsize 7 -gravity center -draw "text 2,8 'CONFIG'" resources/save.png ecp5/resources/save_config.png
+convert -font helvetica -fill red -pointsize 8 -gravity center -draw "text 2,8 'JSON'" resources/save.png resources/save_json.png
diff --git a/gui/ecp5/mainwindow.cc b/gui/ecp5/mainwindow.cc
index c6c7bc97..880af047 100644
--- a/gui/ecp5/mainwindow.cc
+++ b/gui/ecp5/mainwindow.cc
@@ -30,8 +30,8 @@ static void initMainResource() { Q_INIT_RESOURCE(nextpnr); }
NEXTPNR_NAMESPACE_BEGIN
-MainWindow::MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent)
- : BaseMainWindow(std::move(context), args, parent)
+MainWindow::MainWindow(std::unique_ptr<Context> context, CommandHandler *handler, QWidget *parent)
+ : BaseMainWindow(std::move(context), handler, parent)
{
initMainResource();
@@ -47,7 +47,7 @@ MainWindow::~MainWindow() {}
void MainWindow::newContext(Context *ctx)
{
- std::string title = "nextpnr-generic - " + ctx->getChipName() + " ( " + chipArgs.package + " )";
+ std::string title = "nextpnr-ecp5 - " + ctx->getChipName() + " ( " + ctx->archArgs().package + " )";
setWindowTitle(title.c_str());
}
@@ -60,12 +60,6 @@ void MainWindow::createMenu()
actionLoadLPF->setEnabled(false);
connect(actionLoadLPF, &QAction::triggered, this, &MainWindow::open_lpf);
- actionLoadBase = new QAction("Open Base Config", this);
- actionLoadBase->setIcon(QIcon(":/icons/resources/open_base.png"));
- actionLoadBase->setStatusTip("Open Base Config file");
- actionLoadBase->setEnabled(false);
- connect(actionLoadBase, &QAction::triggered, this, &MainWindow::open_base);
-
actionSaveConfig = new QAction("Save Bitstream", this);
actionSaveConfig->setIcon(QIcon(":/icons/resources/save_config.png"));
actionSaveConfig->setStatusTip("Save Bitstream config file");
@@ -75,12 +69,10 @@ void MainWindow::createMenu()
// Add actions in menus
mainActionBar->addSeparator();
mainActionBar->addAction(actionLoadLPF);
- mainActionBar->addAction(actionLoadBase);
mainActionBar->addAction(actionSaveConfig);
menuDesign->addSeparator();
menuDesign->addAction(actionLoadLPF);
- menuDesign->addAction(actionLoadBase);
menuDesign->addAction(actionSaveConfig);
}
@@ -121,7 +113,7 @@ void MainWindow::new_proj()
bool ok;
QString item = QInputDialog::getItem(this, "Select new context", "Chip:", arch.keys(), 0, false, &ok);
if (ok && !item.isEmpty()) {
-
+ ArchArgs chipArgs;
chipArgs.type = (ArchArgs::ArchArgsTypes)arch.value(item);
QString package = QInputDialog::getItem(this, "Select package", "Package:", getSupportedPackages(chipArgs.type),
@@ -139,13 +131,6 @@ void MainWindow::new_proj()
}
}
-void MainWindow::load_base_config(std::string filename)
-{
- disableActions();
- currentBaseConfig = filename;
- actionSaveConfig->setEnabled(true);
-}
-
void MainWindow::open_lpf()
{
QString fileName = QFileDialog::getOpenFileName(this, QString("Open LPF"), QString(), QString("*.lpf"));
@@ -162,21 +147,13 @@ void MainWindow::open_lpf()
}
}
-void MainWindow::open_base()
-{
- QString fileName = QFileDialog::getOpenFileName(this, QString("Open Base Config"), QString(), QString("*.config"));
- if (!fileName.isEmpty()) {
- load_base_config(fileName.toStdString());
- }
-}
-
void MainWindow::save_config()
{
QString fileName = QFileDialog::getSaveFileName(this, QString("Save Bitstream"), QString(), QString("*.config"));
if (!fileName.isEmpty()) {
std::string fn = fileName.toStdString();
disableActions();
- write_bitstream(ctx.get(), currentBaseConfig, fileName.toStdString());
+ write_bitstream(ctx.get(), "", fileName.toStdString());
log("Saving Bitstream successful.\n");
}
}
@@ -184,18 +161,15 @@ void MainWindow::save_config()
void MainWindow::onDisableActions()
{
actionLoadLPF->setEnabled(false);
- actionLoadBase->setEnabled(false);
actionSaveConfig->setEnabled(false);
}
-void MainWindow::onJsonLoaded() { actionLoadLPF->setEnabled(true); }
-
-void MainWindow::onRouteFinished() { actionLoadBase->setEnabled(true); }
-
-void MainWindow::onProjectLoaded()
+void MainWindow::onUpdateActions()
{
- if (ctx->settings.find(ctx->id("input/lpf")) != ctx->settings.end())
- actionLoadLPF->setEnabled(false);
+ if (ctx->settings.find(ctx->id("pack")) == ctx->settings.end())
+ actionLoadLPF->setEnabled(true);
+ if (ctx->settings.find(ctx->id("route")) != ctx->settings.end())
+ actionSaveConfig->setEnabled(true);
}
NEXTPNR_NAMESPACE_END
diff --git a/gui/ecp5/mainwindow.h b/gui/ecp5/mainwindow.h
index 721c6c0b..e60fc5b0 100644
--- a/gui/ecp5/mainwindow.h
+++ b/gui/ecp5/mainwindow.h
@@ -29,34 +29,25 @@ class MainWindow : public BaseMainWindow
Q_OBJECT
public:
- explicit MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent = 0);
+ explicit MainWindow(std::unique_ptr<Context> context, CommandHandler *handler, QWidget *parent = 0);
virtual ~MainWindow();
public:
void createMenu();
- void load_base_config(std::string filename);
protected:
void onDisableActions() override;
- void onJsonLoaded() override;
- void onRouteFinished() override;
- void onProjectLoaded() override;
+ void onUpdateActions() override;
protected Q_SLOTS:
void new_proj() override;
void newContext(Context *ctx);
void open_lpf();
- void open_base();
void save_config();
private:
QAction *actionLoadLPF;
- QAction *actionLoadBase;
QAction *actionSaveConfig;
-
- ArchArgs chipArgs;
-
- std::string currentBaseConfig;
};
NEXTPNR_NAMESPACE_END
diff --git a/gui/generic/mainwindow.cc b/gui/generic/mainwindow.cc
index 54d1f2c8..f616ca1a 100644
--- a/gui/generic/mainwindow.cc
+++ b/gui/generic/mainwindow.cc
@@ -26,9 +26,10 @@ static void initMainResource() { Q_INIT_RESOURCE(nextpnr); }
NEXTPNR_NAMESPACE_BEGIN
-MainWindow::MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent)
- : BaseMainWindow(std::move(context), args, parent)
+MainWindow::MainWindow(std::unique_ptr<Context> context, CommandHandler *handler, QWidget *parent)
+ : BaseMainWindow(std::move(context), handler, parent)
{
+ initMainResource();
QMessageBox::critical(0, "Error - FIXME", "No GUI support for nextpnr-generic");
std::exit(1);
}
diff --git a/gui/generic/mainwindow.h b/gui/generic/mainwindow.h
index bb6a4cf1..4d1cf598 100644
--- a/gui/generic/mainwindow.h
+++ b/gui/generic/mainwindow.h
@@ -29,7 +29,7 @@ class MainWindow : public BaseMainWindow
Q_OBJECT
public:
- explicit MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent = 0);
+ explicit MainWindow(std::unique_ptr<Context> context, CommandHandler *handler, QWidget *parent = 0);
virtual ~MainWindow();
public:
diff --git a/gui/ice40/mainwindow.cc b/gui/ice40/mainwindow.cc
index f270b112..ccff2117 100644
--- a/gui/ice40/mainwindow.cc
+++ b/gui/ice40/mainwindow.cc
@@ -35,8 +35,8 @@ static void initMainResource() { Q_INIT_RESOURCE(nextpnr); }
NEXTPNR_NAMESPACE_BEGIN
-MainWindow::MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent)
- : BaseMainWindow(std::move(context), args, parent)
+MainWindow::MainWindow(std::unique_ptr<Context> context, CommandHandler *handler, QWidget *parent)
+ : BaseMainWindow(std::move(context), handler, parent)
{
initMainResource();
@@ -123,7 +123,7 @@ void MainWindow::new_proj()
bool ok;
QString item = QInputDialog::getItem(this, "Select new context", "Chip:", arch.keys(), 0, false, &ok);
if (ok && !item.isEmpty()) {
-
+ ArchArgs chipArgs;
chipArgs.type = (ArchArgs::ArchArgsTypes)arch.value(item);
QString package = QInputDialog::getItem(this, "Select package", "Package:", getSupportedPackages(chipArgs.type),
@@ -156,7 +156,7 @@ void MainWindow::load_pcf(std::string filename)
void MainWindow::newContext(Context *ctx)
{
- std::string title = "nextpnr-ice40 - " + ctx->getChipName() + " ( " + chipArgs.package + " )";
+ std::string title = "nextpnr-ice40 - " + ctx->getChipName() + " ( " + ctx->archArgs().package + " )";
setWindowTitle(title.c_str());
}
@@ -186,13 +186,12 @@ void MainWindow::onDisableActions()
actionSaveAsc->setEnabled(false);
}
-void MainWindow::onJsonLoaded() { actionLoadPCF->setEnabled(true); }
-void MainWindow::onRouteFinished() { actionSaveAsc->setEnabled(true); }
-
-void MainWindow::onProjectLoaded()
+void MainWindow::onUpdateActions()
{
- if (ctx->settings.find(ctx->id("input/pcf")) != ctx->settings.end())
- actionLoadPCF->setEnabled(false);
+ if (ctx->settings.find(ctx->id("pack")) == ctx->settings.end())
+ actionLoadPCF->setEnabled(true);
+ if (ctx->settings.find(ctx->id("route")) != ctx->settings.end())
+ actionSaveAsc->setEnabled(true);
}
NEXTPNR_NAMESPACE_END
diff --git a/gui/ice40/mainwindow.h b/gui/ice40/mainwindow.h
index 4a9a7d8e..6e725a16 100644
--- a/gui/ice40/mainwindow.h
+++ b/gui/ice40/mainwindow.h
@@ -29,7 +29,7 @@ class MainWindow : public BaseMainWindow
Q_OBJECT
public:
- explicit MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent = 0);
+ explicit MainWindow(std::unique_ptr<Context> context, CommandHandler *handler, QWidget *parent = 0);
virtual ~MainWindow();
public:
@@ -39,9 +39,7 @@ class MainWindow : public BaseMainWindow
void load_pcf(std::string filename);
void onDisableActions() override;
- void onJsonLoaded() override;
- void onRouteFinished() override;
- void onProjectLoaded() override;
+ void onUpdateActions() override;
protected Q_SLOTS:
void new_proj() override;
diff --git a/gui/resources/save_json.png b/gui/resources/save_json.png
new file mode 100644
index 00000000..cbeb3243
--- /dev/null
+++ b/gui/resources/save_json.png
Binary files differ
diff --git a/gui/worker.cc b/gui/worker.cc
index 900883d4..bd14771b 100644
--- a/gui/worker.cc
+++ b/gui/worker.cc
@@ -68,7 +68,7 @@ void Worker::budget(double freq)
{
Q_EMIT taskStarted();
try {
- ctx->target_freq = freq;
+ ctx->settings[ctx->id("target_freq")] = std::to_string(freq);
assign_budget(ctx);
Q_EMIT budget_finish(true);
} catch (WorkerInterruptionRequested) {
@@ -80,7 +80,7 @@ void Worker::place(bool timing_driven)
{
Q_EMIT taskStarted();
try {
- ctx->timing_driven = timing_driven;
+ ctx->settings[ctx->id("timing_driven")] = std::to_string(timing_driven);
Q_EMIT place_finished(ctx->place());
} catch (WorkerInterruptionRequested) {
Q_EMIT taskCanceled();