]> 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 da4bae2b5ad8a3c4e0d0e4bb2bcebec0d565892c..574243ef2a2287fec1e5cf03a0e559bbc50c2cc3 100644 (file)
@@ -18,7 +18,7 @@
 #include "GroupScene.h"
 #include "GroupItem.h"
 #include "BoxItem.h"
 #include "GroupScene.h"
 #include "GroupItem.h"
 #include "BoxItem.h"
-#include "SourceItem.h"
+#include "StimuliItem.h"
 #include "InterfaceItem.h"
 #include "ConnectionItem.h"
 
 #include "InterfaceItem.h"
 #include "ConnectionItem.h"
 
@@ -29,7 +29,9 @@
 #include "DelayInputModifier.h"
 
 
 #include "DelayInputModifier.h"
 
 
-#include "InterfacePropertiesWindow.h"
+#include "InterfacePropertiesDialog.h"
+
+#include <QHashIterator>
 
 int Dispatcher::sceneCounter = 0;
 
 
 int Dispatcher::sceneCounter = 0;
 
@@ -98,7 +100,16 @@ void Dispatcher::setSceneCounter(Context context, int value) {
 }
 
 bool Dispatcher::createConnection(Context context, InterfaceItem *iface1, InterfaceItem *iface2, bool visible) {
 }
 
 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
   ConnectedInterface* ref1 = iface1->refInter;
   ConnectedInterface* ref2 = iface2->refInter;  
   // connect both interface
@@ -106,23 +117,36 @@ bool Dispatcher::createConnection(Context context, InterfaceItem *iface1, Interf
   bool ok1 = false;
   bool ok2 = false;
 
   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
   // 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;
   }
     ref1->connectTo(ref2);    
     ok1 = true;
   }
-  // if the frist one did not work, test ref2->ref1
-  if ((ok1 == false) && (ref2->canConnectTo(ref1)) && (ref1->canConnectFrom(ref2))) {  
+  // if the first one did not work, test ref2->ref1
+  if ((ok1 == false) && (ref2->canConnectTo(ref1,testClock)) && (ref1->canConnectFrom(ref2,testClock))) {
     ref2->connectTo(ref1);    
     ok2 = true;
   }
     ref2->connectTo(ref1);    
     ok2 = true;
   }
-  if ((ok1 == true) || (ok2 == true)) {
+  if ((ok1 == true) || (ok2 == true)) {    
+
+    if (ok1) {
+      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 << "... 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);
+    }
 
 
-    iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2, visible);
+    cout << endl;
 
     unselectAllItems(context);
 
     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;
     return true;
   }
   return false;
@@ -188,6 +212,12 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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");
 
   QDir baseDir(params->projectPath);
   QDir srcDir(params->projectPath+"/src");
@@ -212,10 +242,10 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) {
     make.copy(dest);
   }
 
     make.copy(dest);
   }
 
-  // copying external resources
+  // generate VHDL + copying external resources
   QString dest = params->projectPath;
   QString dest = params->projectPath;
-  dest += "/src/";
-  try {
+  dest += "/src/";  
+  try {    
     params->getGraph()->generateVHDL(dest);
 
     QList<QString> extResources = params->getGraph()->getExternalResources();
     params->getGraph()->generateVHDL(dest);
 
     QList<QString> extResources = params->getGraph()->getExternalResources();
@@ -234,6 +264,17 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) {
   catch(Exception e) {
     throw(e);
   }
   catch(Exception e) {
     throw(e);
   }
+  // generate testbench
+  dest = params->projectPath;
+  dest += "/testbench/";
+  dest += params->projectName;
+  dest += "_tb.vhd";
+  try {
+    params->getGraph()->generateTestbench(params->projectName, dest);
+  }
+  catch(Exception e) {
+    throw(e);
+  }
 
   // creating parameters file
   QString paramName = params->projectPath+"/params-isim.txt";
 
   // creating parameters file
   QString paramName = params->projectPath+"/params-isim.txt";
@@ -262,8 +303,7 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) {
   }
   out << endl;
   out << "VL_SRC := ${XILINX}/verilog/src/glbl.v" << endl << endl;
   }
   out << endl;
   out << "VL_SRC := ${XILINX}/verilog/src/glbl.v" << endl << endl;
