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

Private GIT Repository
changed sources to stimulis
authorstephane Domas <stephane.domas@univ-fcomte.fr>
Thu, 3 May 2018 13:16:02 +0000 (15:16 +0200)
committerstephane Domas <stephane.domas@univ-fcomte.fr>
Thu, 3 May 2018 13:16:02 +0000 (15:16 +0200)
39 files changed:
AbstractBlock.cpp
AbstractBlock.h
AbstractBoxItem.cpp
AbstractBoxItem.h
BlockLibraryWidget.cpp
ConnectionItem.cpp
Dispatcher.cpp
Dispatcher.h
Exception.cpp
Exception.h
ExternalResource.h
FunctionalBlock.cpp
FunctionalBlock.h
FunctionalInterface.cpp
Graph.cpp
Graph.h
GroupBlock.cpp
GroupInterface.cpp
GroupItem.cpp
GroupScene.cpp
GroupScene.h
InterfaceItem.cpp
Parameters.cpp
ReferenceBlock.cpp
SpecialBlock.cpp
SpecialBlock.h
StimuliItem.cpp [moved from SourceItem.cpp with 95% similarity]
StimuliItem.h [moved from SourceItem.h with 72% similarity]
blast.creator.user
blast.files
lib/implementations/impls.bmf [new file with mode: 0644]
lib/references/clkdomain_convert_1024x8.xml
lib/references/csvreader.xml
lib/references/generator-cst.xml
lib/references/generator-img.xml
lib/references/read_csv.xml
lib/references/references.bmf
object-files.txt
reference.xsd

index 116494e1922f1ac830500aed518db2efc1a468f5..b8ce5e5e1ddd8747ad461b278bbc215cfa093322 100644 (file)
@@ -11,6 +11,7 @@
 AbstractBlock::AbstractBlock() {\r
   name = "";\r
   parent = NULL;\r
+  specialType = NotSpecial;\r
 }\r
 \r
 /*\r
@@ -34,6 +35,15 @@ void AbstractBlock::setName(const QString& str) {
   name = Parameters::normalizeName(str);\r
 }\r
 \r
+void AbstractBlock::setSpecialType(int type) {\r
+  if ((type >= NotSpecial) && (type <= ClkConvert)) {\r
+    specialType = type;\r
+  }\r
+  else {\r
+    specialType = NotSpecial;\r
+  }\r
+}\r
+\r
 void AbstractBlock::setParent(AbstractBlock* _parent) {\r
   parent = _parent;\r
 }\r
@@ -46,6 +56,10 @@ bool AbstractBlock::isFunctionalBlock() {
   return false;\r
 }\r
 \r
+bool AbstractBlock::isSpecialBlock() {\r
+  return false;\r
+}\r
+\r
 bool AbstractBlock::isGroupBlock() {\r
   return false;\r
 }\r
@@ -54,20 +68,40 @@ bool AbstractBlock::isTopGroupBlock() {
   return false;\r
 }\r
 \r
-bool AbstractBlock::isSourceBlock() {\r
+bool AbstractBlock::isStimuliBlock() {\r
   return false;\r
 }\r
-/* NB: a generator is a block that has no data inputs\r
+/* NB: a source is a block that has no data inputs\r
  * and has at least one data output.\r
  * By the way, blocks that have no data input/output\r
- * (like clkrstgen) are not generators !\r
+ * (like clkrstgen) are not sources !\r
  */\r
-bool AbstractBlock::isGeneratorBlock() {\r
+bool AbstractBlock::isSourceBlock() {\r
   if (getDataInputs().size() > 0) return false;\r
   if (getDataOutputs().size() == 0) return false;\r
   return true;\r
 }\r
 \r
+/* NB: a sink is a block without outputs of any type */\r
+bool AbstractBlock::isSinkBlock() {\r
+  if (getOutputs().size() == 0) return true;\r
+  return false;\r
+}\r
+\r
+int AbstractBlock::getSpecialTypeFromString(QString str) {\r
+  if (str == "source") {\r
+    return Source;\r
+  }\r
+  else if (str == "sink") {\r
+    return Sink;\r
+  }\r
+  else if (str == "clkconvert") {\r
+    return ClkConvert;\r
+  }\r
+  return NotSpecial;\r
+}\r
+\r
+\r
 void AbstractBlock::addParameter(BlockParameter *param) {\r
   params.append(param);\r
 }\r
index fe3f90e392c67c511d86d7060ba07d7eb62b18fe..e1c33e4dfff272cd02ff237a66eedb2370f2cdd4 100644 (file)
@@ -12,6 +12,7 @@ class BlockParameter;
 \r
 #define AB_TO_REF(ptr) ((ReferenceBlock*)ptr)\r
 #define AB_TO_FUN(ptr) ((FunctionalBlock*)ptr)\r
+#define AB_TO_SPE(ptr) ((SpecialBlock*)ptr)\r
 #define AB_TO_GRP(ptr) ((GroupBlock*)ptr)\r
 \r
 using namespace std;\r
@@ -22,6 +23,8 @@ class AbstractBlock {
 public:  \r
       \r
   enum BlockVHDLContext {AnyContext = 0, Entity = 1, Component = 2, Architecture = 3 }; // NB : 3 is when creating an instance of the block that owns this iface\r
+  enum SpecialType { NotSpecial = 0, Source = 1, Sink = 2, ClkConvert = 3 };\r
+\r
 \r
   AbstractBlock();\r
   //AbstractBlock(const QString& _name);\r
@@ -29,6 +32,8 @@ public:
 \r
   // getters\r
   inline QString getName() { return name; }\r
+  inline int getSpecialType() { return specialType; }\r
+  inline QString getVersion() { return version; }\r
   inline int nbParameters() { return params.size(); }\r
   inline QList<BlockParameter *> getParameters() { return params; }\r
   inline QList<AbstractInterface*> getInputs() { return inputs; }\r
@@ -39,26 +44,31 @@ public:
   QList<BlockParameter *> getPortParameters();\r
   QList<BlockParameter *> getWishboneParameters();\r
   inline AbstractBlock* getParent() { return parent; }\r
-  inline bool getPatternComputed() { return patternComputed; }\r
+  inline bool getOutputPatternComputed() { return outputPatternComputed; }\r
   inline int getTraversalLevel() { return traversalLevel; }\r
   \r
   // setters\r
   void setName(const QString& str);\r
+  void setSpecialType(int type);\r
+  inline void setVersion(const QString& _version) { version = _version; }\r
   virtual void setParent(AbstractBlock* _parent);\r
-  inline void setPatternComputed(bool state) { patternComputed = state; }\r
+  inline void setOutputPatternComputed(bool state) {  outputPatternComputed = state; }\r
   inline void resetTraversalLevel() { traversalLevel = -1; }\r
   inline void setTraversalLevel(int level) { traversalLevel = level; }\r
 \r
   // testers\r
   virtual bool isReferenceBlock();\r
   virtual bool isFunctionalBlock();\r
+  virtual bool isSpecialBlock();\r
   virtual bool isGroupBlock();\r
-  virtual bool isSourceBlock(); //! a source block is outside the top group and simulates a peripheral (NB: this is also a generator)\r
+  virtual bool isStimuliBlock(); //! a stimuli block is outside the top group and simulates a peripheral (NB: this is also a source)\r
   virtual bool isTopGroupBlock();\r
-  bool isGeneratorBlock(); //! a generator block has no data inputs and thus executes infinitely\r
+  bool isSourceBlock(); //! a source block has no data inputs and thus executes infinitely\r
+  bool isSinkBlock(); //! a sink block has no data outputs and just collects what it receives (i.e. no compatibility check)\r
   bool isWBConfigurable();\r
 \r
   // others\r
+  int getSpecialTypeFromString(QString str);\r
 \r
   /*!\r
    * \brief connectClkReset connects the clock and reset inputs to a clkrstgen block or the the group ifaces\r
@@ -97,6 +107,8 @@ protected:
 \r
 \r
   QString name;\r
+  int specialType;\r
+  QString version;\r
 \r
   // parameters\r
   QList<BlockParameter *> params;\r
@@ -109,7 +121,7 @@ protected:
   // others\r
   \r
   // patterns  \r
-  bool patternComputed;\r
+  bool outputPatternComputed;\r
   int traversalLevel; // the level (0, 1, ...) during the traversal of the graph\r
   \r
   // NB: only GroupBlock and FunctionalBlock have a real parent, except sources that have no parents\r
index 911a790d6da0cf18d84de16eda232f5da1103833..7912813f425f7b7a4d0bbd9d648c189a51092683 100644 (file)
@@ -94,7 +94,7 @@ bool AbstractBoxItem::isGroupItem() {
   return false;
 }
 
-bool AbstractBoxItem::isSourceItem() {
+bool AbstractBoxItem::isStimuliItem() {
   return false;
 }
 
index e490088f956e91b19e36ff84207580e887359138..d0965cf4fa729e33990c2d7e6df15ffe170cd146 100644 (file)
@@ -17,7 +17,7 @@ class ConnectedInterface;
 
 #define ABI_TO_BI(ptr) ((BoxItem*)ptr)
 #define ABI_TO_GI(ptr) ((GroupItem*)ptr)
-#define ABI_TO_SI(ptr) ((SourceItem*)ptr)
+#define ABI_TO_SI(ptr) ((StimuliItem*)ptr)
 
 class AbstractBoxItem : public QGraphicsItem {
 
@@ -76,7 +76,7 @@ public:
   // testers
   virtual bool isBoxItem();
   virtual bool isGroupItem();
-  virtual bool isSourceItem();
+  virtual bool isStimuliItem();
   inline bool isSelected() { return selected; }
   inline bool isRstClkVisible(){ return rstClkVisible;}
   inline bool isWishboneVisible(){ return wishboneVisible;}
index 5dfd4b0f6fe71bd974f3197a71cfda05c477e7a7..d80a78ee795a8938d6b0998d5cfa2c763be367ea 100644 (file)
@@ -135,12 +135,13 @@ void BlockLibraryWidget::addClicked() {
     cout << "adding block to scene " << v.toInt() << endl;
 
     QHash<QString, int> clkRstToGen;
-    for(int i=0;i<layClkRst->rowCount();i++) {
+    for(int i=1;i<nbClock+nbRst;i++) {
       QLayoutItem* item = layClkRst->itemAtPosition(i,0);
       QLabel* lab = (QLabel *)(item->widget());
       item = layClkRst->itemAtPosition(i,1);
       QComboBox* combo = (QComboBox *)(item->widget());
       clkRstToGen.insert(lab->text(),combo->currentIndex());
+      cout << "addblock: have to connect " << qPrintable(lab->text()) << " to clk/rst n° " << combo->currentIndex() << endl;
     }
 
 
@@ -218,7 +219,7 @@ void BlockLibraryWidget::updateClkRst(int idCat, int idBlock) {
     QWidget* widget = layClkRst->itemAt(0)->widget();
     layClkRst->removeWidget(widget);
     delete widget;
-  }
+  }  
 
   if (nbClock != 0) {
     delete [] comboClkGen;
@@ -235,6 +236,7 @@ void BlockLibraryWidget::updateClkRst(int idCat, int idBlock) {
   nbClock = lstClocks.size();
   QList<AbstractInterface*> lstRst = currentRefBlock->getInterfaces(AbstractInterface::Input, AbstractInterface::Reset);
   nbRst = lstRst.size();
+  cout << "For chosen block there are " << nbClock << " clocks and " << nbRst << " resets" << endl;
 
   comboClkGen = new QComboBox*[lstClocks.size()];
   for(int i=0;i<lstClocks.size();i++) {
index 86d0073da3cffca8066e702197371cab325d6ae5..c3a7ada6d0fc2d1b1d15f4ec9e35accfa828c2dc 100644 (file)
@@ -73,11 +73,11 @@ ConnectionItem::ConnectionItem(InterfaceItem* _iface1,
       fromInterfaceItem = _iface1;
     }
   }
-  else if ((ref1->getOwner()->isSourceBlock()) && (ref2->getOwner()->isTopGroupBlock())) {    
+  else if ((ref1->getOwner()->isStimuliBlock()) && (ref2->getOwner()->isTopGroupBlock())) {    
     fromInterfaceItem = _iface1;    
     toInterfaceItem = _iface2;
   }
-  else if ((ref2->getOwner()->isSourceBlock()) && (ref1->getOwner()->isTopGroupBlock())) {    
+  else if ((ref2->getOwner()->isStimuliBlock()) && (ref1->getOwner()->isTopGroupBlock())) {    
     fromInterfaceItem = _iface2;    
     toInterfaceItem = _iface1;
   }
index 94cdfb66e7ad5b131e9d073b793fca7117ea21a5..c50270c7f91eebeaae3f519db87fc31fd39921c0 100644 (file)
@@ -18,7 +18,7 @@
 #include "GroupScene.h"
 #include "GroupItem.h"
 #include "BoxItem.h"
-#include "SourceItem.h"
+#include "StimuliItem.h"
 #include "InterfaceItem.h"
 #include "ConnectionItem.h"
 
@@ -381,8 +381,8 @@ void Dispatcher::renameGroupBlock(Context context, GroupItem *item){
   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
@@ -392,7 +392,7 @@ void Dispatcher::renameSourceBlock(Context context, SourceItem *item){
   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;
@@ -406,10 +406,10 @@ void Dispatcher::renameSourceBlock(Context context, SourceItem *item){
       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",
-                             "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;
       }
@@ -564,8 +564,8 @@ 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
@@ -579,9 +579,9 @@ void Dispatcher::duplicateSourceItem(Context context, SourceItem *item) {
 
     // adding to the model
     FunctionalBlock* funBlock = (FunctionalBlock*)block;
-    newBlock = params->getGraph()->duplicateSourceBlock(funBlock);
+    newBlock = params->getGraph()->duplicateStimuliBlock(funBlock);
     // adding to the view
-    scene->createSourceItem(newBlock);
+    scene->createStimuliItem(newBlock);
 
     params->unsaveModif = true;
   }
@@ -628,7 +628,7 @@ BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int
 #ifdef DEBUG_FCTNAME
   cout << "call to " << qPrintable(fctName) << endl;
 #endif
-  bool newSource = false;
+  bool newStimuli = false;
   BoxItem* item = NULL;
 
   /* For now, this method is only used while designing and not loading */
@@ -636,15 +636,15 @@ BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int
     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) {
-        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);
+      scene->createStimuliItem(newOne);
     }
     else {
 
@@ -1159,26 +1159,26 @@ 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
   
-  QString msg = "Removing source ";
+  QString msg = "Removing stimmuli ";
   
   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());  
