1 #include "BlockWidget.h"
\r
6 BlockWidget::BlockWidget(QWidget *parent) : QWidget(parent)
\r
9 rxComment = new QRegExp("(.*)--.*");
\r
10 rxComma = new QRegExp("(.*)[;]");
\r
11 rxPort = new QRegExp("[\\s\\t]*(.*)[\\s\\t]*:[\\s\\t]*(in|out|inout)[\\s\\t]*(.*)",CaseInsensitive,QRegExp::RegExp);
\r
12 rxEnt = new QRegExp("[\\s\\t]*entity[\\s\\t]*(.*)[\\s\\t]*is",CaseInsensitive,QRegExp::RegExp);
\r
13 rxArch = new QRegExp("[\\s\\t]*architecture[\\s\\t]*(.*)[\\s\\t]*of (.*)[\\s\\t]*is",CaseInsensitive,QRegExp::RegExp);
\r
14 rxComp = new QRegExp("[\\s\\t]*component[\\s\\t]*(.*)[\\s\\t]*",CaseInsensitive,QRegExp::RegExp);
\r
15 rxEnd = new QRegExp("[\\s\\t]*end(.*)",CaseInsensitive,QRegExp::RegExp);
\r
16 rxComp = new QRegExp("[\\s\\t]*end component;",CaseInsensitive,QRegExp::RegExp);
\r
17 rxGeneric = new QRegExp("[\\s\\t]*generic[\\s\\t]*[(][\\s\\t]*",CaseInsensitive,QRegExp::RegExp);
\r
18 rxEndGen = new QRegExp("[\\s\\t]*[)]",CaseInsensitive,QRegExp::RegExp);
\r
19 rxGen = new QRegExp("[\\s\\t]*(.*)[\\s\\t]*:[\\s\\t]*(.*)[\\s\\t]*:=[\\s\\t]*(.*)",CaseInsensitive,QRegExp::RegExp);
\r
20 rxConst = new QRegExp("[\\s\\t]*constant[\\s\\t]*(.*)[\\s\\t]*:[\\s\\t]*(.)*[\\s\\t]*:=[\\s\\t]*(.*)",CaseInsensitive,QRegExp::RegExp);
\r
21 rxWidth = new QRegExp(".*[(](.*)(downto|to)(.*)[)]",CaseInsensitive,QRegExp::RegExp);
\r
23 loadBt = new QPushButton("load VHDL");
\r
24 genBt = new QPushButton("generate XML");
\r
25 QHBoxLayout *widgetLayout = new QHBoxLayout;
\r
26 QVBoxLayout *left = new QVBoxLayout;
\r
27 QVBoxLayout *right = new QVBoxLayout;
\r
29 scrollPort = new QScrollArea;
\r
30 scrollPort->setWidgetResizable(true);
\r
31 twPort = new QTableWidget(this);
\r
32 scrollPort->setWidget(twPort);
\r
33 scrollGen = new QScrollArea;
\r
34 scrollGen->setWidgetResizable(true);
\r
35 twGen = new QTableWidget(this);
\r
36 scrollGen->setWidget(twGen);
\r
37 teName = new QTextEdit;
\r
38 teBrief = new QTextEdit;
\r
39 teDesc = new QTextEdit;
\r
40 lblName = new QLabel("Block name :");
\r
41 lblBrief = new QLabel("Enter a brief description : ");
\r
42 lblDesc = new QLabel("Enter a detailled description : ");
\r
43 lblPort = new QLabel("Ports :");
\r
44 lblGen = new QLabel("Generics :");
\r
46 connect(loadBt, SIGNAL(clicked()),this, SLOT(loadCode()));
\r
47 connect(genBt, SIGNAL(clicked()), this, SLOT(generateXml()));
\r
49 left->addWidget(loadBt);
\r
50 left->addWidget(lblPort);
\r
51 left->addWidget(scrollPort);
\r
52 left->addWidget(lblGen);
\r
53 left->addWidget(scrollGen);
\r
55 right->addWidget(lblName);
\r
56 right->addWidget(teName);
\r
57 right->addWidget(lblBrief);
\r
58 right->addWidget(teBrief);
\r
59 right->addWidget(lblDesc);
\r
60 right->addWidget(teDesc);
\r
61 right->addWidget(genBt);
\r
63 widgetLayout->addLayout(left);
\r
64 widgetLayout->addLayout(right);
\r
65 setLayout(widgetLayout);
\r
69 BlockWidget::~BlockWidget()
\r
74 // This function opens a VHDL file and get the informations about the entity :
\r
75 // First the generics, then the signals.
\r
76 // You can edit the descriptions in the right, one for the brief description, the other for the detailled.
\r
77 void BlockWidget::loadCode() {
\r
79 QString line, portName, portType, portId, genName, genType, genValue;
\r
80 QStringList *portNameList, *portTypeList, *portIdList, *genNameList, *genTypeList, *genValueList;
\r
82 twPort->setColumnCount(3);
\r
83 twPort->setRowCount(cpt);
\r
84 twGen->setColumnCount(3);
\r
85 twGen->setRowCount(cpt);
\r
86 portNameList = new QStringList;
\r
87 portTypeList = new QStringList;
\r
88 portIdList = new QStringList;
\r
89 genNameList = new QStringList;
\r
90 genTypeList = new QStringList;
\r
91 genValueList = new QStringList;
\r
93 fileName = QFileDialog::getOpenFileName(this,
\r
94 tr("Open File"), "C:", tr("Files (*.txt *.vhd)"));
\r
95 QFile file(fileName);
\r
97 if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
\r
99 QTextStream ts(&file);
\r
100 while (!ts.atEnd())
\r
102 line = ts.readLine();
\r
103 if(rxComment->indexIn(line) != -1) {
\r
104 line = rxComment->cap(1);
\r
107 if(rxEnt->indexIn(line)!= -1) {
\r
109 entName = rxEnt->cap(1);
\r
110 teName->setText(entName);
\r
111 QSize size = teName->document()->size().toSize();
\r
112 teName->setMaximumSize(size);
\r
114 while(rxEnd->indexIn(line) == -1) {
\r
115 line = ts.readLine();
\r
116 if(rxComment->indexIn(line) != -1) {
\r
117 line = rxComment->cap(1);
\r
119 if(rxComma->indexIn(line) != -1) {
\r
120 line = rxComma->cap(1);
\r
122 if(rxGeneric->indexIn(line) != -1) {
\r
123 while(rxEndGen->indexIn(line) == -1) {
\r
124 line = ts.readLine();
\r
125 if(rxComment->indexIn(line) != -1) {
\r
126 line = rxComment->cap(1);
\r
128 if(rxComma->indexIn(line) != -1) {
\r
129 line = rxComma->cap(1);
\r
131 if(rxGen->indexIn(line) != -1) {
\r
132 genName = rxGen->cap(1).simplified();
\r
133 genType = rxGen->cap(2).simplified();
\r
134 genValue = rxGen->cap(3).simplified();
\r
136 genNameList->append(genName);
\r
137 genTypeList->append(genType);
\r
138 genValueList->append(genValue);
\r
142 if(rxPort->indexIn(line) != -1) {
\r
143 if(rxComment->indexIn(line) != -1) {
\r
144 line = rxComment->cap(1);
\r
146 if(rxComma->indexIn(line) != -1) {
\r
147 line = rxComma->cap(1);
\r
149 portName = rxPort->cap(1).simplified();
\r
150 portId = rxPort->cap(2).simplified();
\r
151 portType = rxPort->cap(3).simplified();
\r
152 portNameList->append(portName);
\r
153 portIdList->append(portId);
\r
154 portTypeList->append(portType);
\r
160 twGen->setRowCount(genNameList->size());
\r
161 for(int i = 0; i < genNameList->size(); i++) {
\r
162 twGen->setItem(i, 0, new QTableWidgetItem(genNameList->at(i)));
\r
163 twGen->setItem(i, 1, new QTableWidgetItem(genTypeList->at(i)));
\r
164 twGen->setItem(i, 2, new QTableWidgetItem(genValueList->at(i)));
\r
166 twPort->setRowCount(portNameList->size());
\r
167 for(int i = 0; i < portNameList->size(); i++) {
\r
168 twPort->setItem(i, 0, new QTableWidgetItem(portIdList->at(i)));
\r
169 twPort->setItem(i, 1, new QTableWidgetItem(portNameList->at(i)));
\r
170 twPort->setItem(i, 2, new QTableWidgetItem(portTypeList->at(i)));
\r
174 scrollPort->setWidget(twPort);
\r
178 // This function gets the informations in the table and the descriptions, and creates a XML file with this content
\r
179 void BlockWidget::generateXml() {
\r
181 QString portName, portType, portId, genName, genType, genValue;
\r
182 QStringList *portNameList, *portTypeList, *portIdList, *genNameList, *genTypeList, *genValueList;
\r
184 brief = teBrief->toPlainText();
\r
185 desc = teDesc->toPlainText();
\r
186 entName = teName->toPlainText();
\r
188 portNameList = new QStringList;
\r
189 portTypeList = new QStringList;
\r
190 portIdList = new QStringList;
\r
191 genNameList = new QStringList;
\r
192 genTypeList = new QStringList;
\r
193 genValueList = new QStringList;
\r
194 for(int i = 0; i < twGen->rowCount(); i++) {
\r
195 genNameList->append(twGen->item(i,0)->text());
\r
196 genTypeList->append(twGen->item(i,1)->text());
\r
197 genValueList->append(twGen->item(i,2)->text());
\r
200 for(int i = 0; i < twPort->rowCount(); i++) {
\r
201 portIdList->append(twPort->item(i,0)->text());
\r
202 portNameList->append(twPort->item(i,1)->text());
\r
203 portTypeList->append(twPort->item(i,2)->text());
\r
206 QDomDocument doc (entName);
\r
207 QDomElement block = doc.createElement("block");
\r
208 block.setAttribute("name",entName);
\r
209 block.setAttribute("version", "0.1");
\r
210 doc.appendChild(block);
\r
212 QDomElement comments = doc.createElement("comments");
\r
213 QDomElement category = doc.createElement("caterory");
\r
214 category.setAttribute("ids","");
\r
215 comments.appendChild(category);
\r
217 QDomElement eBrief = doc.createElement("brief");
\r
218 if(!brief.isEmpty()) {
\r
219 QDomText txtBrief = doc.createTextNode(brief);
\r
220 eBrief.appendChild(txtBrief);
\r
221 comments.appendChild(eBrief);
\r
223 QDomElement eDesc = doc.createElement("description");
\r
224 if(!desc.isEmpty()) {
\r
225 QDomText txtDesc = doc.createTextNode(desc);
\r
226 eDesc.appendChild(txtDesc);
\r
227 comments.appendChild(eDesc);
\r
229 block.appendChild(comments);
\r
231 QDomElement parameters = doc.createElement("parameters");
\r
232 QDomElement interfaces = doc.createElement("interfaces");
\r
233 QDomElement inputs = doc.createElement("inputs");
\r
234 QDomElement outputs = doc.createElement("outputs");
\r
235 QDomElement bidirs = doc.createElement("bidirs");
\r
236 block.appendChild(parameters);
\r
237 block.appendChild(interfaces);
\r
238 interfaces.appendChild(inputs);
\r
239 interfaces.appendChild(outputs);
\r
240 interfaces.appendChild(bidirs);
\r
242 for(int i = 0; i < twGen->rowCount(); i++) {
\r
243 genName = genNameList->at(i);
\r
244 genType = genTypeList->at(i);
\r
245 genValue = genValueList->at(i);
\r
246 QDomElement parameter = doc.createElement("parameter");
\r
247 parameter.setAttribute("name",genName);
\r
248 parameter.setAttribute("type",genType);
\r
249 parameter.setAttribute("value",genValue);
\r
250 parameter.setAttribute("context","generic");
\r
251 parameters.appendChild(parameter);
\r
254 for(int i = 0; i < portIdList->size(); i++) {
\r
255 portId = portIdList->at(i);
\r
256 portName = portNameList->at(i);
\r
257 portType = portTypeList->at(i);
\r
258 if(rxWidth->indexIn(portType) != -1) {
\r
259 x = rxWidth->cap(1).toInt();
\r
260 y = rxWidth->cap(3).toInt();
\r
269 if(portId.compare("in", CaseInsensitive) == 0) {
\r
270 QDomElement input = doc.createElement("input");
\r
271 input.setAttribute("name",portName);
\r
272 input.setAttribute("width", width);
\r
273 inputs.appendChild(input);
\r
275 else if(portId.compare("out", CaseInsensitive) == 0) {
\r
276 QDomElement output = doc.createElement("output");
\r
277 output.setAttribute("name",portName);
\r
278 output.setAttribute("width", width);
\r
279 outputs.appendChild(output);
\r
281 else if(portId.compare("inout", CaseInsensitive) == 0) {
\r
282 QDomElement bidir = doc.createElement("bidir");
\r
283 bidir.setAttribute("name",portName);
\r
284 bidir.setAttribute("width", width);
\r
285 bidirs.appendChild(bidir);
\r
289 fileName = QFileDialog::getOpenFileName(this, tr("Open File"),
\r
290 "C:", tr("Files (*.xml)"));
\r
291 QFile file(fileName);
\r
292 if(!file.open(QIODevice::WriteOnly | QIODevice::Text))
\r
294 QTextStream ts(&file);
\r
295 doc.save(ts,QDomNode::EncodingFromTextStream);
\r
298 QLabel *popup = new QLabel("Votre fichier XML est rempli");
\r