X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/1b7818e18ed7bcf3464e307b97c6e0e6d72cc69b..3fb762e7042d9b4a1cf78556ad9ed7f117cc53ba:/Graph.cpp diff --git a/Graph.cpp b/Graph.cpp index a64d8aa..8e55077 100644 --- a/Graph.cpp +++ b/Graph.cpp @@ -2,11 +2,10 @@ #include "GroupBlock.h" #include "ReferenceBlock.h" #include "FunctionalBlock.h" +#include "SpecialBlock.h" -Graph::Graph(bool createTopGroupIface) { - topGroup = new GroupBlock(NULL, createTopGroupIface); - topGroup->setName("top group"); - groups.append(topGroup); +Graph::Graph() { + topGroup = NULL; } Graph::~Graph() { @@ -14,6 +13,12 @@ Graph::~Graph() { delete topGroup; } +void Graph::createTopGroup(bool createTopGroupIfaces) { + topGroup = new GroupBlock(NULL, createTopGroupIfaces); + topGroup->setName("top group"); + groups.append(topGroup); +} + QList Graph::getOutsideInterfaces() { return topGroup->getInterfaces(); } @@ -40,7 +45,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 +88,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 +146,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 +171,26 @@ void Graph::computeOutputPatterns(int nbExec) throw(Exception) { } resetPatternComputed(); - // search for all block that are generators. - QList generators; - generators.append(sources); + // search for all block that are source. + QList 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); }