X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/8fb3c55ee009a11db5e1c08a4cfb286979412745..4327c2b8817b627249d98d889835726217c81a4e:/Dispatcher.cpp diff --git a/Dispatcher.cpp b/Dispatcher.cpp index c50270c..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) { @@ -684,7 +700,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 +711,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 +720,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,7 +753,7 @@ 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; @@ -748,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 @@ -771,8 +788,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); } @@ -1258,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();