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

Private GIT Repository
started clkconvert output gen
[blast.git] / Graph.cpp
index bd1eb70feeabe6f3c132fc395c5f804546427690..808dbda2f18486c8e247651e4290cea3fdebd109 100644 (file)
--- a/Graph.cpp
+++ b/Graph.cpp
@@ -2,11 +2,10 @@
 #include "GroupBlock.h"
 #include "ReferenceBlock.h"
 #include "FunctionalBlock.h"
+#include "SpecialBlock.h"
 
 Graph::Graph() {
-  topGroup = new GroupBlock(NULL);
-  topGroup->setName("top group");
-  groups.append(topGroup);
+  topGroup = NULL;
 }
 
 Graph::~Graph() {
@@ -14,12 +13,18 @@ Graph::~Graph() {
   delete topGroup;
 }
 
+void Graph::createTopGroup(bool createTopGroupIfaces) {
+  topGroup = new GroupBlock(this, NULL, createTopGroupIfaces);
+  topGroup->setName("top group");
+  groups.append(topGroup);
+}
+
 QList<AbstractInterface *> Graph::getOutsideInterfaces() {
   return topGroup->getInterfaces();
 }
 
-GroupBlock* Graph::createChildGroupBlock(GroupBlock* parent) {
-  GroupBlock* b = new GroupBlock(parent);
+GroupBlock* Graph::createChildGroupBlock(GroupBlock* parent, bool createGroupIface) {
+  GroupBlock* b = new GroupBlock(this, parent, createGroupIface);
   groups.append(b);
   return b;
 }
@@ -38,10 +43,17 @@ GroupBlock* Graph::getGroupBlockByName(QString name) {
   return NULL;
 }
 
-FunctionalBlock* Graph::createFunctionalBlock(GroupBlock* group, ReferenceBlock* ref) {
+FunctionalBlock* Graph::createFunctionalBlock(GroupBlock* group, ReferenceBlock* ref, bool createIfaces) {
 
-  FunctionalBlock* newBlock = new FunctionalBlock(group,ref);
-  newBlock->populate();
+  FunctionalBlock* newBlock = NULL;
+  if (ref->getSpecialType() != -1) {
+    cout << "Graph: create special block from " << qPrintable(ref->getName()) << endl;
+    newBlock = new SpecialBlock(this, ref->getSpecialType(), group,ref, createIfaces);
+  }
+  else {
+    cout << "Graph: create normal block from " << qPrintable(ref->getName()) << endl;
+    newBlock = new FunctionalBlock(this, group,ref, createIfaces);
+  }
   group->addBlock(newBlock);
 
   return newBlock;
@@ -53,7 +65,7 @@ FunctionalBlock* Graph::duplicateFunctionalBlock(FunctionalBlock *block) {
   GroupBlock* group = AB_TO_GRP(block->getParent());
 
   // adding to the graph
-  FunctionalBlock* newBlock = createFunctionalBlock(group,ref);
+  FunctionalBlock* newBlock = createFunctionalBlock(group,ref, true);
   return newBlock;
 }
 
@@ -78,38 +90,38 @@ FunctionalBlock* Graph::getFunctionalBlockByName(QString name, GroupBlock* paren
   return block;
 }
 
-FunctionalBlock* Graph::createSourceBlock(ReferenceBlock* ref) {
+FunctionalBlock* Graph::createStimuliBlock(ReferenceBlock* ref, bool createIfaces) {
+  /* A stimuli block is always a special block with idSpecial = 1 */
 
-  FunctionalBlock* newBlock = new FunctionalBlock(NULL,ref);
-  newBlock->populate();
-  sources.append(newBlock);
+  FunctionalBlock* newBlock = new SpecialBlock(this, 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);
+  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();
@@ -136,16 +148,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();
     }
   }
@@ -161,26 +173,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);
   }
@@ -192,3 +204,17 @@ void Graph::computeOutputPatterns(int nbExec) throw(Exception) {
     throw(e);
   }
 }
+
+void Graph::generateVHDL(const QString &path) throw(Exception) {
+  try {
+    topGroup->generateVHDL(path);
+  }
+  catch(Exception e) {
+    throw(e);
+  }
+}
+
+QList<QString> Graph::getExternalResources() {
+  QList<QString> list = topGroup->getExternalResources();
+  return list;
+}