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

Private GIT Repository
correct bug with clkrstgen
[blast.git] / Parameters.cpp
index c12fead572453807169c5e905bab6592a6c2e07b..c60a927cf26715e20991f9d3559bc2c29a7c83f8 100644 (file)
@@ -9,6 +9,7 @@
 #include "GroupScene.h"\r
 #include "GroupItem.h"\r
 #include "BoxItem.h"\r
 #include "GroupScene.h"\r
 #include "GroupItem.h"\r
 #include "BoxItem.h"\r
+#include "SourceItem.h"\r
 #include "InterfaceItem.h"\r
 #include "ConnectionItem.h"\r
 \r
 #include "InterfaceItem.h"\r
 #include "ConnectionItem.h"\r
 \r
 #include "Exception.h"\r
 #include "BlocksToConfigureWidget.h"\r
 \r
 #include "Exception.h"\r
 #include "BlocksToConfigureWidget.h"\r
 \r
+#include "BlockParameterGeneric.h"\r
+\r
+#include "DelayInputModifier.h"\r
+\r
 Parameters::Parameters() {\r
   categoryTree = NULL;\r
   arrowWidth = 5;\r
 Parameters::Parameters() {\r
   categoryTree = NULL;\r
   arrowWidth = 5;\r
@@ -76,10 +81,60 @@ ReferenceBlock* Parameters::getReferenceBlock(int idCategory, int idBlock) {
   BlockCategory* blockCat = categoryTree->searchCategory(idCategory);\r
 \r
   if (blockCat == NULL) return NULL;\r
   BlockCategory* blockCat = categoryTree->searchCategory(idCategory);\r
 \r
   if (blockCat == NULL) return NULL;\r
-  ReferenceBlock* ref = blockCat->getBlock(idBlock);\r
+  ReferenceBlock* ref = blockCat->getBlockById(idBlock);\r
   return ref;\r
 }\r
 \r
   return ref;\r
 }\r
 \r
+ReferenceBlock* Parameters::getHiddenReferenceBlock(QString blockName) {\r
+\r
+  BlockCategory* blockCat = categoryTree->searchCategory(100);\r
+  if (blockCat == NULL) return NULL;\r
+  ReferenceBlock* ref = blockCat->getBlockByName(blockName);\r
+  return ref;\r
+}\r
+\r
+void Parameters::createDelayBlock() {\r
+  delayRef = new ReferenceBlock("no.xml");\r
+  delayRef->addCategory(100);\r
+  delayRef->setName("delay");\r
+\r
+  BlockCategory* cat = categoryTree->searchCategory(100);\r
+  cat->blocks.append(delayRef);\r
+\r
+  AbstractInterface* interIn = new ReferenceInterface(delayRef,"data_in",AbstractInterface::Input, AbstractInterface::Data, "expression","$in_width");\r
+  delayRef->addInterface(interIn);\r
+  AbstractInterface* interInCtl = new ReferenceInterface(delayRef,"data_in_enb",AbstractInterface::Input, AbstractInterface::Control, "boolean","1");\r
+  delayRef->addInterface(interInCtl);\r
+  interInCtl->setAssociatedIface(interIn);\r
+  AbstractInterface* interOut = new ReferenceInterface(delayRef,"data_out",AbstractInterface::Output, AbstractInterface::Data, "expression","$in_width");\r
+  delayRef->addInterface(interOut);\r
+  AbstractInterface* interOutCtl = new ReferenceInterface(delayRef,"data_out_enb",AbstractInterface::Output, AbstractInterface::Control, "boolean","1");\r
+  delayRef->addInterface(interOutCtl);\r
+  interOutCtl->setAssociatedIface(interOut);\r
+  BlockParameter* param1 = new BlockParameterGeneric(delayRef,"in_width","natural","8");\r
+  BlockParameter* param2 = new BlockParameterGeneric(delayRef,"dly_length","natural","1");\r
+  delayRef->addParameter(param1);\r
+  delayRef->addParameter(param2);\r
+  delayImpl = new BlockImplementation("no.xml");\r
+  delayImpl->setDelta("1");\r
+  QHash<QString,QString> consPattern;\r
+  consPattern.insert("data_in_enb","1");\r
+  delayImpl->setConsumptionPattern(consPattern);\r
+  QHash<QString,QString> prodPattern;\r
+  prodPattern.insert("data_out_enb","O{$dly_length}1");\r
+  delayImpl->setProductionPattern(prodPattern);\r
+  delayImpl->setProductionCounter("1");\r
+  delayRef->addImplementation(delayImpl);\r
+  delayImpl->setReference(delayRef);\r
+  if (! delayImpl->checkPatterns()) {\r
+    cout << "Delay block creation: failure" << endl;\r
+  }\r
+  else {\r
+    cout << "Delay block creation: success" << endl;\r
+  }\r
+\r
+}\r
+\r
 \r
 \r
 void Parameters::validateXmlFile(const QString& xmlFileName, const QString& xsdFileName, XmlFileType fileType) throw(Exception) {\r
 \r
 \r
 void Parameters::validateXmlFile(const QString& xmlFileName, const QString& xsdFileName, XmlFileType fileType) throw(Exception) {\r
@@ -190,6 +245,16 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
   GroupBlock *groupBlock = NULL;\r
 \r
   GroupWidget* topGroup = NULL;\r
   GroupBlock *groupBlock = NULL;\r
 \r
   GroupWidget* topGroup = NULL;\r
+\r
+  QString path = root.attribute("project_path","none");\r
+  if (path != "none") {\r
+    QDir dir(path);\r
+    if (dir.exists()) {\r
+      projectPath = path;\r
+\r
+    }\r
+    cout << "project path set to " << qPrintable(projectPath) << endl;\r
+  }\r
   /**********************************************************\r
    1 : getting scene and creating associated group widgets\r
   ***********************************************************/\r
   /**********************************************************\r
    1 : getting scene and creating associated group widgets\r
   ***********************************************************/\r
@@ -232,6 +297,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
     if (idUpperScene != -1) {\r
       groupWidget->setWindowTitle(groupBlock->getName());\r
       groupWidget->show();\r
     if (idUpperScene != -1) {\r
       groupWidget->setWindowTitle(groupBlock->getName());\r
       groupWidget->show();\r
+      cout << qPrintable(groupItem->getRefBlock()->getName()) << " has upper box item in " << qPrintable(groupItem->getParentItem()->getScene()->getGroupItem()->getRefBlock()->getName()) << endl;\r
     }    \r
   }\r
   dispatcher->setSceneCounter(maxIdScene+1);\r
     }    \r
   }\r
   dispatcher->setSceneCounter(maxIdScene+1);\r
@@ -249,7 +315,29 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
     GroupScene *currentScene = searchSceneById(idScene,topScene);\r
 \r
     if(currentScene == NULL) throw(Exception(PROJECTFILE_CORRUPTED));\r
     GroupScene *currentScene = searchSceneById(idScene,topScene);\r
 \r
     if(currentScene == NULL) throw(Exception(PROJECTFILE_CORRUPTED));\r
-\r
+    /**********************************************************\r
+     2.1 : getting sources if it is top scene\r
+    ***********************************************************/\r
+    if (currentScene->isTopScene()) {\r
+      QDomNodeList sourceNodes = currentSceneNode.elementsByTagName("source_item");\r
+      cout << "top scene has " << sourceNodes.length() << " sources" << endl;\r
+      for(int j=0; j<sourceNodes.length(); j++) {\r
+        QDomElement currentSBNode = sourceNodes.at(j).toElement();      \r
+        SourceItem* sourceItem = new SourceItem(dispatcher,this);\r
+        try {\r
+          sourceItem->load(currentSBNode);\r
+        }\r
+        catch(Exception err) {\r
+          throw(err);\r
+        }\r
+        cout << "source item has been read, add it to the scene" << endl;\r
+        // add the block to the GroupScene\r
+        currentScene->addSourceItem(sourceItem);\r
+      } \r
+    }\r
+    /**********************************************************\r
+     2.2 : getting functional blocks\r
+    ***********************************************************/\r
     QDomNodeList functionalBlockNodes = currentSceneNode.elementsByTagName("bi_functional");\r
 \r
     for(int j=0; j<functionalBlockNodes.length(); j++) {\r
     QDomNodeList functionalBlockNodes = currentSceneNode.elementsByTagName("bi_functional");\r
 \r
     for(int j=0; j<functionalBlockNodes.length(); j++) {\r
@@ -306,7 +394,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
       // get the GroupItem already created and set at phase 1\r
       GroupItem *insideGroup = searchGroupItemById(idGroup, topScene);\r
       BoxItem* upperItem = NULL;\r
       // get the GroupItem already created and set at phase 1\r
       GroupItem *insideGroup = searchGroupItemById(idGroup, topScene);\r
       BoxItem* upperItem = NULL;\r
-      if(insideGroup == NULL) cout << "group null" << endl;\r
+      if(insideGroup == NULL) cout << "group null" << endl;      \r
       // now search within the scene which BoxItem has a childItem that is = to insideGroup\r
       QList<BoxItem *> lst = currentScene->getBoxItems();\r
       foreach(BoxItem* item, lst) {\r
       // now search within the scene which BoxItem has a childItem that is = to insideGroup\r
       QList<BoxItem *> lst = currentScene->getBoxItems();\r
       foreach(BoxItem* item, lst) {\r
@@ -374,6 +462,40 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
   }\r
   cout << "connections loaded and created succefully!" << endl;\r
 \r
   }\r
   cout << "connections loaded and created succefully!" << endl;\r
 \r
+  QDomNodeList modifierNodes = root.elementsByTagName("modifier");\r
+\r
+  for(int i=0; i<modifierNodes.length(); i++){\r
+    QDomElement currentModifierNode = modifierNodes.at(i).toElement();\r
+\r
+    int id = currentModifierNode.attribute("id","none").toInt(&ok);\r
+    if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+\r
+    QString typeStr = currentModifierNode.attribute("type","none");\r
+    if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+    QString paramsStr = currentModifierNode.attribute("params","none");\r
+    if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+\r
+    /* NB: just adding delays for now. To be cont'd */\r
+    InterfaceItem *iface = searchInterfaceItemById(id,topScene);\r
+\r
+    if ((iface == NULL ) || (iface->refInter == NULL) || (iface->refInter->getAssociatedIface() == NULL)) {\r
+      cout << "modified interface not found, modifiers setup canceled!" << endl;\r
+    }\r
+    else {\r
+      ConnectedInterface* connIface = AI_TO_CON(iface->refInter->getAssociatedIface());\r
+\r
+      AbstractInputModifier* mod = NULL;\r
+      if (typeStr == "delay") {\r
+        int delay = paramsStr.toInt(&ok);\r
+        if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+        mod = new DelayInputModifier(connIface, delay);\r
+        connIface->setInputModifier(mod);\r
+      }\r
+    }\r
+  }\r
+\r
+  cout << "modifiers loaded and created succefully!" << endl;\r
+\r
   return topGroup;\r
 }\r
 \r
   return topGroup;\r
 }\r
 \r
@@ -515,7 +637,7 @@ void Parameters::loadReferencesFromXml() throw(Exception) {
       QString line = in.readLine();\r
       line = in.readLine();\r
 \r
       QString line = in.readLine();\r
       line = in.readLine();\r
 \r
-      if (!line.contains("<block>")) {\r
+      if (!line.contains("<block")) {\r
         blockXML.close();\r
         continue;\r
       }\r
         blockXML.close();\r
         continue;\r
       }\r
@@ -683,6 +805,12 @@ void Parameters::loadImplementationsFromXml() throw(Exception) {
       QString refXml = implRoot.attribute("ref_name","none");\r
       QString refMd5 = implRoot.attribute("ref_md5","none");\r
       BlockImplementation* impl = new BlockImplementation(fileName,refXml,refMd5);\r
       QString refXml = implRoot.attribute("ref_name","none");\r
       QString refMd5 = implRoot.attribute("ref_md5","none");\r
       BlockImplementation* impl = new BlockImplementation(fileName,refXml,refMd5);\r
+      try {\r
+        impl->loadPatterns(implRoot);\r
+      }\r
+      catch(int err) {\r
+        throw(err);\r
+      }\r
       availableImplementations.append(impl);\r
 \r
       ReferenceBlock* ref = NULL;\r
       availableImplementations.append(impl);\r
 \r
       ReferenceBlock* ref = NULL;\r
@@ -694,9 +822,12 @@ void Parameters::loadImplementationsFromXml() throw(Exception) {
       }\r
       if (ref == NULL) {\r
         cout << "Cannot find a reference block for impl :" << qPrintable(fileName) << endl;\r
       }\r
       if (ref == NULL) {\r
         cout << "Cannot find a reference block for impl :" << qPrintable(fileName) << endl;\r
-      }\r
-      ref->addImplementation(impl);\r
-      impl->setReference(ref);\r
+      }      \r
+      else {          \r
+        ref->addImplementation(impl);\r
+        impl->setReference(ref);\r
+        if (! impl->checkPatterns()) throw(Exception(IMPLFILE_CORRUPTED));\r
+      }      \r
       cout << "OK" << endl;\r
     }\r
   }\r
       cout << "OK" << endl;\r
     }\r
   }\r
