From e68ca65e9e0a1675a13e607a99f318ce5958c7e9 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Fri, 3 Aug 2018 18:23:40 +0200 Subject: Unify interfaces for gui --- ecp5/arch.h | 2 +- ecp5/main.cc | 2 +- generic/arch.cc | 2 +- generic/main.cc | 5 +++-- gui/ecp5/mainwindow.cc | 10 +++++++++- gui/ecp5/mainwindow.h | 6 +++++- gui/generic/mainwindow.cc | 10 +++++++++- gui/generic/mainwindow.h | 6 +++++- 8 files changed, 34 insertions(+), 9 deletions(-) diff --git a/ecp5/arch.h b/ecp5/arch.h index cd103b12..38ca7f6b 100644 --- a/ecp5/arch.h +++ b/ecp5/arch.h @@ -384,7 +384,7 @@ struct PipRange struct ArchArgs { - enum + enum ArchArgsType { NONE, LFE5U_25F, diff --git a/ecp5/main.cc b/ecp5/main.cc index f40a5e61..805c0d26 100644 --- a/ecp5/main.cc +++ b/ecp5/main.cc @@ -148,7 +148,7 @@ int main(int argc, char *argv[]) #ifndef NO_GUI if (vm.count("gui")) { Application a(argc, argv); - MainWindow w(std::move(ctx)); + MainWindow w(std::move(ctx),args); w.show(); return a.exec(); diff --git a/generic/arch.cc b/generic/arch.cc index 1c22dbf7..ce15a689 100644 --- a/generic/arch.cc +++ b/generic/arch.cc @@ -175,7 +175,7 @@ void Arch::setGroupDecal(GroupId group, DecalXY decalxy) // --------------------------------------------------------------- -Arch::Arch(ArchArgs) {} +Arch::Arch(ArchArgs) : chipName("generic") {} void IdString::initialize_arch(const BaseCtx *ctx) {} diff --git a/generic/main.cc b/generic/main.cc index 3b8b3fe6..8653da01 100644 --- a/generic/main.cc +++ b/generic/main.cc @@ -90,7 +90,8 @@ int main(int argc, char *argv[]) return 1; } - std::unique_ptr ctx = std::unique_ptr(new Context(ArchArgs{})); + ArchArgs chipArgs{}; + std::unique_ptr ctx = std::unique_ptr(new Context(chipArgs)); if (vm.count("verbose")) { ctx->verbose = true; @@ -107,7 +108,7 @@ int main(int argc, char *argv[]) #ifndef NO_GUI if (vm.count("gui")) { Application a(argc, argv); - MainWindow w(std::move(ctx)); + MainWindow w(std::move(ctx), chipArgs); w.show(); return a.exec(); diff --git a/gui/ecp5/mainwindow.cc b/gui/ecp5/mainwindow.cc index 935daefd..0a33ee2b 100644 --- a/gui/ecp5/mainwindow.cc +++ b/gui/ecp5/mainwindow.cc @@ -23,19 +23,27 @@ static void initMainResource() { Q_INIT_RESOURCE(nextpnr); } NEXTPNR_NAMESPACE_BEGIN -MainWindow::MainWindow(std::unique_ptr context, QWidget *parent) : BaseMainWindow(std::move(context), parent) +MainWindow::MainWindow(std::unique_ptr context, ArchArgs args, QWidget *parent) : BaseMainWindow(std::move(context), parent), chipArgs(args) { initMainResource(); std::string title = "nextpnr-ecp5 - [EMPTY]"; setWindowTitle(title.c_str()); + connect(this, &BaseMainWindow::contextChanged, this, &MainWindow::newContext); + createMenu(); Q_EMIT contextChanged(ctx.get()); } MainWindow::~MainWindow() {} +void MainWindow::newContext(Context *ctx) +{ + std::string title = "nextpnr-generic - " + ctx->getChipName() + " ( " + chipArgs.package + " )"; + setWindowTitle(title.c_str()); +} + void MainWindow::createMenu() {} void MainWindow::new_proj() {} diff --git a/gui/ecp5/mainwindow.h b/gui/ecp5/mainwindow.h index e97bb4e7..8421b52a 100644 --- a/gui/ecp5/mainwindow.h +++ b/gui/ecp5/mainwindow.h @@ -29,7 +29,7 @@ class MainWindow : public BaseMainWindow Q_OBJECT public: - explicit MainWindow(std::unique_ptr context, QWidget *parent = 0); + explicit MainWindow(std::unique_ptr context, ArchArgs args, QWidget *parent = 0); virtual ~MainWindow(); public: @@ -39,6 +39,10 @@ class MainWindow : public BaseMainWindow virtual void new_proj(); virtual void open_proj(); virtual bool save_proj(); + void newContext(Context *ctx); + +private: + ArchArgs chipArgs; }; NEXTPNR_NAMESPACE_END diff --git a/gui/generic/mainwindow.cc b/gui/generic/mainwindow.cc index 70ee600d..353668b9 100644 --- a/gui/generic/mainwindow.cc +++ b/gui/generic/mainwindow.cc @@ -23,19 +23,27 @@ static void initMainResource() { Q_INIT_RESOURCE(nextpnr); } NEXTPNR_NAMESPACE_BEGIN -MainWindow::MainWindow(std::unique_ptr context, QWidget *parent) : BaseMainWindow(std::move(context), parent) +MainWindow::MainWindow(std::unique_ptr context, ArchArgs args, QWidget *parent) : BaseMainWindow(std::move(context), parent), chipArgs(args) { initMainResource(); std::string title = "nextpnr-generic - [EMPTY]"; setWindowTitle(title.c_str()); + connect(this, &BaseMainWindow::contextChanged, this, &MainWindow::newContext); + createMenu(); Q_EMIT contextChanged(ctx.get()); } MainWindow::~MainWindow() {} +void MainWindow::newContext(Context *ctx) +{ + std::string title = "nextpnr-generic - " + ctx->getChipName(); + setWindowTitle(title.c_str()); +} + void MainWindow::createMenu() {} void MainWindow::new_proj() {} diff --git a/gui/generic/mainwindow.h b/gui/generic/mainwindow.h index e97bb4e7..fd7cb7d2 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, QWidget *parent = 0); + explicit MainWindow(std::unique_ptr context, ArchArgs args, QWidget *parent = 0); virtual ~MainWindow(); public: @@ -39,6 +39,10 @@ class MainWindow : public BaseMainWindow virtual void new_proj(); virtual void open_proj(); virtual bool save_proj(); + void newContext(Context *ctx); + +private: + ArchArgs chipArgs; }; NEXTPNR_NAMESPACE_END -- cgit v1.2.3 From 17f461ed4f8dcfe33369ed8f6886c6c42dc4c2b6 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 4 Aug 2018 11:21:38 +0200 Subject: add write bitstream --- gui/ecp5/mainwindow.cc | 62 ++++++++++++++++++++++++++++++++++++- gui/ecp5/mainwindow.h | 13 +++++++- gui/ecp5/nextpnr.qrc | 4 +++ gui/ecp5/resources/open_base.png | Bin 0 -> 2022 bytes gui/ecp5/resources/save_config.png | Bin 0 -> 1428 bytes 5 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 gui/ecp5/resources/open_base.png create mode 100644 gui/ecp5/resources/save_config.png diff --git a/gui/ecp5/mainwindow.cc b/gui/ecp5/mainwindow.cc index 0a33ee2b..2c561230 100644 --- a/gui/ecp5/mainwindow.cc +++ b/gui/ecp5/mainwindow.cc @@ -18,6 +18,10 @@ */ #include "mainwindow.h" +#include "bitstream.h" +#include "log.h" + +#include static void initMainResource() { Q_INIT_RESOURCE(nextpnr); } @@ -44,7 +48,29 @@ void MainWindow::newContext(Context *ctx) setWindowTitle(title.c_str()); } -void MainWindow::createMenu() {} +void MainWindow::createMenu() { + // Add arch specific actions + 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"); + actionSaveConfig->setEnabled(false); + connect(actionSaveConfig, &QAction::triggered, this, &MainWindow::save_config); + + // Add actions in menus + mainActionBar->addSeparator(); + mainActionBar->addAction(actionLoadBase); + mainActionBar->addAction(actionSaveConfig); + + menuDesign->addSeparator(); + menuDesign->addAction(actionLoadBase); + menuDesign->addAction(actionSaveConfig); +} void MainWindow::new_proj() {} @@ -52,4 +78,38 @@ void MainWindow::open_proj() {} bool MainWindow::save_proj() { return false; } +void MainWindow::load_base_config(std::string filename) +{ + disableActions(); + currentBaseConfig = filename; + actionSaveConfig->setEnabled(true); +} + +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()); + log("Saving Bitstream successful.\n"); + } +} + +void MainWindow::onDisableActions() +{ + actionLoadBase->setEnabled(false); + actionSaveConfig->setEnabled(false); +} + +void MainWindow::onRouteFinished() { actionLoadBase->setEnabled(true); } + NEXTPNR_NAMESPACE_END diff --git a/gui/ecp5/mainwindow.h b/gui/ecp5/mainwindow.h index 8421b52a..788eafc9 100644 --- a/gui/ecp5/mainwindow.h +++ b/gui/ecp5/mainwindow.h @@ -34,15 +34,26 @@ class MainWindow : public BaseMainWindow public: void createMenu(); + void load_base_config(std::string filename); + + protected: + void onDisableActions() override; + void onRouteFinished() override; protected Q_SLOTS: virtual void new_proj(); virtual void open_proj(); virtual bool save_proj(); void newContext(Context *ctx); + void open_base(); + void save_config(); + private: + QAction *actionLoadBase; + QAction *actionSaveConfig; -private: ArchArgs chipArgs; + + std::string currentBaseConfig; }; NEXTPNR_NAMESPACE_END diff --git a/gui/ecp5/nextpnr.qrc b/gui/ecp5/nextpnr.qrc index 03585ec0..09f96d74 100644 --- a/gui/ecp5/nextpnr.qrc +++ b/gui/ecp5/nextpnr.qrc @@ -1,2 +1,6 @@ + + resources/open_base.png + resources/save_config.png + diff --git a/gui/ecp5/resources/open_base.png b/gui/ecp5/resources/open_base.png new file mode 100644 index 00000000..d58d226c Binary files /dev/null and b/gui/ecp5/resources/open_base.png differ diff --git a/gui/ecp5/resources/save_config.png b/gui/ecp5/resources/save_config.png new file mode 100644 index 00000000..2ade7128 Binary files /dev/null and b/gui/ecp5/resources/save_config.png differ -- cgit v1.2.3 From beb5f9d4df1685a39a02548147e0c7ada40eae48 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 4 Aug 2018 11:37:41 +0200 Subject: not needed anymore --- gui/ice40/mainwindow.cc | 7 ------- 1 file changed, 7 deletions(-) diff --git a/gui/ice40/mainwindow.cc b/gui/ice40/mainwindow.cc index 2fa2e561..677b3166 100644 --- a/gui/ice40/mainwindow.cc +++ b/gui/ice40/mainwindow.cc @@ -78,18 +78,11 @@ void MainWindow::createMenu() menuDesign->addAction(actionSaveAsc); } -#if defined(_MSC_VER) -void load_chipdb(); -#endif - static const ChipInfoPOD *get_chip_info(const RelPtr *ptr) { return ptr->get(); } QStringList getSupportedPackages(ArchArgs::ArchArgsTypes chip) { QStringList packages; -#if defined(_MSC_VER) - load_chipdb(); -#endif const ChipInfoPOD *chip_info; #ifdef ICE40_HX1K_ONLY if (chip == ArchArgs::HX1K) { -- cgit v1.2.3 From a31c00ed96aee4e43bfafc7165d640a1d1a14a9f Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 4 Aug 2018 11:48:29 +0200 Subject: Chip selection ui for ECP5 --- ecp5/arch.h | 2 +- gui/ecp5/mainwindow.cc | 52 +++++++++++++++++++++++++++++++++++++++++++++++++- gui/ecp5/mainwindow.h | 1 + 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/ecp5/arch.h b/ecp5/arch.h index 38ca7f6b..6daf543d 100644 --- a/ecp5/arch.h +++ b/ecp5/arch.h @@ -384,7 +384,7 @@ struct PipRange struct ArchArgs { - enum ArchArgsType + enum ArchArgsTypes { NONE, LFE5U_25F, diff --git a/gui/ecp5/mainwindow.cc b/gui/ecp5/mainwindow.cc index 2c561230..d16a622f 100644 --- a/gui/ecp5/mainwindow.cc +++ b/gui/ecp5/mainwindow.cc @@ -22,6 +22,8 @@ #include "log.h" #include +#include +#include static void initMainResource() { Q_INIT_RESOURCE(nextpnr); } @@ -72,7 +74,55 @@ void MainWindow::createMenu() { menuDesign->addAction(actionSaveConfig); } -void MainWindow::new_proj() {} +static const ChipInfoPOD *get_chip_info(const RelPtr *ptr) { return ptr->get(); } + +QStringList getSupportedPackages(ArchArgs::ArchArgsTypes chip) +{ + QStringList packages; + const ChipInfoPOD *chip_info; + if (chip == ArchArgs::LFE5U_25F) { + chip_info = get_chip_info(reinterpret_cast *>(chipdb_blob_25k)); + } else if (chip == ArchArgs::LFE5U_45F) { + chip_info = get_chip_info(reinterpret_cast *>(chipdb_blob_45k)); + } else if (chip == ArchArgs::LFE5U_85F) { + chip_info = get_chip_info(reinterpret_cast *>(chipdb_blob_85k)); + } else { + log_error("Unsupported ECP5 chip type.\n"); + } + + for (int i = 0; i < chip_info->num_packages; i++) { + packages << chip_info->package_info[i].name.get(); + } + return packages; +} + + +void MainWindow::new_proj() { + QMap arch; + arch.insert("Lattice ECP5 25K", ArchArgs::LFE5U_25F); + arch.insert("Lattice ECP5 45K", ArchArgs::LFE5U_45F); + arch.insert("Lattice ECP5 85K", ArchArgs::LFE5U_85F); + bool ok; + QString item = QInputDialog::getItem(this, "Select new context", "Chip:", arch.keys(), 0, false, &ok); + if (ok && !item.isEmpty()) { + + chipArgs.type = (ArchArgs::ArchArgsTypes)arch.value(item); + + QString package = QInputDialog::getItem(this, "Select package", "Package:", getSupportedPackages(chipArgs.type), + 0, false, &ok); + + if (ok && !item.isEmpty()) { + currentProj = ""; + currentJson = ""; + disableActions(); + chipArgs.package = package.toStdString().c_str(); + ctx = std::unique_ptr(new Context(chipArgs)); + actionLoadJSON->setEnabled(true); + + Q_EMIT contextChanged(ctx.get()); + } + } +} void MainWindow::open_proj() {} diff --git a/gui/ecp5/mainwindow.h b/gui/ecp5/mainwindow.h index 788eafc9..d1d5a5a2 100644 --- a/gui/ecp5/mainwindow.h +++ b/gui/ecp5/mainwindow.h @@ -53,6 +53,7 @@ class MainWindow : public BaseMainWindow ArchArgs chipArgs; + std::string currentProj; std::string currentBaseConfig; }; -- cgit v1.2.3 From dc4bd1b55fba763792e3e8826a9fee63d486006b Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 4 Aug 2018 11:52:07 +0200 Subject: Move ArchArgs to BaseWindow --- gui/basewindow.cc | 4 ++-- gui/basewindow.h | 3 ++- gui/ecp5/mainwindow.cc | 2 +- gui/generic/mainwindow.cc | 2 +- gui/generic/mainwindow.h | 3 --- gui/ice40/mainwindow.cc | 2 +- gui/ice40/mainwindow.h | 2 -- 7 files changed, 7 insertions(+), 11 deletions(-) diff --git a/gui/basewindow.cc b/gui/basewindow.cc index 37141fd6..53720156 100644 --- a/gui/basewindow.cc +++ b/gui/basewindow.cc @@ -37,8 +37,8 @@ static void initBasenameResource() { Q_INIT_RESOURCE(base); } NEXTPNR_NAMESPACE_BEGIN -BaseMainWindow::BaseMainWindow(std::unique_ptr context, QWidget *parent) - : QMainWindow(parent), ctx(std::move(context)), timing_driven(false) +BaseMainWindow::BaseMainWindow(std::unique_ptr context, ArchArgs args, QWidget *parent) + : QMainWindow(parent), chipArgs(args), ctx(std::move(context)), timing_driven(false) { initBasenameResource(); qRegisterMetaType(); diff --git a/gui/basewindow.h b/gui/basewindow.h index 5cec24c5..341cc8e2 100644 --- a/gui/basewindow.h +++ b/gui/basewindow.h @@ -45,7 +45,7 @@ class BaseMainWindow : public QMainWindow Q_OBJECT public: - explicit BaseMainWindow(std::unique_ptr context, QWidget *parent = 0); + explicit BaseMainWindow(std::unique_ptr context, ArchArgs args, QWidget *parent = 0); virtual ~BaseMainWindow(); Context *getContext() { return ctx.get(); } @@ -88,6 +88,7 @@ class BaseMainWindow : public QMainWindow protected: // state variables + ArchArgs chipArgs; std::unique_ptr ctx; TaskManager *task; bool timing_driven; diff --git a/gui/ecp5/mainwindow.cc b/gui/ecp5/mainwindow.cc index d16a622f..510b0201 100644 --- a/gui/ecp5/mainwindow.cc +++ b/gui/ecp5/mainwindow.cc @@ -29,7 +29,7 @@ static void initMainResource() { Q_INIT_RESOURCE(nextpnr); } NEXTPNR_NAMESPACE_BEGIN -MainWindow::MainWindow(std::unique_ptr context, ArchArgs args, QWidget *parent) : BaseMainWindow(std::move(context), parent), chipArgs(args) +MainWindow::MainWindow(std::unique_ptr context, ArchArgs args, QWidget *parent) : BaseMainWindow(std::move(context), args, parent) { initMainResource(); diff --git a/gui/generic/mainwindow.cc b/gui/generic/mainwindow.cc index 353668b9..050c0fb8 100644 --- a/gui/generic/mainwindow.cc +++ b/gui/generic/mainwindow.cc @@ -23,7 +23,7 @@ static void initMainResource() { Q_INIT_RESOURCE(nextpnr); } NEXTPNR_NAMESPACE_BEGIN -MainWindow::MainWindow(std::unique_ptr context, ArchArgs args, QWidget *parent) : BaseMainWindow(std::move(context), parent), chipArgs(args) +MainWindow::MainWindow(std::unique_ptr context, ArchArgs args, QWidget *parent) : BaseMainWindow(std::move(context), args, parent) { initMainResource(); diff --git a/gui/generic/mainwindow.h b/gui/generic/mainwindow.h index fd7cb7d2..375436b6 100644 --- a/gui/generic/mainwindow.h +++ b/gui/generic/mainwindow.h @@ -40,9 +40,6 @@ class MainWindow : public BaseMainWindow virtual void open_proj(); virtual bool save_proj(); void newContext(Context *ctx); - -private: - ArchArgs chipArgs; }; NEXTPNR_NAMESPACE_END diff --git a/gui/ice40/mainwindow.cc b/gui/ice40/mainwindow.cc index 677b3166..3463e122 100644 --- a/gui/ice40/mainwindow.cc +++ b/gui/ice40/mainwindow.cc @@ -37,7 +37,7 @@ static void initMainResource() { Q_INIT_RESOURCE(nextpnr); } NEXTPNR_NAMESPACE_BEGIN MainWindow::MainWindow(std::unique_ptr context, ArchArgs args, QWidget *parent) - : BaseMainWindow(std::move(context), parent), chipArgs(args) + : BaseMainWindow(std::move(context), args, parent) { initMainResource(); diff --git a/gui/ice40/mainwindow.h b/gui/ice40/mainwindow.h index 230ccc4e..829375e2 100644 --- a/gui/ice40/mainwindow.h +++ b/gui/ice40/mainwindow.h @@ -55,8 +55,6 @@ class MainWindow : public BaseMainWindow QAction *actionLoadPCF; QAction *actionSaveAsc; - ArchArgs chipArgs; - std::string currentProj; std::string currentPCF; }; -- cgit v1.2.3 From 0cb349b60ea17378a4c163f0c8b12e8b17988cee Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 4 Aug 2018 11:54:34 +0200 Subject: Utility calls static --- gui/ecp5/mainwindow.cc | 2 +- gui/ice40/mainwindow.cc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/ecp5/mainwindow.cc b/gui/ecp5/mainwindow.cc index 510b0201..efaad364 100644 --- a/gui/ecp5/mainwindow.cc +++ b/gui/ecp5/mainwindow.cc @@ -76,7 +76,7 @@ void MainWindow::createMenu() { static const ChipInfoPOD *get_chip_info(const RelPtr *ptr) { return ptr->get(); } -QStringList getSupportedPackages(ArchArgs::ArchArgsTypes chip) +static QStringList getSupportedPackages(ArchArgs::ArchArgsTypes chip) { QStringList packages; const ChipInfoPOD *chip_info; diff --git a/gui/ice40/mainwindow.cc b/gui/ice40/mainwindow.cc index 3463e122..40b863e9 100644 --- a/gui/ice40/mainwindow.cc +++ b/gui/ice40/mainwindow.cc @@ -80,7 +80,7 @@ void MainWindow::createMenu() static const ChipInfoPOD *get_chip_info(const RelPtr *ptr) { return ptr->get(); } -QStringList getSupportedPackages(ArchArgs::ArchArgsTypes chip) +static QStringList getSupportedPackages(ArchArgs::ArchArgsTypes chip) { QStringList packages; const ChipInfoPOD *chip_info; -- cgit v1.2.3 From 7d5dba3ad378563869657b4330c178ecd8c24931 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 4 Aug 2018 16:27:33 +0200 Subject: compile fix --- generic/arch.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/generic/arch.cc b/generic/arch.cc index 7c0828e0..a0ab58f8 100644 --- a/generic/arch.cc +++ b/generic/arch.cc @@ -412,7 +412,7 @@ delay_t Arch::getBudgetOverride(const NetInfo *net_info, const PortRef &sink, de // --------------------------------------------------------------- -bool Arch::place() { return placer1(getCtx()\, Placer1Cfg()); } +bool Arch::place() { return placer1(getCtx(), Placer1Cfg()); } bool Arch::route() { return router1(getCtx(), Router1Cfg()); } -- cgit v1.2.3