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

Private GIT Repository
finished testbench generation
[blast.git] / Dispatcher.cpp
index 266160b12b4eba2a89824487e44f911c00095eec..574243ef2a2287fec1e5cf03a0e559bbc50c2cc3 100644 (file)
@@ -100,7 +100,16 @@ void Dispatcher::setSceneCounter(Context context, int value) {
 }
 
 bool Dispatcher::createConnection(Context context, InterfaceItem *iface1, InterfaceItem *iface2, bool visible) {
-    
+  static QString fctName = "Dispatcher::createConnection()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
+
+  bool testClock = false;
+  if (context == Design) {
+    testClock = true;
+  }
+
   ConnectedInterface* ref1 = iface1->refInter;
   ConnectedInterface* ref2 = iface2->refInter;  
   // connect both interface
@@ -108,30 +117,33 @@ bool Dispatcher::createConnection(Context context, InterfaceItem *iface1, Interf
   bool ok1 = false;
   bool ok2 = false;
 
+  cout << "trying to create a connection between " << qPrintable(ref1->getOwner()->getName()) << "/" << qPrintable(ref1->getName());
+  cout << " and " << qPrintable(ref2->getOwner()->getName()) << "/" << qPrintable(ref2->getName());
+
   // test the ref1->ref2 connection
-  if ((ref1->canConnectTo(ref2)) && (ref2->canConnectFrom(ref1))) {
+  if ((ref1->canConnectTo(ref2,testClock)) && (ref2->canConnectFrom(ref1,testClock))) {
     ref1->connectTo(ref2);    
     ok1 = true;
   }
   // if the first one did not work, test ref2->ref1
-  if ((ok1 == false) && (ref2->canConnectTo(ref1)) && (ref1->canConnectFrom(ref2))) {  
+  if ((ok1 == false) && (ref2->canConnectTo(ref1,testClock)) && (ref1->canConnectFrom(ref2,testClock))) {
     ref2->connectTo(ref1);    
     ok2 = true;
   }
   if ((ok1 == true) || (ok2 == true)) {    
 
     if (ok1) {
-      cout << "trying to create a connection from " << qPrintable(ref1->getOwner()->getName()) << "/" << qPrintable(ref1->getName());
+      cout << " ... done with " << qPrintable(ref1->getOwner()->getName()) << "/" << qPrintable(ref1->getName());
       cout << " to " << qPrintable(ref2->getOwner()->getName()) << "/" << qPrintable(ref2->getName());
       iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2, visible);
     }
     else {
-      cout << "trying to create a connection from " << qPrintable(ref2->getOwner()->getName()) << "/" << qPrintable(ref2->getName());
+      cout << "... done with " << qPrintable(ref2->getOwner()->getName()) << "/" << qPrintable(ref2->getName());
       cout << " to " << qPrintable(ref1->getOwner()->getName()) << "/" << qPrintable(ref1->getName());
       iface2->getOwner()->getScene()->createConnectionItem(iface2,iface1, visible);
     }
 
-    cout << " ... done." << endl;
+    cout << endl;
 
     unselectAllItems(context);
     params->unsaveModif = true;    
@@ -200,6 +212,12 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
 
   QDir baseDir(params->projectPath);
   QDir srcDir(params->projectPath+"/src");
@@ -304,6 +322,12 @@ void Dispatcher::generateBlockVHDL(Context context, BoxItem *item){
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
 
   if (item->getRefBlock()->isFunctionalBlock()) {
     FunctionalBlock* block = AB_TO_FUN(item->getRefBlock());
@@ -321,6 +345,12 @@ void Dispatcher::renameFunctionalBlock(Context context, BoxItem *item){
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
     
   GroupWidget* win = item->getScene()->getGroupWidget();
   
@@ -360,6 +390,12 @@ void Dispatcher::renameGroupBlock(Context context, GroupItem *item){
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
   
   GroupWidget* win = item->getScene()->getGroupWidget();
   
@@ -406,6 +442,12 @@ void Dispatcher::renameStimuliItem(Context context, StimuliItem *item){
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
     
   GroupWidget* win = item->getScene()->getGroupWidget();
   
@@ -446,6 +488,11 @@ void Dispatcher::renameInterface(Context context, InterfaceItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
 
   GroupWidget* win = item->getOwner()->getScene()->getGroupWidget();
   
@@ -490,6 +537,12 @@ void Dispatcher::showPatterns(Context context, InterfaceItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
   QString msg = "";
   if (item->refInter->getDirection() == AbstractInterface::Input) {
     msg = "Input pattern of iface ";
@@ -534,6 +587,12 @@ void Dispatcher::showModifier(Context context, InterfaceItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
   QString msg = "";
   ConnectedInterface* assoIface = AI_TO_CON(item->refInter->getAssociatedIface());
   AbstractInputModifier* mod = assoIface->getInputModifier();
@@ -551,10 +610,16 @@ void Dispatcher::showModifier(Context context, InterfaceItem *item) {
 }
 
 void Dispatcher::removeModifier(Context context, InterfaceItem *item) {
-  static QString fctName = "Dispatcher::showModifier()";
+  static QString fctName = "Dispatcher::removeModifier()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
 
   ConnectedInterface* assoIface = AI_TO_CON(item->refInter->getAssociatedIface());
   assoIface->clearInputModifier();
@@ -566,6 +631,12 @@ void Dispatcher::duplicateBoxItem(Context context, BoxItem *item){
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
 
   GroupScene *scene = item->getScene();
   AbstractBlock* block = item->getRefBlock();  
@@ -589,6 +660,12 @@ void Dispatcher::duplicateStimuliItem(Context context, StimuliItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
 
   GroupScene *scene = item->getScene();
   AbstractBlock* block = item->getRefBlock();  
@@ -612,6 +689,12 @@ void Dispatcher::duplicateInterfaceItem(Context context, InterfaceItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
 
   AbstractInterface *refI = item->refInter;
   if (! refI->isFunctionalInterface()) return;
@@ -1106,8 +1189,11 @@ void Dispatcher::removeBoxItem(Context context, BoxItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
-
-  if (context != Design) return;
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
 
   /* a BoxItem (group of func) can be removed only if none of its
      interfaces is connected to a group interface that is itself
@@ -1182,6 +1268,11 @@ void Dispatcher::removeAllBlockConnections(Context context, AbstractBoxItem *ite
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " <<qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
 
   foreach(InterfaceItem* ifaceItem, item->getInterfaces()) {
     foreach(ConnectionItem* conn, ifaceItem->connections) {
@@ -1195,6 +1286,11 @@ void Dispatcher::removeStimuliItem(Context context, StimuliItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " <<qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
   
   QString msg = "Removing stimmuli ";
   
@@ -1218,6 +1314,12 @@ void Dispatcher::removeConnection(Context context, ConnectionItem *connItem) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " <<qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
   InterfaceItem* fromIfaceItem = connItem->getFromInterfaceItem();
   InterfaceItem* toIfaceItem = connItem->getToInterfaceItem();
 
@@ -1291,6 +1393,16 @@ void Dispatcher::removeConnection(Context context, ConnectionItem *connItem) {
 
 void Dispatcher::connectBoxItemClock(Context context, BoxItem *item, QString clkName, int idGen) throw(Exception) {
 
+  static QString fctName = "Dispatcher::connectBoxItemClock()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " <<qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
   InterfaceItem* fromIfaceItemClk = NULL;
   InterfaceItem* toIfaceItemClk = item->searchInterfaceItemByName(clkName);
   GroupItem* parentGroup = item->getScene()->getGroupItem();
@@ -1324,6 +1436,17 @@ void Dispatcher::connectBoxItemClock(Context context, BoxItem *item, QString clk
 }
 
 void Dispatcher::connectBoxItemReset(Context context, BoxItem *item, QString rstName, int idGen) throw(Exception) {
+
+  static QString fctName = "Dispatcher::connectBoxItemReset()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " <<qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
   InterfaceItem* fromIfaceItemRst = NULL;
   InterfaceItem* toIfaceItemRst = item->searchInterfaceItemByName(rstName);
   GroupItem* parentGroup = item->getScene()->getGroupItem();
@@ -1357,6 +1480,17 @@ void Dispatcher::connectBoxItemReset(Context context, BoxItem *item, QString rst
 }
 
 void Dispatcher::connectStimuliItemClock(Context context, StimuliItem *item, QString clkName, int idGen) throw(Exception) {
+
+  static QString fctName = "Dispatcher::connectStimuliItemClock()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " <<qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
   InterfaceItem* fromIfaceItemClk = NULL;
   InterfaceItem* toIfaceItemClk = item->searchInterfaceItemByName(clkName);
   BoxItem* clkrstItem = NULL;
@@ -1381,6 +1515,16 @@ void Dispatcher::connectStimuliItemClock(Context context, StimuliItem *item, QSt
 }
 
 void Dispatcher::connectStimuliItemReset(Context context, StimuliItem *item, QString rstName, int idGen) throw(Exception) {
+  static QString fctName = "Dispatcher::connectStimuliItemReset()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " <<qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
   InterfaceItem* fromIfaceItemRst = NULL;
   InterfaceItem* toIfaceItemRst = item->searchInterfaceItemByName(rstName);
   BoxItem* clkrstItem = NULL;
@@ -1412,6 +1556,17 @@ void Dispatcher::showBlocksLibrary(){
 }
 
 void Dispatcher::showProperties(Context context, InterfaceItem *inter) {
+
+  static QString fctName = "Dispatcher::showProperties()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " <<qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
   QDialog* dial = new InterfacePropertiesDialog(inter);
   dial->exec();
 }
@@ -1424,6 +1579,16 @@ void Dispatcher::showProperties(Context context, InterfaceItem *inter) {
 */
 void Dispatcher::connectInterToGroup(Context context, InterfaceItem *item){
 
+  static QString fctName = "Dispatcher::connectInterToGroup()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " <<qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
+
   // getting the GroupBlock and GroupItem that are parent of the block that owns item
   ConnectedInterface *refInter = item->refInter;
   cout << "owner of iface = " << qPrintable(refInter->getOwner()->getName()) << endl;
@@ -1445,7 +1610,12 @@ void Dispatcher::connectInterToGroup(Context context, InterfaceItem *item){
   parentItem->addInterfaceItem(groupIfaceItem,true);
 
   // creating the connection, in graph and with an item
-  createConnection(context, item, groupIfaceItem);
+  /* NOTE:
+     Since the group interface is for now unconnected, it is impossible to determine
+     its clock domain. Thus, the connection must be created without testing the clock domain
+     consistency. For that, we cheat by changing the context to Load because it implies no clock test.
+   */
+  createConnection(Load, item, groupIfaceItem);
 
   // if groupItem is not topGroup, must also add a new interface to the parent BlockItem
   BoxItem* parent2Item = parentItem->getParentItem();
@@ -1465,6 +1635,11 @@ void Dispatcher::removeFunctionalInterface(Context context, InterfaceItem *item)
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " <<qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
 
   /* first, remove all connections from item
      NB:  if there is a connection to a group interface, then this
@@ -1488,6 +1663,11 @@ void Dispatcher::removeGroupInterface(Context context, InterfaceItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " <<qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
 
   /* NB: just remove all connections from/to this item, since when there are no more
      ones to a GroupItem, it is automatically deleted.
@@ -1566,6 +1746,11 @@ void Dispatcher::findGraphModifications(Context context, FunctionalBlock *block)
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  /* NB: only called in Design context */
+  if (context != Design) {
+    cout << "Abnormal case: call to " <<qPrintable(fctName) << " not in Design context" << endl;
+    return;
+  }
 
   block->computeAdmittanceDelays();
   // get the block item that is associated to block