@@ -741,8 +872,11 @@ void Parameters::loadImplementationsFromLib() throw(Exception) {
     if (ref == NULL) {\r
       cout << "Cannot find a reference block for impl :" << qPrintable(impl->getXmlFile()) << endl;\r
     }\r
     if (ref == NULL) {\r
       cout << "Cannot find a reference block for impl :" << qPrintable(impl->getXmlFile()) << endl;\r
     }\r
-    ref->addImplementation(impl);\r
-    impl->setReference(ref);\r
+    else {          \r
+      ref->addImplementation(impl);\r
+      impl->setReference(ref);\r
+      if (! impl->checkPatterns()) throw(Exception(IMPLFILE_CORRUPTED));\r
+    }\r
   }\r
   libFile.close();\r
 }\r
   }\r
   libFile.close();\r
 }\r
@@ -933,6 +1067,35 @@ void Parameters::save(QString confFile) {
     }\r
 \r
     writer.writeEndElement();    //</connections>\r
     }\r
 \r
     writer.writeEndElement();    //</connections>\r
+\r
+    QList<InterfaceItem *> lstIfaceItem;\r
+    // search for modifiers\r
+    foreach(ConnectionItem* item, allConnections) {\r
+      InterfaceItem* fromIfaceItem = item->getFromInterfaceItem();\r
+      AbstractInputModifier* mod = fromIfaceItem->refInter->getInputModifier();\r
+      if (mod != NULL) {\r
+        if (!lstIfaceItem.contains(fromIfaceItem)) lstIfaceItem.append(fromIfaceItem);\r
+      }\r
+      InterfaceItem* toIfaceItem = item->getToInterfaceItem();\r
+      mod = toIfaceItem->refInter->getInputModifier();\r
+      if (mod != NULL) {\r
+        if (!lstIfaceItem.contains(toIfaceItem)) lstIfaceItem.append(toIfaceItem);\r
+      }\r
+    }\r
+    // write input modifiers\r
+    writer.writeStartElement("modifiers");\r
+    foreach(InterfaceItem* item, lstIfaceItem) {\r
+      AbstractInputModifier* mod = item->refInter->getInputModifier();\r
+      if (mod != NULL) {\r
+        writer.writeStartElement("modifier");\r
+        writer.writeAttribute("id", QString::number(item->getId()));\r
+        writer.writeAttribute("type",mod->getTypeStr());\r
+        writer.writeAttribute("params", mod->getParametersStr());\r
+        writer.writeEndElement();\r
+      }\r
+    }\r
+\r
+    writer.writeEndElement();    //</modifiers>\r
     writer.writeEndElement();      //</blast_project\r
 \r
     writer.writeEndDocument();\r
     writer.writeEndElement();      //</blast_project\r
 \r
     writer.writeEndDocument();\r
