}
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;
}
-BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int idScene, QHash<QString, int> clkRstToGen) {
+void Dispatcher::addBlock(Context context, int idCategory, int idBlock, int idScene, QHash<QString, int> 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) {
}
if (newStimuli) {
FunctionalBlock* newOne = params->getGraph()->createStimuliBlock(ref, true);
- scene->createStimuliItem(newOne);
+ StimuliItem* item = scene->createStimuliItem(newOne);
+ QHashIterator<QString,int> 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 {
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<QString,int> 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<QString,int> 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) {
}
}
+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();