From a0e79c993fd4b6886d997a814582c1b64c929355 Mon Sep 17 00:00:00 2001
From: Miodrag Milanovic <mmicko@gmail.com>
Date: Sat, 3 Nov 2018 09:39:43 +0100
Subject: Added LPF support and all chip models  available for select

---
 gui/ecp5/mainwindow.cc          |  51 +++++++++++++++++++++++++++++++++++-----
 gui/ecp5/mainwindow.h           |   4 ++++
 gui/ecp5/nextpnr.qrc            |   1 +
 gui/ecp5/resources/open_lpf.png | Bin 0 -> 1928 bytes
 4 files changed, 50 insertions(+), 6 deletions(-)
 create mode 100644 gui/ecp5/resources/open_lpf.png

diff --git a/gui/ecp5/mainwindow.cc b/gui/ecp5/mainwindow.cc
index b3c53849..aa2911ea 100644
--- a/gui/ecp5/mainwindow.cc
+++ b/gui/ecp5/mainwindow.cc
@@ -20,6 +20,7 @@
 #include "mainwindow.h"
 #include "bitstream.h"
 #include "log.h"
+#include <fstream>
 
 #include <QFileDialog>
 #include <QInputDialog>
@@ -53,6 +54,12 @@ void MainWindow::newContext(Context *ctx)
 void MainWindow::createMenu()
 {
     // Add arch specific actions
+    actionLoadLPF = new QAction("Open LPF", this);
+    actionLoadLPF->setIcon(QIcon(":/icons/resources/open_lpf.png"));
+    actionLoadLPF->setStatusTip("Open LPF file");
+    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");
@@ -67,10 +74,12 @@ 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);
 }
@@ -81,11 +90,11 @@ static QStringList getSupportedPackages(ArchArgs::ArchArgsTypes chip)
 {
     QStringList packages;
     const ChipInfoPOD *chip_info;
-    if (chip == ArchArgs::LFE5U_25F) {
+    if (chip == ArchArgs::LFE5U_25F || chip == ArchArgs::LFE5UM_25F || chip == ArchArgs::LFE5UM5G_25F) {
         chip_info = get_chip_info(reinterpret_cast<const RelPtr<ChipInfoPOD> *>(chipdb_blob_25k));
-    } else if (chip == ArchArgs::LFE5U_45F) {
+    } else if (chip == ArchArgs::LFE5U_45F || chip == ArchArgs::LFE5UM_45F || chip == ArchArgs::LFE5UM5G_45F) {
         chip_info = get_chip_info(reinterpret_cast<const RelPtr<ChipInfoPOD> *>(chipdb_blob_45k));
-    } else if (chip == ArchArgs::LFE5U_85F) {
+    } else if (chip == ArchArgs::LFE5U_85F || chip == ArchArgs::LFE5UM_85F || chip == ArchArgs::LFE5UM5G_85F) {
         chip_info = get_chip_info(reinterpret_cast<const RelPtr<ChipInfoPOD> *>(chipdb_blob_85k));
     } else {
         log_error("Unsupported ECP5 chip type.\n");
@@ -100,9 +109,15 @@ static QStringList getSupportedPackages(ArchArgs::ArchArgsTypes chip)
 void MainWindow::new_proj()
 {
     QMap<QString, int> 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);
+    arch.insert("Lattice ECP5 LFE5U-25F", ArchArgs::LFE5U_25F);
+    arch.insert("Lattice ECP5 LFE5U-45F", ArchArgs::LFE5U_45F);
+    arch.insert("Lattice ECP5 LFE5U-85F", ArchArgs::LFE5U_85F);
+    arch.insert("Lattice ECP5 LFE5UM-25F", ArchArgs::LFE5UM_25F);
+    arch.insert("Lattice ECP5 LFE5UM-45F", ArchArgs::LFE5UM_45F);
+    arch.insert("Lattice ECP5 LFE5UM-85F", ArchArgs::LFE5UM_85F);
+    arch.insert("Lattice ECP5 LFE5UM5G-25F", ArchArgs::LFE5UM5G_25F);
+    arch.insert("Lattice ECP5 LFE5UM5G-45F", ArchArgs::LFE5UM5G_45F);
+    arch.insert("Lattice ECP5 LFE5UM5G-85F", ArchArgs::LFE5UM5G_85F);
     bool ok;
     QString item = QInputDialog::getItem(this, "Select new context", "Chip:", arch.keys(), 0, false, &ok);
     if (ok && !item.isEmpty()) {
@@ -131,6 +146,21 @@ void MainWindow::load_base_config(std::string filename)
     actionSaveConfig->setEnabled(true);
 }
 
+void MainWindow::open_lpf()
+{
+    QString fileName = QFileDialog::getOpenFileName(this, QString("Open LPF"), QString(), QString("*.lpf"));
+    if (!fileName.isEmpty()) {
+        std::ifstream in(fileName.toStdString());        
+        if (ctx->applyLPF(fileName.toStdString(), in)) {
+            log("Loading LPF successful.\n");
+            actionPack->setEnabled(true);
+        } else {
+            actionLoadLPF->setEnabled(true);
+            log("Loading LPF failed.\n");
+        }        
+    }
+}
+
 void MainWindow::open_base()
 {
     QString fileName = QFileDialog::getOpenFileName(this, QString("Open Base Config"), QString(), QString("*.config"));
@@ -152,10 +182,19 @@ 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()
+{
+    if (ctx->settings.find(ctx->id("input/lpf")) != ctx->settings.end())
+        actionLoadLPF->setEnabled(false);
+}
+
 NEXTPNR_NAMESPACE_END
diff --git a/gui/ecp5/mainwindow.h b/gui/ecp5/mainwindow.h
index f85c2abc..f67f7a81 100644
--- a/gui/ecp5/mainwindow.h
+++ b/gui/ecp5/mainwindow.h
@@ -38,15 +38,19 @@ class MainWindow : public BaseMainWindow
 
   protected:
     void onDisableActions() override;
+    void onJsonLoaded() override;
     void onRouteFinished() override;
+    void onProjectLoaded() override;
 
   protected Q_SLOTS:
     virtual void new_proj();
     void newContext(Context *ctx);
+    void open_lpf();
     void open_base();
     void save_config();
 
   private:
+    QAction *actionLoadLPF;
     QAction *actionLoadBase;
     QAction *actionSaveConfig;
 
diff --git a/gui/ecp5/nextpnr.qrc b/gui/ecp5/nextpnr.qrc
index 09f96d74..ca7e5b1a 100644
--- a/gui/ecp5/nextpnr.qrc
+++ b/gui/ecp5/nextpnr.qrc
@@ -1,5 +1,6 @@
 <RCC>
     <qresource prefix="/icons">
+        <file>resources/open_lpf.png</file> 
         <file>resources/open_base.png</file>
         <file>resources/save_config.png</file>
     </qresource>
diff --git a/gui/ecp5/resources/open_lpf.png b/gui/ecp5/resources/open_lpf.png
new file mode 100644
index 00000000..10772fc6
Binary files /dev/null and b/gui/ecp5/resources/open_lpf.png differ
-- 
cgit v1.2.3