@@ -949,8 +1112,13 @@ void Parameters::setArrowPathes() {
   _inArrow.lineTo(arrowLineLength+arrowWidth,-arrowHeight/2);\r
   _inArrow.lineTo(arrowLineLength+arrowWidth,arrowHeight/2);\r
   _inArrow.lineTo(arrowLineLength,0);\r
   _inArrow.lineTo(arrowLineLength+arrowWidth,-arrowHeight/2);\r
   _inArrow.lineTo(arrowLineLength+arrowWidth,arrowHeight/2);\r
   _inArrow.lineTo(arrowLineLength,0);\r
-  _inArrow.closeSubpath();\r
-  inArrow = _inArrow;\r
+  //_inArrow.closeSubpath();\r
+  dataArrowIn = _inArrow;\r
+\r
+  QPainterPath _inArrowC;\r
+  _inArrowC.lineTo(arrowLineLength,0);\r
+  _inArrowC.addEllipse(arrowLineLength,-arrowHeight/2,arrowHeight-1,arrowHeight-1);\r
+  clkrstArrow = _inArrowC;\r
 \r
   QPainterPath _outArrow;\r
   _outArrow.lineTo(arrowLineLength,0);\r
 \r
   QPainterPath _outArrow;\r
   _outArrow.lineTo(arrowLineLength,0);\r
@@ -958,8 +1126,8 @@ void Parameters::setArrowPathes() {
   _outArrow.lineTo(arrowLineLength+arrowWidth,0);\r
   _outArrow.lineTo(arrowLineLength,arrowHeight/2);\r
   _outArrow.lineTo(arrowLineLength,0);\r
   _outArrow.lineTo(arrowLineLength+arrowWidth,0);\r
   _outArrow.lineTo(arrowLineLength,arrowHeight/2);\r
   _outArrow.lineTo(arrowLineLength,0);\r
-  _outArrow.closeSubpath();\r
-  outArrow = _outArrow;\r
+  //_outArrow.closeSubpath();\r
+  dataArrowOut = _outArrow;\r
 \r
 }\r
 \r
 \r
 }\r
 \r
