#include "BlockLibraryWidget.h"
#include "BlockLibraryTree.h"
+#include "AbstractInputModifier.h"
+#include "DelayInputModifier.h"
+
+
#include "InterfacePropertiesWindow.h"
int Dispatcher::sceneCounter = 0;
bool Dispatcher::createConnection(InterfaceItem *iface1, InterfaceItem *iface2) {
ConnectedInterface* ref1 = iface1->refInter;
- ConnectedInterface* ref2 = iface2->refInter;
- ConnectedInterface* asso1 = (ConnectedInterface*)(iface1->refInter->getAssociatedIface());
- ConnectedInterface* asso2 = (ConnectedInterface*)(iface2->refInter->getAssociatedIface());
+ ConnectedInterface* ref2 = iface2->refInter;
// connect both interface
bool ok1 = false;
// test the ref1->ref2 connection
if ((ref1->canConnectTo(ref2)) && (ref2->canConnectFrom(ref1))) {
- ref1->connectTo(ref2);
- /*
- ref2->connectFrom(ref1);
- if ((asso1 != NULL) && (asso2 != NULL)) {
- asso1->connectTo(asso2);
- asso2->connectFrom(asso1);
- }
- */
+ ref1->connectTo(ref2);
ok1 = true;
}
// if the frist one did not work, test ref2->ref1
if ((ok1 == false) && (ref2->canConnectTo(ref1)) && (ref1->canConnectFrom(ref2))) {
- ref2->connectTo(ref1);
- /*
- ref1->connectFrom(ref2);
- if ((asso1 != NULL) && (asso2 != NULL)) {
- asso1->connectFrom(asso2);
- asso2->connectTo(asso1);
- }
- */
+ ref2->connectTo(ref1);
ok2 = true;
}
if ((ok1 == true) || (ok2 == true)) {
unselectAllItems();
params->unsaveModif = true;
+ cout << "created a connection from " << qPrintable(ref1->getName()) << " to " << qPrintable(ref2->getName()) << endl;
return true;
}
return false;
*/
}
+void Dispatcher::generateBlockVHDL(BoxItem *item){
+ static QString fctName = "Dispatcher::generateBlockVHDL()";
+#ifdef DEBUG_FCTNAME
+ cout << "call to " << qPrintable(fctName) << endl;
+#endif
+
+ 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/");
+ }
+ catch(Exception e) {
+ cout << qPrintable(e.getMessage()) << endl;
+ }
+ }
+}
+
void Dispatcher::renameFunctionalBlock(BoxItem *item){
static QString fctName = "Dispatcher::renameFunctionalBlock()";
#ifdef DEBUG_FCTNAME
item->getOwner()->nameChanged();
}
+void Dispatcher::showPatterns(InterfaceItem *item) {
+ static QString fctName = "Dispatcher::showPatterns()";
+#ifdef DEBUG_FCTNAME
+ cout << "call to " << qPrintable(fctName) << endl;
+#endif
+ QString msg = "";
+ if (item->refInter->getDirection() == AbstractInterface::Input) {
+ msg = "Input pattern of iface ";
+ msg += item->refInter->getName();
+ 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())) {
+ msg += QString::number((int)c);
+ }
+ msg += "\n";
+ }
+ else if (item->refInter->getDirection() == AbstractInterface::Output) {
+ msg = "Output pattern of iface ";
+ msg += item->refInter->getName();
+ msg += " owned by ";
+ msg += item->refInter->getOwner()->getName();
+ msg += " is:\n";
+ ConnectedInterface* iface = AI_TO_CON(item->refInter->getAssociatedIface());
+ if (iface->getOutputPattern() == NULL) return;
+ foreach(char c, *(iface->getOutputPattern())) {
+ msg += QString::number((int)c);
+ }
+ msg += "\n";
+ }
+ QMessageBox::information(NULL,"Interface pattern",msg,QMessageBox::Ok,QMessageBox::Ok);
+}
+
+void Dispatcher::showModifier(InterfaceItem *item) {
+ static QString fctName = "Dispatcher::showModifier()";
+#ifdef DEBUG_FCTNAME
+ cout << "call to " << qPrintable(fctName) << endl;
+#endif
+ QString msg = "";
+ AbstractInputModifier* mod = item->refInter->getInputModifier();
+ if (mod->isDelay()) {
+ DelayInputModifier* delay = (DelayInputModifier *)mod;
+ msg = "Pattern of iface ";
+ msg += item->refInter->getName();
+ msg += " owned by ";
+ msg += item->refInter->getOwner()->getName();
+ msg += " is modified by a simple delay of ";
+ msg += QString::number(delay->getDelayLength());
+
+ }
+ QMessageBox::information(NULL,"Interface pattern",msg,QMessageBox::Ok,QMessageBox::Ok);
+}
+
+void Dispatcher::removeModifier(InterfaceItem *item) {
+ static QString fctName = "Dispatcher::showModifier()";
+#ifdef DEBUG_FCTNAME
+ cout << "call to " << qPrintable(fctName) << endl;
+#endif
+
+ item->refInter->clearInputModifier();
+}
+
+
void Dispatcher::duplicateBoxItem(BoxItem *item){
static QString fctName = "Dispatcher::duplicateBoxItem()";
#ifdef DEBUG_FCTNAME
// creating control interface if needed
if (refI->getAssociatedIface() != NULL) {
QString ctlName = cloneIface->getName()+"_enb";
- ReferenceInterface* ctlIface = new ReferenceInterface(refB,ctlName,"boolean","1",cloneIface->getDirection(), AbstractInterface::Control, 1);
+ ReferenceInterface* ctlIface = new ReferenceInterface(refB,ctlName,cloneIface->getDirection(), AbstractInterface::Control,"boolean","1", AbstractInterface::LittleEndian, 1);
refB->addInterface(ctlIface);
if (! ctlIface->setAssociatedIface(cloneIface)) {
cerr << "Abnormal case while cloning an interface and creating its associated control interface" << endl;
}
-void Dispatcher::addBlock(int idCategory, int idBlock, int idScene) {
+BoxItem* Dispatcher::addBlock(int idCategory, int idBlock, int idScene) {
static QString fctName = "Dispatcher::addBlock()";
#ifdef DEBUG_FCTNAME
cout << "call to " << qPrintable(fctName) << endl;
#endif
bool newSource = false;
+ BoxItem* item = NULL;
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
else {
GroupBlock* group = AB_TO_GRP(scene->getGroupItem()->getRefBlock());
FunctionalBlock* newOne = params->getGraph()->createFunctionalBlock(group, ref);
- scene->createBoxItem(newOne);
+ item = scene->createBoxItem(newOne);
+ params->blockToItem.insert(newOne,item);
}
params->unsaveModif = true;
+ return item;
}
// creating the view part of the group
GroupItem *group = new GroupItem(NULL,refBlock,this,params);
+
// adding the fake interface to the top group item
//InterfaceItem* item = new InterfaceItem(0.0 , Parameters::West, (ConnectedInterface*)iface, group, params);
//group->addInterface(item,true);
GroupBlock* groupBlock = AB_TO_GRP(upperItemOfGroupItem->getRefBlock());
// creating the view part of the group
GroupItem *groupItem = new GroupItem(upperItemOfGroupItem,groupBlock,this,params);
+
// creating the group widget
group = new GroupWidget(parentWidget, this, params);
// getting the newly created scene
removeAllBlockConnections(item);
if (item->getRefBlock()->isFunctionalBlock()) {
- FunctionalBlock* block = AB_TO_FUN(item->getRefBlock());
- GroupBlock* group = AB_TO_GRP(block->getParent());
+ FunctionalBlock* block = AB_TO_FUN(item->getRefBlock());
item->getScene()->removeBoxItem(item);
params->getGraph()->removeFunctionalBlock(block);
+ params->blockToItem.remove(block);
+
}
else if (item->getRefBlock()->isGroupBlock()) {
return NULL;
}
+void Dispatcher::findGraphModifications(FunctionalBlock *block) {
+ static QString fctName = "Dispatcher::findGraphModifications()";
+#ifdef DEBUG_FCTNAME
+ cout << "call to " << qPrintable(fctName) << endl;
+#endif
+
+ block->computeAdmittanceDelays();
+ // get the block item that is associated to block
+ BoxItem* toBlockItem = params->blockToItem.value(block);
+
+ /* VERSION 1: just add delays if needed */
+ QMap<AbstractInterface*,QList<int>* > delays = block->getAdmittanceDelays();
+ QMapIterator<AbstractInterface*,QList<int>* > iterD(delays);
+ while (iterD.hasNext()) {
+ iterD.next();
+ QList<int>* 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());
+ cout << "modify input of " << qPrintable(toIface->getName()) << endl;
+ toIface->setInputModifier(mod);
+ // repaint
+ toBlockItem->update();
+ }
+ }
+}
+