-  item->getScene()->removeSourceItem(item);
-  params->getGraph()->removeSourceBlock(block);  
+  item->getScene()->removeStimuliItem(item);
+  params->getGraph()->removeStimuliBlock(block);
 }
 
 
index 0fa74bd0954c764c67cdad4cfa49b14660b3d96e..cf14b6a36aee70f896c975372ff5992349619d3d 100644 (file)
@@ -15,7 +15,7 @@ class GroupScene;
 class AbstractBoxItem;
 class GroupItem;
 class BoxItem;
-class SourceItem;
+class StimuliItem;
 class ConnectionItem;
 class InterfaceItem;
 class GroupBlock;
@@ -101,9 +101,9 @@ public:
   void renameFunctionalBlock(Context context, BoxItem* item);
   void generateBlockVHDL(Context context, BoxItem* item);
   void renameGroupBlock(Context context, GroupItem* item);
-  void renameSourceBlock(Context context, SourceItem* item);
-  void removeSourceItem(Context context, SourceItem* item);
-  void duplicateSourceItem(Context context, SourceItem* item);
+  void renameStimuliItem(Context context, StimuliItem* item);
+  void removeStimuliItem(Context context, StimuliItem* item);
+  void duplicateStimuliItem(Context context, StimuliItem* item);
 
 
   // interface ops
