+
+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);
+ }
+}