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

Private GIT Repository
nearly finished GroupBlock VHDL gen
[blast.git] / Graph.cpp
index a4dd676142370731391ddb74333e256195e6ea90..5b491b07ea15c5cd24d06daff89e90ff1bc814fa 100644 (file)
--- a/Graph.cpp
+++ b/Graph.cpp
@@ -24,7 +24,7 @@ GroupBlock* Graph::createChildGroupBlock(GroupBlock* parent) {
   return b;
 }
 
   return b;
 }
 
-bool Graph::removeGroupBlock(GroupBlock *group) {
+void Graph::removeGroupBlock(GroupBlock *group) {
   group->removeAllBlocks();
   GroupBlock* parent = AB_TO_GRP(group->getParent());
   parent->removeBlock(group);
   group->removeAllBlocks();
   GroupBlock* parent = AB_TO_GRP(group->getParent());
   parent->removeBlock(group);
@@ -88,8 +88,7 @@ FunctionalBlock* Graph::createSourceBlock(ReferenceBlock* ref) {
 
 FunctionalBlock* Graph::duplicateSourceBlock(FunctionalBlock *block) {
 
 
 FunctionalBlock* Graph::duplicateSourceBlock(FunctionalBlock *block) {
 
-  ReferenceBlock* ref = block->getReference();
-  GroupBlock* group = AB_TO_GRP(block->getParent());
+  ReferenceBlock* ref = block->getReference();  
 
   // adding to the graph
   FunctionalBlock* newBlock = createSourceBlock(ref);
 
   // adding to the graph
   FunctionalBlock* newBlock = createSourceBlock(ref);
@@ -107,3 +106,98 @@ bool Graph::removeSourceBlock(FunctionalBlock *block) {
   sources.removeAll(block);
   return true;
 }
   sources.removeAll(block);
   return true;
 }
+
+void Graph::createPatterns() throw(Exception) {
+  
+  foreach(AbstractBlock* block, sources) {
+    FunctionalBlock* funBlock = AB_TO_FUN(block);
+    try {
+      funBlock->createPatterns();
+    }
+    catch(Exception e) {
+      throw(e);      
+    }
+  }
+  
+  foreach(AbstractBlock* block, groups) {
+    GroupBlock* group = AB_TO_GRP(block);    
+    foreach(AbstractBlock* inBlock, group->getBlocks()) {
+      if (inBlock->isFunctionalBlock()) {
+        FunctionalBlock* funBlock = AB_TO_FUN(inBlock);
+        try {
+          funBlock->createPatterns();
+        }
+        catch(Exception e) {
+          throw(e);
+        }
+      }
+    }
+  }  
+}
+
+void Graph::resetPatternComputed() {
+  foreach(AbstractBlock* block, sources) {
+    block->setPatternComputed(false);
+    block->resetTraversalLevel();
+  }
+  foreach(AbstractBlock* block, groups) {
+    GroupBlock* group = AB_TO_GRP(block);
+    group->setPatternComputed(false);
+    block->resetTraversalLevel();
+    foreach(AbstractBlock* inBlock, group->getBlocks()) {
+      inBlock->setPatternComputed(false);
+      block->resetTraversalLevel();
+    }
+  }
+}
+
+void Graph::computeOutputPatterns(int nbExec) throw(Exception) {
+  
+  try {
+    createPatterns();
+  }
+  catch(Exception e) {
+    throw(e);    
+  }
+
+  resetPatternComputed();
+  // search for all block that are generators.
+  QList<FunctionalBlock*> generators;
+  generators.append(sources);
+  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);
+      }
+    }    
+  }
+  // search for maximum PP length
+  int maxPP = 0;
+  foreach(FunctionalBlock* block, generators) {    
+    if (block->getProductionPatternLength() > maxPP) maxPP = block->getProductionPatternLength();
+  }
+  // compute output for generators
+  int maxExecLen = maxPP*nbExec;
+  foreach(FunctionalBlock* block, generators) {    
+    int d = block->getProductionPatternLength();
+    block->computeOutputPattern((maxExecLen+d-1)/d);
+  }
+  // compute output for top group
+  try {
+    topGroup->computeOutputPattern();
+  }
+  catch(Exception e) {
+    throw(e);
+  }
+}
+
+void Graph::generateVHDL(const QString &path) throw(Exception) {
+  try {
+    topGroup->generateVHDL(path);
+  }
+  catch(Exception e) {
+    throw(e);
+  }
+}