X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/4cf57e6db08da791233d75237f62e74bc88dd427..a13795fc34cd1e74f94695d35253c3d00abec9bc:/Parameters.cpp

diff --git a/Parameters.cpp b/Parameters.cpp
index d3a8dd4..ec0041f 100644
--- a/Parameters.cpp
+++ b/Parameters.cpp
@@ -9,7 +9,7 @@
 #include "GroupScene.h"
 #include "GroupItem.h"
 #include "BoxItem.h"
-#include "SourceItem.h"
+#include "StimuliItem.h"
 #include "InterfaceItem.h"
 #include "ConnectionItem.h"
 
@@ -46,10 +46,14 @@ Parameters::Parameters() {
 
   unsaveModif = false;
   isRstClkShown = false;
-
-  projectPath = QDir::currentPath();
   
   validityExtension = "_enb";
+
+  projectPath = "";
+  projectName = "";
+  projectFile = "";
+
+  graph = new Graph();
 }
 
 Parameters::~Parameters() {
@@ -67,8 +71,8 @@ void Parameters::clear() {
   refPathes.clear();
 }
 
-Graph* Parameters::createGraph() {
-  graph = new Graph();
+Graph* Parameters::initGraph(bool createTopGroupIfaces) {
+  graph->createTopGroup(createTopGroupIfaces);
   return graph;
 }
 
@@ -81,10 +85,19 @@ ReferenceBlock* Parameters::getReferenceBlock(int idCategory, int idBlock) {
   BlockCategory* blockCat = categoryTree->searchCategory(idCategory);
 
   if (blockCat == NULL) return NULL;
-  ReferenceBlock* ref = blockCat->getBlock(idBlock);
+  ReferenceBlock* ref = blockCat->getBlockById(idBlock);
   return ref;
 }
 
+ReferenceBlock* Parameters::getHiddenReferenceBlock(QString blockName) {
+
+  BlockCategory* blockCat = categoryTree->searchCategory(100);
+  if (blockCat == NULL) return NULL;
+  ReferenceBlock* ref = blockCat->getBlockByName(blockName);
+  return ref;
+}
+
+
 void Parameters::createDelayBlock() {
   delayRef = new ReferenceBlock("no.xml");
   delayRef->addCategory(100);
@@ -237,6 +250,16 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
   GroupBlock *groupBlock = NULL;
 
   GroupWidget* topGroup = NULL;
+
+  QString path = root.attribute("project_path","none");
+  if (path != "none") {
+    QDir dir(path);
+    if (dir.exists()) {
+      projectPath = path;
+
+    }
+    cout << "project path set to " << qPrintable(projectPath) << endl;
+  }
   /**********************************************************
    1 : getting scene and creating associated group widgets
   ***********************************************************/
@@ -252,7 +275,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
     if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));
 
     if (idUpperScene == -1) {
-      topGroup = dispatcher->createTopScene();
+      topGroup = dispatcher->createTopScene(Dispatcher::Load);
       topScene->setId(idScene);
       groupItem = topScene->getGroupItem();      
       cout << "top group added to scene n°" << idScene << endl;
@@ -260,7 +283,12 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
     else {
       cout << "trying to create scene n°" << idScene << " with upper scene n°" <<idUpperScene << endl;
       GroupScene* upperScene = searchSceneById(idUpperScene, topScene);
-      groupWidget = dispatcher->addNewEmptyGroup(upperScene,false);
+      /* IMPORTANT: calling addNewEmptyGroup() leads to create a new GroupWidget
+       *            AND a BoxItem in upperScene that represents the GroupItem in the
+       *            newly created child scene. Thus, it has not to be created when
+       *            reading bi_group tags in the following but just searched
+       */
+      groupWidget = dispatcher->addNewEmptyGroup(Dispatcher::Load, upperScene,false);
       groupWidget->getScene()->setId(idScene);
       groupItem = groupWidget->getScene()->getGroupItem();      
     }
@@ -282,7 +310,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
       cout << qPrintable(groupItem->getRefBlock()->getName()) << " has upper box item in " << qPrintable(groupItem->getParentItem()->getScene()->getGroupItem()->getRefBlock()->getName()) << endl;
     }    
   }
