#include "BlockLibraryWidget.h"
#include "BlockLibraryTree.h"
+#include "Graph.h"
BlockLibraryWidget::BlockLibraryWidget(Dispatcher* _dispatcher,
Parameters* _params,
comboClkGen = NULL;
nbRst = 0;
comboRstGen = NULL;
+ currentRefBlock = NULL;
// creating the widget : tree, buttons, ...
QBoxLayout* layout = new QBoxLayout(QBoxLayout::TopToBottom, this);
layAdd->addWidget(buttonAdd);
layAdd->addWidget(comboScenes);
+ boxClkRst = new QGroupBox("Clock/reset connection");
+
+
+ QString msg = "Connect to main clock/rst ext_clk/reset_0 (";
+ msg += QString::number(params->getGraph()->getClock(0));
+ msg += ")";
+ radAutoClk = new QRadioButton(msg);
+ radChooseClk = new QRadioButton("Choose among available clk/rst");
+ if (params->autoConnMainClk) {
+ radAutoClk->setChecked(true);
+ }
+ else {
+ radChooseClk->setChecked(true);
+ }
+
layClkRst = new QGridLayout;
- boxClkRst = new QGroupBox("Clock/reset connection");
- boxClkRst->setLayout(layClkRst);
+ QVBoxLayout* layConn = new QVBoxLayout;
+ layConn->addWidget(radAutoClk,0,0);
+ layConn->addWidget(radChooseClk,1,0);
+ stack = new QStackedWidget();
+ QLabel* labDummy = new QLabel("");
+ stack->addWidget(labDummy);
+ QWidget* w = new QWidget();
+ w->setLayout(layClkRst);
+ stack->addWidget(w);
+ layConn->addWidget(stack);
+
+ boxClkRst->setLayout(layConn);
QVBoxLayout* layBottom = new QVBoxLayout;
layBottom->addLayout(layAdd);
layBottom->addWidget(boxClkRst);
-
connect(tree, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(clicked()));
connect(tree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(doubleClicked()));
connect(buttonAdd, SIGNAL(clicked()), this, SLOT(addClicked()));
+ connect(radChooseClk, SIGNAL(toggled(bool)), this, SLOT(enableAvailableClocks(bool)));
BlockCategory* cat = params->categoryTree->searchCategory(0);
cout << "adding block to scene " << v.toInt() << endl;
QHash<QString, int> clkRstToGen;
- for(int i=0;i<layClkRst->rowCount();i++) {
+ for(int i=1;i<=nbClock+nbRst;i++) {
QLayoutItem* item = layClkRst->itemAtPosition(i,0);
QLabel* lab = (QLabel *)(item->widget());
item = layClkRst->itemAtPosition(i,1);
QComboBox* combo = (QComboBox *)(item->widget());
clkRstToGen.insert(lab->text(),combo->currentIndex());
+ cout << "addblock: have to connect " << qPrintable(lab->text()) << " to clk/rst n° " << combo->currentIndex() << endl;
}
}
void BlockLibraryWidget::clicked() {
- if(tree->selectedItems().length() > 0){
+ if(tree->selectedItems().length() > 0) {
+
QTreeWidgetItem *item = tree->selectedItems().at(0);
+
if(item->data(1,Qt::DisplayRole).isValid()) {
+
+
buttonAdd->setEnabled(true);
- int idParent = item->data(1,Qt::DisplayRole).toInt();
+ int idCat = item->data(1,Qt::DisplayRole).toInt();
int idBlock = item->data(2,Qt::DisplayRole).toInt();
- updateClkRst(idParent, idBlock);
+ currentRefBlock = params->getReferenceBlock(idCat,idBlock);
+ QList<AbstractInterface*> lstClocks = currentRefBlock->getInterfaces(AbstractInterface::Input, AbstractInterface::Clock);
+ //if there are more than one input clock, force to choose
+ if ((lstClocks.size()>1) || (! params->autoConnMainClk)) {
+ radChooseClk->setChecked(true);
+ //enableAvailableClocks(true);
+ }
+ else {
+ radAutoClk->setChecked(true);
+ }
+ updateClkRst(idCat, idBlock);
}
else {
buttonAdd->setEnabled(false);
+ updateClkRst(-1,-1);
}
}
}
void BlockLibraryWidget::doubleClicked() {
+ clicked();
addClicked();
}
+void BlockLibraryWidget::updateBoxConn() {
+ if (params->autoConnMainClk) {
+ radAutoClk->setChecked(true);
+ //enableAvailableClocks(false);
+ }
+ else {
+ radChooseClk->setChecked(true);
+ //enableAvailableClocks(true);
+ }
+ QString msg = "Auto-connect to main clk/rst (ext_clk_0 at ";
+ msg += QString::number(params->getGraph()->getClock(0));
+ msg += " MHz)";
+ radAutoClk->setText(msg);
+}
+
void BlockLibraryWidget::updateComboScene() {
comboScenes->clear();
QMap<int,QString> list = dispatcher->getAllGroupNames();
QWidget* widget = layClkRst->itemAt(0)->widget();
layClkRst->removeWidget(widget);
delete widget;
- }
+ }
if (nbClock != 0) {
- for(int i=0;i<nbClock;i++) {
- comboClkGen[i]->deleteLater();
- }
delete [] comboClkGen;
+ nbClock = 0;
}
if (nbRst != 0) {
- for(int i=0;i<nbRst;i++) {
- comboRstGen[i]->deleteLater();
- }
delete [] comboRstGen;
+ nbRst = 0;
}
- ReferenceBlock* ref = params->getReferenceBlock(idCat,idBlock);
- QList<AbstractInterface*> lstClocks = ref->getInterfaces(AbstractInterface::Input, AbstractInterface::Clock);
+ if ((idCat == -1) || (idBlock == -1)) return;
+
+ QList<AbstractInterface*> lstClocks = currentRefBlock->getInterfaces(AbstractInterface::Input, AbstractInterface::Clock);
nbClock = lstClocks.size();
- QList<AbstractInterface*> lstRst = ref->getInterfaces(AbstractInterface::Input, AbstractInterface::Reset);
+ QList<AbstractInterface*> lstRst = currentRefBlock->getInterfaces(AbstractInterface::Input, AbstractInterface::Reset);
nbRst = lstRst.size();
+ cout << "For chosen block there are " << nbClock << " clocks and " << nbRst << " resets" << endl;
comboClkGen = new QComboBox*[lstClocks.size()];
for(int i=0;i<lstClocks.size();i++) {
comboClkGen[i] = new QComboBox();
QString name = "";
int id = 0;
- foreach(double d, params->clocks) {
+ foreach(double d, params->getGraph()->getClocks()) {
name = "ext_clk_"+QString::number(id)+" (";
name += QString::number(d) + " MHz)";
comboClkGen[i]->addItem(name);
for(int i=0;i<lstRst.size();i++) {
comboRstGen[i] = new QComboBox();
QString name = "";
- for(int j=0;j<params->clocks.size();j++) {
+ for(int j=0;j<params->getGraph()->getClocks().size();j++) {
name = "ext_rst_"+QString::number(j);
comboRstGen[i]->addItem(name);
}
layClkRst->addWidget(comboClkGen[row-1],row, 1);
row++;
}
+
foreach(AbstractInterface* iface, lstRst) {
layClkRst->addWidget(new QLabel(iface->getName()), row,0);
layClkRst->addWidget(comboRstGen[row-1-nbClock],row, 1);
row++;
}
+}
+
+void BlockLibraryWidget::enableAvailableClocks(bool state) {
+ if (state == false) {
+ stack->setCurrentIndex(0);
+ }
+ else {
+ stack->setCurrentIndex(1);
+ }
}
+