#include "GroupScene.h"
#include "GroupItem.h"
#include "BoxItem.h"
-#include "SourceItem.h"
+#include "StimuliItem.h"
#include "InterfaceItem.h"
#include "ConnectionItem.h"
#include "DelayInputModifier.h"
-#include "InterfacePropertiesWindow.h"
+#include "InterfacePropertiesDialog.h"
+
+#include <QHashIterator>
int Dispatcher::sceneCounter = 0;
}
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
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 frist one did not work, test ref2->ref1
- if ((ok1 == false) && (ref2->canConnectTo(ref1)) && (ref1->canConnectFrom(ref2))) {
+ // if the first one did not work, test ref2->ref1
+ 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;
#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");
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<QString> extResources = params->getGraph()->getExternalResources();
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";
}
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();
#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());
#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();
#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();
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;
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;
}
#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();
#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 ";
#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();
}
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();
#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();
}
}
-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();
// 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;
}
#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;
}
-BoxItem* Dispatcher::addBlock(Context context, int idCategory, int idBlock, int idScene) {
+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 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<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 {
+
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<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;
}
+}
+
+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;
#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
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;
}
#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);
#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
#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;
+ }
foreach(InterfaceItem* ifaceItem, item->getInterfaces()) {
foreach(ConnectionItem* conn, ifaceItem->connections) {
}
}
-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 " <<qPrintable(fctName) << " not in Design context" << endl;
+ return;
+ }
- 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);
}
#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;
+ }
+
InterfaceItem* fromIfaceItem = connItem->getFromInterfaceItem();
InterfaceItem* toIfaceItem = connItem->getToInterfaceItem();
}
}
+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 " <<qPrintable(fctName) << " not in Design context" << endl;
+ return;
+ }
+
+ 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) {
+
+ 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 " <<qPrintable(fctName) << " not in Design context" << endl;
+ return;
+ }
+
+ 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) {
+
+ 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 " <<qPrintable(fctName) << " not in Design context" << endl;
+ return;
+ }
+
+ 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) {
+ 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 " <<qPrintable(fctName) << " not in Design context" << endl;
+ return;
+ }
+
+ 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();
}
void Dispatcher::showProperties(Context context, InterfaceItem *inter) {
- new InterfacePropertiesWindow(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 " <<qPrintable(fctName) << " not in Design context" << endl;
+ return;
+ }
+
+ QDialog* dial = new InterfacePropertiesDialog(inter);
+ dial->exec();
}
/* connectInterToGroup() :
*/
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 " <<qPrintable(fctName) << " not in Design context" << endl;
+ return;
+ }
+
// getting the GroupBlock and GroupItem that are parent of the block that owns item
ConnectedInterface *refInter = item->refInter;
cout << "owner of iface = " << qPrintable(refInter->getOwner()->getName()) << endl;
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();
#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;
+ }
/* first, remove all connections from item
NB: if there is a connection to a group interface, then this
#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;
+ }
/* NB: just remove all connections from/to this item, since when there are no more
ones to a GroupItem, it is automatically deleted.
#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;
+ }
block->computeAdmittanceDelays();
// get the block item that is associated to block