From 26f23e31212d41c713127d20e561d00260c80408 Mon Sep 17 00:00:00 2001 From: Miodrag Milanovic Date: Wed, 8 Mar 2023 11:54:53 +0100 Subject: [PATCH] Make small GUI changes --- gui/machxo2/mainwindow.cc | 78 +++++++++++++++++++++----- gui/machxo2/mainwindow.h | 8 ++- gui/machxo2/nextpnr.qrc | 5 ++ gui/machxo2/resources/open_base.png | Bin 0 -> 2175 bytes gui/machxo2/resources/open_lpf.png | Bin 0 -> 2117 bytes gui/machxo2/resources/save_config.png | Bin 0 -> 1645 bytes 6 files changed, 77 insertions(+), 14 deletions(-) create mode 100644 gui/machxo2/resources/open_base.png create mode 100644 gui/machxo2/resources/open_lpf.png create mode 100644 gui/machxo2/resources/save_config.png diff --git a/gui/machxo2/mainwindow.cc b/gui/machxo2/mainwindow.cc index 6302d9fa..2ecba910 100644 --- a/gui/machxo2/mainwindow.cc +++ b/gui/machxo2/mainwindow.cc @@ -18,16 +18,13 @@ */ #include "mainwindow.h" -#include +#include +#include "bitstream.h" +#include "log.h" + #include -#include -#include #include #include -#include -#include -#include "design_utils.h" -#include "log.h" static void initMainResource() { Q_INIT_RESOURCE(nextpnr); } @@ -38,7 +35,7 @@ MainWindow::MainWindow(std::unique_ptr context, CommandHandler *handler { initMainResource(); - std::string title = "nextpnr-xo2 - [EMPTY]"; + std::string title = "nextpnr-machxo2 - [EMPTY]"; setWindowTitle(title.c_str()); connect(this, &BaseMainWindow::contextChanged, this, &MainWindow::newContext); @@ -48,11 +45,35 @@ MainWindow::MainWindow(std::unique_ptr context, CommandHandler *handler MainWindow::~MainWindow() {} +void MainWindow::newContext(Context *ctx) +{ + std::string title = "nextpnr-machxo2 - " + ctx->getChipName() + " ( " + ctx->archArgs().package + " )"; + setWindowTitle(title.c_str()); +} + 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); + + 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(actionLoadLPF); + mainActionBar->addAction(actionSaveConfig); + + menuDesign->addSeparator(); + menuDesign->addAction(actionLoadLPF); + menuDesign->addAction(actionSaveConfig); } void MainWindow::new_proj() @@ -94,14 +115,45 @@ void MainWindow::new_proj() } } -void MainWindow::newContext(Context *ctx) +void MainWindow::open_lpf() { - std::string title = "nextpnr-xo2 - " + ctx->getChipName(); - setWindowTitle(title.c_str()); + QString fileName = QFileDialog::getOpenFileName(this, QString("Open LPF"), QString(), QString("*.lpf")); + if (!fileName.isEmpty()) { + /*std::ifstream in(fileName.toStdString()); + if (ctx->apply_lpf(fileName.toStdString(), in)) { + log("Loading LPF successful.\n"); + actionPack->setEnabled(true); + actionLoadLPF->setEnabled(false); + } else { + actionLoadLPF->setEnabled(true); + log("Loading LPF failed.\n"); + }*/ + } } -void MainWindow::onDisableActions() {} +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(), fileName.toStdString()); + log("Saving Bitstream successful.\n"); + } +} -void MainWindow::onUpdateActions() {} +void MainWindow::onDisableActions() +{ + actionLoadLPF->setEnabled(false); + actionSaveConfig->setEnabled(false); +} + +void MainWindow::onUpdateActions() +{ + 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/machxo2/mainwindow.h b/gui/machxo2/mainwindow.h index 2dcd052f..20d72c68 100644 --- a/gui/machxo2/mainwindow.h +++ b/gui/machxo2/mainwindow.h @@ -35,13 +35,19 @@ class MainWindow : public BaseMainWindow public: void createMenu(); + protected: void onDisableActions() override; void onUpdateActions() override; protected Q_SLOTS: void new_proj() override; - void newContext(Context *ctx); + void open_lpf(); + void save_config(); + + private: + QAction *actionLoadLPF; + QAction *actionSaveConfig; }; NEXTPNR_NAMESPACE_END diff --git a/gui/machxo2/nextpnr.qrc b/gui/machxo2/nextpnr.qrc index 03585ec0..ca7e5b1a 100644 --- a/gui/machxo2/nextpnr.qrc +++ b/gui/machxo2/nextpnr.qrc @@ -1,2 +1,7 @@ + + resources/open_lpf.png + resources/open_base.png + resources/save_config.png + diff --git a/gui/machxo2/resources/open_base.png b/gui/machxo2/resources/open_base.png new file mode 100644 index 0000000000000000000000000000000000000000..b60cf25a109b1e2488b211be1e7bb7a7bc01e04f GIT binary patch literal 2175 zcmV-_2!QvAP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Rd3j+xOH(W{~7XSbUgGod|R9M5smwSv{brr`y z=iWPaW_D+1XP@0}OSdhh1qzK&DQKELaES>-LyLx2{6k1I2BL=e2mkmFF)=1$0va?D zH6(_rU~43v@7a0Z=kNH(ozl`NN<`xCpZU$XbARV^&-tEn z&%pnA$$x$01CqrhOGpP15YV7ZRiD)cpdT23d|3*eh0fg>H}eT63)#+^dtG!*lcWzjMWB>lZ>1m zVRB@0U-z> z_po_rGo`lDwe!qhuZwz&B1=H@{sBHLInGk_p736X4n-#!;RMGyG_g2Q8TCd73o8m) zH|WK_R@$1~pdfLEHK zMgOS3pPQaLuwV8+vVGU~fqX7cY+^Fq8EPA9JHid&t&H+CFm?vTHn+t4~fvYkQoGs%w{Mta0ap*PFr9L=`Pdfz2F@M zu4-0BD}XU1&Q0_1P@%49pb(r3T%sNoWz2)Oe3*L&MZsIx_62Xa1t5+TJOw{_;;5kn>d znJTco1;8&GXeeG)S@vzT_oMV|x|81C4>jZ7XqIP`lqxpe-39L4x`Qpb%X$1CzvR%w zDY!C)?b^hC3=#v}1>%HU#cYvLOxDF;t zoD+aaAQW&NWlg_Q$Yfa6{Sgko*3DxhM;I?uiQ0s96L3w}0@nA1Jdjz0BsmmHh0D z1rCl^*y*;hGDK5v+u~9P(EVTfrQPLfQ;3)XD zrgK1}#926ngbQFA2oY$EG@F8A5H%n%Z5d_lN}Jx!3{e=;o-w#igx81|KO5J83Q%g* zKxAm^9)!3GQ8m$>X&})Ygl8eHp$Hw4S8$~+AIiT zL+|fMbYo)B7_T1l>bTAVi14@X9P4T}B^RhnN7Kn?!%G1v$2aoG7BhdE{3SAvP4srZP-5h!&Sb9! zabmnPF{4wu2oz~fMehKxEpEuPIS@6ejUaCiZHlTQ$u5D>bHjjX+9LFVrlrJ51xV5x z8V%*O37u&Qu+akGy3We6H|DBgq^YK_|FHD@$GKmtwq6HBzz@(PC(W4)0WNlO8L$i3 z$h*yp?|+R02Z2*SbTL31&Q}%002ovPDHLkV1n*N Bk%puFcL`7$0JNo#3c(3Pq?)$p#`}%!;Xha(`9xhQX004Lh=En9%F7@X)*^e|d zDr)PD7Rx$%e1>o=1G$o72gD1Ml=TQ%F~*FH_P0`?p?I}tE`Lx`hGLK7784cU#82Xhugg1x1 zE!^<_l1$BOT9gPKVHU9ITGC8#vB6+Td);z{_PJ~Blk(fh)N`F7l&^n zw$^VH|H{msnEh9QDVFtimY$t8vR=$w6Hf1BIYj7R2|Itp^Fv-gf$an2{UrB;=OvF%0HzTB4?(rV9bcKXoB zX*b@gq_tk>j);2k0rqOKddiLb%3kk>Hi^PQJq0Ot};GYPqA zq0kB4*6kIqhy~(Wo^^V{^*?~;ii&#)&l12sig_kwT8}3c2w-uNtr9tFu)#&(?+389 z1%`7;6a*G4)_0j?3kcX=rn$1WmUlm_X7q(L-PWG{EZBLFGC)5ix+bzl=YK8780*p` z2B4*I*P&JWA&c0&)F9q59%VBt{X00K+*@?7A+g|9hzkE15u3*<^~kEL6N@ju6@yy) zNBz+hIA0r07y(^PV1Wl$z`+!&m_WZzdsG(Z|_9r6DeJds{EgzLnIbbaznKa z6`Ru@!FHG>TAvzpiIzbUc!a)7)rwe16>5S2h{abod#!~OWwQ<5s7agcOzh;qs^(Dm4fqd{2l`=S~ zjP2yTJ6A~&J4}I?jrE|)r~eY_EWC6{&_Fm|tK{_Oq0*NU9~q@Qg%a1dN7@DINb&pD z(2lhDWCrP`+?Z*aWNGNIU0UDyE3;w^XTrUm0VJtI4yzEf{OP2Y`Q<0Cnik*dW>*)b zl4~22=16wjWVa(8jsjVLbEHt77c1-G9x(FQ#AWq~cMcxm7irY1VxfII_X`_N#|B*#nYve1rm@MEc2T?sHp z45B>VFfpl;MdXEBz$3DUNy%`(Q5kuQs2M;0a9)1G)rGnm+y$ls;(c-8zrH)FGn<|A(?H~bNQuKE&*~?|` z6d^;5kC57oVexUZsw)FZ zp2+8^x1^%jUwFDI_dZQ2lFS#O{GBC2B!T4@a9+o^z+ANK7EJXsmU32vmk_#|IJp@Z z1l=-)Y1wh`edX4DAH~LxN-EJBcJdl^%Y;tl#W$%x{uZjC>Y{==5Tr<3lmdJbATa|p zQYw+{{lv`pynjSfMvNwh?V{H!>_>B1$2o41huT_`6<`(6K{RJX@lJ4q9-FU_99~x2 zE)~T;HRi_%RE&yn)^7FXeV97#Y~kUFPqzCFq{B*DtLsQ6X{1 z^U{8$fg)A1qf}COtL{yOc$U?Y`A`V?-0MPj0cqnx44N|kTP#`L8>GN@&16HGLe|e4 zMdPBSz^0`KADUq({(K1Ss*=uqkidXu$Z#n#zrXhwXMko>x|fCocm23=*A@O6Gqo`i zM0N1^ngQH(r+uf{{O5I?;%3a(EoA5d3H&Va3FH_EGX2zjkKrYF8sx^d#e_EEgmdU- z4BihnvdohVtfM8-{Tx&>4_z#jfsEPmp literal 0 HcmV?d00001 diff --git a/gui/machxo2/resources/save_config.png b/gui/machxo2/resources/save_config.png new file mode 100644 index 0000000000000000000000000000000000000000..63b5ab563bf99eb9fc02520052cfe83d8049bbd9 GIT binary patch literal 1645 zcmV-z29o)SP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 zVoOIv0RI600RN!9r;`8x00(qQO+^Rd3j+xOH(W{~7XSbSaY;l$R9M5kmRoEURTPH5 zxg1(s3dNMGX>H0S)rhpBVi7?s1|voZCTh4O#fS=`5J(XciQ!@(zK8-ELn9I}JZUfz z(FzGhDd7Qa5w(CQZLl@8wH8`v&&=%Q!=9Nlb9#UW2s=4vvS+Wo|9}1KGTY!9WA*CQ z!c7>PH*Yqswq{>%b6Hs#mStg@Cbnf^**3PFz_x7?2@Bg!kgyY2wuNok*tUgfS>c|V znwo2#9}*~ebjwu3vTK2?)be@#khl;A@wxc(x}$Y;w71jL+)QZdmrg)hj9!Q_71le8E0_e?tfveF_E!AmYC_QVNShc z%C$e9&id$M*_Z5XU)t65%@-zsVI}HTES;K|QeG4~9CO-8ONBICBVufbV489B;5<<< zWAa!kXOt!iN@jfsln18S(S3!1emIXXu z$3R3M&<~J!5{uS4l?jn$y*DmFdPoH5y^;hN8WK?AAFM)%bja|nfgpyYaMR6Ie+44U zW9BIWN;00M5d)}{O{T)GsF;jx>k^Fd@d=0mG2$R;3TPRkBzEwy5K0mRf4OuVoGUf!vNEOaRu2K2zU~D zu%oW|hU1=TJTi7Do`CD6GzbYep6KS{ukBtq;iiHw*x8_g4RBQk0&Wn3v>|?VDDf*r zz*G2h{XUqxO3Uqu&MBpI0*)J+&?<`p0oPOg2_#*Kr!}dp4S+>b4NC>2B4k8#f=6v5 z&f@tKFH;pbp32z&BxoYBLj?(di6|lBd+jUWlZ=HKNM=;P(;x6G z{O54W?!#*7CablPWMMIRdD-OU=g|AcN_wWx#8bks@4iO5{)4SsIa2Wyo%dH@dLGaG zemKO8-5ipxF#Oype!KfYodbnMI8Qu@apn~6#7SCK)55*yUW~3Tx|XjZZ`&5+N?-Uj z9kOFPBdTBH_L}Xwiz}d^fiq*u$Z2b3_Kx)wAN(>i0moCcj4I*IrbZqA)>gU}EvBWQ zkh5PM;zV;Nzntr!`*=OAWO2HqkDs4k1RK}UeyNw1&dW5+sp9bRcc_~+pT9eMbZM8C zQhNG0ZG(ofr|K;RwlrTQ1fHVyu@{*C$$F^zo&g>IGHBDgc*90A{LPif{=LwBiJrwv z7+Qav+eQqc_n~s~j(kh*fNTcl=a3wdOYVrlD1p5ETpfaC%a}5AE>n;0$Mifp$K0js z75{25x^kPmy z(gN14-N)HOOSi-n2tE?FsZ9rFrQNS@a5zfR?#pQ*2tE?FX|Z5u!%YR(Id+{s@bviM zHy!kPBP6hH?Y>(M4ypU;7+|LVyp`jR{{e@6WjA|?_LTqt03~!qSaf7zbY(hYa%Ew3 zWdJfTF*q$SI4v+TR53R?Ff%$ZGAl4LIxsMM=ESA|001R)MObuXVRU6WZEs|0W_bWI rFflkSFgPtRGE^})IxsUjFfuDJGCD9Y3cGw700000NkvXXu0mjf4kqH{ literal 0 HcmV?d00001