]> AND Private Git Repository - blast.git/blob - BlockLibraryWidget.cpp
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
d80a78ee795a8938d6b0998d5cfa2c763be367ea
[blast.git] / BlockLibraryWidget.cpp
1 #include "BlockLibraryWidget.h"
2 #include "BlockLibraryTree.h"
3
4 BlockLibraryWidget::BlockLibraryWidget(Dispatcher* _dispatcher,
5                                        Parameters* _params,
6                                        QWidget *parent) : QWidget(parent) {
7
8
9   dispatcher = _dispatcher;
10   params = _params;
11
12   nbClock = 0;
13   comboClkGen = NULL;
14   nbRst = 0;
15   comboRstGen = NULL;
16   currentRefBlock = NULL;
17
18   // creating the widget : tree, buttons, ...
19   QBoxLayout* layout = new QBoxLayout(QBoxLayout::TopToBottom, this);
20   tree = new QTreeWidget(this);
21
22   buttonAdd = new QPushButton("add to", this);
23   buttonAdd->setEnabled(false);
24   comboScenes = new QComboBox();
25
26   QHBoxLayout* layAdd = new QHBoxLayout;
27   layAdd->addWidget(buttonAdd);
28   layAdd->addWidget(comboScenes);
29
30   boxClkRst = new QGroupBox("Clock/reset connection");
31
32
33   QString msg = "Connect to main clock/rst ext_clk/reset_0 (";
34   msg += QString::number(params->clocks.at(0));
35   msg += ")";
36   radAutoClk = new QRadioButton(msg);
37   radChooseClk = new QRadioButton("Choose among available clk/rst");
38   if (params->autoConnMainClk) {
39     radAutoClk->setChecked(true);
40   }
41   else {
42     radChooseClk->setChecked(true);
43   }
44
45   layClkRst = new QGridLayout;
46
47   QVBoxLayout* layConn = new QVBoxLayout;
48   layConn->addWidget(radAutoClk,0,0);
49   layConn->addWidget(radChooseClk,1,0);
50   stack = new QStackedWidget();
51   QLabel* labDummy = new QLabel("");
52   stack->addWidget(labDummy);
53   QWidget* w = new QWidget();
54   w->setLayout(layClkRst);
55   stack->addWidget(w);
56   layConn->addWidget(stack);
57
58   boxClkRst->setLayout(layConn);
59
60   QVBoxLayout* layBottom = new QVBoxLayout;
61   layBottom->addLayout(layAdd);
62   layBottom->addWidget(boxClkRst);
63
64   connect(tree, SIGNAL(itemClicked(QTreeWidgetItem*,int)), this, SLOT(clicked()));
65   connect(tree, SIGNAL(itemDoubleClicked(QTreeWidgetItem*,int)), this, SLOT(doubleClicked()));
66   connect(buttonAdd, SIGNAL(clicked()), this, SLOT(addClicked()));  
67   connect(radChooseClk, SIGNAL(toggled(bool)), this, SLOT(enableAvailableClocks(bool)));
68
69   BlockCategory* cat = params->categoryTree->searchCategory(0);
70
71   QTreeWidgetItem* item = tree->invisibleRootItem();
72   tree->setHeaderLabel("Blocks list");
73
74   addChild(cat,item);
75
76   layout->addWidget(tree);
77   layout->addLayout(layBottom);
78   this->setLayout(layout);
79
80   //this->setFixedSize(300,230);
81 }
82
83
84 BlockLibraryWidget::~BlockLibraryWidget() {
85 }
86
87 void BlockLibraryWidget::addChild(BlockCategory *catParent,QTreeWidgetItem* itemParent) {
88
89   QTreeWidgetItem* newItemCat = NULL;
90   QTreeWidgetItem* newItemBlock = NULL;
91
92   QList<BlockCategory *> childs = catParent->getAllChilds();
93   foreach(BlockCategory* cat, childs){
94
95     if (cat->getId()<100) {
96       newItemCat = new QTreeWidgetItem(itemParent);
97       newItemCat->setData(0,Qt::DisplayRole, cat->getName());
98       QList<ReferenceBlock*> list = cat->getBlocks();
99       for(int i=0; i<list.length(); i++){
100         newItemBlock = new QTreeWidgetItem(newItemCat);
101         newItemBlock->setData(0,Qt::DisplayRole, list.at(i)->getName());
102         newItemBlock->setData(1,Qt::DisplayRole, cat->getId());
103         newItemBlock->setData(2,Qt::DisplayRole, i);
104         newItemBlock->setIcon(0,QIcon("icons/window_new.png"));
105       }
106       addChild(cat,newItemCat);
107     }
108   }
109   /* TO DO :
110      - getting the childs of catParent
111      - for each BlockCategory cat of that list :
112         - create an new TreeWidgetItem (newImteCat), with itemParent as a parent
113         - set the first column of that item with the categry name
114         - get the list of the blocks that are associated with cat
115         - for i = 0 to that list size.
116            - create a new TreeWidgetItem (newItemBlock), with newItemCat as a parent
117            - set the first column of that item with the block name
118            - set the second column of that item with the newItemCat id
119            - set the third column of that item with the value of i
120         - endfor
121         - call again addChild with cat and newImteCat as parameters
122       - end for
123   */
124 }
125
126
127 void BlockLibraryWidget::addClicked() {
128
129   QTreeWidgetItem *item = tree->selectedItems().at(0);
130   if(item->data(1,Qt::DisplayRole).isValid() && item->data(2,Qt::DisplayRole).isValid()){
131     int idCat = item->data(1,Qt::DisplayRole).toInt();
132     int idBlock = item->data(2,Qt::DisplayRole).toInt();
133     QVariant v = comboScenes->currentData();    
134
135     cout << "adding block to scene " << v.toInt() << endl;
136
137     QHash<QString, int> clkRstToGen;
138     for(int i=1;i<nbClock+nbRst;i++) {
139       QLayoutItem* item = layClkRst->itemAtPosition(i,0);
140       QLabel* lab = (QLabel *)(item->widget());
141       item = layClkRst->itemAtPosition(i,1);
142       QComboBox* combo = (QComboBox *)(item->widget());
143       clkRstToGen.insert(lab->text(),combo->currentIndex());
144       cout << "addblock: have to connect " << qPrintable(lab->text()) << " to clk/rst n° " << combo->currentIndex() << endl;
145     }
146
147
148     dispatcher->addBlock(Dispatcher::Design, idCat, idBlock, v.toInt(), clkRstToGen);
149   }
150
151   // only take the first selected
152   // retrieve id of category and id of block
153   // calling dispatcher addBlock() method.
154 }
155
156 void BlockLibraryWidget::clicked() {
157   if(tree->selectedItems().length() > 0) {
158
159     QTreeWidgetItem *item = tree->selectedItems().at(0);
160
161     if(item->data(1,Qt::DisplayRole).isValid()) {
162
163
164       buttonAdd->setEnabled(true);
165       int idCat = item->data(1,Qt::DisplayRole).toInt();
166       int idBlock = item->data(2,Qt::DisplayRole).toInt();
167       currentRefBlock = params->getReferenceBlock(idCat,idBlock);
168       QList<AbstractInterface*> lstClocks = currentRefBlock->getInterfaces(AbstractInterface::Input, AbstractInterface::Clock);
169       //if there are more than one input clock, force to choose
170       if ((lstClocks.size()>1) || (! params->autoConnMainClk)) {
171         radChooseClk->setChecked(true);
172         //enableAvailableClocks(true);
173       }
174       else {
175         radAutoClk->setChecked(true);
176       }
177       updateClkRst(idCat, idBlock);
178     }
179     else {
180       buttonAdd->setEnabled(false);
181       updateClkRst(-1,-1);
182     }
183   }
184 }
185
186 void BlockLibraryWidget::doubleClicked() {
187   clicked();
188   addClicked();
189 }
190
191 void BlockLibraryWidget::updateBoxConn() {
192   if (params->autoConnMainClk) {
193     radAutoClk->setChecked(true);
194     //enableAvailableClocks(false);
195   }
196   else {
197     radChooseClk->setChecked(true);
198     //enableAvailableClocks(true);
199   }
200   QString msg = "Auto-connect to main clk/rst (ext_clk_0 at ";
201   msg += QString::number(params->clocks.at(0));
202   msg += " MHz)";
203   radAutoClk->setText(msg);
204 }
205
206 void BlockLibraryWidget::updateComboScene() {
207   comboScenes->clear();
208   QMap<int,QString> list = dispatcher->getAllGroupNames();
209   QMapIterator<int,QString> iter(list);
210   while (iter.hasNext()) {
211     iter.next();
212     comboScenes->addItem(iter.value(),QVariant(iter.key()));
213   }
214 }
215
216 void BlockLibraryWidget::updateClkRst(int idCat, int idBlock) {
217
218   while (layClkRst->count() > 0) {
219     QWidget* widget = layClkRst->itemAt(0)->widget();
220     layClkRst->removeWidget(widget);
221     delete widget;
222   }  
223
224   if (nbClock != 0) {
225     delete [] comboClkGen;
226     nbClock = 0;
227   }
228   if (nbRst != 0) {
229     delete [] comboRstGen;
230     nbRst = 0;
231   }
232
233   if ((idCat == -1) || (idBlock == -1)) return;
234
235   QList<AbstractInterface*> lstClocks = currentRefBlock->getInterfaces(AbstractInterface::Input, AbstractInterface::Clock);
236   nbClock = lstClocks.size();
237   QList<AbstractInterface*> lstRst = currentRefBlock->getInterfaces(AbstractInterface::Input, AbstractInterface::Reset);
238   nbRst = lstRst.size();
239   cout << "For chosen block there are " << nbClock << " clocks and " << nbRst << " resets" << endl;
240
241   comboClkGen = new QComboBox*[lstClocks.size()];
242   for(int i=0;i<lstClocks.size();i++) {
243     comboClkGen[i] = new QComboBox();
244     QString name = "";
245     int id = 0;
246     foreach(double d, params->clocks) {
247       name = "ext_clk_"+QString::number(id)+" (";
248       name += QString::number(d) + " MHz)";
249       comboClkGen[i]->addItem(name);
250       id++;
251     }
252   }
253
254   comboRstGen = new QComboBox*[lstRst.size()];
255   for(int i=0;i<lstRst.size();i++) {
256     comboRstGen[i] = new QComboBox();
257     QString name = "";
258     for(int j=0;j<params->clocks.size();j++) {
259       name = "ext_rst_"+QString::number(j);
260       comboRstGen[i]->addItem(name);
261     }
262   }
263   layClkRst->addWidget(new QLabel("Clock/Reset name"), 0, 0);
264   layClkRst->addWidget(new QLabel("connect to"), 0, 1);
265   int row = 1;
266   foreach(AbstractInterface* iface, lstClocks) {
267     layClkRst->addWidget(new QLabel(iface->getName()), row,0);
268     layClkRst->addWidget(comboClkGen[row-1],row, 1);
269     row++;
270   }
271
272   foreach(AbstractInterface* iface, lstRst) {
273     layClkRst->addWidget(new QLabel(iface->getName()), row,0);
274     layClkRst->addWidget(comboRstGen[row-1-nbClock],row, 1);
275     row++;
276   }
277 }
278
279 void BlockLibraryWidget::enableAvailableClocks(bool state) {
280
281   if (state == false) {
282     stack->setCurrentIndex(0);
283   }
284   else {
285     stack->setCurrentIndex(1);
286   }
287 }
288