X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/4327c2b8817b627249d98d889835726217c81a4e..HEAD:/Dispatcher.cpp diff --git a/Dispatcher.cpp b/Dispatcher.cpp index e1857c3..574243e 100644 --- a/Dispatcher.cpp +++ b/Dispatcher.cpp @@ -100,7 +100,16 @@ void Dispatcher::setSceneCounter(Context context, int value) { } 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 @@ -108,29 +117,33 @@ bool Dispatcher::createConnection(Context context, InterfaceItem *iface1, Interf 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 first one did not work, test ref2->ref1 - if ((ok1 == false) && (ref2->canConnectTo(ref1)) && (ref1->canConnectFrom(ref2))) { + if ((ok1 == false) && (ref2->canConnectTo(ref1,testClock)) && (ref1->canConnectFrom(ref2,testClock))) { ref2->connectTo(ref1); ok2 = true; } - if ((ok1 == true) || (ok2 == true)) { - - 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 == 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); } - cout << " ... done." << endl; + cout << endl; unselectAllItems(context); params->unsaveModif = true; @@ -199,6 +212,12 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) { #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"); @@ -223,10 +242,10 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) { 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 extResources = params->getGraph()->getExternalResources(); @@ -245,6 +264,17 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) { 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"; @@ -273,8 +303,7 @@ void Dispatcher::generateVHDL(Context context) throw(Exception) { } 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(); @@ -293,6 +322,12 @@ void Dispatcher::generateBlockVHDL(Context context, BoxItem *item){ #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()); @@ -310,6 +345,12 @@ void Dispatcher::renameFunctionalBlock(Context context, BoxItem *item){ #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(); @@ -349,6 +390,12 @@ void Dispatcher::renameGroupBlock(Context context, GroupItem *item){ #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(); @@ -395,6 +442,12 @@ void Dispatcher::renameStimuliItem(Context context, StimuliItem *item){ #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(); @@ -435,6 +488,11 @@ void Dispatcher::renameInterface(Context context, InterfaceItem *item) { #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(); @@ -479,6 +537,12 @@ void Dispatcher::showPatterns(Context context, InterfaceItem *item) { #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 "; @@ -523,6 +587,12 @@ void Dispatcher::showModifier(Context context, InterfaceItem *item) { #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(); @@ -540,10 +610,16 @@ void Dispatcher::showModifier(Context context, InterfaceItem *item) { } 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(); @@ -555,6 +631,12 @@ void Dispatcher::duplicateBoxItem(Context context, BoxItem *item){ #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(); @@ -578,6 +660,12 @@ void Dispatcher::duplicateStimuliItem(Context context, StimuliItem *item) { #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(); @@ -601,6 +689,12 @@ void Dispatcher::duplicateInterfaceItem(Context context, InterfaceItem *item) { #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; @@ -759,13 +853,16 @@ GroupWidget *Dispatcher::createTopScene(Context context, double mainClock){ 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->initGraph(createIfaces); - graph->addClock(mainClock); + 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 @@ -1092,8 +1189,11 @@ void Dispatcher::removeBoxItem(Context context, BoxItem *item) { #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 @@ -1168,6 +1268,11 @@ void Dispatcher::removeAllBlockConnections(Context context, AbstractBoxItem *ite #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <getInterfaces()) { foreach(ConnectionItem* conn, ifaceItem->connections) { @@ -1181,6 +1286,11 @@ void Dispatcher::removeStimuliItem(Context context, StimuliItem *item) { #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <getFromInterfaceItem(); InterfaceItem* toIfaceItem = connItem->getToInterfaceItem(); @@ -1277,6 +1393,16 @@ void Dispatcher::removeConnection(Context context, ConnectionItem *connItem) { 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 " <searchInterfaceItemByName(clkName); GroupItem* parentGroup = item->getScene()->getGroupItem(); @@ -1310,6 +1436,17 @@ void Dispatcher::connectBoxItemClock(Context context, BoxItem *item, QString clk } 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 " <searchInterfaceItemByName(rstName); GroupItem* parentGroup = item->getScene()->getGroupItem(); @@ -1343,6 +1480,17 @@ void Dispatcher::connectBoxItemReset(Context context, BoxItem *item, QString rst } 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 " <searchInterfaceItemByName(clkName); BoxItem* clkrstItem = NULL; @@ -1367,6 +1515,16 @@ void Dispatcher::connectStimuliItemClock(Context context, StimuliItem *item, QSt } 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 " <searchInterfaceItemByName(rstName); BoxItem* clkrstItem = NULL; @@ -1398,6 +1556,17 @@ void Dispatcher::showBlocksLibrary(){ } void Dispatcher::showProperties(Context context, InterfaceItem *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 " <exec(); } @@ -1410,6 +1579,16 @@ void Dispatcher::showProperties(Context context, InterfaceItem *inter) { */ 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 " <refInter; cout << "owner of iface = " << qPrintable(refInter->getOwner()->getName()) << endl; @@ -1431,7 +1610,12 @@ void Dispatcher::connectInterToGroup(Context context, InterfaceItem *item){ 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(); @@ -1451,6 +1635,11 @@ void Dispatcher::removeFunctionalInterface(Context context, InterfaceItem *item) #ifdef DEBUG_FCTNAME cout << "call to " << qPrintable(fctName) << endl; #endif + /* NB: only called in Design context */ + if (context != Design) { + cout << "Abnormal case: call to " <computeAdmittanceDelays(); // get the block item that is associated to block