index 1329f0c81caa125f0662ffb93ee7c1b205ef2bc8..100339783aa12695b67bc9563dd977c5f1ac4bd3 100644 (file)
@@ -42,7 +42,9 @@ QString Exception::getDefaultMessage() {
   case BLOCKITEM_INVALID_TYPE : ret = tr("A parameter of type AbstractBlockItem* is used with an incorrect instance type."); break;
   case WIDTHS_NOT_EQUALS : ret = tr("Two interfaces are connected but don't have the same widths."); break;
   case INVALID_VALUE : ret = tr("parameter value is not correct (e.g. not numeric, invalid other parameter name, ...)."); break;
-  case INVALID_REFBLOCK_USE : ret = tr("a reference block is used during pattern computations"); break;
+  case INVALID_FUNBLOCK_USE : ret = tr("a functional block is used for an unauthorized operation while analyzing the design"); break;
+  case INVALID_REFBLOCK_USE : ret = tr("a reference block is used for an unauthorized operation while analyzing the design"); break;
+  case INVALID_GROUPBLOCK_USE : ret = tr("a group block is used for an unauthorized operation while analyzing the design"); break;
   case INVALID_DELTA_CP : ret = tr("delta and CP are not consistent"); break;
   case EVAL_PARAM_UNKNOWN : ret = tr("a variable used in an expression is not defined as a block parameter"); break;
   case EVAL_PARAM_NOVALUE : ret = tr("can't get the double value of a block parameter"); break;
index 00d146ae85e025e75467a1e44df85be327ff2d6e..0c2cd5ed619418a49f49f4df62bf9aac8c8b79d9 100644 (file)
@@ -65,9 +65,11 @@ supp. infos : saved in UTF-8 [éè]
 #define INVALID_VALUE 5001
 
 // exception for patterns
-#define INVALID_REFBLOCK_USE 10001
-#define INVALID_GROUPBLOCK_USE 10002
-#define INVALID_DELTA_CP 10003 // delta and CP are not consistent (NB: used during admittance computation)
+#define INVALID_FUNBLOCK_USE 10001
+#define INVALID_REFBLOCK_USE 10002
+#define INVALID_GROUPBLOCK_USE 10003
+
+#define INVALID_DELTA_CP 10004 // delta and CP are not consistent (NB: used during admittance computation)
 
 #define EVAL_PARAM_UNKNOWN 10101 // a variable used in an expression is not defined as a block parameter
 #define EVAL_PARAM_NOVALUE 10102 // can't get the double value of a block parameter
index e3adf1bda2bbe07e7894775a76716ce12d902768..5cebdf959ecf5f6c2746dda094205695d82d7984 100644 (file)
@@ -14,7 +14,7 @@ class ExternalResource {
 \r
 public :\r
 \r
-  enum SourceType { Code = 1, Package, Netlist, InitFile};\r
+  enum ResourceType { Code = 1, Package, Netlist, InitFile};\r
 \r
   ExternalResource(const QString& _name, const QString& _file, int _type = Code);\r
 \r
index ccaa7b2c8ead70bc09165e0ac451ce2ee039ecf1..0fb38c39881ec64c9a45d84eac3a2b09fae95d9b 100644 (file)
@@ -65,7 +65,7 @@ bool FunctionalBlock::isFunctionalBlock() {
   return true;\r
 }\r
 \r
-bool FunctionalBlock::isSourceBlock() {\r
+bool FunctionalBlock::isStimuliBlock() {\r
   if (parent == NULL) return true;\r
   return false;\r
 }\r
@@ -146,7 +146,7 @@ void FunctionalBlock::createPatterns() throw(Exception) {
   \r
   cout << "create patterns for block " << qPrintable(name) << endl;\r
   if (evaluator == NULL) evaluator = new ArithmeticEvaluator();\r
-  if (! isGeneratorBlock()) {\r
+  if (! isSourceBlock()) {\r
     try {\r
       createDelta();\r
       createConsumptionPattern();    \r
@@ -846,125 +846,113 @@ void FunctionalBlock::computeOutputPattern(int nbExec) throw(Exception) {
 \r
   clearOutputPattern();\r
 \r
-  /* case 1: the block is a generator for which output pattern\r
-     must be computed for a nbExec following executions\r
-  */\r
+  if (specialType != NotSpecial) {\r
+    cerr << "Abnormal case: the block is special and output pattern is computed normally" << endl;\r
+    throw(Exception(INVALID_FUNBLOCK_USE,this));\r
+  }\r
 \r
-  if (nbExec > 0) {\r
-    cout << "computing output pattern of " << qPrintable(name) << " for " << nbExec << " executions" << endl;\r
-    foreach(AbstractInterface* iface, getControlOutputs()) {\r
-      FunctionalInterface* connIface = AI_TO_FUN(iface);\r
-      // create output pattern\r
-      QList<char>* pp = productionPattern.value(connIface);\r
-      QList<char>* pattern = new QList<char>(*pp);\r
-      for(int i=1;i<nbExec;i++) pattern->append(*pp);\r
-      // assign pattern to interface\r
-      connIface->setOutputPattern(pattern);\r
-      // store it in QMap\r
-      outputPattern.insert(connIface,pattern);      \r
+  cout << "computing output pattern of " << qPrintable(name) << endl;\r
+\r
+  // in case of inputPattern not created, do it\r
+  if (lengthIP <= 0) {\r
+\r
+    cout << "Strange case: input pattern is not created while it is time to compute output pattern !" << endl;\r
+    // collect the input patterns for each input\r
+    try {\r
+      createInputPattern();\r
     }\r
+    catch(Exception e) {\r
+      throw(e);\r
+    }\r
+    cout << "input pattern array initialized with min. len " << lengthIP << endl;\r
   }\r
-  else {\r
-    cout << "computing output pattern of " << qPrintable(name) << endl;\r
-    \r
-    // in case of inputPattern not created, do it\r
-    if (lengthIP <= 0) {\r
 \r
-      cout << "Strange case: input pattern is not created while it is time to compute output pattern !" << endl;\r
-      // collect the input patterns for each input    \r
-      try {\r
-        createInputPattern();\r
-      }\r
-      catch(Exception e) {\r
-        throw(e);\r
+  // initialize the output pattern\r
+  lengthOP = 0;\r
+  foreach(AbstractInterface* iface, getControlOutputs()) {\r
+    FunctionalInterface* connIface = AI_TO_FUN(iface);\r
+    lengthOP = lengthIP+productionPattern.value(connIface)->size();\r
+    QList<char>* pattern = new QList<char>();\r
+    for(int i=0;i<lengthOP;i++) pattern->append(0);\r
+    connIface->setOutputPattern(pattern);\r
+    outputPattern.insert(connIface,pattern);\r
+  }\r
+  cout << "output pattern array initialized" << endl;\r
+\r
+  int clock = 0;\r
+  nbExec = 0;\r
+  // search for the beginning of the first execution.\r
+  while ((clock < lengthIP) && (! isValidDataGroup(inputPattern,clock))) clock++;\r
+  cout << "found 1st exec clock: " << clock << endl;\r
+\r
+  while (clock < lengthIP) {\r
+    // initialize counters for current execution.\r
+    int p = 0; // index in production pattern\r
+    int o = 0; // clock+o will give the clock cycle of each output group\r
+    int cip = 0; // clock+cip give the clock cycle of an input group\r
+    int ccp = 0; // ccp give a column in the consumptio pattern\r
+    int nip = 0; // number of input data groups already consumed during the current execution, used while exploring IP\r
+    int ncp = 0; // number of input data groups already consumed during the current execution, used while exploring CP\r
+    bool cannotCompleteExec = false;\r
+    for(int m=0;m<productionCounter.size();m++) {\r
+      // search for the first production in PP\r
+      while (!isValidDataGroup(productionPattern,p)) {\r
+        p += 1;\r
+        o += 1;\r
       }\r
-      cout << "input pattern array initialized with min. len " << lengthIP << endl;\r
-    }\r
-    \r
-    // initialize the output pattern    \r
-    lengthOP = 0;\r
-    foreach(AbstractInterface* iface, getControlOutputs()) {\r
-      FunctionalInterface* connIface = AI_TO_FUN(iface);      \r
-      lengthOP = lengthIP+productionPattern.value(connIface)->size();\r
-      QList<char>* pattern = new QList<char>();\r
-      for(int i=0;i<lengthOP;i++) pattern->append(0);\r
-      connIface->setOutputPattern(pattern);\r
-      outputPattern.insert(connIface,pattern);\r
-    }\r
-    cout << "output pattern array initialized" << endl;\r
-    \r
-    int clock = 0;\r
-    nbExec = 0;\r
-    // search for the beginning of the first execution.\r
-    while ((clock < lengthIP) && (! isValidDataGroup(inputPattern,clock))) clock++;\r
-    cout << "found 1st exec clock: " << clock << endl;\r
-    \r
-    while (clock < lengthIP) {\r
-      // initialize counters for current execution.\r
-      int p = 0; // index in production pattern\r
-      int o = 0; // clock+o will give the clock cycle of each output group\r
-      int cip = 0; // clock+cip give the clock cycle of an input group\r
-      int ccp = 0; // ccp give a column in the consumptio pattern\r
-      int nip = 0; // number of input data groups already consumed during the current execution, used while exploring IP\r
-      int ncp = 0; // number of input data groups already consumed during the current execution, used while exploring CP\r
-      bool cannotCompleteExec = false;\r
-      for(int m=0;m<productionCounter.size();m++) {\r
-        // search for the first production in PP\r
-        while (!isValidDataGroup(productionPattern,p)) {\r
-          p += 1;\r
-          o += 1;\r
+      int gap = 0; // count the number of extra null columns\r
+      // search for PC(m) valid input group in IP\r
+      while (nip < productionCounter.at(m)) {\r
+        if (clock+cip < lengthIP) {\r
+          if (isValidDataGroup(inputPattern,clock+cip)) nip += 1;\r
+          cip += 1;\r
+          gap += 1;\r
         }\r
-        int gap = 0; // count the number of extra null columns\r
-        // search for PC(m) valid input group in IP\r
-        while (nip < productionCounter.at(m)) {\r
-          if (clock+cip < lengthIP) {\r
-            if (isValidDataGroup(inputPattern,clock+cip)) nip += 1;\r
-            cip += 1;\r
-            gap += 1;\r
-          }\r
-          else {\r
-            cannotCompleteExec = true;\r
-            break;\r
-          }        \r
-        }        \r
-        \r
-        if (cannotCompleteExec) break; // no need to go further since the next search of input data group will lead to go outside inputPattern\r
-        \r
-        // search for PC(m) valid input group in IP\r
-        while (ncp < productionCounter.at(m)) {\r
-          if (isValidDataGroup(consumptionPattern,ccp)) ncp += 1;\r
-          ccp += 1;\r
-          gap -= 1;\r
+        else {\r
+          cannotCompleteExec = true;\r
+          break;\r
         }\r
-        o += gap; // to take into acocunt of extra null columns\r
-        combinePatterns(productionPattern,p,outputPattern,clock+o);\r
-        p += 1;\r
-        o += 1;\r
       }\r
-      \r
+\r
       if (cannotCompleteExec) break; // no need to go further since the next search of input data group will lead to go outside inputPattern\r
-      \r
-      // current exec. taken into accunt\r
-      nbExec += 1;\r
-      \r
-      // search for the next exec.\r
-      clock += 1;      \r
-      nip = 0;\r
-      while ((clock < lengthIP) && (nip < delta)) {\r
-        if (isValidDataGroup(inputPattern,clock)) nip += 1;\r
-        if (nip < delta) clock += 1;\r
+\r
+      // search for PC(m) valid input group in IP\r
+      while (ncp < productionCounter.at(m)) {\r
+        if (isValidDataGroup(consumptionPattern,ccp)) ncp += 1;\r
+        ccp += 1;\r
+        gap -= 1;\r
       }\r
-      cout << "found exec " << nbExec << " at clock: " << clock << endl;\r
+      o += gap; // to take into acocunt of extra null columns\r
+      combinePatterns(productionPattern,p,outputPattern,clock+o);\r
+      p += 1;\r
+      o += 1;\r
     }\r
-    // find the last valid output data group\r
-    while(! isValidDataGroup(outputPattern,lengthOP-1)) {\r
-      removeDataGroup(outputPattern,lengthOP-1);\r
-      lengthOP -= 1;\r
+\r
+    if (cannotCompleteExec) break; // no need to go further since the next search of input data group will lead to go outside inputPattern\r
+\r
+    // current exec. taken into accunt\r
+    nbExec += 1;\r
+\r
+    // search for the next exec.\r
+    clock += 1;\r
+    nip = 0;\r
+    while ((clock < lengthIP) && (nip < delta)) {\r
+      if (isValidDataGroup(inputPattern,clock)) nip += 1;\r
+      if (nip < delta) clock += 1;\r
     }\r
+    cout << "found exec " << nbExec << " at clock: " << clock << endl;\r
+  }\r
+  // find the last valid output data group\r
+  while(! isValidDataGroup(outputPattern,lengthOP-1)) {\r
+    removeDataGroup(outputPattern,lengthOP-1);\r
+    lengthOP -= 1;\r
+  }\r
+\r
+  // clear input pattern\r
+  clearInputPattern();\r
+\r
+  setOutputPatternComputed(true);\r
 \r
-    // clear input pattern\r
-    clearInputPattern();\r
-  }  \r
 }\r
 \r
 /*\r
index 8c469d5b2936d545eadd7c1baf4249f391dc8f07..ced4ab679d871b8f25abe5291f0512ed373c21bc 100644 (file)
@@ -46,7 +46,7 @@ public:
 \r
   // testers\r
   bool isFunctionalBlock();\r
-  bool isSourceBlock(); //! a source block has no parent and has no data inputs\r
+  bool isStimuliBlock(); //! a stimuli block has no parent and has no data inputs\r
 \r
   // others\r
 \r
@@ -63,8 +63,8 @@ public:
   \r
   // patterns\r
   void createPatterns() throw(Exception); // called in Graph, before checking compatibility and computing output pattern\r
-  void checkInputPatternCompatibility() throw(Exception);\r
-  void computeOutputPattern(int nbExec = -1) throw(Exception);\r
+  virtual void checkInputPatternCompatibility() throw(Exception);\r
+  virtual void computeOutputPattern(int nbExec = -1) throw(Exception);\r
   void computeAdmittanceDelays() throw(Exception); // compute differences between IP and admittance\r
 \r
 protected:\r
index eec7ea8e1249746285f271cb355063022eb0fa01..c0b63af1327c97c7e0aea14f34e80a14fb92d02a 100644 (file)
@@ -116,7 +116,7 @@ bool FunctionalInterface::canConnectTo(AbstractInterface *iface) {
     if ((direction == Output) && (iface->getDirection() == Output) && (purpose == iface->getPurpose())) return true;\r
     if ((direction == InOut) && (iface->getDirection() == InOut) && (purpose == iface->getPurpose())) return true;\r
   }\r
-  else if ((getOwner()->isSourceBlock()) && (iface->getOwner()->isTopGroupBlock())) {\r
+  else if ((getOwner()->isStimuliBlock()) && (iface->getOwner()->isTopGroupBlock())) {\r
     if ((direction == Output) && (iface->getDirection() == Input) && (purpose == iface->getPurpose())) return true;\r
   }\r
 \r
index a64d8aa7dd16a1279f670758ce95d3bf6542e7a9..4b22691ff97492ba3bf853d1f49563ccf2b08479 100644 (file)
--- a/Graph.cpp
+++ b/Graph.cpp
@@ -2,6 +2,7 @@
 #include "GroupBlock.h"
 #include "ReferenceBlock.h"
 #include "FunctionalBlock.h"
+#include "SpecialBlock.h"
 
 Graph::Graph(bool createTopGroupIface) {
   topGroup = new GroupBlock(NULL, createTopGroupIface);
@@ -40,7 +41,13 @@ GroupBlock* Graph::getGroupBlockByName(QString name) {
 
 FunctionalBlock* Graph::createFunctionalBlock(GroupBlock* group, ReferenceBlock* ref, bool createIfaces) {
 
-  FunctionalBlock* newBlock = new FunctionalBlock(group,ref, createIfaces);
+  FunctionalBlock* newBlock = NULL;
+  if (ref->getSpecialType() != -1) {
+    newBlock = new SpecialBlock(ref->getSpecialType(), group,ref, createIfaces);
+  }
+  else {
+    newBlock = new FunctionalBlock(group,ref, createIfaces);
+  }
   group->addBlock(newBlock);
 
   return newBlock;
@@ -77,37 +84,38 @@ FunctionalBlock* Graph::getFunctionalBlockByName(QString name, GroupBlock* paren
   return block;
 }
 
-FunctionalBlock* Graph::createSourceBlock(ReferenceBlock* ref, bool createIfaces) {
+FunctionalBlock* Graph::createStimuliBlock(ReferenceBlock* ref, bool createIfaces) {
+  /* A stimuli block is always a special block with idSpecial = 1 */
 
-  FunctionalBlock* newBlock = new FunctionalBlock(NULL,ref, createIfaces);
-  sources.append(newBlock);
+  FunctionalBlock* newBlock = new SpecialBlock(AbstractBlock::Source, NULL,ref, createIfaces);
+  stimulis.append(newBlock);
   return newBlock;
 }
 
-FunctionalBlock* Graph::duplicateSourceBlock(FunctionalBlock *block) {
+FunctionalBlock* Graph::duplicateStimuliBlock(FunctionalBlock *block) {
 
   ReferenceBlock* ref = block->getReference();  
 
   // adding to the graph
-  FunctionalBlock* newBlock = createSourceBlock(ref, true);
+  FunctionalBlock* newBlock = createStimuliBlock(ref, true);
   return newBlock;
 }
 
-FunctionalBlock* Graph::getSourceBlockByName(QString name) {
-  foreach(FunctionalBlock* block, sources) {
+FunctionalBlock* Graph::getStimuliBlockByName(QString name) {
+  foreach(FunctionalBlock* block, stimulis) {
     if (block->getName() == name) return block;
   }
   return NULL;
 }
 
-bool Graph::removeSourceBlock(FunctionalBlock *block) {
-  sources.removeAll(block);
+bool Graph::removeStimuliBlock(FunctionalBlock *block) {
+  stimulis.removeAll(block);
   return true;
 }
 
 void Graph::createPatterns() throw(Exception) {
   
-  foreach(AbstractBlock* block, sources) {
+  foreach(AbstractBlock* block, stimulis) {
     FunctionalBlock* funBlock = AB_TO_FUN(block);
     try {
       funBlock->createPatterns();
@@ -134,16 +142,16 @@ void Graph::createPatterns() throw(Exception) {
 }
 
 void Graph::resetPatternComputed() {
-  foreach(AbstractBlock* block, sources) {
-    block->setPatternComputed(false);
+  foreach(AbstractBlock* block, stimulis) {
+    block->setOutputPatternComputed(false);
     block->resetTraversalLevel();
   }
   foreach(AbstractBlock* block, groups) {
     GroupBlock* group = AB_TO_GRP(block);
-    group->setPatternComputed(false);
+    group->setOutputPatternComputed(false);
     block->resetTraversalLevel();
     foreach(AbstractBlock* inBlock, group->getBlocks()) {
-      inBlock->setPatternComputed(false);
+      inBlock->setOutputPatternComputed(false);
       block->resetTraversalLevel();
     }
   }
@@ -159,26 +167,26 @@ void Graph::computeOutputPatterns(int nbExec) throw(Exception) {
   }
 
   resetPatternComputed();
-  // search for all block that are generators.
-  QList<FunctionalBlock*> generators;
-  generators.append(sources);
+  // search for all block that are source.
+  QList<FunctionalBlock*> sources;
+  sources.append(stimulis);
   foreach(AbstractBlock* block, groups) {    
     GroupBlock* group = AB_TO_GRP(block);    
     foreach(AbstractBlock* inBlock, group->getBlocks()) {
       FunctionalBlock* funBlock = AB_TO_FUN(inBlock);
-      if ((inBlock->isFunctionalBlock()) && (inBlock->isGeneratorBlock())) {
-        generators.append(funBlock);
+      if (inBlock->isSourceBlock()) {
+        sources.append(funBlock);
       }
     }    
   }
   // search for maximum PP length
   int maxPP = 0;
-  foreach(FunctionalBlock* block, generators) {    
+  foreach(FunctionalBlock* block, sources) {
     if (block->getProductionPatternLength() > maxPP) maxPP = block->getProductionPatternLength();
   }
   // compute output for generators
   int maxExecLen = maxPP*nbExec;
-  foreach(FunctionalBlock* block, generators) {    
+  foreach(FunctionalBlock* block, sources) {
     int d = block->getProductionPatternLength();
     block->computeOutputPattern((maxExecLen+d-1)/d);
   }
diff --git a/Graph.h b/Graph.h
index a9b90aaf0198cd9941dc66ee0711a4bd3eb7d507..58690c9761def608401ec1b8ccc80ce6ef4e9e89 100644 (file)
--- a/Graph.h
+++ b/Graph.h
@@ -37,11 +37,11 @@ public:
   bool removeFunctionalBlock(FunctionalBlock* block);
   FunctionalBlock* getFunctionalBlockByName(QString name, GroupBlock* parent = NULL); //! if parent = NULL, search in the whole graph
 
-  // methods for source blocks
-  FunctionalBlock* createSourceBlock(ReferenceBlock *ref, bool createIfaces = true);
-  FunctionalBlock* duplicateSourceBlock(FunctionalBlock *block);
-  FunctionalBlock* getSourceBlockByName(QString name);
-  bool removeSourceBlock(FunctionalBlock* block);
+  // methods for stimulis blocks
+  FunctionalBlock* createStimuliBlock(ReferenceBlock *ref, bool createIfaces = true);
+  FunctionalBlock* duplicateStimuliBlock(FunctionalBlock *block);
+  FunctionalBlock* getStimuliBlockByName(QString name);
+  bool removeStimuliBlock(FunctionalBlock* block);
   
   // others
   QList<AbstractInterface *> getOutsideInterfaces();
@@ -62,7 +62,7 @@ public:
 private:  
   GroupBlock* topGroup;
   QList<GroupBlock *> groups; //! usefull to avoid recursive methods to find a particular group.
-  QList<FunctionalBlock*> sources; //! source for the top group
+  QList<FunctionalBlock*> stimulis; //! source for the top group
 
 };
 
index fda0546ed12ff4fb57417ced4dbc4e8d46f948e4..d682a57b2990ab23d738221d6d515de9e9d292a7 100644 (file)
@@ -139,11 +139,11 @@ void GroupBlock::createInputPattern() {
 }
 
 void GroupBlock::computeAdmittanceDelays() throw(Exception) {
-  throw(Exception(INVALID_GROUPBLOCK_USE));
+  throw(Exception(INVALID_GROUPBLOCK_USE,this));
 }
 
 void GroupBlock::checkInputPatternCompatibility()  throw(Exception){
-  throw(Exception(INVALID_GROUPBLOCK_USE));
+  throw(Exception(INVALID_GROUPBLOCK_USE,this));
 }
 
 
@@ -167,7 +167,7 @@ void GroupBlock::computeOutputPattern(int nbExec) throw(Exception) {
 
     bool addIt = false;
     // if a block is a generator and has control outputs, add it
-    if (block->isGeneratorBlock()) {
+    if (block->isSourceBlock()) {
       if (block->getControlOutputs().size() > 0) addIt = true;
     }
     else {
@@ -200,7 +200,7 @@ void GroupBlock::computeOutputPattern(int nbExec) throw(Exception) {
   while (!fifo.isEmpty()) {
     AbstractBlock* block = fifo.takeFirst();
     
-    if (block->getPatternComputed()) continue; // block has already been processed
+    if (block->getOutputPatternComputed()) continue; // block has already been processed
 
     cout << "computing compat and output for " << qPrintable(block->getName()) << endl;
     
@@ -221,7 +221,7 @@ void GroupBlock::computeOutputPattern(int nbExec) throw(Exception) {
       throw(e);
     }
     canCompute = true;
-    block->setPatternComputed(true);
+
     /* add other blocks connected from block to the fifo but only if
        all their connected inputs are connected to blocks that have
        a traversalLevel >=0
@@ -240,7 +240,7 @@ void GroupBlock::computeOutputPattern(int nbExec) throw(Exception) {
           ConnectedInterface* connFrom = ((ConnectedInterface*)iface)->getConnectedFrom();
           //cout << qPrintable(connFrom->getName()) << " of " << qPrintable(connFrom->getOwner()->getName()) << endl;
 
-          if ((connFrom != NULL) && (connFrom->getOwner()->getPatternComputed() == false)) {
+          if ((connFrom != NULL) && (connFrom->getOwner()->getOutputPatternComputed() == false)) {
             addIt = false;
             break;
           }
@@ -264,7 +264,7 @@ void GroupBlock::computeOutputPattern(int nbExec) throw(Exception) {
       QList<char>* pattern = new QList<char>(*(connIface->getConnectedFrom()->getOutputPattern()));
       connIface->setOutputPattern(pattern);
     }
-    setPatternComputed(true);
+    setOutputPatternComputed(true);
   }
 }
 
index 5f292b6aad1a94488dd809206f78b7802059a5a0..b42e7a047020869c98cbe341d8804f455106a0bc 100644 (file)
@@ -122,7 +122,7 @@ bool GroupInterface::canConnectFrom(AbstractInterface *iface) {
     if ((direction == Input) && (iface->getDirection() == Input) && (purpose == iface->getPurpose())) return true;
     if ((direction == InOut) && (iface->getDirection() == InOut) && (purpose == iface->getPurpose())) return true;
   }
-  else if ((getOwner()->isTopGroupBlock()) && (iface->getOwner()->isSourceBlock())) {
+  else if ((getOwner()->isTopGroupBlock()) && (iface->getOwner()->isStimuliBlock())) {
     if ((direction == Input) && (iface->getDirection() == Output) && (purpose == iface->getPurpose())) return true;
   }
 
index 385b352e3e86d4373257005db1800a8d63871f96..f275f8ebc25865556bfce20b001e99612cf1d720 100644 (file)
@@ -5,7 +5,7 @@
 #include "Dispatcher.h"
 #include "Parameters.h"
 #include "BoxItem.h"
-#include "SourceItem.h"
+#include "StimuliItem.h"
 #include "AbstractBlock.h"
 #include "AbstractInterface.h"
 #include "ConnectedInterface.h"
@@ -430,7 +430,7 @@ void GroupItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
     if (refBlock->isTopGroupBlock()) {
       QRectF rectGroup = boundingRectInScene();
       rectGroup.moveTo(rectGroup.x()+gapX,rectGroup.y()+gapY);
-      foreach(SourceItem* source, getScene()->getSourceItems()) {
+      foreach(StimuliItem* source, getScene()->getSourceItems()) {
         QRectF rectSource = source->boundingRectInScene();
         if (rectGroup.intersects(rectSource)) canMove = false;
       }
index 05d7c4c61cb96ba3d163270ea44d9c734884fc1a..70c88e25f1e8c96a4fcec0ec45d1d4e9dcd743c0 100644 (file)
@@ -5,7 +5,7 @@
 #include "GroupWidget.h"
 #include "GroupItem.h"
 #include "BoxItem.h"
-#include "SourceItem.h"
+#include "StimuliItem.h"
 #include "ConnectionItem.h"
 #include "InterfaceItem.h"
 #include "AbstractBlock.h"
@@ -73,7 +73,7 @@ int GroupScene::setItemsId(int countInit) {
   int counter = countInit;
   groupItem->setId(counter++);
   if (isTopScene()) {
-    foreach(SourceItem *item, sourceItems){
+    foreach(StimuliItem *item, stimuliItems){
       item->setId(counter++);
     } 
   }
@@ -89,7 +89,7 @@ int GroupScene::setInterfacesId(int countInit) {
     inter->setId(counter++);
   }
   if (isTopScene()) {
-    foreach(SourceItem *item, sourceItems){
+    foreach(StimuliItem *item, stimuliItems){
       foreach(InterfaceItem* inter, item->getInterfaces()){
         inter->setId(counter++);
       }
@@ -156,35 +156,35 @@ void GroupScene::removeBoxItem(BoxItem* item) {
   groupItem->updateShape();
 }
 
-SourceItem *GroupScene::createSourceItem(AbstractBlock *block) {
+StimuliItem *GroupScene::createStimuliItem(AbstractBlock *block) {
 
-  SourceItem* item = new SourceItem(block,dispatcher,params);
+  StimuliItem* item = new StimuliItem(block,dispatcher,params);
   // adding item to the scene
   addItem(item);
   item->setZValue(1);
   // add item from the QList
-  sourceItems.append(item);    
+  stimuliItems.append(item);    
   // center the new block
   QPointF groupPos = groupItem->pos();
-  QPointF newPos(groupPos.x()-item->getTotalWidth()-50, groupPos.y());  
+  QPointF newPos(groupPos.x()-item->getTotalWidth()-100, groupPos.y());
   newPos = newPos-item->getOriginPoint();
   item->moveTo(newPos);
   return item;
 }
 
-void GroupScene::addSourceItem(SourceItem* item) {  
+void GroupScene::addStimuliItem(StimuliItem* item) {  
   // adding item to the scene
   addItem(item);
   item->setZValue(1);  
   // add item from the QList
-  sourceItems.append(item);  
+  stimuliItems.append(item);  
 }
 
-void GroupScene::removeSourceItem(SourceItem* item) {
+void GroupScene::removeStimuliItem(StimuliItem* item) {
   // remove item from the viewport
   removeItem(item);
   // remove item from the QList
-  sourceItems.removeAll(item);  
+  stimuliItems.removeAll(item);  
 }
 
 void GroupScene::createConnectionItem(InterfaceItem *iface1, InterfaceItem *iface2, bool visible) {
@@ -272,8 +272,8 @@ void GroupScene::save(QXmlStreamWriter &writer) {
 
   if (isTopScene()) {
     writer.writeStartElement("source_items");
-    writer.writeAttribute("count",QString::number(sourceItems.length()));
-    foreach(SourceItem* item, sourceItems) {
+    writer.writeAttribute("count",QString::number(stimuliItems.length()));
+    foreach(StimuliItem* item, stimuliItems) {
       item->save(writer);
     }
     writer.writeEndElement(); // source_items
index 211d9d7937519151e861cbae245c2b82b0c62f75..d5a485ebcd7ceeffa05358e6460af8c94489d203 100644 (file)
@@ -12,7 +12,7 @@ class GroupWidget;
 class GroupItem;
 #include "BoxItem.h"
 class BoxItem;
-class SourceItem;
+class StimuliItem;
 class AbstractBoxItem;
 class ConnectionItem;
 class InterfaceItem;
@@ -54,7 +54,7 @@ public:
   // attributes getters
   inline GroupItem* getGroupItem() {return groupItem;}
   inline QList<BoxItem*> getBoxItems() { return boxItems; }
-  inline QList<SourceItem*> getSourceItems() { return sourceItems; }
+  inline QList<StimuliItem*> getSourceItems() { return stimuliItems; }
   inline QList<ConnectionItem*> getConnectionItems() { return connectionItems; }
   inline QList<GroupScene*> getChildrenScene() { return childrenScene; }
   inline GroupScene* getParentScene() { return parentScene; }
@@ -89,10 +89,10 @@ public:
   // GroupItem related
   void removeGroupItem();
   
-  // SourceItem related
-  SourceItem* createSourceItem(AbstractBlock* block); //! create a new SourceItem and place it around the group item
-  void addSourceItem(SourceItem* item); //! add an already configured SourceItem in the scene.
-  void removeSourceItem(SourceItem* item);
+  // StimuliItem related
+  StimuliItem* createStimuliItem(AbstractBlock* block); //! create a new SourceItem and place it around the group item
+  void addStimuliItem(StimuliItem* item); //! add an already configured SourceItem in the scene.
+  void removeStimuliItem(StimuliItem* item);
   
   // child scenes related
   inline void addChildScene(GroupScene* child) { childrenScene.append(child); }
@@ -118,7 +118,7 @@ private:
   GroupItem *groupItem; //! for convenience, the group item is directly accessible via this attribute
   QList<ConnectionItem*> connectionItems; //! for convenience, connections are directly accessible via this attribute
   QList<BoxItem*> boxItems; //! for convenience, box items are directly accessible via this attribute
-  QList<SourceItem*> sourceItems; //! for convenience, box items are directly accessible via this attribute. Only usefull for top scene
+  QList<StimuliItem*> stimuliItems; //! for convenience, box items are directly accessible via this attribute. Only usefull for top scene
   QList<GroupScene*> childrenScene;//! for convenience, children scenes are directly accessible via this attribute
   bool topScene;
   EditMode editMode;
index 1ef3aae76b5c3de65eeb940cb3dc78c958da847e..02b04ac6aa3db045d593bab291c265bc715b301e 100644 (file)
@@ -98,7 +98,7 @@ void InterfaceItem::paint(QPainter *painter) {
       if(owner->isBoxItem()) {
         painter->setPen(QPen(Qt::black,1));
       }
-      else if(owner->isSourceItem()) {
+      else if(owner->isStimuliItem()) {
         painter->setPen(QPen(Qt::darkCyan,1));
       }
     }
@@ -165,7 +165,7 @@ void InterfaceItem::paint(QPainter *painter) {
       if(owner->isGroupItem()){
         painter->drawText(-(w+params->arrowWidth+params->arrowLineLength),-h/2,w,h,Qt::AlignLeft | Qt::TextWordWrap, refInter->getName());
       }
-      else if((owner->isBoxItem()) || (owner->isSourceItem())){
+      else if((owner->isBoxItem()) || (owner->isStimuliItem())){
         painter->drawText(0,-h/2,w,h,Qt::AlignRight | Qt::TextWordWrap, refInter->getName());
       }
     }
@@ -174,7 +174,7 @@ void InterfaceItem::paint(QPainter *painter) {
       if(owner->isGroupItem()) {
         painter->drawText(params->arrowWidth+params->arrowLineLength,-h/2,w,h,Qt::AlignRight | Qt::TextWordWrap, refInter->getName());
       }
-      else if((owner->isBoxItem()) || (owner->isSourceItem())){     
+      else if((owner->isBoxItem()) || (owner->isStimuliItem())){     
         painter->drawText(-w,-h/2,w,h,Qt::AlignLeft | Qt::TextWordWrap, refInter->getName());
       }
     }
index 60d7971c07e228dc849b2f7875f652b77a0dc696..98ea7ebc0d626c016f99bfeb9b6146fa66e940e7 100644 (file)
@@ -9,7 +9,7 @@
 #include "GroupScene.h"\r
 #include "GroupItem.h"\r
 #include "BoxItem.h"\r
-#include "SourceItem.h"\r
+#include "StimuliItem.h"\r
 #include "InterfaceItem.h"\r
 #include "ConnectionItem.h"\r
 \r
@@ -325,7 +325,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
       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
+        StimuliItem* sourceItem = new StimuliItem(dispatcher,this);\r
         try {\r
           sourceItem->load(currentSBNode);\r
         }\r
@@ -334,7 +334,7 @@ GroupWidget *Parameters::loadProject(QDomElement root) throw(Exception) {
         }\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
+        currentScene->addStimuliItem(sourceItem);\r
       } \r
     }\r
     /**********************************************************\r
@@ -1303,7 +1303,7 @@ InterfaceItem* Parameters::searchInterfaceItemById(int id, GroupScene* scene) {
     }\r
   }\r
   if (scene->isTopScene()) {\r
-    foreach(SourceItem *block, scene->getSourceItems()){\r
+    foreach(StimuliItem *block, scene->getSourceItems()){\r
       foreach(InterfaceItem *item, block->getInterfaces()){\r
         if(item->getId() == id){\r
           return item;\r
index b6dee80ce813a88016e75e0cc823a856239a263c..9b3959c052fccde774b6584e5bef6c39bab06de6 100644 (file)
@@ -9,7 +9,7 @@
 #include "Parameters.h"
 
 ReferenceBlock::ReferenceBlock(const QString _xmlFile) : AbstractBlock() {
-  xmlFile = _xmlFile;
+  xmlFile = _xmlFile;  
 }
 
 void ReferenceBlock::addCategory(int id) {
@@ -40,6 +40,16 @@ void ReferenceBlock::setHashMd5() {
 
 void ReferenceBlock::load(QDomElement &elt) throw(Exception) {
 
+  cout << "Block : get version" << endl;
+  QString verStr = elt.attribute("version","none");
+  QString specialStr = elt.attribute("special","none");
+  if (verStr != "none") {
+    setVersion(verStr);
+  }
+  else {
+    setVersion("0.0");
+  }
+  setSpecialType(getSpecialTypeFromString(specialStr));
 
   cout << "Block : get informations" << endl;  
   QDomElement eltInfo  = elt.firstChildElement("informations");
@@ -419,6 +429,8 @@ QDataStream& operator<<(QDataStream &out, const ReferenceBlock &b) {
 
   toWrite << b.name;
   toWrite << b.xmlFile;
+  toWrite << b.specialType;
+  toWrite << b.version;
   toWrite << b.description;
   toWrite << b.categories;
   toWrite << b.hashMd5;
@@ -547,6 +559,8 @@ QDataStream& operator>>(QDataStream &in, ReferenceBlock &b) {
 
   in >> b.name;
   in >> b.xmlFile;
+  in >> b.specialType;
+  in >> b.version;
   in >> b.description;
   in >> b.categories;
   in >> b.hashMd5;
index 2d225e2ea3e389f89645f0abedec850026a04f05..8c7cc1025ed0ea1887d594f3e41173838aeaa9f5 100644 (file)
@@ -1,18 +1,31 @@
 #include "SpecialBlock.h"\r
+#include "FunctionalInterface.h"\r
 \r
-SpecialBlock::SpecialBlock(SpecialType _type, GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces) throw(Exception) : FunctionalBlock(_parent, _reference, createIfaces) {\r
-  type = _type;  \r
+SpecialBlock::SpecialBlock(int _type, GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces) throw(Exception) : FunctionalBlock(_parent, _reference, createIfaces) {\r
+  specialType = _type;\r
 }\r
 \r
 SpecialBlock::~SpecialBlock() {\r
 }\r
 \r
+bool SpecialBlock::isSpecialBlock() {\r
+  return true;\r
+}\r
+\r
 void SpecialBlock::checkInputPatternCompatibility() throw(Exception) {\r
   try {\r
-    switch(type) {\r
-    case ClockConvert :\r
+    switch(specialType) {\r
+    case Source :\r
+      checkInputPatternCompatibilitySource();\r
+      break;\r
+    case Sink :\r
+      checkInputPatternCompatibilitySink();\r
+      break;\r
+    case ClkConvert :\r
       checkInputPatternCompatibilityClockConvert();\r
-      break;    \r
+      break;\r
+    default:\r
+      break;\r
     }\r
   }\r
   catch(Exception e) {\r
@@ -22,10 +35,18 @@ void SpecialBlock::checkInputPatternCompatibility() throw(Exception) {
 \r
 void SpecialBlock::computeOutputPattern(int nbExec) throw(Exception) {\r
   try {\r
-    switch(type) {\r
-    case ClockConvert :\r
+    switch(specialType) {\r
+    case Source :\r
+      computeOutputPatternSource(nbExec);\r
+      break;\r
+    case Sink :\r
+      computeOutputPatternSink(nbExec);\r
+      break;\r
+    case ClkConvert :\r
       computeOutputPatternClockConvert(nbExec);\r
       break;    \r
+    default:\r
+      break;\r
     }\r
   }\r
   catch(Exception e) {\r
@@ -33,6 +54,30 @@ void SpecialBlock::computeOutputPattern(int nbExec) throw(Exception) {
   }\r
 }\r
 \r
+void SpecialBlock::checkInputPatternCompatibilitySource() throw(Exception) {\r
+}\r
+void SpecialBlock::computeOutputPatternSource(int nbExec) throw(Exception) {\r
+\r
+  cout << "computing output pattern of " << qPrintable(name) << " for " << nbExec << " executions" << endl;\r
+  foreach(AbstractInterface* iface, getControlOutputs()) {\r
+    FunctionalInterface* connIface = AI_TO_FUN(iface);\r
+    // create output pattern\r
+    QList<char>* pp = productionPattern.value(connIface);\r
+    QList<char>* pattern = new QList<char>(*pp);\r
+    for(int i=1;i<nbExec;i++) pattern->append(*pp);\r
+    // assign pattern to interface\r
+    connIface->setOutputPattern(pattern);\r
+    // store it in QMap\r
+    outputPattern.insert(connIface,pattern);\r
+  }\r
+  setOutputPatternComputed(true);\r
+}\r
+\r
+void SpecialBlock::checkInputPatternCompatibilitySink() throw(Exception) {\r
+}\r
+void SpecialBlock::computeOutputPatternSink(int nbExec) throw(Exception) {\r
+}\r
+\r
 void SpecialBlock::checkInputPatternCompatibilityClockConvert() throw(Exception) {\r
 }\r
 void SpecialBlock::computeOutputPatternClockConvert(int nbExec) throw(Exception) {\r
index 574803d883de02b23cb511aeb1c8fdc82ed2fb39..aff0d6bc7720401c127266ea787d30bdefa9fb30 100644 (file)
@@ -14,27 +14,29 @@ using namespace Qt;
 \r
 \r
 class SpecialBlock : public FunctionalBlock {\r
-public:\r
-\r
-  enum SpecialType { ClockConvert = 1 };\r
+public:  \r
   \r
-  SpecialBlock(SpecialType _type, GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces = true) throw(Exception);\r
+  SpecialBlock(int _type, GroupBlock* _parent, ReferenceBlock* _reference, bool createIfaces = true) throw(Exception);\r
   ~SpecialBlock();\r
-  // getters\r
+  // getters  \r
   \r
   // setters\r
   \r
   // testers\r
+  bool isSpecialBlock();\r
 \r
-  // others\r
+  // others  \r
  \r
   // patterns\r
   void checkInputPatternCompatibility() throw(Exception);\r
   void computeOutputPattern(int nbExec = -1) throw(Exception);\r
 \r
-private:\r
-  SpecialType type;\r
-  \r
+private:  \r
+\r
+  void checkInputPatternCompatibilitySource() throw(Exception);\r
+  void computeOutputPatternSource(int nbExec = -1) throw(Exception);\r
+  void checkInputPatternCompatibilitySink() throw(Exception);\r
+  void computeOutputPatternSink(int nbExec = -1) throw(Exception);\r
   void checkInputPatternCompatibilityClockConvert() throw(Exception);\r
   void computeOutputPatternClockConvert(int nbExec = -1) throw(Exception);\r
 \r
similarity index 95%
rename from SourceItem.cpp
rename to StimuliItem.cpp
index 0229e7f2d7117972b752f9cd0ba83883c940693e..dff524702658977813d4adee702e6a0997b6fb29 100644 (file)
@@ -1,4 +1,4 @@
-#include "SourceItem.h"
+#include "StimuliItem.h"
 #include "GroupScene.h"
 #include "ConnectionItem.h"
 #include "InterfaceItem.h"
@@ -15,7 +15,7 @@
 #include "Graph.h"
 
 
-SourceItem::SourceItem(AbstractBlock *_refBlock,
+StimuliItem::StimuliItem(AbstractBlock *_refBlock,
                      Dispatcher *_dispatcher,
                      Parameters *_params) throw(Exception) : AbstractBoxItem( _refBlock, _dispatcher, _params) {
 
@@ -39,7 +39,7 @@ SourceItem::SourceItem(AbstractBlock *_refBlock,
   //cout << "pos in group: " << x() << "," << y() << endl;
 }
 
-SourceItem::SourceItem(Dispatcher *_dispatcher, Parameters *_params) throw(Exception) : AbstractBoxItem(_dispatcher, _params) {
+StimuliItem::StimuliItem(Dispatcher *_dispatcher, Parameters *_params) throw(Exception) : AbstractBoxItem(_dispatcher, _params) {
 
   refBlock = NULL;
   currentBorder = NoBorder;
@@ -52,10 +52,10 @@ SourceItem::SourceItem(Dispatcher *_dispatcher, Parameters *_params) throw(Excep
   boxHeight = params->defaultBlockHeight;
 }
 
-SourceItem::~SourceItem() {
+StimuliItem::~StimuliItem() {
 }
 
-void SourceItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
+void StimuliItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
   QPen pen(Qt::black, 3);
   if(selected)
     pen.setColor(Qt::red);
@@ -71,16 +71,16 @@ void SourceItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option
   }
 }
 
-void SourceItem::moveTo(QPointF dest) {
+void StimuliItem::moveTo(QPointF dest) {
   setPos(dest);
   currentPosition = dest;
 }
 
-bool SourceItem::isSourceItem() {
+bool StimuliItem::isStimuliItem() {
   return true;
 }
 
-void SourceItem::nameChanged() {
+void StimuliItem::nameChanged() {
 
   
   QFontMetrics fmId(params->defaultBlockFont);
@@ -91,7 +91,7 @@ void SourceItem::nameChanged() {
   update();  
 }
 
-void SourceItem::updateMinimumSize() {
+void StimuliItem::updateMinimumSize() {
 
   int maxSouth = 0;
   int maxNorth = 0;
@@ -149,7 +149,7 @@ void SourceItem::updateMinimumSize() {
 /* updateGeometry() :
 
  */
-bool SourceItem::updateGeometry(ChangeType type) {
+bool StimuliItem::updateGeometry(ChangeType type) {
 
   currentPosition = pos();
   //cout << "current pos of block: " << currentPosition.x() << "," << currentPosition.y() << endl;
@@ -212,7 +212,7 @@ bool SourceItem::updateGeometry(ChangeType type) {
   return false;
 }
 
-void SourceItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
+void StimuliItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
 
   if(params->editState == Parameters::EditBlockMove) {
     QPointF absPos = currentPosition + originPoint;
@@ -303,7 +303,7 @@ void SourceItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) {
   }
 }
 
-void SourceItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
+void StimuliItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
 
   QPointF pos = event->pos();
   qreal x = pos.x();
@@ -366,7 +366,7 @@ void SourceItem::mousePressEvent(QGraphicsSceneMouseEvent *event) {
   }
 }
 
-void SourceItem::mouseReleaseEvent(QGraphicsSceneMouseEvent  *event) {
+void StimuliItem::mouseReleaseEvent(QGraphicsSceneMouseEvent  *event) {
 
   //setZValue(zValue()-100);
 
@@ -415,7 +415,7 @@ void SourceItem::mouseReleaseEvent(QGraphicsSceneMouseEvent  *event) {
   QGraphicsItem::mouseReleaseEvent(event);
 }
 
-void SourceItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) {
+void StimuliItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) {
 
   QPointF pos = event->pos();
   qreal x = pos.x();
@@ -485,7 +485,7 @@ void SourceItem::hoverMoveEvent(QGraphicsSceneHoverEvent * event) {
 }
 
 
-void SourceItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
+void StimuliItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
 
   event->accept();
 
@@ -539,17 +539,17 @@ void SourceItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
   if(selectedAction == NULL) return ;
 
   if (selectedAction == removeAction) {    
-    dispatcher->removeSourceItem(Dispatcher::Design, this);
+    dispatcher->removeStimuliItem(Dispatcher::Design, this);
   }
   else if (selectedAction == duplicateAction) {
-    dispatcher->duplicateSourceItem(Dispatcher::Design, this);
+    dispatcher->duplicateStimuliItem(Dispatcher::Design, this);
   }
   else if(selectedAction == renameAction){
     if(ifaceItem != NULL) {
       dispatcher->renameInterface(Dispatcher::Design, ifaceItem);
     }
     else {      
-      dispatcher->renameSourceBlock(Dispatcher::Design, this);
+      dispatcher->renameStimuliItem(Dispatcher::Design, this);
     }   
   }
   else if(selectedAction == showProperties){
@@ -563,7 +563,7 @@ void SourceItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * event) {
   }
 }
 
-void SourceItem::load(QDomElement funcElement) throw(Exception) {
+void StimuliItem::load(QDomElement funcElement) throw(Exception) {
 
   bool ok = false;
 
@@ -614,7 +614,7 @@ void SourceItem::load(QDomElement funcElement) throw(Exception) {
     reference = referenceMd5;
   }
     
-  FunctionalBlock* functionalBlock = params->getGraph()->createSourceBlock(reference);
+  FunctionalBlock* functionalBlock = params->getGraph()->createStimuliBlock(reference);
   /* NB: createSourceBlock creates all interfaces from the reference, which is annoying when
     reading bif_iface tags. Thus interface are all removed.
   */
@@ -706,7 +706,7 @@ void SourceItem::load(QDomElement funcElement) throw(Exception) {
   updateGeometry(Resize);
 }
 
-void SourceItem::save(QXmlStreamWriter &writer) {
+void StimuliItem::save(QXmlStreamWriter &writer) {
   
   writer.writeStartElement("source_item");
   
similarity index 72%
rename from SourceItem.h
rename to StimuliItem.h
index 72ebedefb0f8c0593142c4d404299733d165e3f3..c8d68a05abe09b8816973c5e84c68c4bd887c247 100644 (file)
@@ -1,5 +1,5 @@
-#ifndef __SOURCEITEM_H__
-#define __SOURCEITEM_H__
+#ifndef __STIMULIITEM_H__
+#define __STIMULIITEM_H__
 
 #include <iostream>
 
@@ -21,24 +21,24 @@ using namespace std;
 using namespace Qt;
 
 /*!
- * \brief The SourceItem class
- * A SourceItem represents a special type of block that is added only
+ * \brief The StimuliItem class
+ * A StimuliItem represents a special type of block that is added only
  * to the top scene, in order to simulate inputs on the FPGA input
  * pins. This, the reference block used as a source must be chosen
  * among blocks that have no inputs and only outputs (with multiplicity
  * = 1)
  */
-class SourceItem : public AbstractBoxItem {
+class StimuliItem : public AbstractBoxItem {
 
 public:
-  SourceItem(AbstractBlock *_refBlock, Dispatcher *_dispatcher, Parameters *_params) throw(Exception);
-  SourceItem(Dispatcher *_dispatcher, Parameters *_params) throw(Exception);
-  ~SourceItem();
+  StimuliItem(AbstractBlock *_refBlock, Dispatcher *_dispatcher, Parameters *_params) throw(Exception);
+  StimuliItem(Dispatcher *_dispatcher, Parameters *_params) throw(Exception);
+  ~StimuliItem();
 
   void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);  
 
   // testers
-  bool isSourceItem();
+  bool isStimuliItem();
 
   // others
   void nameChanged();
@@ -59,4 +59,4 @@ protected:
   
 };
 
-#endif // __SOURCEITEM_H__
+#endif // __STIMULIITEM_H__
index ee6eead3e209db99219cd6a61b0ab6cc40985ce0..eb750a8a1962c15e686439506e56a31dd879be16 100644 (file)
@@ -1,10 +1,10 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.2.0, 2018-05-02T22:20:14. -->
+<!-- Written by QtCreator 4.2.0, 2018-05-03T15:15:26. -->
 <qtcreator>
  <data>
   <variable>EnvironmentId</variable>
-  <value type="QByteArray">{c8006d66-d34f-42be-ad10-d0207752286d}</value>
+  <value type="QByteArray">{3701e197-5b6c-48ea-9e98-a6cf6de18672}</value>
  </data>
  <data>
   <variable>ProjectExplorer.Project.ActiveTarget</variable>
@@ -61,7 +61,7 @@
   <valuemap type="QVariantMap">
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Desktop</value>
    <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName">Desktop</value>
-   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{2c9bf876-3476-44eb-8065-1f0844704dda}</value>
+   <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">{ed04208c-8774-456b-99b9-4a02094ca7a4}</value>
    <value type="int" key="ProjectExplorer.Target.ActiveBuildConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveDeployConfiguration">0</value>
    <value type="int" key="ProjectExplorer.Target.ActiveRunConfiguration">0</value>
index 114b32dca72a92ad76392027f9a39acb46aef60e..8dcb9aa33fdcb0aa9d088f45ef980e14729fbd55 100755 (executable)
@@ -42,13 +42,13 @@ GroupInterface.h
 GroupInterface.cpp
 BlockLibraryWidget.cpp
 BlockLibraryWidget.h
+StimuliItem.cpp
+StimuliItem.h
 VHDLConverter.cpp
 VHDLConverter.h
 blast.cpp
 BlockCategory.cpp
 BlockCategory.h
-SourceItem.cpp
-SourceItem.h
 BoxItem.cpp
 BoxItem.h
 BlockLibraryTree.cpp
diff --git a/lib/implementations/impls.bmf b/lib/implementations/impls.bmf
new file mode 100644 (file)
index 0000000..31ec0a1
Binary files /dev/null and b/lib/implementations/impls.bmf differ
index 9247fb2c1368d13c06f55354d3f0e819f91de9a7..b980f69c24b845f2ddd9590daa5e64dfe1edb007 100644 (file)
@@ -1,5 +1,5 @@
 <!DOCTYPE clkdomain_convert_1024x8>
-<block version="0.1" special="1">
+<block version="0.1" special="clkconvert">
   <informations>
     <name>clkdomain_convert_1024x8</name>
     <category ids="10"/>
index 7da5240c34616b7909883f8485b855e435f7befc..4d4d627b76c3dec6bb09d37e6d532a2b01afcfe5 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<block>
+<block special="source">
   <informations>
     <name>
       generator-csvreader
index 76e4d392edb73487737f2883d73af018922fe92a..2ddf876644fe91dde8180b36b935250ac6093fb4 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<block>
+<block special="source">
   <informations>
     <name>
       generator-cst
index a3905a0688b16b88fd864c29d2d711e2df42d875..dfc18eb663da85303132232323ea50e925dd93d9 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<block>
+<block special="source">
   <informations>
     <name>
       generator-img
index 7cebc17ccde29aa7b601058ed0e8688d96ba5860..c8fd7f1e725f493a12f5447e553c1aa213c7c9ce 100644 (file)
@@ -1,5 +1,5 @@
 <!DOCTYPE read_csv>
-<block version="0.1">
+<block version="0.1" special="source">
   <informations>
     <name>read_csv</name>
     <category ids="6"/>
index 3c19438c097d2343fffb1e6485f708444c5a1fe1..b7a6ef6d9acaa1b455b30970d8800f9d287577d9 100644 (file)
Binary files a/lib/references/references.bmf and b/lib/references/references.bmf differ
index 2adb35efc2606fddf88732149f4c31e5e1204810..8184399ce635c70bfc9d51a341f2f23a5c577677 100644 (file)
@@ -16,7 +16,7 @@ COMMON-OBJ = $(BUILDPATH)/AbstractBlock.o \
           $(BUILDPATH)/AbstractBoxItem.o \
           $(BUILDPATH)/BoxItem.o \
           $(BUILDPATH)/GroupItem.o \
-          $(BUILDPATH)/SourceItem.o \
+          $(BUILDPATH)/StimuliItem.o \
           $(BUILDPATH)/BlockCategory.o \
           $(BUILDPATH)/BlockLibraryTree.o \
           $(BUILDPATH)/BlockLibraryWidget.o \
index 9442528904882607cb97adba5c167f8fbffbaf64..259506f3214f70768e57a322f594aa8f7668c7ab 100644 (file)
     <xs:attribute name="name" type="xs:string"/>
     <xs:attribute name="clock" type="xs:string"/>
 
+    <xs:simpleType name="typespecial">
+      <xs:restriction base="xs:string">
+       <xs:enumeration value="source"/>
+       <xs:enumeration value="sink"/>
+       <xs:enumeration value="clkconvert"/>
+      </xs:restriction>
+    </xs:simpleType>
+    
     <xs:simpleType name="typeparam">
       <xs:restriction base="xs:string">
        <xs:enumeration value="string"/>
       <xs:complexType>
        <xs:group ref="blockElmtGroup"/>
        <xs:attribute name="version" type="xs:string" use="optional" />
-       <xs:attribute name="special" type="xs:nonNegativeInteger" use="optional" />
+       <xs:attribute name="special" type="typespecial" use="optional" />
       </xs:complexType>
     </xs:element>