-  dispatcher->setSceneCounter(maxIdScene+1);
+  dispatcher->setSceneCounter(Dispatcher::Load, maxIdScene+1);
   cout << "groupItems loaded and windows created succefully!" << endl;
 
   /**********************************************************
@@ -305,7 +333,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
       cout << "top scene has " << sourceNodes.length() << " sources" << endl;
       for(int j=0; j<sourceNodes.length(); j++) {
         QDomElement currentSBNode = sourceNodes.at(j).toElement();      
-        SourceItem* sourceItem = new SourceItem(dispatcher,this);
+        StimuliItem* sourceItem = new StimuliItem(dispatcher,this);
         try {
           sourceItem->load(currentSBNode);
         }
@@ -314,7 +342,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
         }
         cout << "source item has been read, add it to the scene" << endl;
         // add the block to the GroupScene
-        currentScene->addSourceItem(sourceItem);
+        currentScene->addStimuliItem(sourceItem);
       } 
     }
     /**********************************************************
@@ -437,7 +465,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
     InterfaceItem *iface2 = searchInterfaceItemById(to,topScene);
 
     if(iface1 != NULL && iface2 != NULL){
-      dispatcher->createConnection(iface1,iface2);
+      dispatcher->createConnection(Dispatcher::Load, iface1,iface2);
     } else {
       cout << "interfaces not found, connect canceled!" << endl;
     }
@@ -457,23 +485,25 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
     QString paramsStr = currentModifierNode.attribute("params","none");
     if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));
 
-    AbstractInputModifier* mod = NULL;
-    if (typeStr == "delay") {
-      int delay = paramsStr.toInt(&ok);
-      if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));
-      mod = new DelayInputModifier(delay);
-    }
-
     /* NB: just adding delays for now. To be cont'd */
     InterfaceItem *iface = searchInterfaceItemById(id,topScene);
 
-    if(iface != NULL ) {
-      iface->refInter->setInputModifier(mod);
+    if ((iface == NULL ) || (iface->refInter == NULL) || (iface->refInter->getAssociatedIface() == NULL)) {
+      cout << "modified interface not found, modifiers setup canceled!" << endl;
+    }
+    else {
+      ConnectedInterface* connIface = AI_TO_CON(iface->refInter->getAssociatedIface());
 
-    } else {
-      cout << "interfaces not found, modifiers setup canceled!" << endl;
+      AbstractInputModifier* mod = NULL;
+      if (typeStr == "delay") {
+        int delay = paramsStr.toInt(&ok);
+        if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));
+        mod = new DelayInputModifier(connIface, delay);
+        connIface->setInputModifier(mod);
+      }
     }
   }
+
   cout << "modifiers loaded and created succefully!" << endl;
 
   return topGroup;
@@ -552,10 +582,27 @@ void Parameters::loadBlastConfiguration(QString confFile) throw(Exception) {
     implPathes.append(path);
     cout << "impl path : " << qPrintable(path) << endl << endl;
   }
+
+  QDomElement eltSource = eltImpl.nextSiblingElement("sources");
+  nbPathesStr = eltSource.attribute("nb","none");
+  nbPathes = nbPathesStr.toInt(&ok);
+  QDomNodeList listSourceDir = eltSource.elementsByTagName("source_lib");
+  if ((!ok) || (nbPathes != listSourceDir.size())) throw(Exception(CONFIGFILE_CORRUPTED));
+
+  for(int i=0;i<listSourceDir.size();i++) {
+    QDomNode nodeSourceDir = listSourceDir.at(i);
+    QDomElement eltSourceDir = nodeSourceDir.toElement();
+    if (eltSourceDir.isNull()) throw(Exception(CONFIGFILE_CORRUPTED));
+    QString path = eltSourceDir.attribute("path","none");
+    if (path == "none") throw(Exception(CONFIGFILE_CORRUPTED));
+    sourcePathes.append(path);
+    cout << "core path : " << qPrintable(path) << endl << endl;
+  }
+
   // getting elt = the element <defaults>
   // for each child element, initialize the associated attributes of Parameters
 
-  QDomElement eltDefaults = eltImpl.nextSiblingElement("defaults");
+  QDomElement eltDefaults = eltSource.nextSiblingElement("defaults");
 
   QDomElement eltBlocks = eltDefaults.firstChildElement("blocks");
   QString attributeStr = eltBlocks.attribute("width", "none");
