Merge pull request #33 from YosysHQ/gui-ecp5

Gui ecp5
This commit is contained in:
Miodrag Milanović 2018-08-04 04:05:38 -07:00 committed by GitHub
commit dc34d4c9ed
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 165 additions and 25 deletions

View File

@ -384,7 +384,7 @@ struct PipRange
struct ArchArgs struct ArchArgs
{ {
enum enum ArchArgsTypes
{ {
NONE, NONE,
LFE5U_25F, LFE5U_25F,

View File

@ -148,7 +148,7 @@ int main(int argc, char *argv[])
#ifndef NO_GUI #ifndef NO_GUI
if (vm.count("gui")) { if (vm.count("gui")) {
Application a(argc, argv); Application a(argc, argv);
MainWindow w(std::move(ctx)); MainWindow w(std::move(ctx),args);
w.show(); w.show();
return a.exec(); return a.exec();

View File

@ -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) {} void IdString::initialize_arch(const BaseCtx *ctx) {}

View File

@ -90,7 +90,8 @@ int main(int argc, char *argv[])
return 1; return 1;
} }
std::unique_ptr<Context> ctx = std::unique_ptr<Context>(new Context(ArchArgs{})); ArchArgs chipArgs{};
std::unique_ptr<Context> ctx = std::unique_ptr<Context>(new Context(chipArgs));
if (vm.count("verbose")) { if (vm.count("verbose")) {
ctx->verbose = true; ctx->verbose = true;
@ -107,7 +108,7 @@ int main(int argc, char *argv[])
#ifndef NO_GUI #ifndef NO_GUI
if (vm.count("gui")) { if (vm.count("gui")) {
Application a(argc, argv); Application a(argc, argv);
MainWindow w(std::move(ctx)); MainWindow w(std::move(ctx), chipArgs);
w.show(); w.show();
return a.exec(); return a.exec();

View File

@ -37,8 +37,8 @@ static void initBasenameResource() { Q_INIT_RESOURCE(base); }
NEXTPNR_NAMESPACE_BEGIN NEXTPNR_NAMESPACE_BEGIN
BaseMainWindow::BaseMainWindow(std::unique_ptr<Context> context, QWidget *parent) BaseMainWindow::BaseMainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent)
: QMainWindow(parent), ctx(std::move(context)), timing_driven(false) : QMainWindow(parent), chipArgs(args), ctx(std::move(context)), timing_driven(false)
{ {
initBasenameResource(); initBasenameResource();
qRegisterMetaType<std::string>(); qRegisterMetaType<std::string>();

View File

@ -45,7 +45,7 @@ class BaseMainWindow : public QMainWindow
Q_OBJECT Q_OBJECT
public: public:
explicit BaseMainWindow(std::unique_ptr<Context> context, QWidget *parent = 0); explicit BaseMainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent = 0);
virtual ~BaseMainWindow(); virtual ~BaseMainWindow();
Context *getContext() { return ctx.get(); } Context *getContext() { return ctx.get(); }
@ -88,6 +88,7 @@ class BaseMainWindow : public QMainWindow
protected: protected:
// state variables // state variables
ArchArgs chipArgs;
std::unique_ptr<Context> ctx; std::unique_ptr<Context> ctx;
TaskManager *task; TaskManager *task;
bool timing_driven; bool timing_driven;

View File

@ -18,30 +18,148 @@
*/ */
#include "mainwindow.h" #include "mainwindow.h"
#include "bitstream.h"
#include "log.h"
#include <QFileDialog>
#include <QInputDialog>
#include <QLineEdit>
static void initMainResource() { Q_INIT_RESOURCE(nextpnr); } static void initMainResource() { Q_INIT_RESOURCE(nextpnr); }
NEXTPNR_NAMESPACE_BEGIN NEXTPNR_NAMESPACE_BEGIN
MainWindow::MainWindow(std::unique_ptr<Context> context, QWidget *parent) : BaseMainWindow(std::move(context), parent) MainWindow::MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent) : BaseMainWindow(std::move(context), args, parent)
{ {
initMainResource(); initMainResource();
std::string title = "nextpnr-ecp5 - [EMPTY]"; std::string title = "nextpnr-ecp5 - [EMPTY]";
setWindowTitle(title.c_str()); setWindowTitle(title.c_str());
connect(this, &BaseMainWindow::contextChanged, this, &MainWindow::newContext);
createMenu(); createMenu();
Q_EMIT contextChanged(ctx.get()); Q_EMIT contextChanged(ctx.get());
} }
MainWindow::~MainWindow() {} MainWindow::~MainWindow() {}
void MainWindow::createMenu() {} void MainWindow::newContext(Context *ctx)
{
std::string title = "nextpnr-generic - " + ctx->getChipName() + " ( " + chipArgs.package + " )";
setWindowTitle(title.c_str());
}
void MainWindow::new_proj() {} 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);
}
static const ChipInfoPOD *get_chip_info(const RelPtr<ChipInfoPOD> *ptr) { return ptr->get(); }
static QStringList getSupportedPackages(ArchArgs::ArchArgsTypes chip)
{
QStringList packages;
const ChipInfoPOD *chip_info;
if (chip == ArchArgs::LFE5U_25F) {
chip_info = get_chip_info(reinterpret_cast<const RelPtr<ChipInfoPOD> *>(chipdb_blob_25k));
} else if (chip == ArchArgs::LFE5U_45F) {
chip_info = get_chip_info(reinterpret_cast<const RelPtr<ChipInfoPOD> *>(chipdb_blob_45k));
} else if (chip == ArchArgs::LFE5U_85F) {
chip_info = get_chip_info(reinterpret_cast<const RelPtr<ChipInfoPOD> *>(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<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);
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<Context>(new Context(chipArgs));
actionLoadJSON->setEnabled(true);
Q_EMIT contextChanged(ctx.get());
}
}
}
void MainWindow::open_proj() {} void MainWindow::open_proj() {}
bool MainWindow::save_proj() { return false; } 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 NEXTPNR_NAMESPACE_END

View File

@ -29,16 +29,32 @@ class MainWindow : public BaseMainWindow
Q_OBJECT Q_OBJECT
public: public:
explicit MainWindow(std::unique_ptr<Context> context, QWidget *parent = 0); explicit MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent = 0);
virtual ~MainWindow(); virtual ~MainWindow();
public: public:
void createMenu(); void createMenu();
void load_base_config(std::string filename);
protected:
void onDisableActions() override;
void onRouteFinished() override;
protected Q_SLOTS: protected Q_SLOTS:
virtual void new_proj(); virtual void new_proj();
virtual void open_proj(); virtual void open_proj();
virtual bool save_proj(); virtual bool save_proj();
void newContext(Context *ctx);
void open_base();
void save_config();
private:
QAction *actionLoadBase;
QAction *actionSaveConfig;
ArchArgs chipArgs;
std::string currentProj;
std::string currentBaseConfig;
}; };
NEXTPNR_NAMESPACE_END NEXTPNR_NAMESPACE_END

View File

@ -1,2 +1,6 @@
<RCC> <RCC>
<qresource prefix="/icons">
<file>resources/open_base.png</file>
<file>resources/save_config.png</file>
</qresource>
</RCC> </RCC>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@ -23,19 +23,27 @@ static void initMainResource() { Q_INIT_RESOURCE(nextpnr); }
NEXTPNR_NAMESPACE_BEGIN NEXTPNR_NAMESPACE_BEGIN
MainWindow::MainWindow(std::unique_ptr<Context> context, QWidget *parent) : BaseMainWindow(std::move(context), parent) MainWindow::MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent) : BaseMainWindow(std::move(context), args, parent)
{ {
initMainResource(); initMainResource();
std::string title = "nextpnr-generic - [EMPTY]"; std::string title = "nextpnr-generic - [EMPTY]";
setWindowTitle(title.c_str()); setWindowTitle(title.c_str());
connect(this, &BaseMainWindow::contextChanged, this, &MainWindow::newContext);
createMenu(); createMenu();
Q_EMIT contextChanged(ctx.get()); Q_EMIT contextChanged(ctx.get());
} }
MainWindow::~MainWindow() {} MainWindow::~MainWindow() {}
void MainWindow::newContext(Context *ctx)
{
std::string title = "nextpnr-generic - " + ctx->getChipName();
setWindowTitle(title.c_str());
}
void MainWindow::createMenu() {} void MainWindow::createMenu() {}
void MainWindow::new_proj() {} void MainWindow::new_proj() {}