@@ -1003,6 +1171,27 @@ BoxItem* Parameters::searchBlockItemById(int id, GroupScene *scene) {
   return NULL;\r
 }\r
 \r
   return NULL;\r
 }\r
 \r
+BoxItem* Parameters::searchFunctionalBlock(AbstractBlock* block) {\r
+\r
+  return searchFunctionalBlockRecur(block,topScene);\r
+}\r
+\r
+BoxItem* Parameters::searchFunctionalBlockRecur(AbstractBlock* block, GroupScene* scene) {\r
+\r
+  foreach(BoxItem *item, scene->getBoxItems()){\r
+    if(item->getRefBlock() == block) {\r
+      return item;\r
+    }\r
+  }\r
+\r
+  BoxItem* item = NULL;\r
+  foreach(GroupScene *s, scene->getChildrenScene()) {\r
+    item = searchFunctionalBlockRecur(block,s);\r
+    if (item != NULL) return item;\r
+  }\r
+  return NULL;\r
+}\r
+\r
 InterfaceItem* Parameters::searchInterfaceItemById(int id, GroupScene* scene) {\r
 \r
   foreach(InterfaceItem *item, scene->getGroupItem()->getInterfaces()){\r
 InterfaceItem* Parameters::searchInterfaceItemById(int id, GroupScene* scene) {\r
 \r
   foreach(InterfaceItem *item, scene->getGroupItem()->getInterfaces()){\r
@@ -1010,6 +1199,15 @@ InterfaceItem* Parameters::searchInterfaceItemById(int id, GroupScene* scene) {
       return item;\r
     }\r
   }\r
       return item;\r
     }\r
   }\r
+  if (scene->isTopScene()) {\r
+    foreach(SourceItem *block, scene->getSourceItems()){\r
+      foreach(InterfaceItem *item, block->getInterfaces()){\r
+        if(item->getId() == id){\r
+          return item;\r
+        }\r
+      }\r
+    } \r
+  }\r
   foreach(BoxItem *block, scene->getBoxItems()){\r
     foreach(InterfaceItem *item, block->getInterfaces()){\r
       if(item->getId() == id){\r
   foreach(BoxItem *block, scene->getBoxItems()){\r
     foreach(InterfaceItem *item, block->getInterfaces()){\r
       if(item->getId() == id){\r