@@ -785,6 +832,22 @@ void Parameters::loadImplementationsFromXml() throw(Exception) {
       QString refXml = implRoot.attribute("ref_name","none");
       QString refMd5 = implRoot.attribute("ref_md5","none");
       BlockImplementation* impl = new BlockImplementation(fileName,refXml,refMd5);
+
+      QDomNodeList archNode = implRoot.elementsByTagName("architecture");
+
+      if (archNode.isEmpty()) {
+        cout << "impl has no architecture" << endl;
+        return;
+      }
+      QDomElement archElt = archNode.at(0).toElement();
+      QString compList = archElt.attribute("comp_list","none");
+      if (compList != "none") {
+        QStringList compos = compList.split(",");
+        foreach(QString s, compos) {
+          impl->addResource(s);
+        }
+      }
+
       try {
         impl->loadPatterns(implRoot);
       }
@@ -886,6 +949,74 @@ void Parameters::saveImplementationsToLib() throw(Exception) {
   libFile.close();
 
 }
+
+
+void Parameters::loadSources() throw(Exception) {
+
+  for(int i=0;i<sourcePathes.size();i++) {
+    cout << "analyzing " << qPrintable(sourcePathes.at(i)) << endl;
+    QDir dir(sourcePathes.at(i));
+    QStringList filter;
+    filter << "*.vhd" << "*.ngc";
+    dir.setNameFilters(filter);
+    QStringList list = dir.entryList();
+    for(int j=0;j<list.size();j++) {
+      QString fileName = dir.absolutePath();
+      fileName.append("/"+list.at(j));
+
+      if (list.at(j).endsWith(".ngc")) {
+        QString netName = list.at(j);
+        netName.truncate(list.at(j).size() -4);
+        cout << "found netlist " << qPrintable(netName) << endl;
+        availableResources.append(new ExternalResource(netName,fileName,ExternalResource::Netlist));
+      }
+      else {
+        cout << "parsing " << qPrintable(fileName) << " ... ";
+        QFile srcXML(fileName);
+        if (!srcXML.open(QIODevice::ReadOnly)) {
+          throw(Exception(IMPLFILE_NOACCESS));
+        }
+        QTextStream in(&srcXML);
+
+        QString line = in.readLine();
+        while (!line.isNull()) {
+          if (line.contains("package", Qt::CaseInsensitive)) {
+            QRegularExpression rxPack("^package (.+) is$",QRegularExpression::CaseInsensitiveOption);
+            QRegularExpressionMatch matchPack = rxPack.match(line);
+            if (matchPack.hasMatch()) {
+              QString packName = matchPack.captured(1);
+              cout << "found package " << qPrintable(packName) << endl;
+              availableResources.append(new ExternalResource(packName,fileName,ExternalResource::Package));
+            }
+          }
+          else if (line.contains("entity", Qt::CaseInsensitive)) {
+            QRegularExpression rxEnt("^entity (.+) is$",QRegularExpression::CaseInsensitiveOption);
+            QRegularExpressionMatch matchEnt = rxEnt.match(line);
+            if (matchEnt.hasMatch()) {
+              QString entityName = matchEnt.captured(1);
+              cout << "found entity " << qPrintable(entityName) << endl;
+              availableResources.append(new ExternalResource(entityName,fileName,ExternalResource::Code));
+            }
+          }
+          line = in.readLine();
+        }
+        srcXML.close();
+        cout << "OK" << endl;
+      }
+    }
+  }
+}
+
+QList<ExternalResource *> Parameters::searchResourceByName(const QString& name) {
+  QList<ExternalResource*> listRes;
+  foreach(ExternalResource* s, availableResources) {
+    if (s->getName() == name) {
+      listRes.append(s);
+    }
+  }
+  return listRes;
+}
+
 void Parameters::addAvailableBlock(ReferenceBlock *block) {
   availableBlocks.append(block);
   foreach (int id,block->getCategories()) {
@@ -1092,8 +1223,13 @@ void Parameters::setArrowPathes() {
   _inArrow.lineTo(arrowLineLength+arrowWidth,-arrowHeight/2);
   _inArrow.lineTo(arrowLineLength+arrowWidth,arrowHeight/2);
   _inArrow.lineTo(arrowLineLength,0);
-  _inArrow.closeSubpath();
-  inArrow = _inArrow;
+  //_inArrow.closeSubpath();
+  dataArrowIn = _inArrow;
+
+  QPainterPath _inArrowC;
+  _inArrowC.lineTo(arrowLineLength,0);
+  _inArrowC.addEllipse(arrowLineLength,-arrowHeight/2,arrowHeight-1,arrowHeight-1);
+  clkrstArrow = _inArrowC;
 
   QPainterPath _outArrow;
   _outArrow.lineTo(arrowLineLength,0);
@@ -1101,8 +1237,8 @@ void Parameters::setArrowPathes() {
   _outArrow.lineTo(arrowLineLength+arrowWidth,0);
   _outArrow.lineTo(arrowLineLength,arrowHeight/2);
   _outArrow.lineTo(arrowLineLength,0);
-  _outArrow.closeSubpath();
-  outArrow = _outArrow;
+  //_outArrow.closeSubpath();
+  dataArrowOut = _outArrow;
 
 }
 
@@ -1175,7 +1311,7 @@ InterfaceItem* Parameters::searchInterfaceItemById(int id, GroupScene* scene) {
     }
   }
   if (scene->isTopScene()) {
-    foreach(SourceItem *block, scene->getSourceItems()){
+    foreach(StimuliItem *block, scene->getSourceItems()){
       foreach(InterfaceItem *item, block->getInterfaces()){
         if(item->getId() == id){
           return item;
@@ -1197,3 +1333,10 @@ InterfaceItem* Parameters::searchInterfaceItemById(int id, GroupScene* scene) {
   }
   return NULL;
 }
+
+QString Parameters::normalizeName(const QString &name) {
+  QString s = name;
+  s.replace(QRegularExpression("[^a-zA-Z0-9_]"),"_");
+  s.replace(QRegularExpression("[_]+"),"_");
+  return s;
+}