22 #include <qvgroupbox.h>
23 #include <qhgroupbox.h>
26 #include <qpushbutton.h>
27 #include <qprogressbar.h>
28 #include <qtextedit.h>
29 #include <qdatetime.h>
42 : QDialog(parent, 0, FALSE, Qt::WDestructiveClose)
44 setCaption(tr(
"Qucs Simulation Messages"));
56 DataSet = QDir::convertSeparators(Info.dirPath()) +
57 QDir::separator() + Doc->
DataSet;
62 all =
new QVBoxLayout(
this);
65 QVGroupBox *Group1 =
new QVGroupBox(tr(
"Progress:"),
this);
66 all->addWidget(Group1);
69 ProgText->setTextFormat(Qt::PlainText);
71 ProgText->setWordWrap(QTextEdit::NoWrap);
75 QHGroupBox *HGroup =
new QHGroupBox(
this);
76 HGroup->setInsideMargin(5);
77 HGroup->setInsideSpacing(5);
78 all->addWidget(HGroup);
79 new QLabel(tr(
"Progress:"), HGroup);
83 QVGroupBox *Group2 =
new QVGroupBox(tr(
"Errors and Warnings:"),
this);
84 all->addWidget(Group2);
86 ErrText =
new QTextEdit(Group2);
87 ErrText->setTextFormat(Qt::PlainText);
89 ErrText->setWordWrap(QTextEdit::NoWrap);
90 ErrText->setMinimumSize(400,80);
92 QHBox *Butts =
new QHBox(
this);
93 all->addWidget(Butts);
95 Display =
new QPushButton(tr(
"Goto display page"), Butts);
97 connect(
Display,SIGNAL(clicked()),SLOT(slotDisplayButton()));
99 Abort =
new QPushButton(tr(
"Abort simulation"), Butts);
100 connect(
Abort,SIGNAL(clicked()),SLOT(reject()));
112 Abort->setText(tr(
"Abort simulation"));
115 QString txt = tr(
"Starting new simulation on %1 at %2").
116 arg(QDate::currentDate().toString(
"ddd dd. MMM yyyy")).
117 arg(QTime::currentTime().toString(
"hh:mm:ss"));
122 ErrText->insert(tr(
"ERROR: Simulator is still running!"));
123 FinishSimulation(-1);
128 ProgText->insert(tr(
"creating netlist... "));
131 ErrText->insert(tr(
"ERROR: Cannot write netlist file!"));
132 FinishSimulation(-1);
143 FinishSimulation(-1);
151 connect(&
SimProcess, SIGNAL(readyReadStderr()), SLOT(slotDisplayErr()));
152 connect(&
SimProcess, SIGNAL(readyReadStdout()),
153 SLOT(slotReadSpiceNetlist()));
155 SLOT(slotFinishSpiceNetlist()));
165 void SimMessage::nextSPICE()
175 if(Line.left(5) ==
"SPICE") {
184 QString FileName = Line.section(
'"', 1,1);
185 Line = Line.section(
'"', 2);
192 com <<
"-g" <<
"_ref";
193 com <<
"-if" <<
"spice" <<
"-of" <<
"qucs";
197 if(FileName.find(QDir::separator()) < 0)
198 SpiceFile.setName(
QucsWorkDir.path() + QDir::separator() + FileName);
200 SpiceFile.setName(FileName);
201 if(!SpiceFile.open(IO_ReadOnly)) {
202 ErrText->insert(tr(
"ERROR: Cannot open SPICE file \"%1\".").
arg(FileName));
203 FinishSimulation(-1);
211 Line.replace(
',',
' ');
213 if(!Line.isEmpty())
Stream <<
" _ref";
220 ErrText->insert(tr(
"ERROR: Cannot start QucsConv!"));
221 FinishSimulation(-1);
225 QByteArray SpiceContent = SpiceFile.readAll();
228 connect(&
SimProcess, SIGNAL(wroteToStdin()), SLOT(slotCloseStdin()));
232 void SimMessage::slotCloseStdin()
235 disconnect(&
SimProcess, SIGNAL(wroteToStdin()), 0, 0);
239 void SimMessage::slotReadSpiceNetlist()
251 s = s.stripWhiteSpace();
252 if(s.isEmpty())
continue;
253 if(s.at(0) ==
'#')
continue;
254 if(s.at(0) ==
'.')
if(s.left(5) !=
".Def:") {
258 Stream <<
" " << s <<
'\n';
263 void SimMessage::slotFinishSpiceNetlist()
274 static QString pathName(QString longpath) {
275 const char * lpath = QDir::convertSeparators(longpath).ascii();
277 int len = GetShortPathNameA(lpath,spath,
sizeof(spath)-1);
279 return QString(spath);
282 static QString pathName(QString longpath) {
288 void SimMessage::startSimulator()
295 QStringList CommandLine;
296 QString SimPath = QDir::convertSeparators (
QucsHomeDir.absPath());
298 QString QucsDigiLib =
"qucsdigilib.bat";
299 QString QucsDigi =
"qucsdigi.bat";
300 QString QucsVeri =
"qucsveri.bat";
302 QString QucsDigiLib =
"qucsdigilib";
303 QString QucsDigi =
"qucsdigi";
304 QString QucsVeri =
"qucsveri";
307 bool isVerilog =
false;
326 libs.replace(
" ",
",-l");
327 libs =
"-Wl,-l" + libs;
330 <<
"netlist.txt" <<
DataSet << SimTime << pathName(SimPath)
335 QString text = Doc->text();
337 QString entity = VInfo.EntityName.lower();
338 QString lib = Doc->
Library.lower();
339 if (lib.isEmpty()) lib =
"work";
340 QString dir = QDir::convertSeparators (
QucsHomeDir.path());
342 if(!vhdlDir.exists(
"vhdl"))
343 if(!vhdlDir.mkdir(
"vhdl")) {
344 ErrText->insert(tr(
"ERROR: Cannot create VHDL directory \"%1\"!")
345 .
arg(vhdlDir.path()+
"/vhdl"));
348 vhdlDir.setPath(vhdlDir.path()+
"/vhdl");
349 if(!vhdlDir.exists(lib))
350 if(!vhdlDir.mkdir(lib)) {
351 ErrText->insert(tr(
"ERROR: Cannot create VHDL directory \"%1\"!")
352 .
arg(vhdlDir.path()+
"/"+lib));
355 vhdlDir.setPath(vhdlDir.path()+
"/"+lib);
357 destFile.setName(vhdlDir.filePath(entity+
".vhdl"));
358 if(!destFile.open(IO_WriteOnly)) {
359 ErrText->insert(tr(
"ERROR: Cannot create \"%1\"!")
360 .
arg(destFile.name()));
363 destFile.writeBlock(text.ascii(), text.length());
366 <<
"netlist.txt" << pathName(SimPath) << entity << lib;
372 for(QStringList::Iterator it =
Collect.begin();
375 if ((*it).right(4) !=
".lst" &&
376 (*it).right(5) !=
".vhdl" &&
377 (*it).right(4) !=
".vhd" &&
378 (*it).right(2) !=
".v") {
386 if(SimTime.at(0) ==
'§') {
388 ErrText->insert(SimTime.mid(1));
389 FinishSimulation(-1);
394 <<
" initial begin\n"
395 <<
" $dumpfile(\"digi.vcd\");\n"
397 <<
" #" << SimTime <<
" $finish;\n"
399 <<
"endmodule // TestBench\n";
408 QucsHomeDir.filePath(
"asco_netlist.txt") <<
"-o" <<
"asco_out";
417 <<
"netlist.txt" <<
DataSet << SimTime << pathName(SimPath)
421 <<
"netlist.txt" <<
DataSet << SimTime << pathName(SimPath)
430 connect(&
SimProcess, SIGNAL(readyReadStderr()), SLOT(slotDisplayErr()));
431 connect(&
SimProcess, SIGNAL(readyReadStdout()), SLOT(slotDisplayMsg()));
432 connect(&
SimProcess, SIGNAL(processExited()), SLOT(slotSimEnded()));
434 #ifdef SPEEDUP_PROGRESSBAR
435 waitForUpdate =
false;
440 ErrText->insert(tr(
"ERROR: Cannot start simulator!"));
441 FinishSimulation(-1);
451 if(pc->
Model ==
".Opt")
459 void SimMessage::slotDisplayMsg()
471 #ifdef SPEEDUP_PROGRESSBAR
475 QTimer::singleShot(20,
this, SLOT(slotUpdateProgressBar()));
476 waitForUpdate =
true;
504 #ifdef SPEEDUP_PROGRESSBAR
506 void SimMessage::slotUpdateProgressBar()
509 waitForUpdate =
false;
515 void SimMessage::slotDisplayErr()
517 int par =
ErrText->paragraphs();
518 int idx =
ErrText->paragraphLength(par-1);
519 ErrText->setCursorPosition(par-1,idx);
525 void SimMessage::slotSimEnded()
528 FinishSimulation(stat);
534 void SimMessage::FinishSimulation(
int Status)
536 Abort->setText(tr(
"Close window"));
540 QDate d = QDate::currentDate();
541 QTime
t = QTime::currentTime();
544 QString txt = tr(
"Simulation ended on %1 at %2").
545 arg(d.toString(
"ddd dd. MMM yyyy")).
546 arg(t.toString(
"hh:mm:ss"));
547 ProgText->insert(
"\n" + txt +
"\n" + tr(
"Ready.") +
"\n");
550 QString txt = tr(
"Errors occurred during simulation on %1 at %2").
551 arg(d.toString(
"ddd dd. MMM yyyy")).
552 arg(t.toString(
"hh:mm:ss"));
553 ProgText->insert(
"\n" + txt +
"\n" + tr(
"Aborted.") +
"\n");
557 if(file.open(IO_WriteOnly)) {
559 QTextStream stream(&file);
560 stream << tr(
"Output:\n-------") <<
"\n\n";
561 for(z=0; z<=
ProgText->paragraphs(); z++)
562 stream <<
ProgText->text(z) <<
"\n";
563 stream <<
"\n\n\n" << tr(
"Errors:\n-------") <<
"\n\n";
564 for(z=0; z<
ErrText->paragraphs(); z++)
565 stream <<
ErrText->text(z) <<
"\n";
573 if(
ifile.open(IO_ReadOnly)) {
574 if(ofile.open(IO_WriteOnly)) {
576 ofile.writeBlock(data);
597 void SimMessage::slotDisplayButton()