]> AND Private Git Repository - blast.git/blobdiff - MainWindow.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
started VHDL generation of GroupBlock
[blast.git] / MainWindow.cpp
index 1f8c1c0375c158f6dcfe356258fe3850da186166..212e54dd6cf9a7f7a8f91b0c052cb2575fcc051f 100644 (file)
@@ -4,14 +4,14 @@
 #include "BlockLibraryWidget.h"
 #include "GroupWidget.h"
 #include "GroupScene.h"
-#include "BlockWidget.h"
-#include "AbstractBoxItem.h"
+#include "VHDLConverter.h"
 #include "Graph.h"
-#include "GroupItem.h"
+#include "FunctionalBlock.h"
 #include <QDomDocument>
 #include <QDomElement>
 #include <QDomText>
 #include <sstream>
+#include "NewProjectDialog.h"
 
 MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
 
@@ -24,6 +24,9 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
   try {    
     params->loadBlastConfiguration("blastconfig.xml");
 
+    // first load external sources
+    params->loadSources();
+
     if (!QFileInfo::exists(params->refLib)) {
       params->loadReferencesFromXml();
       int ret = QMessageBox::question(this,tr("Building references library"),tr("The reference block library does not exists.\n References have been read directly from the xml descriptions of blocks.\n It can be saved into a library in order to start application faster. "), QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);
@@ -54,6 +57,8 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) {
 
   cout << "all references and implementations are loaded" << endl;
 
+  params->createDelayBlock();
+
   // create the menu, action, ...
   dispatcher = new Dispatcher(params,this);
   params->setDispatcher(dispatcher);
@@ -86,9 +91,11 @@ MainWindow::~MainWindow() {}
 void MainWindow::initialize() {
 
   projectMenuEnb = 0;
+  analysisMenuEnb = 0;
 
   stackedWidget->setCurrentIndex(0);
   enableProjectActions(true,PROJECT_NEW | PROJECT_OPEN, OP_RAZ);
+  enableAnalysisActions(false);
 
   stackedWidget->setCurrentIndex(0);
 
@@ -195,11 +202,45 @@ void MainWindow::enableProjectActions(bool enbMenu, quint16 mask, quint8 op) {
   }
 }
 
+void MainWindow::enableAnalysisActions(bool enbMenu, quint16 mask, quint8 op) {
+  if (enbMenu) {
+    analysisMenu->setEnabled(true);
+  }
+  else {
+    analysisMenu->setEnabled(false);
+  }
+
+  if (op == OP_ADD) {
+    analysisMenuEnb = analysisMenuEnb | mask;
+  }
+  else if (op == OP_REM) {
+    analysisMenuEnb = (analysisMenuEnb | mask) ^ mask;
+  }
+  else if (op == OP_RAZ) {
+    analysisMenuEnb = mask;
+  }
+
+
+  if (analysisMenuEnb & ANALYSIS_ANALYZE) {
+    graphAnalysis->setEnabled(true);
+  }
+  else {
+    graphAnalysis->setEnabled(false);
+  }
+  if (analysisMenuEnb & ANALYSIS_GENERATE) {
+    generateVHDL->setEnabled(true);
+  }
+  else {
+    generateVHDL->setEnabled(false);
+  }
+}
+
 void MainWindow::createMenus(){
 
   allMenuBar = menuBar();
 
   projectMenu = allMenuBar->addMenu(tr("&Project"));
+  analysisMenu = allMenuBar->addMenu(tr("&Analysis"));
   toolsMenu = allMenuBar->addMenu(tr("&Tools"));
 
   projectMenu->addAction(newProject);
@@ -209,8 +250,11 @@ void MainWindow::createMenus(){
   projectMenu->addAction(closeProject);
   projectMenu->addAction(openLibrary);
 
-  toolsMenu->addAction(newBlockWidgetAct);
-  toolsMenu->addAction(graphValidation);
+  analysisMenu->addAction(graphAnalysis);
+  analysisMenu->addAction(generateVHDL);
+
+  toolsMenu->addAction(vhdlToXmlAct);
+
 
 }
 
@@ -246,40 +290,47 @@ void MainWindow::createActions() {
   openLibrary->setStatusTip(tr("Open block library window"));
   connect(openLibrary, SIGNAL(triggered()), this, SLOT(slotOpenBlockLibrary()));
 
-  newBlockWidgetAct = new QAction(tr("&XML generator"), this);
-  newBlockWidgetAct->setIcon(QPixmap::fromImage(QImage("icons/new.ico")));
-  newBlockWidgetAct->setStatusTip(tr("Create a new XML generator"));
-  connect(newBlockWidgetAct, SIGNAL(triggered()), this, SLOT(slotNewBlockWidget()));
+  vhdlToXmlAct = new QAction(tr("&XML generator"), this);
+  vhdlToXmlAct->setIcon(QPixmap::fromImage(QImage("icons/new.ico")));
+  vhdlToXmlAct->setStatusTip(tr("Create a new XML generator"));
+  connect(vhdlToXmlAct, SIGNAL(triggered()), this, SLOT(slotVHDLToXml()));
 
-  graphValidation = new QAction(tr("&graph validation"), this);
-  graphValidation->setIcon(QPixmap::fromImage(QImage("icons/new.ico")));
-  graphValidation->setStatusTip(tr("validate the graph"));
-  connect(graphValidation, SIGNAL(triggered()), this, SLOT(slotGraphValidation()));
+  graphAnalysis = new QAction(tr("&graph analysis"), this);
+  graphAnalysis->setIcon(QPixmap::fromImage(QImage("icons/new.ico")));
+  graphAnalysis->setStatusTip(tr("validate the graph"));
+  connect(graphAnalysis, SIGNAL(triggered()), this, SLOT(slotGraphAnalysis()));
+
+  generateVHDL = new QAction(tr("generate &VHDL"), this);
+  generateVHDL->setIcon(QPixmap::fromImage(QImage("icons/new.ico")));
+  generateVHDL->setStatusTip(tr("generate the VHDL code for the whole design"));
+  connect(generateVHDL, SIGNAL(triggered()), this, SLOT(slotGenerateVHDL()));
 
 }
 
-void MainWindow::save(QString absoluteFilename) {
-  params->save(absoluteFilename);
+void MainWindow::save(QString projectFile) {
+  params->save(projectFile);
 }
 
 void MainWindow::slotLoadProject(){
 
-  absoluteFilename = QFileDialog::getOpenFileName(0, "select a project file", "save/",tr("sauvegardes (*.xml)"));
+  params->projectFile = QFileDialog::getOpenFileName(0, "select a project file", "save/",tr("sauvegardes (*.xml)"));
 
-  if(! absoluteFilename.isEmpty()){
-    GroupWidget* topGroup = dispatcher->loadProject(absoluteFilename);
+  if(! params->projectFile.isEmpty()){
+    GroupWidget* topGroup = dispatcher->loadProject(params->projectFile);
     if (topGroup != NULL) {
       addTopGroup(topGroup);
       library->updateComboScene();
+      params->isCurrentProject = true;
+      enableProjectActions(true, PROJECT_CLOSE | PROJECT_SAVE | PROJECT_SAVEAS | PROJECT_LIB, OP_RAZ);
+      enableAnalysisActions(true, ANALYSIS_ANALYZE | ANALYSIS_GENERATE, OP_RAZ);
     }
     else {
       QMessageBox msgBox;
-      msgBox.setText("Cannot open the project.");
-      msgBox.setInformativeText("Do you want to save your changes?");
+      msgBox.setText("Cannot open the project.");      
       msgBox.setStandardButtons(QMessageBox::Cancel);
       msgBox.setDefaultButton(QMessageBox::Cancel);
 
-      int ret = msgBox.exec();
+      msgBox.exec();
     }
   }
 }
@@ -287,37 +338,73 @@ void MainWindow::slotLoadProject(){
 
 void MainWindow::slotNewProject(){
 
-  enableProjectActions(true, PROJECT_CLOSE | PROJECT_SAVE | PROJECT_SAVEAS | PROJECT_LIB, OP_RAZ);
-  GroupWidget* topGroup = dispatcher->createTopScene();
-  addTopGroup(topGroup);
-  library->updateComboScene();
+  NewProjectDialog* dialog = new NewProjectDialog(params);
+  int ret = dialog->exec();
+
+  if (ret == 1) {
+    enableProjectActions(true, PROJECT_CLOSE | PROJECT_SAVE | PROJECT_SAVEAS | PROJECT_LIB, OP_RAZ);
+    enableAnalysisActions(true, ANALYSIS_ANALYZE | ANALYSIS_GENERATE, OP_RAZ);
+    GroupWidget* topGroup = dispatcher->createTopScene();
+    addTopGroup(topGroup);
+    library->updateComboScene();
+    library->show();
+    params->isCurrentProject = true;
+  }
 }
 
-void MainWindow::slotCloseProject(){
+bool MainWindow::slotCloseProject(){
 
-  // removing the GroupWidget from stack
-  QWidget *widget = stackedWidget->widget(1);
-  stackedWidget->removeWidget(widget);
-  stackedWidget->setCurrentIndex(0);
+  bool doClose = false;
+
+  if(params->isCurrentProject) {
+    if (params->unsaveModif) {
+      QMessageBox msgBox;
+      msgBox.setText("The project has been modified.");
+      msgBox.setInformativeText("Do you want to save your changes?");
+      msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
+      msgBox.setDefaultButton(QMessageBox::Save);
 
-  dispatcher->closeCurrentProject();
+      int ret = msgBox.exec();
 
+      switch(ret) {
+      case QMessageBox::Save :
+        slotSaveProject();
+        doClose = true;
+        break;
+      case QMessageBox::Discard :
+        doClose = true;
+        break;
+      }
+    }
+    else {
+      doClose = true;
+    }
+    if (doClose) {
+      // removing the GroupWidget from stack
+      QWidget *widget = stackedWidget->widget(1);
+      stackedWidget->removeWidget(widget);
+      stackedWidget->setCurrentIndex(0);
 
-  params->isCurrentProject = false;
-  params->unsaveModif = false;
-  absoluteFilename = QString();
+      dispatcher->closeCurrentProject();
 
-  initialize();
+      params->isCurrentProject = false;
+      params->unsaveModif = false;
+      params->projectFile = QString();
+
+      initialize();
+    }
+  }
+  return doClose;
 }
 
 
-void MainWindow::slotNewBlockWidget() {
-  new BlockWidget();
+void MainWindow::slotVHDLToXml() {
+  new VHDLConverter();
 }
 
 void MainWindow::slotSaveProject(){
-  if(absoluteFilename != QString()){
-    save(absoluteFilename);
+  if(params->projectFile != QString()){
+    save(params->projectFile);
   } else {
     slotSaveAsProject();
   }
@@ -329,9 +416,9 @@ void MainWindow::slotSaveAsProject(){
     dial.setDefaultSuffix(".xml");
     dial.setAcceptMode(QFileDialog::AcceptSave);
     if(dial.exec() == QFileDialog::AcceptSave){
-      absoluteFilename = dial.selectedFiles().at(0);
-      if(absoluteFilename != QString())
-        save(absoluteFilename);
+      params->projectFile = dial.selectedFiles().at(0);
+      if(params->projectFile != QString())
+        save(params->projectFile);
     }
   }
 }
@@ -341,8 +428,55 @@ void MainWindow::slotOpenBlockLibrary() {
 }
 
 
-void MainWindow::slotGraphValidation() {
-  params->parametersValidation();
+void MainWindow::slotGraphAnalysis() {
+  bool compat = true;
+  try {    
+    params->getGraph()->computeOutputPatterns(1);
+  }
+  catch(Exception e) {
+    cerr << qPrintable(e.getMessage()) << endl;
+    compat = false;
+    if (e.getType() == IP_AP_NOTCOMPAT) {
+      FunctionalBlock* toBlock = (FunctionalBlock*)(e.getSource());
+      QString msg = tr("");
+      msg.append(toBlock->getName());
+      msg += " is not compatible with its input pattern.\nDo you want to launch automatic modification process to ensure the compatibility ?";
+      int ret = QMessageBox::question(this,tr("Building references library"),msg, QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);
+      if (ret == QMessageBox::Ok) {
+        dispatcher->findGraphModifications(toBlock);
+      }
+    }
+  }
+}
+
+void MainWindow::slotGenerateVHDL() {
+
+  QDir baseDir(params->projectPath);
+  if (!baseDir.exists()) {
+    cerr << "Project path " << qPrintable(params->projectPath) << " no longer exists. First, recreate it and put the project file within. Then retry to generate." << endl;
+    return;
+  }
+  if (! baseDir.exists("src")) {
+    baseDir.mkdir("src");
+  }
+  if (! baseDir.exists("testbench")) {
+    baseDir.mkdir("testbench");
+  }
+  if (! baseDir.exists("Makefile")) {
+    QFile make("/home/sdomas/Projet/Blast/code/blast/Makefile-isim");
+    QString dest = params->projectPath;
+    dest += "/Makefile";
+    make.copy(dest);
+  }
+
+  QString dest = params->projectPath;
+  dest += "/src/";
+  try {
+    params->getGraph()->generateVHDL(dest);
+  }
+  catch(Exception e) {
+    cerr << qPrintable(e.getMessage()) << endl;
+  }
 }
 
 void MainWindow::addTopGroup(GroupWidget *_topGroup) {
@@ -357,29 +491,16 @@ void MainWindow::removeTopGroup() {
   stackedWidget->setCurrentIndex(0);
 }
 
-void MainWindow::closeEvent(QCloseEvent *event){
-  if(params->isCurrentProject){
-    QMessageBox msgBox;
-    msgBox.setText("The project has been modified.");
-    msgBox.setInformativeText("Do you want to save your changes?");
-    msgBox.setStandardButtons(QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
-    msgBox.setDefaultButton(QMessageBox::Save);
-
-    int ret = msgBox.exec();
-
-    switch(ret) {
-    case QMessageBox::Save :
-      slotSaveProject();
-      slotCloseProject();
-      break;
-    case QMessageBox::Discard :
-      slotCloseProject();
-      break;
-    }
+void MainWindow::closeEvent(QCloseEvent *event) {
+
+  if (params->isCurrentProject) {
+    slotCloseProject();
     event->ignore();
-  } else {
-    exit(0);
   }
+  else {
+    library->deleteLater();
+  }
+
 }
 
 void MainWindow::mousePressEvent(QMouseEvent *e) {