// ------------------------------------------------------------------------- bool SpiceDialog::loadSpiceNetList(const QString& s) { Comp->withSim = false; if(s.isEmpty()) return false; QFileInfo FileInfo(QucsWorkDir, s); NodesList->clear(); PortsList->clear(); textStatus = 0; Line = Error = ""; QString preprocessor = PrepCombo->currentText(); if (preprocessor != "none") { bool piping = true; QString script; #ifdef __MINGW32__ QString interpreter = "tinyperl.exe"; #else QString interpreter = "perl"; #endif if (preprocessor == "ps2sp") { script = "ps2sp"; } else if (preprocessor == "spicepp") { script = "spicepp.pl"; } else if (preprocessor == "spiceprm") { script = "spiceprm"; piping = false; } script = QucsSettings.BinDir + script; SpicePrep = new QProcess(this); SpicePrep->addArgument(interpreter); SpicePrep->addArgument(script); SpicePrep->addArgument(FileInfo.filePath()); QFile PrepFile; QFileInfo PrepInfo(QucsWorkDir, s + ".pre"); QString PrepName = PrepInfo.filePath(); if (!piping) { SpicePrep->addArgument(PrepName); connect(SpicePrep, SIGNAL(readyReadStdout()), SLOT(slotSkipOut())); connect(SpicePrep, SIGNAL(readyReadStderr()), SLOT(slotGetPrepErr())); } else { connect(SpicePrep, SIGNAL(readyReadStdout()), SLOT(slotGetPrepOut())); connect(SpicePrep, SIGNAL(readyReadStderr()), SLOT(slotGetPrepErr())); } QMessageBox *MBox = new QMessageBox(tr("Info"), tr("Preprocessing SPICE file \"%1\".").arg(FileInfo.filePath()), QMessageBox::NoIcon, QMessageBox::Abort, QMessageBox::NoButton, QMessageBox::NoButton, this, 0, true, Qt::WStyle_DialogBorder | Qt::WDestructiveClose); connect(SpicePrep, SIGNAL(processExited()), MBox, SLOT(close())); if (piping) { PrepFile.setName(PrepName); if(!PrepFile.open(IO_WriteOnly)) { QMessageBox::critical(this, tr("Error"), tr("Cannot save preprocessed SPICE file \"%1\"."). arg(PrepName)); return false; } prestream = new QTextStream(&PrepFile); } if(!SpicePrep->start()) { QMessageBox::critical(this, tr("Error"), tr("Cannot execute \"%1\".").arg(interpreter + " " + script)); if (piping) { PrepFile.close(); delete prestream; } return false; } SpicePrep->closeStdin(); MBox->exec(); delete SpicePrep; if (piping) { PrepFile.close(); delete prestream; } if(!Error.isEmpty()) { QMessageBox::critical(this, tr("SPICE Preprocessor Error"), Error); return false; } FileInfo = QFileInfo(QucsWorkDir, s + ".pre"); } // first call Qucsconv ............ QucsConv = new QProcess(this); QucsConv->addArgument(QucsSettings.BinDir + "qucsconv"); QucsConv->addArgument("-if"); QucsConv->addArgument("spice"); QucsConv->addArgument("-of"); QucsConv->addArgument("qucs"); QucsConv->addArgument("-i"); QucsConv->addArgument(FileInfo.filePath()); connect(QucsConv, SIGNAL(readyReadStdout()), SLOT(slotGetNetlist())); connect(QucsConv, SIGNAL(readyReadStderr()), SLOT(slotGetError())); QMessageBox *MBox = new QMessageBox(tr("Info"), tr("Converting SPICE file \"%1\".").arg(FileInfo.filePath()), QMessageBox::NoIcon, QMessageBox::Abort, QMessageBox::NoButton, QMessageBox::NoButton, this, 0, true, Qt::WStyle_DialogBorder | Qt::WDestructiveClose); connect(QucsConv, SIGNAL(processExited()), MBox, SLOT(close())); if(!QucsConv->start()) { QMessageBox::critical(this, tr("Error"), tr("Cannot execute \"%1\".").arg(QucsSettings.BinDir + "qucsconv")); return false; } QucsConv->closeStdin(); MBox->exec(); delete QucsConv; if(!Error.isEmpty()) QMessageBox::critical(this, tr("QucsConv Error"), Error); Property *pp = Comp->Props.at(1); if(!pp->Value.isEmpty()) { PortsList->clear(); PortsList->insertStringList(QStringList::split(',', pp->Value)); } QString tmp; QListBoxItem *pi; for(unsigned int i=0; i<PortsList->count(); i++) { tmp = PortsList->text(i).remove(0, 4); PortsList->changeItem(tmp, i); pi = NodesList->findItem(tmp, Qt::CaseSensitive | Qt::ExactMatch); if(pi) delete pi; else PortsList->removeItem(i--); } return true; }
// ------------------------------------------------------------------------- bool SpiceFile::recreateSubNetlist(QString *SpiceFile, QString *FileName) { // initialize collectors ErrText = ""; NetText = ""; SimText = ""; NetLine = ""; // evaluate properties if(Props.at(1)->Value != "") makeSubcircuit = true; else makeSubcircuit = false; if(Props.at(2)->Value == "yes") insertSim = true; else insertSim = false; // preprocessor run if necessary QString preprocessor = Props.at(3)->Value; if (preprocessor != "none") { bool piping = true; QStringList script; #ifdef __MINGW32__ QString interpreter = "tinyperl.exe"; #else QString interpreter = "perl"; #endif if (preprocessor == "ps2sp") { script << "ps2sp"; } else if (preprocessor == "spicepp") { script << "spicepp.pl"; } else if (preprocessor == "spiceprm") { script << "spiceprm"; piping = false; } SpicePrep = new QProcess(this); script << interpreter; script << script; script << *SpiceFile; QFile PrepFile; QString PrepName = *SpiceFile + ".pre"; if (!piping) { script << PrepName; connect(SpicePrep, SIGNAL(readyReadStandardOutput()), SLOT(slotSkipOut())); connect(SpicePrep, SIGNAL(readyReadStandardError()), SLOT(slotGetPrepErr())); } else { connect(SpicePrep, SIGNAL(readyReadStandardOutput()), SLOT(slotGetPrepOut())); connect(SpicePrep, SIGNAL(readyReadStandardError()), SLOT(slotGetPrepErr())); } QMessageBox *MBox = new QMessageBox(QMessageBox::NoIcon, QObject::tr("Info"), QObject::tr("Preprocessing SPICE file \"%1\".").arg(*SpiceFile), QMessageBox::Abort); MBox->setAttribute(Qt::WA_DeleteOnClose); connect(SpicePrep, SIGNAL(finished(int)), MBox, SLOT(close())); if (piping) { PrepFile.setFileName(PrepName); if(!PrepFile.open(QIODevice::WriteOnly)) { ErrText += QObject::tr("ERROR: Cannot save preprocessed SPICE file \"%1\"."). arg(PrepName); return false; } prestream = new QTextStream(&PrepFile); } QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert("PATH", env.value("PATH") ); SpicePrep->setProcessEnvironment(env); SpicePrep->start(script.join(" ")); //QucsHelp->setCommunication(0); if(SpicePrep->state()!=QProcess::Running&& SpicePrep->state()!=QProcess::Starting) { ErrText += QObject::tr("ERROR: Cannot execute \"%1\"."). arg(interpreter + " " + script.join(" ") + "\"."); if (piping) { PrepFile.close(); delete prestream; } return false; } //SpicePrep->closeStdin(); MBox->exec(); delete SpicePrep; if (piping) { PrepFile.close(); delete prestream; } *SpiceFile = PrepName; } // begin command line construction QString prog; QStringList com; //prog = QucsSettings.BinDir + "qucsconv" + executableSuffix; prog = QucsSettings.Qucsconv; if(makeSubcircuit) com << "-g" << "_ref"; com << "-if" << "spice" << "-of" << "qucs"; com << "-i" << *SpiceFile; // begin netlist text creation if(makeSubcircuit) { QString f = misc::properFileName(*FileName); NetText += "\n.Def:" + misc::properName(f) + " "; QString PortNames = Props.at(1)->Value; PortNames.replace(',', ' '); NetText += PortNames; if(makeSubcircuit) NetText += " _ref"; } NetText += "\n"; // startup SPICE conversion process QucsConv = new QProcess(this); QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); env.insert("PATH", env.value("PATH") ); QucsConv->setProcessEnvironment(env); qDebug() << "SpiceFile::recreateSubNetlist :Command:" << prog << com.join(" "); // QucsConv->start(com.join(" ")); QucsConv->start(prog, com); /// these slots might write into NetText, ErrText, outstream, filstream connect(QucsConv, SIGNAL(readyReadStandardOutput()), SLOT(slotGetNetlist())); connect(QucsConv, SIGNAL(readyReadStandardError()), SLOT(slotGetError())); connect(QucsConv, SIGNAL(finished(int,QProcess::ExitStatus)), SLOT(slotExited())); if(QucsConv->state()!=QProcess::Running&& QucsConv->state()!=QProcess::Starting) { ErrText += QObject::tr("COMP ERROR: Cannot start QucsConv!"); return false; } (*outstream) << NetText; (*filstream) << NetText; // only interact with the GUI if it was launched if (QucsMain) { QucsMain->statusBar()->showMessage(tr("Converting SPICE file \"%1\".").arg(*SpiceFile), 2000); } else qDebug() << QObject::tr("Converting SPICE file \"%1\".").arg(*SpiceFile); // finish QucsConv->waitForFinished(); delete QucsConv; lastLoaded = QDateTime::currentDateTime(); return true; }
// ------------------------------------------------------------------------- bool SpiceFile::recreateSubNetlist(QString *SpiceFile, QString *FileName) { // initialize collectors ErrText = ""; NetText = ""; SimText = ""; NetLine = ""; // evaluate properties if(Props.at(1)->Value != "") makeSubcircuit = true; else makeSubcircuit = false; if(Props.at(2)->Value == "yes") insertSim = true; else insertSim = false; // preprocessor run if necessary QString preprocessor = Props.at(3)->Value; if (preprocessor != "none") { bool piping = true; QString script; #ifdef __MINGW32__ QString interpreter = "tinyperl.exe"; #else QString interpreter = "perl"; #endif if (preprocessor == "ps2sp") { script = "ps2sp"; } else if (preprocessor == "spicepp") { script = "spicepp.pl"; } else if (preprocessor == "spiceprm") { script = "spiceprm"; piping = false; } script = QucsSettings.BinDir + script; SpicePrep = new Q3Process(this); SpicePrep->addArgument(interpreter); SpicePrep->addArgument(script); SpicePrep->addArgument(*SpiceFile); QFile PrepFile; QString PrepName = *SpiceFile + ".pre"; if (!piping) { SpicePrep->addArgument(PrepName); connect(SpicePrep, SIGNAL(readyReadStdout()), SLOT(slotSkipOut())); connect(SpicePrep, SIGNAL(readyReadStderr()), SLOT(slotGetPrepErr())); } else { connect(SpicePrep, SIGNAL(readyReadStdout()), SLOT(slotGetPrepOut())); connect(SpicePrep, SIGNAL(readyReadStderr()), SLOT(slotGetPrepErr())); } QMessageBox *MBox = new QMessageBox(QObject::tr("Info"), QObject::tr("Preprocessing SPICE file \"%1\".").arg(*SpiceFile), QMessageBox::NoIcon, QMessageBox::Abort, QMessageBox::NoButton, QMessageBox::NoButton, 0, 0, true, Qt::WStyle_DialogBorder | Qt::WDestructiveClose); connect(SpicePrep, SIGNAL(processExited()), MBox, SLOT(close())); if (piping) { PrepFile.setName(PrepName); if(!PrepFile.open(QIODevice::WriteOnly)) { ErrText += QObject::tr("ERROR: Cannot save preprocessed SPICE file \"%1\"."). arg(PrepName); return false; } prestream = new QTextStream(&PrepFile); } if(!SpicePrep->start()) { ErrText += QObject::tr("ERROR: Cannot execute \"%1\"."). arg(interpreter + " " + script + "\"."); if (piping) { PrepFile.close(); delete prestream; } return false; } SpicePrep->closeStdin(); MBox->exec(); delete SpicePrep; if (piping) { PrepFile.close(); delete prestream; } *SpiceFile = PrepName; } // begin command line construction QStringList com; com << (QucsSettings.BinDir + "qucsconv"); if(makeSubcircuit) com << "-g" << "_ref"; com << "-if" << "spice" << "-of" << "qucs"; com << "-i" << *SpiceFile; // begin netlist text creation if(makeSubcircuit) { QString f = properFileName(*FileName); NetText += "\n.Def:" + properName(f) + " "; QString PortNames = Props.at(1)->Value; PortNames.replace(',', ' '); NetText += PortNames; if(makeSubcircuit) NetText += " _ref"; } NetText += "\n"; // startup SPICE conversion process QucsConv = new Q3Process(this); QucsConv->setArguments(com); connect(QucsConv, SIGNAL(readyReadStdout()), SLOT(slotGetNetlist())); connect(QucsConv, SIGNAL(readyReadStderr()), SLOT(slotGetError())); connect(QucsConv, SIGNAL(processExited()), SLOT(slotExited())); if(!QucsConv->start()) { ErrText += QObject::tr("ERROR: Cannot start QucsConv!"); return false; } (*outstream) << NetText; (*filstream) << NetText; QucsConv->closeStdin(); // waiting info dialog box QMessageBox *MBox = new QMessageBox(QObject::tr("Info"), QObject::tr("Converting SPICE file \"%1\".").arg(*SpiceFile), QMessageBox::NoIcon, QMessageBox::Abort, QMessageBox::NoButton, QMessageBox::NoButton, 0, 0, true, Qt::WStyle_DialogBorder | Qt::WDestructiveClose); connect(QucsConv, SIGNAL(processExited()), MBox, SLOT(close())); MBox->exec(); // finish delete QucsConv; lastLoaded = QDateTime::currentDateTime(); return true; }