X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/e40a5399ec7887c2606f18575c809b0d05b09278..HEAD:/Dispatcher.cpp diff --git a/Dispatcher.cpp b/Dispatcher.cpp index 94cdfb6..574243e 100644 --- a/Dispatcher.cpp +++ b/Dispatcher.cpp @@ -18,7 +18,7 @@ #include "GroupScene.h" #include "GroupItem.h" #include "BoxItem.h" -#include "SourceItem.h" +#include "StimuliItem.h" #include "InterfaceItem.h" #include "ConnectionItem.h" @@ -100,7 +100,16 @@ void Dispatcher::setSceneCounter(Context context, int value) { } bool Dispatcher::createConnection(Context context, InterfaceItem *iface1, InterfaceItem *iface2, bool visible) { - + static QString fctName = "Dispatcher::createConnection()"; +#ifdef DEBUG_FCTNAME + cout << "call to " << qPrintable(fctName) << endl; +#endif + + bool testClock = false; + if (context == Design) { + testClock = true; + } + ConnectedInterface* ref1 = iface1->refInter; ConnectedInterface* ref2 = iface2->refInter; // connect both interface @@ -108,23 +117,36 @@ bool Dispatcher::createConnection(Context context, InterfaceItem *iface1, Interf bool ok1 = false; bool ok2 = false; + cout << "trying to create a connection between " << qPrintable(ref1->getOwner()->getName()) << "/" << qPrintable(ref1->getName()); + cout << " and " << qPrintable(ref2->getOwner()->getName()) << "/" << qPrintable(ref2->getName()); + // test the ref1->ref2 connection - if ((ref1->canConnectTo(ref2)) && (ref2->canConnectFrom(ref1))) { + if ((ref1->canConnectTo(ref2,testClock)) && (ref2->canConnectFrom(ref1,testClock))) { ref1->connectTo(ref2); ok1 = true; } // if the first one did not work, test ref2->ref1 - if ((ok1 == false) && (ref2->canConnectTo(ref1)) && (ref1->canConnectFrom(ref2))) { + if ((ok1 == false) && (ref2->canConnectTo(ref1,testClock)) && (ref1->canConnectFrom(ref2,testClock))) { ref2->connectTo(ref1); ok2 = true; } - if ((ok1 == true) || (ok2 == true)) { + if ((ok1 == true) || (ok2 == true)) { + + if (ok1) { + cout << " ... done with " << qPrintable(ref1->getOwner()->getName()) << "/" << qPrintable(ref1->getName()); + cout << " to " << qPrintable(ref2->getOwner()->getName()) << "/" << qPrintable(ref2->getName()); + iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2, visible); + } + else { + cout << "... done with " << qPrintable(ref2->getOwner()->getName()) << "/" << qPrintable(ref2->getName()); + cout << " to " << qPrintable(ref1->getOwner()->getName()) << "/" << qPrintable(ref1->getName()); + iface2->getOwner()->getScene()->createConnectionItem(iface2,iface1, visible); + } - iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2, visible); + cout << endl; unselectAllItems(context); - params->unsaveModif = true; - cout << "created a connection from " << qPrintable(ref1->getName()) << " to " << qPrintable(ref2->getName()) << endl; + params->unsaveModif = true; return true; } return false; @@ -190,6 +212,12 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) { #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } + QDir baseDir(params->projectPath); QDir srcDir(params->projectPath+"/src"); @@ -214,10 +242,10 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) { make.copy(dest); } - // copying external resources + // generate VHDL + copying external resources QString dest = params->projectPath; - dest += "/src/"; - try { + dest += "/src/"; + try { params->getGraph()->generateVHDL(dest); QList extResources = params->getGraph()->getExternalResources(); @@ -236,6 +264,17 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) { catch(Exception e) { throw(e); } + // generate testbench + dest = params->projectPath; + dest += "/testbench/"; + dest += params->projectName; + dest += "_tb.vhd"; + try { + params->getGraph()->generateTestbench(params->projectName, dest); + } + catch(Exception e) { + throw(e); + } // creating parameters file QString paramName = params->projectPath+"/params-isim.txt"; @@ -264,8 +303,7 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) { } out << endl; out << "VL_SRC := ${XILINX}/verilog/src/glbl.v" << endl << endl; - out << "TB_SRC := $(TB_DIR)/read_csv.vhd \\" << endl; - out << "\t$(TB_DIR)/$(PROJECT_NAME)_tb.vhd" << endl << endl; + out << "TB_SRC := $(TB_DIR)/$(PROJECT_NAME)_tb.vhd" << endl << endl; out << "SIMU_EXE := $(PROJECT_NAME)_tb" << endl << endl; paramFile.close(); @@ -284,6 +322,12 @@ void Dispatcher::generateBlockVHDL(Context context, BoxItem *item){ #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } + if (item->getRefBlock()->isFunctionalBlock()) { FunctionalBlock* block = AB_TO_FUN(item->getRefBlock()); @@ -301,6 +345,12 @@ void Dispatcher::renameFunctionalBlock(Context context, BoxItem *item){ #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } + GroupWidget* win = item->getScene()->getGroupWidget(); @@ -340,6 +390,12 @@ void Dispatcher::renameGroupBlock(Context context, GroupItem *item){ #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } + GroupWidget* win = item->getScene()->getGroupWidget(); @@ -381,18 +437,24 @@ void Dispatcher::renameGroupBlock(Context context, GroupItem *item){ mainWindow->getLibrary()->updateComboScene(); } -void Dispatcher::renameSourceBlock(Context context, SourceItem *item){ - static QString fctName = "Dispatcher::renameSourceBlock()"; +void Dispatcher::renameStimuliItem(Context context, StimuliItem *item){ + static QString fctName = "Dispatcher::renameStimuliItem()"; #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } + GroupWidget* win = item->getScene()->getGroupWidget(); bool ok = false; QString text = ""; while (!ok) { - text = QInputDialog::getText(win, "Rename a source", + text = QInputDialog::getText(win, "Rename a stimuli", "New name:", QLineEdit::Normal, item->getRefBlock()->getName(), &ok); if (!ok) return; @@ -406,10 +468,10 @@ void Dispatcher::renameSourceBlock(Context context, SourceItem *item){ ok = false; } else { - FunctionalBlock* block = params->getGraph()->getSourceBlockByName(text); + FunctionalBlock* block = params->getGraph()->getStimuliBlockByName(text); if (block != NULL) { QMessageBox::warning(win,"Error in given name", - "the name provided is similar to that of another source block within the top group", + "the name provided is similar to that of another stimuli block within the top group", QMessageBox::Ok); ok = false; } @@ -426,6 +488,11 @@ void Dispatcher::renameInterface(Context context, InterfaceItem *item) { #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } GroupWidget* win = item->getOwner()->getScene()->getGroupWidget(); @@ -470,6 +537,12 @@ void Dispatcher::showPatterns(Context context, InterfaceItem *item) { #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } + QString msg = ""; if (item->refInter->getDirection() == AbstractInterface::Input) { msg = "Input pattern of iface "; @@ -514,6 +587,12 @@ void Dispatcher::showModifier(Context context, InterfaceItem *item) { #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } + QString msg = ""; ConnectedInterface* assoIface = AI_TO_CON(item->refInter->getAssociatedIface()); AbstractInputModifier* mod = assoIface->getInputModifier(); @@ -531,10 +610,16 @@ void Dispatcher::showModifier(Context context, InterfaceItem *item) { } void Dispatcher::removeModifier(Context context, InterfaceItem *item) { - static QString fctName = "Dispatcher::showModifier()"; + static QString fctName = "Dispatcher::removeModifier()"; #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } + ConnectedInterface* assoIface = AI_TO_CON(item->refInter->getAssociatedIface()); assoIface->clearInputModifier(); @@ -546,6 +631,12 @@ void Dispatcher::duplicateBoxItem(Context context, BoxItem *item){ #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } + GroupScene *scene = item->getScene(); AbstractBlock* block = item->getRefBlock(); @@ -564,11 +655,17 @@ void Dispatcher::duplicateBoxItem(Context context, BoxItem *item){ } } -void Dispatcher::duplicateSourceItem(Context context, SourceItem *item) { - static QString fctName = "Dispatcher::duplicateSourceItem()"; +void Dispatcher::duplicateStimuliItem(Context context, StimuliItem *item) { + static QString fctName = "Dispatcher::duplicateStimuliItem()"; #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } + GroupScene *scene = item->getScene(); AbstractBlock* block = item->getRefBlock(); @@ -579,9 +676,9 @@ void Dispatcher::duplicateSourceItem(Context context, SourceItem *item) { // adding to the model FunctionalBlock* funBlock = (FunctionalBlock*)block; - newBlock = params->getGraph()->duplicateSourceBlock(funBlock); + newBlock = params->getGraph()->duplicateStimuliBlock(funBlock); // adding to the view - scene->createSourceItem(newBlock); + scene->createStimuliItem(newBlock); params->unsaveModif = true; } @@ -592,6 +689,12 @@ void Dispatcher::duplicateInterfaceItem(Context context, InterfaceItem *item) { #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } + AbstractInterface *refI = item->refInter; if (! refI->isFunctionalInterface()) return; @@ -623,28 +726,38 @@ void Dispatcher::duplicateInterfaceItem(Context context, InterfaceItem *item) { } -BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int idScene, QHash clkRstToGen) { +void Dispatcher::addBlock(Context context, int idCategory, int idBlock, int idScene, QHash clkRstToGen) { static QString fctName = "Dispatcher::addBlock()"; #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif - bool newSource = false; - BoxItem* item = NULL; + bool newStimuli = false; /* For now, this method is only used while designing and not loading */ if (context == Design) { GroupScene *scene = getSceneById(idScene); ReferenceBlock* ref = params->getReferenceBlock(idCategory,idBlock); // if block has no inputs, propose to add it as a source to top scene - if ((scene->isTopScene()) && (ref->isGeneratorBlock())) { - int ret = QMessageBox::question(NULL,"Adding a block to top scene","Selected block may be used as a source for the top scene. Do you want to add it as a source ?"); + if ((scene->isTopScene()) && (ref->isSourceBlock())) { + int ret = QMessageBox::question(NULL,"Adding a block to top scene","Selected block may be used as a stimuli for the top scene. Do you want to add it as a stimuli ?"); if (ret == QMessageBox::Yes) { - newSource = true; + newStimuli = true; } } - if (newSource) { - FunctionalBlock* newOne = params->getGraph()->createSourceBlock(ref, true); - scene->createSourceItem(newOne); + if (newStimuli) { + FunctionalBlock* newOne = params->getGraph()->createStimuliBlock(ref, true); + StimuliItem* item = scene->createStimuliItem(newOne); + QHashIterator iter(clkRstToGen); + while (iter.hasNext()) { + iter.next(); + AbstractInterface* iface = newOne->getIfaceFromName(iter.key()); + if (iface->getPurpose() == AbstractInterface::Clock) { + connectStimuliItemClock(context,item,iface->getName(),iter.value()); + } + else if (iface->getPurpose() == AbstractInterface::Reset) { + connectStimuliItemReset(context,item,iface->getName(),iter.value()); + } + } } else { @@ -652,27 +765,24 @@ BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref, true); // creating the box item - item = scene->createBoxItem(newOne); - if (params->autoConnMainClk) { - // for now just use the first one - QHashIterator iter(clkRstToGen); - while (iter.hasNext()) { - iter.next(); - AbstractInterface* iface = newOne->getIfaceFromName(iter.key()); - if (iface->getPurpose() == AbstractInterface::Clock) { - newOne->connectClock(iface->getName(), iter.value()); - } - else if (iface->getPurpose() == AbstractInterface::Reset) { - newOne->connectReset(iface->getName(), iter.value()); - } + BoxItem* item = scene->createBoxItem(newOne); + + QHashIterator iter(clkRstToGen); + while (iter.hasNext()) { + iter.next(); + AbstractInterface* iface = newOne->getIfaceFromName(iter.key()); + if (iface->getPurpose() == AbstractInterface::Clock) { + connectBoxItemClock(context,item,iface->getName(),iter.value()); + } + else if (iface->getPurpose() == AbstractInterface::Reset) { + connectBoxItemReset(context,item,iface->getName(),iter.value()); } } + params->blockToItem.insert(newOne,item); } params->unsaveModif = true; } - - return item; } void Dispatcher::addClkRstGenBlock(Context context, double frequency) { @@ -684,7 +794,7 @@ void Dispatcher::addClkRstGenBlock(Context context, double frequency) { if (context == Design) { - params->clocks.append(frequency); + params->getGraph()->addClock(frequency); // get the top group GroupBlock *group = params->getGraph()->getTopGroup(); @@ -695,7 +805,7 @@ void Dispatcher::addClkRstGenBlock(Context context, double frequency) { FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref, true); QString name = "clkrstgen_"; - name += QString::number(params->clocks.size()-1); + name += QString::number(params->getGraph()->getClocks().size()-1); newOne->setName(name); // creating the box item @@ -704,8 +814,8 @@ void Dispatcher::addClkRstGenBlock(Context context, double frequency) { ConnectedInterface* fromIfaceClk = NULL; ConnectedInterface* fromIfaceReset = NULL; - QString clkName = "ext_clk_"+QString::number(params->clocks.size()-1); - QString rstName = "ext_reset_"+QString::number(params->clocks.size()-1); + QString clkName = "ext_clk_"+QString::number(params->getGraph()->getClocks().size()-1); + QString rstName = "ext_reset_"+QString::number(params->getGraph()->getClocks().size()-1); fromIfaceClk = new GroupInterface(group,clkName, AbstractInterface::Input, AbstractInterface::Clock); fromIfaceReset = new GroupInterface(group,rstName, AbstractInterface::Input, AbstractInterface::Reset); group->addInterface(fromIfaceClk); @@ -737,18 +847,22 @@ void Dispatcher::addClkRstGenBlock(Context context, double frequency) { -GroupWidget *Dispatcher::createTopScene(Context context){ +GroupWidget *Dispatcher::createTopScene(Context context, double mainClock){ static QString fctName = "Dispatcher::createTopScene()"; #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif - bool createIfaces = true; - if (context == Load) { - createIfaces = false; - } + Graph* graph = NULL; // creating the graph and thus, the topgroup - Graph* graph = params->createGraph(createIfaces); + if (context == Design) { + graph = params->initGraph(true); + graph->addClock(mainClock); + } + else if (context == Load) { + graph = params->initGraph(false); + } + // get the top group GroupBlock *topBlock = graph->getTopGroup(); // creating the top group widget @@ -771,8 +885,8 @@ GroupWidget *Dispatcher::createTopScene(Context context){ if (context == Design) { // create clkrstgen - double freq = params->clocks.at(0); - params->clocks.clear(); + double freq = params->getGraph()->getClock(0); + params->getGraph()->resetClocks(); addClkRstGenBlock(context,freq); } @@ -1075,8 +1189,11 @@ void Dispatcher::removeBoxItem(Context context, BoxItem *item) { #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif - - if (context != Design) return; + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " << qPrintable(fctName) << " not in Design context" << endl; + return; + } /* a BoxItem (group of func) can be removed only if none of its interfaces is connected to a group interface that is itself @@ -1151,6 +1268,11 @@ void Dispatcher::removeAllBlockConnections(Context context, AbstractBoxItem *ite #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <getInterfaces()) { foreach(ConnectionItem* conn, ifaceItem->connections) { @@ -1159,26 +1281,31 @@ void Dispatcher::removeAllBlockConnections(Context context, AbstractBoxItem *ite } } -void Dispatcher::removeSourceItem(Context context, SourceItem *item) { - static QString fctName = "Dispatcher::removeSourceItem()"; +void Dispatcher::removeStimuliItem(Context context, StimuliItem *item) { + static QString fctName = "Dispatcher::removeStimuliItem()"; #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <getRefBlock()->getName(); msg += " and all its connections.\n\nAre you sure ?"; - int ret = QMessageBox::question(NULL,"Removing source block",msg, QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok); + int ret = QMessageBox::question(NULL,"Removing stimuli block",msg, QMessageBox::Ok | QMessageBox::Cancel, QMessageBox::Ok); if (ret == QMessageBox::Cancel) { return; } removeAllBlockConnections(context, item); FunctionalBlock* block = AB_TO_FUN(item->getRefBlock()); - item->getScene()->removeSourceItem(item); - params->getGraph()->removeSourceBlock(block); + item->getScene()->removeStimuliItem(item); + params->getGraph()->removeStimuliBlock(block); } @@ -1187,6 +1314,12 @@ void Dispatcher::removeConnection(Context context, ConnectionItem *connItem) { #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <getFromInterfaceItem(); InterfaceItem* toIfaceItem = connItem->getToInterfaceItem(); @@ -1258,6 +1391,164 @@ void Dispatcher::removeConnection(Context context, ConnectionItem *connItem) { } } +void Dispatcher::connectBoxItemClock(Context context, BoxItem *item, QString clkName, int idGen) throw(Exception) { + + static QString fctName = "Dispatcher::connectBoxItemClock()"; +#ifdef DEBUG_FCTNAME + cout << "call to " << qPrintable(fctName) << endl; +#endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <searchInterfaceItemByName(clkName); + GroupItem* parentGroup = item->getScene()->getGroupItem(); + BoxItem* clkrstItem = NULL; + + if (parentGroup->getRefBlock()->isTopGroupBlock()) { + QString genName = "clkrstgen_" + QString::number(idGen); + clkrstItem = item->getScene()->searchBoxItemByName(genName); + if (clkrstItem == NULL) { + throw(Exception(IFACE_TOP_NOCLKRSTGEN)); + } + else { + fromIfaceItemClk = clkrstItem->searchInterfaceItemByName("clk"); + } + cout << "connecting clock of " << qPrintable(item->getRefBlock()->getName()) << " to clk of " << qPrintable(genName) << endl; + } + else { + // searching for ext_clk_idGen + QString name = "ext_clk_"+QString::number(idGen); + fromIfaceItemClk = parentGroup->searchInterfaceItemByName(name); + cout << "connecting clock of " << qPrintable(item->getRefBlock()->getName()) << " to " << qPrintable(name) << " of parent group " << qPrintable(parentGroup->getRefBlock()->getName()) << endl; + } + + if (fromIfaceItemClk == NULL) { + throw(Exception(IFACE_GROUP_NOCLKRST)); + } + else { + createConnection(context, fromIfaceItemClk, toIfaceItemClk, false); + cout << "connection done." << endl; + } +} + +void Dispatcher::connectBoxItemReset(Context context, BoxItem *item, QString rstName, int idGen) throw(Exception) { + + static QString fctName = "Dispatcher::connectBoxItemReset()"; +#ifdef DEBUG_FCTNAME + cout << "call to " << qPrintable(fctName) << endl; +#endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <searchInterfaceItemByName(rstName); + GroupItem* parentGroup = item->getScene()->getGroupItem(); + BoxItem* clkrstItem = NULL; + + if (parentGroup->getRefBlock()->isTopGroupBlock()) { + QString genName = "clkrstgen_" + QString::number(idGen); + clkrstItem = item->getScene()->searchBoxItemByName(genName); + if (clkrstItem == NULL) { + throw(Exception(IFACE_TOP_NOCLKRSTGEN)); + } + else { + fromIfaceItemRst = clkrstItem->searchInterfaceItemByName("reset"); + } + cout << "connecting reset of " << qPrintable(item->getRefBlock()->getName()) << " to reset of " << qPrintable(genName) << endl; + } + else { + // searching for ext_rst_idGen + QString name = "ext_rst_"+QString::number(idGen); + fromIfaceItemRst = parentGroup->searchInterfaceItemByName(name); + cout << "connecting reset of " << qPrintable(item->getRefBlock()->getName()) << " to " << qPrintable(name) << " of parent group " << qPrintable(parentGroup->getRefBlock()->getName()) << endl; + } + + if (fromIfaceItemRst == NULL) { + throw(Exception(IFACE_GROUP_NOCLKRST)); + } + else { + createConnection(context, fromIfaceItemRst, toIfaceItemRst, false); + cout << "connection done." << endl; + } +} + +void Dispatcher::connectStimuliItemClock(Context context, StimuliItem *item, QString clkName, int idGen) throw(Exception) { + + static QString fctName = "Dispatcher::connectStimuliItemClock()"; +#ifdef DEBUG_FCTNAME + cout << "call to " << qPrintable(fctName) << endl; +#endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <searchInterfaceItemByName(clkName); + BoxItem* clkrstItem = NULL; + + QString genName = "clkrstgen_" + QString::number(idGen); + clkrstItem = item->getScene()->searchBoxItemByName(genName); + if (clkrstItem == NULL) { + throw(Exception(IFACE_TOP_NOCLKRSTGEN)); + } + else { + fromIfaceItemClk = clkrstItem->searchInterfaceItemByName("clk"); + } + cout << "connecting clock of " << qPrintable(item->getRefBlock()->getName()) << " to clock of " << qPrintable(genName) << endl; + + if (fromIfaceItemClk == NULL) { + throw(Exception(IFACE_GROUP_NOCLKRST)); + } + else { + createConnection(context, fromIfaceItemClk, toIfaceItemClk, false); + cout << "connection done." << endl; + } +} + +void Dispatcher::connectStimuliItemReset(Context context, StimuliItem *item, QString rstName, int idGen) throw(Exception) { + static QString fctName = "Dispatcher::connectStimuliItemReset()"; +#ifdef DEBUG_FCTNAME + cout << "call to " << qPrintable(fctName) << endl; +#endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <searchInterfaceItemByName(rstName); + BoxItem* clkrstItem = NULL; + + QString genName = "clkrstgen_" + QString::number(idGen); + clkrstItem = item->getScene()->searchBoxItemByName(genName); + if (clkrstItem == NULL) { + throw(Exception(IFACE_TOP_NOCLKRSTGEN)); + } + else { + fromIfaceItemRst = clkrstItem->searchInterfaceItemByName("reset"); + } + cout << "connecting reset of " << qPrintable(item->getRefBlock()->getName()) << " to reset of " << qPrintable(genName) << endl; + + if (fromIfaceItemRst == NULL) { + throw(Exception(IFACE_GROUP_NOCLKRST)); + } + else { + createConnection(context, fromIfaceItemRst, toIfaceItemRst, false); + cout << "connection done." << endl; + } +} + + void Dispatcher::showBlocksLibrary(){ cout << "showing block library" << endl; mainWindow->getLibrary()->show(); @@ -1265,6 +1556,17 @@ void Dispatcher::showBlocksLibrary(){ } void Dispatcher::showProperties(Context context, InterfaceItem *inter) { + + static QString fctName = "Dispatcher::showProperties()"; +#ifdef DEBUG_FCTNAME + cout << "call to " << qPrintable(fctName) << endl; +#endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <exec(); } @@ -1277,6 +1579,16 @@ void Dispatcher::showProperties(Context context, InterfaceItem *inter) { */ void Dispatcher::connectInterToGroup(Context context, InterfaceItem *item){ + static QString fctName = "Dispatcher::connectInterToGroup()"; +#ifdef DEBUG_FCTNAME + cout << "call to " << qPrintable(fctName) << endl; +#endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <refInter; cout << "owner of iface = " << qPrintable(refInter->getOwner()->getName()) << endl; @@ -1298,7 +1610,12 @@ void Dispatcher::connectInterToGroup(Context context, InterfaceItem *item){ parentItem->addInterfaceItem(groupIfaceItem,true); // creating the connection, in graph and with an item - createConnection(context, item, groupIfaceItem); + /* NOTE: + Since the group interface is for now unconnected, it is impossible to determine + its clock domain. Thus, the connection must be created without testing the clock domain + consistency. For that, we cheat by changing the context to Load because it implies no clock test. + */ + createConnection(Load, item, groupIfaceItem); // if groupItem is not topGroup, must also add a new interface to the parent BlockItem BoxItem* parent2Item = parentItem->getParentItem(); @@ -1318,6 +1635,11 @@ void Dispatcher::removeFunctionalInterface(Context context, InterfaceItem *item) #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <computeAdmittanceDelays(); // get the block item that is associated to block