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 --- gui/ecp5/mainwindow.cc | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'gui/ecp5/mainwindow.cc') 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() {} -- 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 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 61 insertions(+), 1 deletion(-) (limited to 'gui/ecp5/mainwindow.cc') 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 -- 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 --- gui/ecp5/mainwindow.cc | 52 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 51 insertions(+), 1 deletion(-) (limited to 'gui/ecp5/mainwindow.cc') 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() {} -- 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/ecp5/mainwindow.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gui/ecp5/mainwindow.cc') 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(); -- 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 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'gui/ecp5/mainwindow.cc') 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; -- cgit v1.2.3