#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() {
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;
}
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;
GroupBlock* group = AB_TO_GRP(block->getParent());
// adding to the graph
- FunctionalBlock* newBlock = createFunctionalBlock(group,ref);
+ FunctionalBlock* newBlock = createFunctionalBlock(group,ref, true);
return newBlock;
}
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();
}
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();
}
}
}
throw(e);
}
- resetPatternComputed();
- // search for all block that are generators.
- QList<FunctionalBlock*> generators;
- generators.append(sources);
+ resetPatternComputed();
+ // 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);
}
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;
+}