X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/3fb762e7042d9b4a1cf78556ad9ed7f117cc53ba..4327c2b8817b627249d98d889835726217c81a4e:/Dispatcher.cpp?ds=inline diff --git a/Dispatcher.cpp b/Dispatcher.cpp index b162559..e1857c3 100644 --- a/Dispatcher.cpp +++ b/Dispatcher.cpp @@ -120,11 +120,20 @@ bool Dispatcher::createConnection(Context context, InterfaceItem *iface1, Interf } 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; @@ -623,13 +632,12 @@ 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 newStimuli = false; - BoxItem* item = NULL; + bool newStimuli = false; /* For now, this method is only used while designing and not loading */ if (context == Design) { @@ -644,7 +652,18 @@ BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int } if (newStimuli) { FunctionalBlock* newOne = params->getGraph()->createStimuliBlock(ref, true); - scene->createStimuliItem(newOne); + 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 +671,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) { @@ -1259,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();