X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/1b7818e18ed7bcf3464e307b97c6e0e6d72cc69b..4327c2b8817b627249d98d889835726217c81a4e:/Dispatcher.cpp diff --git a/Dispatcher.cpp b/Dispatcher.cpp index da4bae2..e1857c3 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" @@ -29,7 +29,9 @@ #include "DelayInputModifier.h" -#include "InterfacePropertiesWindow.h" +#include "InterfacePropertiesDialog.h" + +#include int Dispatcher::sceneCounter = 0; @@ -111,18 +113,27 @@ bool Dispatcher::createConnection(Context context, InterfaceItem *iface1, Interf ref1->connectTo(ref2); ok1 = true; } - // if the frist one did not work, test ref2->ref1 + // if the first one did not work, test ref2->ref1 if ((ok1 == false) && (ref2->canConnectTo(ref1)) && (ref1->canConnectFrom(ref2))) { ref2->connectTo(ref1); ok2 = true; } if ((ok1 == true) || (ok2 == true)) { - iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2, visible); + cout << "trying to create a connection from " << qPrintable(ref1->getOwner()->getName()) << "/" << qPrintable(ref1->getName()); + cout << " to " << qPrintable(ref2->getOwner()->getName()) << "/" << qPrintable(ref2->getName()); + + if (ok1) { + iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2, visible); + } + else { + iface2->getOwner()->getScene()->createConnectionItem(iface2,iface1, visible); + } + + cout << " ... done." << 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; @@ -379,8 +390,8 @@ 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 @@ -390,7 +401,7 @@ void Dispatcher::renameSourceBlock(Context context, SourceItem *item){ 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; @@ -404,10 +415,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; } @@ -562,8 +573,8 @@ 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 @@ -577,9 +588,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; } @@ -621,43 +632,128 @@ void Dispatcher::duplicateInterfaceItem(Context context, InterfaceItem *item) { } -BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int idScene) { +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 { + GroupBlock* group = AB_TO_GRP(scene->getGroupItem()->getRefBlock()); FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref, true); - item = scene->createBoxItem(newOne); + + // creating the box item + 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; } +} + +void Dispatcher::addClkRstGenBlock(Context context, double frequency) { + static QString fctName = "Dispatcher::addClkRstGenBlock()"; +#ifdef DEBUG_FCTNAME + cout << "call to " << qPrintable(fctName) << endl; +#endif + - return item; + if (context == Design) { + + params->getGraph()->addClock(frequency); + + // get the top group + GroupBlock *group = params->getGraph()->getTopGroup(); + GroupScene *scene = topGroupWidget->getScene(); + + // creating the clkrstgen block + ReferenceBlock* ref = params->getHiddenReferenceBlock("clkrstgen"); + FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref, true); + + QString name = "clkrstgen_"; + name += QString::number(params->getGraph()->getClocks().size()-1); + newOne->setName(name); + + // creating the box item + BoxItem* item = scene->createBoxItem(newOne, BoxItem::Left, AbstractBoxItem::Dimension); + item->setVisible(false); + + ConnectedInterface* fromIfaceClk = NULL; + ConnectedInterface* fromIfaceReset = NULL; + 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); + group->addInterface(fromIfaceReset); + // creating top group ext_clk iface item + GroupItem* groupItem = scene->getGroupItem(); + InterfaceItem* fromIfaceItemClk = new InterfaceItem(0.5 , Parameters::West, fromIfaceClk, groupItem, params, true); + groupItem->addInterfaceItem(fromIfaceItemClk,true); + // creating top group ext_reset iface item + InterfaceItem* fromIfaceItemReset = new InterfaceItem(0.5 , Parameters::West, fromIfaceReset, groupItem, params, false); + groupItem->addInterfaceItem(fromIfaceItemReset,true); + // connecting ext_clk iface items + InterfaceItem* toIfaceItemClk = item->searchInterfaceItemByName("ext_clk"); + if (toIfaceItemClk == NULL) { + cerr << "Abnormal case while connecting top group ext_clk to clkrstgen" << endl; + } + createConnection(context,fromIfaceItemClk, toIfaceItemClk, false); + // connecting ext_reset iface items + InterfaceItem* toIfaceItemReset = item->searchInterfaceItemByName("ext_reset"); + if (toIfaceItemReset == NULL) { + cerr << "Abnormal case while connecting top group ext_reset to clkrstgen" << endl; + } + createConnection(context,fromIfaceItemReset, toIfaceItemReset, false); + + params->blockToItem.insert(newOne,item); + params->unsaveModif = true; + } } -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; @@ -668,7 +764,8 @@ GroupWidget *Dispatcher::createTopScene(Context context){ createIfaces = false; } // creating the graph and thus, the topgroup - Graph* graph = params->createGraph(createIfaces); + Graph* graph = params->initGraph(createIfaces); + graph->addClock(mainClock); // get the top group GroupBlock *topBlock = graph->getTopGroup(); // creating the top group widget @@ -690,21 +787,12 @@ GroupWidget *Dispatcher::createTopScene(Context context){ if (context == Design) { - // creating the clkrstgen block - ReferenceBlock* ref = params->getHiddenReferenceBlock("clkrstgen"); - FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(topBlock, ref, true); - ConnectedInterface* fromIface = AI_TO_CON(topBlock->getIfaceFromName("ext_clk")); - ConnectedInterface* toIface = AI_TO_CON(newOne->getIfaceFromName("ext_clk")); - fromIface->connectTo(toIface); - fromIface = AI_TO_CON(topBlock->getIfaceFromName("ext_reset")); - toIface = AI_TO_CON(newOne->getIfaceFromName("ext_reset")); - fromIface->connectTo(toIface); - // create the clkrstgen boxitem - BoxItem* item = scene->createBoxItem(newOne, GroupScene::Left, GroupScene::Top, AbstractBoxItem::Position, BoxItem::HSpan); - params->blockToItem.insert(newOne,item); + // create clkrstgen + double freq = params->getGraph()->getClock(0); + params->getGraph()->resetClocks(); + addClkRstGenBlock(context,freq); } - groupList.append(topGroupWidget); return topGroupWidget; } @@ -714,11 +802,15 @@ GroupWidget* Dispatcher::addNewEmptyGroup(Context context, GroupScene* scene, bo #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + bool createIfaces = true; + if (context == Load) { + createIfaces = false; + } // getting the parent block in the graph GroupBlock* parent = AB_TO_GRP(scene->getGroupItem()->getRefBlock()); cout << "new group : parent = "<< qPrintable(parent->getName()) << endl; - GroupBlock* groupBlock = params->getGraph()->createChildGroupBlock(parent); + GroupBlock* groupBlock = params->getGraph()->createChildGroupBlock(parent, createIfaces); cout << "new group : child = "<< qPrintable(groupBlock->getName()) << ", child of " << qPrintable(groupBlock->getParent()->getName()) << endl; // creating the BlockItem in the scene BoxItem* newItem = scene->createBoxItem(groupBlock); @@ -1084,26 +1176,26 @@ 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 - QString msg = "Removing source "; + QString msg = "Removing stimmuli "; msg += item->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); } @@ -1183,6 +1275,122 @@ void Dispatcher::removeConnection(Context context, ConnectionItem *connItem) { } } +void Dispatcher::connectBoxItemClock(Context context, BoxItem *item, QString clkName, int idGen) throw(Exception) { + + InterfaceItem* fromIfaceItemClk = NULL; + InterfaceItem* toIfaceItemClk = item->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) { + InterfaceItem* fromIfaceItemRst = NULL; + InterfaceItem* toIfaceItemRst = item->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) { + InterfaceItem* fromIfaceItemClk = NULL; + InterfaceItem* toIfaceItemClk = item->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) { + InterfaceItem* fromIfaceItemRst = NULL; + InterfaceItem* toIfaceItemRst = item->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(); @@ -1190,7 +1398,8 @@ void Dispatcher::showBlocksLibrary(){ } void Dispatcher::showProperties(Context context, InterfaceItem *inter) { - new InterfacePropertiesWindow(inter); + QDialog* dial = new InterfacePropertiesDialog(inter); + dial->exec(); } /* connectInterToGroup() :