2 #include "GroupBlock.h"
3 #include "ReferenceBlock.h"
4 #include "FunctionalBlock.h"
5 #include "SpecialBlock.h"
16 void Graph::createTopGroup(bool createTopGroupIfaces) {
17 topGroup = new GroupBlock(NULL, createTopGroupIfaces);
18 topGroup->setName("top group");
19 groups.append(topGroup);
22 QList<AbstractInterface *> Graph::getOutsideInterfaces() {
23 return topGroup->getInterfaces();
26 GroupBlock* Graph::createChildGroupBlock(GroupBlock* parent, bool createGroupIface) {
27 GroupBlock* b = new GroupBlock(parent, createGroupIface);
32 void Graph::removeGroupBlock(GroupBlock *group) {
33 group->removeAllBlocks();
34 GroupBlock* parent = AB_TO_GRP(group->getParent());
35 parent->removeBlock(group);
36 groups.removeAll(group);
39 GroupBlock* Graph::getGroupBlockByName(QString name) {
40 foreach(GroupBlock* group, groups) {
41 if (group->getName() == name) return group;
46 FunctionalBlock* Graph::createFunctionalBlock(GroupBlock* group, ReferenceBlock* ref, bool createIfaces) {
48 FunctionalBlock* newBlock = NULL;
49 if (ref->getSpecialType() != -1) {
50 newBlock = new SpecialBlock(ref->getSpecialType(), group,ref, createIfaces);
53 newBlock = new FunctionalBlock(group,ref, createIfaces);
55 group->addBlock(newBlock);
60 FunctionalBlock* Graph::duplicateFunctionalBlock(FunctionalBlock *block) {
62 ReferenceBlock* ref = block->getReference();
63 GroupBlock* group = AB_TO_GRP(block->getParent());
65 // adding to the graph
66 FunctionalBlock* newBlock = createFunctionalBlock(group,ref, true);
71 bool Graph::removeFunctionalBlock(FunctionalBlock* block) {
72 GroupBlock* group = AB_TO_GRP(block->getParent());
73 group->removeBlock(block);
77 FunctionalBlock* Graph::getFunctionalBlockByName(QString name, GroupBlock* parent) {
78 FunctionalBlock* block = NULL;
80 block = AB_TO_FUN(parent->getFunctionalBlockByName(name));
83 foreach(GroupBlock* group, groups) {
84 block = AB_TO_FUN(group->getFunctionalBlockByName(name));
85 if (block != NULL) return block;
91 FunctionalBlock* Graph::createStimuliBlock(ReferenceBlock* ref, bool createIfaces) {
92 /* A stimuli block is always a special block with idSpecial = 1 */
94 FunctionalBlock* newBlock = new SpecialBlock(AbstractBlock::Source, NULL,ref, createIfaces);
95 stimulis.append(newBlock);
99 FunctionalBlock* Graph::duplicateStimuliBlock(FunctionalBlock *block) {
101 ReferenceBlock* ref = block->getReference();
103 // adding to the graph
104 FunctionalBlock* newBlock = createStimuliBlock(ref, true);
108 FunctionalBlock* Graph::getStimuliBlockByName(QString name) {
109 foreach(FunctionalBlock* block, stimulis) {
110 if (block->getName() == name) return block;
115 bool Graph::removeStimuliBlock(FunctionalBlock *block) {
116 stimulis.removeAll(block);
120 void Graph::createPatterns() throw(Exception) {
122 foreach(AbstractBlock* block, stimulis) {
123 FunctionalBlock* funBlock = AB_TO_FUN(block);
125 funBlock->createPatterns();
132 foreach(AbstractBlock* block, groups) {
133 GroupBlock* group = AB_TO_GRP(block);
134 foreach(AbstractBlock* inBlock, group->getBlocks()) {
135 if (inBlock->isFunctionalBlock()) {
136 FunctionalBlock* funBlock = AB_TO_FUN(inBlock);
138 funBlock->createPatterns();
148 void Graph::resetPatternComputed() {
149 foreach(AbstractBlock* block, stimulis) {
150 block->setOutputPatternComputed(false);
151 block->resetTraversalLevel();
153 foreach(AbstractBlock* block, groups) {
154 GroupBlock* group = AB_TO_GRP(block);
155 group->setOutputPatternComputed(false);
156 block->resetTraversalLevel();
157 foreach(AbstractBlock* inBlock, group->getBlocks()) {
158 inBlock->setOutputPatternComputed(false);
159 block->resetTraversalLevel();
164 void Graph::computeOutputPatterns(int nbExec) throw(Exception) {
173 resetPatternComputed();
174 // search for all block that are source.
175 QList<FunctionalBlock*> sources;
176 sources.append(stimulis);
177 foreach(AbstractBlock* block, groups) {
178 GroupBlock* group = AB_TO_GRP(block);
179 foreach(AbstractBlock* inBlock, group->getBlocks()) {
180 FunctionalBlock* funBlock = AB_TO_FUN(inBlock);
181 if (inBlock->isSourceBlock()) {
182 sources.append(funBlock);
186 // search for maximum PP length
188 foreach(FunctionalBlock* block, sources) {
189 if (block->getProductionPatternLength() > maxPP) maxPP = block->getProductionPatternLength();
191 // compute output for generators
192 int maxExecLen = maxPP*nbExec;
193 foreach(FunctionalBlock* block, sources) {
194 int d = block->getProductionPatternLength();
195 block->computeOutputPattern((maxExecLen+d-1)/d);
197 // compute output for top group
199 topGroup->computeOutputPattern();
206 void Graph::generateVHDL(const QString &path) throw(Exception) {
208 topGroup->generateVHDL(path);
215 QList<QString> Graph::getExternalResources() {
216 QList<QString> list = topGroup->getExternalResources();