From a0e79c993fd4b6886d997a814582c1b64c929355 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Sat, 3 Nov 2018 09:39:43 +0100 Subject: [PATCH] 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 #include #include @@ -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 *>(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 *>(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 *>(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 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 @@ + resources/open_lpf.png resources/open_base.png resources/save_config.png diff --git a/gui/ecp5/resources/open_lpf.png b/gui/ecp5/resources/open_lpf.png new file mode 100644 index 0000000000000000000000000000000000000000..10772fc667b54a46210731228d323af0f9525d2a GIT binary patch literal 1928 zcmV;32Y2|1P)#m?@={EeCmEd^rT<1hqy3{NqrXN!pr5}3!M|d}{kM&OLp9^@WK*u`KxwQrHgs`l zzW;pxq7;$UsCyRf#9OJ~w7>P7M`c}Cok^+6PDVSsml()~bq_byy|DYqfz@=Mp{ z=$-3Upnp()_W74UvNdiL)NzMI8grd@(h&=AkEcc0KYet(!kbYtLh}ZhDl~?nAWYruOgNIM?y(Kblj?hI7C? zvkd#8KfI7%c(lE%Jzcd`#w+7kYn`YP6}ZB?z%&rOuLy@;$;p;a{Q|532|;Rz^-;P6 z;SAT`{y9ZoZlzpRb{q^UK32)c{m#v(J2<#6pK48UW8ntDLV!9`)K3Sg$)o$6a^Kf$ zeF^BweO&-RG!3G`lpvT#h4WCEM(iniw*#=@-cPKBryAk8+vB9O&7eRz3gzH6XY_g{ zDS+eZ3FXR3Ihkm}tPY?y3SkM#w-EEYcx}mh0@!47$C_i|;Vgs`C4xk5ZptOtkm0xg z2zYl=<2>#BP$Ibk`~|oTllpliSb6s+}@F5lDR~Jng?wS4uWzNPTIli z%5gU1fUC%~+RobRwe!HkNo3Rmu$I`kO*W4NDuRRp;SzDNdPE6BHMkkTSfKcRF@@}C zMtKS>IIe@&;GtYaSPBXL9F*h_GM(%YuBriti_{e8?v|PHuZfW_xRDhsmIn9YBLAFTI;I=V6;F@Ac#+_ zt3oIq)pQ=!xu1OR2TNa3bkOkiL{^N8QguKf<%dn%-(ANRm-KDG6~Go0dUg_FPkOP*a6{GA`BnI zEX5m`VjQ72o`SH5yg7pU_FKrGj*v>l@mYEA0OQjYt_=J1X~VWn4s9(0+AzOh^o2n? z4$Rd75G!PwyTKC({KPLlh(_5(BpO3SGqKR^e9Vd?%MMgx0cgkyJ?mULTC(UUqA_bp zdzxBRGdy8@U=b+RYd~8X+PcA%L6>7tdKRUpAesQ=XT(Tj>QSE z^DG`v0Hl8_A_g2w&5yV-AqzkesMLpHWXa~&f}TU9f&x@^05K($5|m1^6(H9>jlzJ{ zC^UjbEddzVvwW|JKv__hS|#Gzs7xnCsk$lyxu!gXGZ4fY5HpPug-D#6l_Zqg2*Jds zmgKtJcf`g8y%MsHp;j?m9F|F7c2x$HhVM{0Sb$VMqv=q zNL-;2qGb?>iGga(V%ggB*JAv99%+_?S5r;V>oB$l;>d|Dwr3xr0iI6LYl6(+X zBUvsI2I=3Lu%eg2DGXs?7`<)%T1W|40K&Tf1cCin$Jz|osn`fArd}cp8I;(>_bZ@849YRoDw?5jDJI7KRr&!rlxy_j2oQ@>Dn7Z58BkaRLD`j%6HKfN z3}SSwc4EqvP3B?~|62yfWEPlT>Wc0H;5r=0Hh7=|5CN-V)hDMHk;EO6_~hkI!Pz7N4ArV|c|>j}0<6{nNTwSi-T$bJzsecYA1wn|MyJm0Q z3E*BM9|Dd6+wa>ie(*62oCdA~`d$DHKqt`j0Dp)pNsI3PCqJ