X-Git-Url: https://bilbo.iut-bm.univ-fcomte.fr/and/gitweb/blast.git/blobdiff_plain/4cf57e6db08da791233d75237f62e74bc88dd427..a7299f808c1906872b76aa62fb6d8276096c4ff5:/Dispatcher.cpp diff --git a/Dispatcher.cpp b/Dispatcher.cpp index a552f20..cdf8ee3 100644 --- a/Dispatcher.cpp +++ b/Dispatcher.cpp @@ -2,6 +2,8 @@ #include "Parameters.h" #include "MainWindow.h" +#include "ExternalResource.h" + #include "Graph.h" #include "ReferenceBlock.h" #include "GroupBlock.h" @@ -69,6 +71,10 @@ GroupWidget *Dispatcher::loadProject(const QString& filename) { return NULL; } + QFileInfo info(filename); + params->projectPath = info.absolutePath(); + params->projectName = info.baseName(); + cout << "project path = " << qPrintable(params->projectPath) << endl; groupList.append(topGroup); return topGroup; } @@ -85,7 +91,7 @@ void Dispatcher::closeCurrentProject() { sceneCounter = 0; } -bool Dispatcher::createConnection(InterfaceItem *iface1, InterfaceItem *iface2) { +bool Dispatcher::createConnection(InterfaceItem *iface1, InterfaceItem *iface2, bool visible) { ConnectedInterface* ref1 = iface1->refInter; ConnectedInterface* ref2 = iface2->refInter; @@ -106,7 +112,7 @@ bool Dispatcher::createConnection(InterfaceItem *iface1, InterfaceItem *iface2) } if ((ok1 == true) || (ok2 == true)) { - iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2); + iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2, visible); unselectAllItems(); params->unsaveModif = true; @@ -171,6 +177,100 @@ void Dispatcher::changeConnectionMode(int mode){ */ } +void Dispatcher::generateVHDL() throw(Exception) { + static QString fctName = "Dispatcher::generateVHDL()"; +#ifdef DEBUG_FCTNAME + cout << "call to " << qPrintable(fctName) << endl; +#endif + + QDir baseDir(params->projectPath); + QDir srcDir(params->projectPath+"/src"); + + if (!baseDir.exists()) { + cerr << "Project path " << qPrintable(params->projectPath) << " no longer exists. First, recreate it and put the project file within. Then retry to generate." << endl; + return; + } + + if (srcDir.exists()) { + srcDir.removeRecursively(); + } + baseDir.mkdir("src"); + + if (! baseDir.exists("testbench")) { + baseDir.mkdir("testbench"); + } + if (! baseDir.exists("Makefile")) { + QFile make("/home/sdomas/Projet/Blast/code/blast/Makefile-isim"); + QString dest = params->projectPath; + dest += "/Makefile"; + make.copy(dest); + } + + // copying external resources + QString dest = params->projectPath; + dest += "/src/"; + try { + params->getGraph()->generateVHDL(dest); + + QList extResources = params->getGraph()->getExternalResources(); + foreach(QString name, extResources) { + cout << qPrintable(name) << endl; + QList lstRes = params->searchResourceByName(name); + foreach(ExternalResource* res, lstRes) { + QFile resFile(res->getFile()); + QFileInfo info(res->getFile()); + QString destFile = dest+info.fileName(); + cout << "copying " << qPrintable(res->getFile()) << " into " << qPrintable(destFile) << endl; + resFile.copy(destFile); + } + } + } + catch(Exception e) { + throw(e); + } + + // creating parameters file + QString paramName = params->projectPath+"/params-isim.txt"; + QFile paramFile(paramName); + if (!paramFile.open(QIODevice::WriteOnly)) { + throw(Exception(PROJECTPATH_NOACCESS)); + } + QTextStream out(¶mFile); + out << "PROJECT_NAME := " << params->projectName << endl << endl; + out << "SRC_DIR := src" << endl; + out << "TB_DIR := testbench" << endl << endl; + out << "VHDL_SRC := "; + QStringList filter; + filter << "*.vhd" ; + srcDir.setNameFilters(filter); + QStringList listVHDL = srcDir.entryList(); + for(int j=0;j 0) { + out << "\t"; + } + out << "$(SRC_DIR)/" << qPrintable(listVHDL.at(j)); + if (j != listVHDL.size()-1) { + out << " \\"; + } + out << endl; + } + 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 << "SIMU_EXE := $(PROJECT_NAME)_tb" << endl << endl; + + paramFile.close(); + + QString msg = "VHDL generation completed successfully. Go to "; + msg += params->projectPath+" and type the following commands to launch a simulation:\n"; + msg += "\tmake clean\n"; + msg += "\tmake\n"; + msg += "\tmake view\n"; + QMessageBox::information(mainWindow,"VHDL generation", msg, QMessageBox::Ok); + +} + void Dispatcher::generateBlockVHDL(BoxItem *item){ static QString fctName = "Dispatcher::generateBlockVHDL()"; #ifdef DEBUG_FCTNAME @@ -179,10 +279,8 @@ void Dispatcher::generateBlockVHDL(BoxItem *item){ if (item->getRefBlock()->isFunctionalBlock()) { FunctionalBlock* block = AB_TO_FUN(item->getRefBlock()); - ReferenceBlock* ref = block->getReference(); - BlockImplementation* impl = ref->getImplementations().at(0); try { - impl->generateVHDL(block,"/home/sdomas/"); + block->generateVHDL(params->projectPath); } catch(Exception e) { cout << qPrintable(e.getMessage()) << endl; @@ -371,10 +469,18 @@ void Dispatcher::showPatterns(InterfaceItem *item) { msg += " owned by "; msg += item->refInter->getOwner()->getName(); msg += " is:\n"; - ConnectedInterface* iface = AI_TO_CON(item->refInter->getAssociatedIface()); - ConnectedInterface* fromIface = iface->getConnectedFrom(); - if (fromIface->getOutputPattern() == NULL) return; - foreach(char c, *(fromIface->getOutputPattern())) { + // get the precursor output pattern + ConnectedInterface* connIface = AI_TO_CON(item->refInter->getAssociatedIface()); + QList* out = connIface->getConnectedFrom()->getOutputPattern(); + // get the modifier + AbstractInputModifier* modifier = connIface->getInputModifier(); + // check if the input is modified + if (modifier != NULL) { + + out = modifier->getModifiedInput(out); + } + + foreach(char c, *out) { msg += QString::number((int)c); } msg += "\n"; @@ -401,7 +507,8 @@ void Dispatcher::showModifier(InterfaceItem *item) { cout << "call to " << qPrintable(fctName) << endl; #endif QString msg = ""; - AbstractInputModifier* mod = item->refInter->getInputModifier(); + ConnectedInterface* assoIface = AI_TO_CON(item->refInter->getAssociatedIface()); + AbstractInputModifier* mod = assoIface->getInputModifier(); if (mod->isDelay()) { DelayInputModifier* delay = (DelayInputModifier *)mod; msg = "Pattern of iface "; @@ -421,7 +528,8 @@ void Dispatcher::removeModifier(InterfaceItem *item) { cout << "call to " << qPrintable(fctName) << endl; #endif - item->refInter->clearInputModifier(); + ConnectedInterface* assoIface = AI_TO_CON(item->refInter->getAssociatedIface()); + assoIface->clearInputModifier(); } @@ -546,7 +654,16 @@ GroupWidget *Dispatcher::createTopScene(){ // creating the model part of the group Graph* graph = params->createGraph(); - GroupBlock *refBlock = graph->getTopGroup(); + GroupBlock *topBlock = graph->getTopGroup(); + // creating the clkrstgen block + ReferenceBlock* ref = params->getHiddenReferenceBlock("clkrstgen"); + FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(topBlock, ref); + 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); // creating a fake and not connected interface //AbstractInterface* iface = new GroupInterface(refBlock,"grp_iface",AbstractInterface::Input,AbstractInterface::Top); @@ -560,7 +677,7 @@ GroupWidget *Dispatcher::createTopScene(){ params->setTopScene(scene); params->setCurrentScene(scene); // creating the view part of the group - GroupItem *group = new GroupItem(NULL,refBlock,this,params); + GroupItem *group = new GroupItem(NULL,topBlock,this,params); // adding the fake interface to the top group item @@ -1073,10 +1190,12 @@ void Dispatcher::connectInterToGroup(InterfaceItem *item){ // creating/adding the group interface in the graph model GroupInterface *groupInter = new GroupInterface(parentBlock,refInter->getName()+"_group",refInter->getDirection(),refInter->getPurpose()); parentItem->getRefBlock()->addInterface(groupInter); - // creating/adding the group control interface in the graph model - GroupInterface *groupCtlInter = new GroupInterface(parentBlock,refInter->getName()+"_group_enb",refInter->getDirection(),AbstractInterface::Control); - groupCtlInter->setAssociatedIface(groupInter); - parentItem->getRefBlock()->addInterface(groupCtlInter); + // creating/adding the group control interface in the graph model if the purpose is data + if (refInter->getPurpose() == AbstractInterface::Data) { + GroupInterface *groupCtlInter = new GroupInterface(parentBlock,refInter->getName()+"_group_enb",refInter->getDirection(),AbstractInterface::Control); + groupCtlInter->setAssociatedIface(groupInter); + parentItem->getRefBlock()->addInterface(groupCtlInter); + } // creating/adding the group interface in the current scene model, and connection item InterfaceItem *groupIfaceItem = new InterfaceItem(0,item->getOrientation(),groupInter,parentItem,params); parentItem->addInterfaceItem(groupIfaceItem,true); @@ -1216,8 +1335,9 @@ void Dispatcher::findGraphModifications(FunctionalBlock *block) { QList* delay = iterD.value(); if (delay->at(0) > 0) { // create delay and associate it to the connected input - AbstractInputModifier* mod = new DelayInputModifier(delay->at(0)); - ConnectedInterface* toIface = AI_TO_CON(iterD.key()->getAssociatedIface()); + + ConnectedInterface* toIface = AI_TO_CON(iterD.key()); + AbstractInputModifier* mod = new DelayInputModifier(toIface, delay->at(0)); cout << "modify input of " << qPrintable(toIface->getName()) << endl; toIface->setInputModifier(mod); // repaint