View File

@ -29,7 +29,7 @@ class MainWindow : public BaseMainWindow
Q_OBJECT Q_OBJECT
public: public:
explicit MainWindow(std::unique_ptr<Context> context, QWidget *parent = 0); explicit MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent = 0);
virtual ~MainWindow(); virtual ~MainWindow();
public: public:
@ -39,6 +39,7 @@ class MainWindow : public BaseMainWindow
virtual void new_proj(); virtual void new_proj();
virtual void open_proj(); virtual void open_proj();
virtual bool save_proj(); virtual bool save_proj();
void newContext(Context *ctx);
}; };
NEXTPNR_NAMESPACE_END NEXTPNR_NAMESPACE_END

View File

@ -37,7 +37,7 @@ static void initMainResource() { Q_INIT_RESOURCE(nextpnr); }
NEXTPNR_NAMESPACE_BEGIN NEXTPNR_NAMESPACE_BEGIN
MainWindow::MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent) MainWindow::MainWindow(std::unique_ptr<Context> context, ArchArgs args, QWidget *parent)
: BaseMainWindow(std::move(context), parent), chipArgs(args) : BaseMainWindow(std::move(context), args, parent)
{ {
initMainResource(); initMainResource();
@ -78,18 +78,11 @@ void MainWindow::createMenu()
menuDesign->addAction(actionSaveAsc); menuDesign->addAction(actionSaveAsc);
} }
#if defined(_MSC_VER)
void load_chipdb();
#endif
static const ChipInfoPOD *get_chip_info(const RelPtr<ChipInfoPOD> *ptr) { return ptr->get(); } static const ChipInfoPOD *get_chip_info(const RelPtr<ChipInfoPOD> *ptr) { return ptr->get(); }
QStringList getSupportedPackages(ArchArgs::ArchArgsTypes chip) static QStringList getSupportedPackages(ArchArgs::ArchArgsTypes chip)
{ {
QStringList packages; QStringList packages;
#if defined(_MSC_VER)
load_chipdb();
#endif
const ChipInfoPOD *chip_info; const ChipInfoPOD *chip_info;
#ifdef ICE40_HX1K_ONLY #ifdef ICE40_HX1K_ONLY
if (chip == ArchArgs::HX1K) { if (chip == ArchArgs::HX1K) {

View File

@ -55,8 +55,6 @@ class MainWindow : public BaseMainWindow
QAction *actionLoadPCF; QAction *actionLoadPCF;
QAction *actionSaveAsc; QAction *actionSaveAsc;
ArchArgs chipArgs;
std::string currentProj; std::string currentProj;
std::string currentPCF; std::string currentPCF;
}; };