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

Private GIT Repository
clkconvert OP compute done
[blast.git] / Dispatcher.cpp
index c50270c7f91eebeaae3f519db87fc31fd39921c0..e1857c326c27322dcbf0a915c0b83bf215916a53 100644 (file)
@@ -120,11 +120,20 @@ bool Dispatcher::createConnection(Context context, InterfaceItem *iface1, Interf
   }
   if ((ok1 == true) || (ok2 == true)) {
 
-    iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2, visible);
+    cout << "trying to create a connection from " << qPrintable(ref1->getOwner()->getName()) << "/" << qPrintable(ref1->getName());
+    cout << " to " << qPrintable(ref2->getOwner()->getName()) << "/" << qPrintable(ref2->getName());
+
+    if (ok1) {
+      iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2, visible);
+    }
+    else {
+      iface2->getOwner()->getScene()->createConnectionItem(iface2,iface1, visible);
+    }
+
+    cout << " ... done." << endl;
 
     unselectAllItems(context);
-    params->unsaveModif = true;
-    cout << "created a connection from " << qPrintable(ref1->getName()) << " to " << qPrintable(ref2->getName()) << endl;
+    params->unsaveModif = true;    
     return true;
   }
   return false;
@@ -623,13 +632,12 @@ void Dispatcher::duplicateInterfaceItem(Context context, InterfaceItem *item) {
 }
 
 
-BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int idScene, QHash<QString, int> clkRstToGen) {
+void Dispatcher::addBlock(Context context, int idCategory, int idBlock, int idScene, QHash<QString, int> clkRstToGen) {
   static QString fctName = "Dispatcher::addBlock()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
-  bool newStimuli = false;
-  BoxItem* item = NULL;
+  bool newStimuli = false;  
 
   /* For now, this method is only used while designing and not loading */
   if (context == Design) {
@@ -644,7 +652,18 @@ BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int
     }
     if (newStimuli) {
       FunctionalBlock* newOne = params->getGraph()->createStimuliBlock(ref, true);
-      scene->createStimuliItem(newOne);
+      StimuliItem* item = scene->createStimuliItem(newOne);
+      QHashIterator<QString,int> iter(clkRstToGen);
+      while (iter.hasNext()) {
+        iter.next();
+        AbstractInterface* iface = newOne->getIfaceFromName(iter.key());
+        if (iface->getPurpose() == AbstractInterface::Clock) {
+          connectStimuliItemClock(context,item,iface->getName(),iter.value());
+        }
+        else if (iface->getPurpose() == AbstractInterface::Reset) {
+          connectStimuliItemReset(context,item,iface->getName(),iter.value());
+        }
+      }
     }
     else {
 
@@ -652,27 +671,24 @@ BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int
       FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref, true);
 
       // creating the box item
-      item = scene->createBoxItem(newOne);
-      if (params->autoConnMainClk) {
-        // for now just use the first one
-        QHashIterator<QString,int> iter(clkRstToGen);
-        while (iter.hasNext()) {
-          iter.next();
-          AbstractInterface* iface = newOne->getIfaceFromName(iter.key());
-          if (iface->getPurpose() == AbstractInterface::Clock) {
-            newOne->connectClock(iface->getName(), iter.value());
-          }
-          else if (iface->getPurpose() == AbstractInterface::Reset) {
-            newOne->connectReset(iface->getName(), iter.value());
-          }
+      BoxItem* item = scene->createBoxItem(newOne);
+
+      QHashIterator<QString,int> iter(clkRstToGen);
+      while (iter.hasNext()) {
+        iter.next();
+        AbstractInterface* iface = newOne->getIfaceFromName(iter.key());
+        if (iface->getPurpose() == AbstractInterface::Clock) {
+          connectBoxItemClock(context,item,iface->getName(),iter.value());
+        }
+        else if (iface->getPurpose() == AbstractInterface::Reset) {
+          connectBoxItemReset(context,item,iface->getName(),iter.value());
         }
       }
+
       params->blockToItem.insert(newOne,item);
     }
     params->unsaveModif = true;
   }
-
-  return item;
 }
 
 void Dispatcher::addClkRstGenBlock(Context context, double frequency) {
@@ -684,7 +700,7 @@ void Dispatcher::addClkRstGenBlock(Context context, double frequency) {
 
   if (context == Design) {
 
-    params->clocks.append(frequency);
+    params->getGraph()->addClock(frequency);
 
     // get the top group
     GroupBlock *group = params->getGraph()->getTopGroup();
@@ -695,7 +711,7 @@ void Dispatcher::addClkRstGenBlock(Context context, double frequency) {
     FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref, true);
 
     QString name = "clkrstgen_";
-    name += QString::number(params->clocks.size()-1);
+    name += QString::number(params->getGraph()->getClocks().size()-1);
     newOne->setName(name);
 
     // creating the box item
@@ -704,8 +720,8 @@ void Dispatcher::addClkRstGenBlock(Context context, double frequency) {
 
     ConnectedInterface* fromIfaceClk = NULL;
     ConnectedInterface* fromIfaceReset = NULL;
-    QString clkName = "ext_clk_"+QString::number(params->clocks.size()-1);
-    QString rstName = "ext_reset_"+QString::number(params->clocks.size()-1);
+    QString clkName = "ext_clk_"+QString::number(params->getGraph()->getClocks().size()-1);
+    QString rstName = "ext_reset_"+QString::number(params->getGraph()->getClocks().size()-1);
     fromIfaceClk = new GroupInterface(group,clkName, AbstractInterface::Input, AbstractInterface::Clock);
     fromIfaceReset = new GroupInterface(group,rstName, AbstractInterface::Input, AbstractInterface::Reset);
     group->addInterface(fromIfaceClk);
@@ -737,7 +753,7 @@ void Dispatcher::addClkRstGenBlock(Context context, double frequency) {
 
 
 
-GroupWidget *Dispatcher::createTopScene(Context context){
+GroupWidget *Dispatcher::createTopScene(Context context, double mainClock){
   static QString fctName = "Dispatcher::createTopScene()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
@@ -748,7 +764,8 @@ GroupWidget *Dispatcher::createTopScene(Context context){
     createIfaces = false;
   }
   // creating the graph and thus, the topgroup
-  Graph* graph = params->createGraph(createIfaces);
+  Graph* graph = params->initGraph(createIfaces);
+  graph->addClock(mainClock);
   // get the top group
   GroupBlock *topBlock = graph->getTopGroup();
   // creating the top group widget
@@ -771,8 +788,8 @@ GroupWidget *Dispatcher::createTopScene(Context context){
 
   if (context == Design) {
     // create clkrstgen
-    double freq = params->clocks.at(0);
-    params->clocks.clear();
+    double freq = params->getGraph()->getClock(0);
+    params->getGraph()->resetClocks();
     addClkRstGenBlock(context,freq);
   }
 
@@ -1258,6 +1275,122 @@ void Dispatcher::removeConnection(Context context, ConnectionItem *connItem) {
   }
 }
 
+void Dispatcher::connectBoxItemClock(Context context, BoxItem *item, QString clkName, int idGen) throw(Exception) {
+
+  InterfaceItem* fromIfaceItemClk = NULL;
+  InterfaceItem* toIfaceItemClk = item->searchInterfaceItemByName(clkName);
+  GroupItem* parentGroup = item->getScene()->getGroupItem();
+  BoxItem* clkrstItem = NULL;
+
+  if (parentGroup->getRefBlock()->isTopGroupBlock()) {
+    QString genName = "clkrstgen_" + QString::number(idGen);
+    clkrstItem = item->getScene()->searchBoxItemByName(genName);
+    if (clkrstItem == NULL) {
+      throw(Exception(IFACE_TOP_NOCLKRSTGEN));
+    }
+    else {
+      fromIfaceItemClk = clkrstItem->searchInterfaceItemByName("clk");
+    }
+    cout << "connecting clock of " << qPrintable(item->getRefBlock()->getName()) << " to clk of " << qPrintable(genName) << endl;
+  }
+  else {
+    // searching for ext_clk_idGen
+    QString name = "ext_clk_"+QString::number(idGen);
+    fromIfaceItemClk = parentGroup->searchInterfaceItemByName(name);
+    cout << "connecting clock of " << qPrintable(item->getRefBlock()->getName()) << " to " << qPrintable(name) << " of parent group " << qPrintable(parentGroup->getRefBlock()->getName()) << endl;
+  }
+
+  if (fromIfaceItemClk == NULL) {
+    throw(Exception(IFACE_GROUP_NOCLKRST));
+  }
+  else {
+    createConnection(context, fromIfaceItemClk, toIfaceItemClk, false);
+    cout << "connection done."  << endl;
+  }
+}
+
+void Dispatcher::connectBoxItemReset(Context context, BoxItem *item, QString rstName, int idGen) throw(Exception) {
+  InterfaceItem* fromIfaceItemRst = NULL;
+  InterfaceItem* toIfaceItemRst = item->searchInterfaceItemByName(rstName);
+  GroupItem* parentGroup = item->getScene()->getGroupItem();
+  BoxItem* clkrstItem = NULL;
+
+  if (parentGroup->getRefBlock()->isTopGroupBlock()) {
+    QString genName = "clkrstgen_" + QString::number(idGen);
+    clkrstItem = item->getScene()->searchBoxItemByName(genName);
+    if (clkrstItem == NULL) {
+      throw(Exception(IFACE_TOP_NOCLKRSTGEN));
+    }
+    else {
+      fromIfaceItemRst = clkrstItem->searchInterfaceItemByName("reset");
+    }
+    cout << "connecting reset of " << qPrintable(item->getRefBlock()->getName()) << " to reset of " << qPrintable(genName) << endl;
+  }
+  else {
+    // searching for ext_rst_idGen
+    QString name = "ext_rst_"+QString::number(idGen);
+    fromIfaceItemRst = parentGroup->searchInterfaceItemByName(name);
+    cout << "connecting reset of " << qPrintable(item->getRefBlock()->getName()) << " to " << qPrintable(name) << " of parent group " << qPrintable(parentGroup->getRefBlock()->getName()) << endl;
+  }
+
+  if (fromIfaceItemRst == NULL) {
+    throw(Exception(IFACE_GROUP_NOCLKRST));
+  }
+  else {
+    createConnection(context, fromIfaceItemRst, toIfaceItemRst, false);
+    cout << "connection done."  << endl;
+  }
+}
+
+void Dispatcher::connectStimuliItemClock(Context context, StimuliItem *item, QString clkName, int idGen) throw(Exception) {
+  InterfaceItem* fromIfaceItemClk = NULL;
+  InterfaceItem* toIfaceItemClk = item->searchInterfaceItemByName(clkName);
+  BoxItem* clkrstItem = NULL;
+
+  QString genName = "clkrstgen_" + QString::number(idGen);
+  clkrstItem = item->getScene()->searchBoxItemByName(genName);
+  if (clkrstItem == NULL) {
+    throw(Exception(IFACE_TOP_NOCLKRSTGEN));
+  }
+  else {
+    fromIfaceItemClk = clkrstItem->searchInterfaceItemByName("clk");
+  }
+  cout << "connecting clock of " << qPrintable(item->getRefBlock()->getName()) << " to clock of " << qPrintable(genName) << endl;
+
+  if (fromIfaceItemClk == NULL) {
+    throw(Exception(IFACE_GROUP_NOCLKRST));
+  }
+  else {
+    createConnection(context, fromIfaceItemClk, toIfaceItemClk, false);
+    cout << "connection done."  << endl;
+  }
+}
+
+void Dispatcher::connectStimuliItemReset(Context context, StimuliItem *item, QString rstName, int idGen) throw(Exception) {
+  InterfaceItem* fromIfaceItemRst = NULL;
+  InterfaceItem* toIfaceItemRst = item->searchInterfaceItemByName(rstName);
+  BoxItem* clkrstItem = NULL;
+
+  QString genName = "clkrstgen_" + QString::number(idGen);
+  clkrstItem = item->getScene()->searchBoxItemByName(genName);
+  if (clkrstItem == NULL) {
+    throw(Exception(IFACE_TOP_NOCLKRSTGEN));
+  }
+  else {
+    fromIfaceItemRst = clkrstItem->searchInterfaceItemByName("reset");
+  }
+  cout << "connecting reset of " << qPrintable(item->getRefBlock()->getName()) << " to reset of " << qPrintable(genName) << endl;
+
+  if (fromIfaceItemRst == NULL) {
+    throw(Exception(IFACE_GROUP_NOCLKRST));
+  }
+  else {
+    createConnection(context, fromIfaceItemRst, toIfaceItemRst, false);
+    cout << "connection done."  << endl;
+  }
+}
+
+
 void Dispatcher::showBlocksLibrary(){
   cout << "showing block library" << endl;
   mainWindow->getLibrary()->show();