X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/48f48e6a26a54751ecd0ab90b10ab972cc5e89cd..bc5d59217a24b25c1b913bec4a41dd026d02720c:/Graph.cpp diff --git a/Graph.cpp b/Graph.cpp index 999e72a..d0c11cc 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() { - topGroup = new GroupBlock(NULL); - topGroup->setName("top group"); - groups.append(topGroup); + topGroup = NULL; } Graph::~Graph() { @@ -14,17 +13,23 @@ Graph::~Graph() { delete topGroup; } +void Graph::createTopGroup(bool createTopGroupIfaces) { + topGroup = new GroupBlock(this, NULL, createTopGroupIfaces); + topGroup->setName("top group"); + groups.append(topGroup); +} + QList 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; } -bool Graph::removeGroupBlock(GroupBlock *group) { +void Graph::removeGroupBlock(GroupBlock *group) { group->removeAllBlocks(); GroupBlock* parent = AB_TO_GRP(group->getParent()); parent->removeBlock(group); @@ -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() != SpecialBlock::NotSpecial) { + 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,42 +90,45 @@ 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(); - GroupBlock* group = AB_TO_GRP(block->getParent()); + 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; } -bool Graph::createPatterns() { - bool ok = true; - foreach(AbstractBlock* block, sources) { +void Graph::createPatterns() throw(Exception) { + + foreach(AbstractBlock* block, stimulis) { FunctionalBlock* funBlock = AB_TO_FUN(block); - ok = funBlock->createPatterns(); - if (!ok) return false; + try { + funBlock->createPatterns(); + } + catch(Exception e) { + throw(e); + } } foreach(AbstractBlock* block, groups) { @@ -121,54 +136,163 @@ bool Graph::createPatterns() { foreach(AbstractBlock* inBlock, group->getBlocks()) { if (inBlock->isFunctionalBlock()) { FunctionalBlock* funBlock = AB_TO_FUN(inBlock); - ok = funBlock->createPatterns(); - if (!ok) return false; + try { + funBlock->createPatterns(); + } + catch(Exception e) { + throw(e); + } } } - } - return true; + } } 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(); } } } -bool Graph::computeOutputPatterns(int nbExec) { +void Graph::computeOutputPatterns(int nbExec) throw(Exception) { - createPatterns(); - resetPatternComputed(); - // search for all block that are generators. - QList generators; - generators.append(sources); + try { + createPatterns(); + } + catch(Exception e) { + throw(e); + } + + resetPatternComputed(); + // 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 delta - int maxDelta = 0; - foreach(FunctionalBlock* block, generators) { - if (block->getDelta() > maxDelta) maxDelta = block->getDelta(); + // search for maximum PP length + int maxPP = 0; + foreach(FunctionalBlock* block, sources) { + if (block->getProductionPatternLength() > maxPP) maxPP = block->getProductionPatternLength(); } // compute output for generators - int maxExecLen = maxDelta*nbExec; - foreach(FunctionalBlock* block, generators) { - int d = block->getDelta(); + int maxExecLen = maxPP*nbExec; + foreach(FunctionalBlock* block, sources) { + int d = block->getProductionPatternLength(); block->computeOutputPattern((maxExecLen+d-1)/d); } // compute output for top group - topGroup->computeOutputPattern(); + try { + topGroup->computeOutputPattern(); + } + catch(Exception e) { + throw(e); + } +} + +void Graph::generateVHDL(const QString &path) throw(Exception) { + // generating VHDL for stimulis + cout << "generating stimulis" << endl; + try { + foreach(FunctionalBlock* stimuli, stimulis) { + stimuli->generateVHDL(path); + } + } + catch(Exception e) { + throw(e); + } + // generating VHDL for top group + cout << "generating top group" << endl; + try { + topGroup->generateVHDL(path); + } + catch(Exception e) { + throw(e); + } +} + +void Graph::generateTestbench(const QString &projectName, const QString &benchFile) throw(Exception) { + + + QFile vhdlBench(benchFile); + + if (!vhdlBench.open(QIODevice::WriteOnly)) { + throw(Exception(VHDLFILE_NOACCESS)); + } + + cout << "generate testbench" << endl; + QTextStream out(&vhdlBench); + + out << "-------------------------------------------------------------------------------" << endl; + out << "-- testbench for " << projectName << endl; + out << "-------------------------------------------------------------------------------" << endl << endl; + out << "-------------------------------------------------------------------------------" << endl; + out << "-- clock generator" << endl; + out << "-------------------------------------------------------------------------------" << endl << endl; + + out << "library IEEE;" << endl; + out << "use IEEE.STD_LOGIC_1164.all;" << endl; + out << "use IEEE.numeric_std.all;" << endl; + out << "entity clock_gen is" << endl; + out << " generic (" << endl; + out << " Tps : time -- high level width : must be < period" << endl; + out << " );" << endl; + out << " port (" << endl; + out << " phase : out std_logic" << endl; + out << " );" << endl; + out << "end entity clock_gen;" << endl<< endl; + + out << "architecture clock_gen_1 of clock_gen is" << endl; + out << " constant period : time := 2*Tps;" << endl; + out << "begin" << endl; + out << " clock_process : process" << endl; + out << " begin" << endl; + out << " phase <= '1', '0' after Tps;" << endl; + out << " wait for period;" << endl; + out << " end process clock_process;" << endl; + out << "end architecture clock_gen_1;" << endl << endl; + + out << "-------------------------------------------------------------------------------" << endl; + out << "-- testbench" << endl; + out << "-------------------------------------------------------------------------------" << endl << endl; + out << "library IEEE;" << endl; + out << "use IEEE.STD_LOGIC_1164.all;" << endl; + out << "use IEEE.numeric_std.all;" << endl; + out << "entity " << projectName << "_tb is" << endl; + out << "end entity " << projectName << "_tb;" << endl << endl; + out << "architecture " << projectName << "_tb_1 of " << projectName << "_tb is" << endl << endl; + + out << " component clock_gen" << endl; + out << " generic (" << endl; + out << " Tps : time" << endl; + out << " );" << endl; + out << " port (" << endl; + out << " phase : out std_logic" << endl; + out << " );" << endl; + out << " end component;" << endl << endl; + + topGroup->generateComponent(out,false); + + vhdlBench.close(); + +} + +QList Graph::getExternalResources() { + QList list = topGroup->getExternalResources(); + return list; }