-  out << "TB_SRC := $(TB_DIR)/read_csv.vhd \\" << endl;
-  out << "\t$(TB_DIR)/$(PROJECT_NAME)_tb.vhd" << endl << endl;
+  out << "TB_SRC := $(TB_DIR)/$(PROJECT_NAME)_tb.vhd" << endl << endl;
   out << "SIMU_EXE := $(PROJECT_NAME)_tb" << endl << endl;
 
   paramFile.close();
   out << "SIMU_EXE := $(PROJECT_NAME)_tb" << endl << endl;
 
   paramFile.close();
@@ -282,6 +322,12 @@ void Dispatcher::generateBlockVHDL(Context context, BoxItem *item){
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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());
 
   if (item->getRefBlock()->isFunctionalBlock()) {
     FunctionalBlock* block = AB_TO_FUN(item->getRefBlock());
@@ -299,6 +345,12 @@ void Dispatcher::renameFunctionalBlock(Context context, BoxItem *item){
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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();
   
     
   GroupWidget* win = item->getScene()->getGroupWidget();
   
@@ -338,6 +390,12 @@ void Dispatcher::renameGroupBlock(Context context, GroupItem *item){
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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();
   
   
   GroupWidget* win = item->getScene()->getGroupWidget();
   
@@ -379,18 +437,24 @@ void Dispatcher::renameGroupBlock(Context context, GroupItem *item){
   mainWindow->getLibrary()->updateComboScene();   
 }
 
   mainWindow->getLibrary()->updateComboScene();   
 }
 
-void Dispatcher::renameSourceBlock(Context context, SourceItem *item){
-  static QString fctName = "Dispatcher::renameSourceBlock()";
+void Dispatcher::renameStimuliItem(Context context, StimuliItem *item){
+  static QString fctName = "Dispatcher::renameStimuliItem()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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();
   
   bool ok = false;
   QString text = "";  
   while (!ok) {  
     
   GroupWidget* win = item->getScene()->getGroupWidget();
   
   bool ok = false;
   QString text = "";  
   while (!ok) {  
-    text = QInputDialog::getText(win, "Rename a source",
+    text = QInputDialog::getText(win, "Rename a stimuli",
                                        "New name:", QLineEdit::Normal,
                                        item->getRefBlock()->getName(), &ok);
     if (!ok) return;
                                        "New name:", QLineEdit::Normal,
                                        item->getRefBlock()->getName(), &ok);
     if (!ok) return;
@@ -404,10 +468,10 @@ void Dispatcher::renameSourceBlock(Context context, SourceItem *item){
       ok = false;
     }
     else {
       ok = false;
     }
     else {
-      FunctionalBlock* block = params->getGraph()->getSourceBlockByName(text);
+      FunctionalBlock* block = params->getGraph()->getStimuliBlockByName(text);
       if (block != NULL) {
         QMessageBox::warning(win,"Error in given name",
       if (block != NULL) {
         QMessageBox::warning(win,"Error in given name",
-                             "the name provided is similar to that of another source block within the top group",
+                             "the name provided is similar to that of another stimuli block within the top group",
                              QMessageBox::Ok);
         ok = false;
       }
                              QMessageBox::Ok);
         ok = false;
       }
@@ -424,6 +488,11 @@ void Dispatcher::renameInterface(Context context, InterfaceItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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();
   
 
   GroupWidget* win = item->getOwner()->getScene()->getGroupWidget();
   
@@ -468,6 +537,12 @@ void Dispatcher::showPatterns(Context context, InterfaceItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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 ";
   QString msg = "";
   if (item->refInter->getDirection() == AbstractInterface::Input) {
     msg = "Input pattern of iface ";
@@ -512,6 +587,12 @@ void Dispatcher::showModifier(Context context, InterfaceItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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();
   QString msg = "";
   ConnectedInterface* assoIface = AI_TO_CON(item->refInter->getAssociatedIface());
   AbstractInputModifier* mod = assoIface->getInputModifier();
@@ -529,10 +610,16 @@ void Dispatcher::showModifier(Context context, InterfaceItem *item) {
 }
 
 void Dispatcher::removeModifier(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
 #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();
 
   ConnectedInterface* assoIface = AI_TO_CON(item->refInter->getAssociatedIface());
   assoIface->clearInputModifier();
@@ -544,6 +631,12 @@ void Dispatcher::duplicateBoxItem(Context context, BoxItem *item){
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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();  
 
   GroupScene *scene = item->getScene();
   AbstractBlock* block = item->getRefBlock();  
@@ -562,11 +655,17 @@ void Dispatcher::duplicateBoxItem(Context context, BoxItem *item){
   }
 }
 
   }
 }
 
-void Dispatcher::duplicateSourceItem(Context context, SourceItem *item) {
-  static QString fctName = "Dispatcher::duplicateSourceItem()";
+void Dispatcher::duplicateStimuliItem(Context context, StimuliItem *item) {
+  static QString fctName = "Dispatcher::duplicateStimuliItem()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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();  
 
   GroupScene *scene = item->getScene();
   AbstractBlock* block = item->getRefBlock();  
@@ -577,9 +676,9 @@ void Dispatcher::duplicateSourceItem(Context context, SourceItem *item) {
 
     // adding to the model
     FunctionalBlock* funBlock = (FunctionalBlock*)block;
 
     // adding to the model
     FunctionalBlock* funBlock = (FunctionalBlock*)block;
-    newBlock = params->getGraph()->duplicateSourceBlock(funBlock);
+    newBlock = params->getGraph()->duplicateStimuliBlock(funBlock);
     // adding to the view
     // adding to the view
-    scene->createSourceItem(newBlock);
+    scene->createStimuliItem(newBlock);
 
     params->unsaveModif = true;
   }
 
     params->unsaveModif = true;
   }
@@ -590,6 +689,12 @@ void Dispatcher::duplicateInterfaceItem(Context context, InterfaceItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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;
 
   AbstractInterface *refI = item->refInter;
   if (! refI->isFunctionalInterface()) return;
@@ -621,54 +726,143 @@ void Dispatcher::duplicateInterfaceItem(Context context, InterfaceItem *item) {
 }
 
 
 }
 
 
-BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int idScene) {
+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
   static QString fctName = "Dispatcher::addBlock()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
-  bool newSource = false;
-  BoxItem* item = NULL;
+  bool newStimuli = false;  
 
   /* For now, this method is only used while designing and not loading */
   if (context == Design) {
     GroupScene *scene = getSceneById(idScene);
     ReferenceBlock* ref = params->getReferenceBlock(idCategory,idBlock);
     // if block has no inputs, propose to add it as a source to top scene
 
   /* For now, this method is only used while designing and not loading */
   if (context == Design) {
     GroupScene *scene = getSceneById(idScene);
     ReferenceBlock* ref = params->getReferenceBlock(idCategory,idBlock);
     // if block has no inputs, propose to add it as a source to top scene
-    if ((scene->isTopScene()) && (ref->isGeneratorBlock())) {
-      int ret = QMessageBox::question(NULL,"Adding a block to top scene","Selected block may be used as a source for the top scene. Do you want to add it as a source ?");
+    if ((scene->isTopScene()) && (ref->isSourceBlock())) {
+      int ret = QMessageBox::question(NULL,"Adding a block to top scene","Selected block may be used as a stimuli for the top scene. Do you want to add it as a stimuli ?");
       if (ret == QMessageBox::Yes) {
       if (ret == QMessageBox::Yes) {
-        newSource = true;
+        newStimuli = true;
       }
     }
       }
     }
-    if (newSource) {
-      FunctionalBlock* newOne = params->getGraph()->createSourceBlock(ref, true);
-      scene->createSourceItem(newOne);
+    if (newStimuli) {
+      FunctionalBlock* newOne = params->getGraph()->createStimuliBlock(ref, true);
+      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 {
     }
     else {
+
       GroupBlock* group = AB_TO_GRP(scene->getGroupItem()->getRefBlock());
       FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref, true);
       GroupBlock* group = AB_TO_GRP(scene->getGroupItem()->getRefBlock());
       FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref, true);
-      item = scene->createBoxItem(newOne);
+
+      // creating the box item
+      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;
   }
       params->blockToItem.insert(newOne,item);
     }
     params->unsaveModif = true;
   }
+}
+
+void Dispatcher::addClkRstGenBlock(Context context, double frequency) {
+  static QString fctName = "Dispatcher::addClkRstGenBlock()";
+#ifdef DEBUG_FCTNAME
+  cout << "call to " << qPrintable(fctName) << endl;
+#endif
 
 
-  return item;
+
+  if (context == Design) {
+
+    params->getGraph()->addClock(frequency);
+
+    // get the top group
+    GroupBlock *group = params->getGraph()->getTopGroup();
+    GroupScene *scene = topGroupWidget->getScene();
+
+    // creating the clkrstgen block
+    ReferenceBlock* ref = params->getHiddenReferenceBlock("clkrstgen");
+    FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref, true);
+
+    QString name = "clkrstgen_";
+    name += QString::number(params->getGraph()->getClocks().size()-1);
+    newOne->setName(name);
+
+    // creating the box item
+    BoxItem* item = scene->createBoxItem(newOne, BoxItem::Left, AbstractBoxItem::Dimension);
+    item->setVisible(false);
+
+    ConnectedInterface* fromIfaceClk = NULL;
+    ConnectedInterface* fromIfaceReset = NULL;
+    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);
+    group->addInterface(fromIfaceReset);
+  // creating top group ext_clk iface item
+    GroupItem* groupItem = scene->getGroupItem();
+    InterfaceItem* fromIfaceItemClk = new InterfaceItem(0.5 , Parameters::West, fromIfaceClk, groupItem, params, true);
+    groupItem->addInterfaceItem(fromIfaceItemClk,true);
+    // creating top group ext_reset iface item
+    InterfaceItem* fromIfaceItemReset = new InterfaceItem(0.5 , Parameters::West, fromIfaceReset, groupItem, params, false);
+    groupItem->addInterfaceItem(fromIfaceItemReset,true);
+    // connecting ext_clk iface items
+    InterfaceItem* toIfaceItemClk = item->searchInterfaceItemByName("ext_clk");
+    if (toIfaceItemClk == NULL) {
+      cerr << "Abnormal case while connecting top group ext_clk to clkrstgen" << endl;
+    }
+    createConnection(context,fromIfaceItemClk, toIfaceItemClk, false);
+    // connecting ext_reset iface items
+    InterfaceItem* toIfaceItemReset = item->searchInterfaceItemByName("ext_reset");
+    if (toIfaceItemReset == NULL) {
+      cerr << "Abnormal case while connecting top group ext_reset to clkrstgen" << endl;
+    }
+    createConnection(context,fromIfaceItemReset, toIfaceItemReset, false);
+
+    params->blockToItem.insert(newOne,item);
+    params->unsaveModif = true;
+  }
 }
 
 
 }
 
 
-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;
 #endif
 
   static QString fctName = "Dispatcher::createTopScene()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 
-  bool createIfaces = true;
-  if (context == Load) {
-    createIfaces = false;
-  }
+  Graph* graph = NULL;
   // creating the graph and thus, the topgroup
   // creating the graph and thus, the topgroup
-  Graph* graph = params->createGraph(createIfaces);
+  if (context == Design) {
+    graph = params->initGraph(true);
+    graph->addClock(mainClock);
+  }
+  else if (context == Load) {
+    graph = params->initGraph(false);
+  }
+
   // get the top group
   GroupBlock *topBlock = graph->getTopGroup();
   // creating the top group widget
   // get the top group
   GroupBlock *topBlock = graph->getTopGroup();
   // creating the top group widget
@@ -690,21 +884,12 @@ GroupWidget *Dispatcher::createTopScene(Context context){
 
 
   if (context == Design) {
 
 
   if (context == Design) {
-    // creating the clkrstgen block
-    ReferenceBlock* ref = params->getHiddenReferenceBlock("clkrstgen");
-    FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(topBlock, ref, true);
-    ConnectedInterface* fromIface = AI_TO_CON(topBlock->getIfaceFromName("ext_clk"));
-    ConnectedInterface* toIface = AI_TO_CON(newOne->getIfaceFromName("ext_clk"));
-    fromIface->connectTo(toIface);
-    fromIface = AI_TO_CON(topBlock->getIfaceFromName("ext_reset"));
-    toIface = AI_TO_CON(newOne->getIfaceFromName("ext_reset"));
-    fromIface->connectTo(toIface);
-    // create the clkrstgen boxitem
-    BoxItem* item = scene->createBoxItem(newOne, GroupScene::Left, GroupScene::Top, AbstractBoxItem::Position, BoxItem::HSpan);
-    params->blockToItem.insert(newOne,item);
+    // create clkrstgen
+    double freq = params->getGraph()->getClock(0);
+    params->getGraph()->resetClocks();
+    addClkRstGenBlock(context,freq);
   }
 
   }
 
-
   groupList.append(topGroupWidget);
   return topGroupWidget;
 }
   groupList.append(topGroupWidget);
   return topGroupWidget;
 }
@@ -714,11 +899,15 @@ GroupWidget* Dispatcher::addNewEmptyGroup(Context context, GroupScene* scene, bo
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
+  bool createIfaces = true;
+  if (context == Load) {
+    createIfaces = false;
+  }
 
   // getting the parent block in the graph
   GroupBlock* parent = AB_TO_GRP(scene->getGroupItem()->getRefBlock());
   cout << "new group : parent = "<< qPrintable(parent->getName()) << endl;
 
   // getting the parent block in the graph
   GroupBlock* parent = AB_TO_GRP(scene->getGroupItem()->getRefBlock());
   cout << "new group : parent = "<< qPrintable(parent->getName()) << endl;
-  GroupBlock* groupBlock = params->getGraph()->createChildGroupBlock(parent);
+  GroupBlock* groupBlock = params->getGraph()->createChildGroupBlock(parent, createIfaces);
   cout << "new group : child = "<< qPrintable(groupBlock->getName()) << ", child of " << qPrintable(groupBlock->getParent()->getName()) << endl;
   // creating the BlockItem in the scene
   BoxItem* newItem = scene->createBoxItem(groupBlock);
   cout << "new group : child = "<< qPrintable(groupBlock->getName()) << ", child of " << qPrintable(groupBlock->getParent()->getName()) << endl;
   // creating the BlockItem in the scene
   BoxItem* newItem = scene->createBoxItem(groupBlock);
@@ -1000,8 +1189,11 @@ void Dispatcher::removeBoxItem(Context context, BoxItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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
 
   /* a BoxItem (group of func) can be removed only if none of its
      interfaces is connected to a group interface that is itself
@@ -1076,6 +1268,11 @@ void Dispatcher::removeAllBlockConnections(Context context, AbstractBoxItem *ite
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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) {
 
   foreach(InterfaceItem* ifaceItem, item->getInterfaces()) {
     foreach(ConnectionItem* conn, ifaceItem->connections) {
@@ -1084,26 +1281,31 @@ void Dispatcher::removeAllBlockConnections(Context context, AbstractBoxItem *ite
   }
 }
 
   }
 }
 
-void Dispatcher::removeSourceItem(Context context, SourceItem *item) {
-  static QString fctName = "Dispatcher::removeSourceItem()";
+void Dispatcher::removeStimuliItem(Context context, StimuliItem *item) {
+  static QString fctName = "Dispatcher::removeStimuliItem()";
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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 source ";
+  QString msg = "Removing stimmuli ";
   
   msg += item->getRefBlock()->getName();
   msg += " and all its connections.\n\nAre you sure ?";
 
   
   msg += item->getRefBlock()->getName();
   msg += " and all its connections.\n\nAre you sure ?";
 
-  int ret = QMessageBox::question(NULL,"Removing source block",msg, QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);
+  int ret = QMessageBox::question(NULL,"Removing stimuli block",msg, QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok);
   if (ret == QMessageBox::Cancel) {
     return;
   }
   removeAllBlockConnections(context, item);
   
   FunctionalBlock* block = AB_TO_FUN(item->getRefBlock());  
   if (ret == QMessageBox::Cancel) {
     return;
   }
   removeAllBlockConnections(context, item);
   
   FunctionalBlock* block = AB_TO_FUN(item->getRefBlock());  
-  item->getScene()->removeSourceItem(item);
-  params->getGraph()->removeSourceBlock(block);  
+  item->getScene()->removeStimuliItem(item);
+  params->getGraph()->removeStimuliBlock(block);
 }
 
 
 }
 
 
@@ -1112,6 +1314,12 @@ void Dispatcher::removeConnection(Context context, ConnectionItem *connItem) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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();
 
   InterfaceItem* fromIfaceItem = connItem->getFromInterfaceItem();
   InterfaceItem* toIfaceItem = connItem->getToInterfaceItem();
 
@@ -1183,6 +1391,164 @@ 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();
+  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) {
+
+  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();
+  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) {
+
+  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;
+
+  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) {
+  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;
+
+  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();
 void Dispatcher::showBlocksLibrary(){
   cout << "showing block library" << endl;
   mainWindow->getLibrary()->show();
@@ -1190,7 +1556,19 @@ void Dispatcher::showBlocksLibrary(){
 }
 
 void Dispatcher::showProperties(Context context, InterfaceItem *inter) {
 }
 
 void Dispatcher::showProperties(Context context, InterfaceItem *inter) {
-  new InterfacePropertiesWindow(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();
 }
 
 /* connectInterToGroup() :
 }
 
 /* connectInterToGroup() :
@@ -1201,6 +1579,16 @@ void Dispatcher::showProperties(Context context, InterfaceItem *inter) {
 */
 void Dispatcher::connectInterToGroup(Context context, InterfaceItem *item){
 
 */
 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;
   // 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;
@@ -1222,7 +1610,12 @@ void Dispatcher::connectInterToGroup(Context context, InterfaceItem *item){
   parentItem->addInterfaceItem(groupIfaceItem,true);
 
   // creating the connection, in graph and with an 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();
 
   // if groupItem is not topGroup, must also add a new interface to the parent BlockItem
   BoxItem* parent2Item = parentItem->getParentItem();
@@ -1242,6 +1635,11 @@ void Dispatcher::removeFunctionalInterface(Context context, InterfaceItem *item)
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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
 
   /* first, remove all connections from item
      NB:  if there is a connection to a group interface, then this
@@ -1265,6 +1663,11 @@ void Dispatcher::removeGroupInterface(Context context, InterfaceItem *item) {
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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.
 
   /* NB: just remove all connections from/to this item, since when there are no more
      ones to a GroupItem, it is automatically deleted.
@@ -1343,6 +1746,11 @@ void Dispatcher::findGraphModifications(Context context, FunctionalBlock *block)
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
 #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
 
   block->computeAdmittanceDelays();
   // get the block item that is associated to block