// ------------------------------------------------------- QString Subcircuit::verilogCode(int) { QString f = properFileName(Props.first()->Value); QString s = " Sub_" + properName(f); // output all user defined properties Property *pr = Props.next(); if (pr) { s += " #("; s += Verilog_Param(pr->Value); for(pr = Props.next(); pr != 0; pr = Props.next()) s += ", " + Verilog_Param(pr->Value); s += ")"; } // output all node names s += " " + Name + " ("; Port *pp = Ports.first(); if(pp) s += pp->Connection->Name; for(pp = Ports.next(); pp != 0; pp = Ports.next()) s += ", "+pp->Connection->Name; // node names s += ");\n"; return s; }
void ColorBox::setStrColor(const QString &colorStr) { if (properName(m_color) == colorStr) return; setColor(properColor(colorStr)); }
// ------------------------------------------------------- QString Subcircuit::vhdlCode(int) { QString f = properFileName(Props.first()->Value); QString s = " " + Name + ": entity Sub_" + properName(f); // output all user defined properties Property *pr = Props.next(); if (pr) { s += " generic map ("; s += pr->Value; for(pr = Props.next(); pr != 0; pr = Props.next()) s += ", " + pr->Value; s += ")"; } // output all node names s += " port map ("; Port *pp = Ports.first(); if(pp) s += pp->Connection->Name; for(pp = Ports.next(); pp != 0; pp = Ports.next()) s += ", "+pp->Connection->Name; // node names s += ");\n"; return s; }
// --------------------------------------------------- QString SpiceFile::netlist() { if(Props.at(1)->Value.isEmpty()) return QString(""); // no ports, no subcircuit instance QString s = "Sub:"+Name; // SPICE netlist is subcircuit for(Port *pp = Ports.first(); pp != 0; pp = Ports.next()) s += " "+pp->Connection->Name; // output all node names QString f = properFileName(Props.first()->Value); s += " Type=\""+properName(f)+"\"\n"; return s; }
// ------------------------------------------------------- QString Subcircuit::netlist() { QString s = Model+":"+Name; // output all node names for(Port *p1 = Ports.first(); p1 != 0; p1 = Ports.next()) s += " "+p1->Connection->Name; // node names // type for subcircuit QString f = properFileName(Props.first()->Value); s += " Type=\""+properName(f)+"\""; // output all user defined properties for(Property *pp = Props.next(); pp != 0; pp = Props.next()) s += " "+pp->Name+"=\""+pp->Value+"\""; return s + '\n'; }
// ------------------------------------------------------------------------- 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; }
// --------------------------------------------------- // Converts a spice netlist into Qucs format and outputs it. void SimMessage::nextSPICE() { QString Line; for(;;) { // search for next SPICE component Line = *(Collect.begin()); Collect.remove(Collect.begin()); if(Line == "*") { // worked on all components ? startSimulator(); // <<<<<================== go on === return; } if(Line.left(5) == "SPICE") { if(Line.at(5) != 'o') insertSim = true; else insertSim = false; break; } Collect.append(Line); } QString FileName = Line.section('"', 1,1); Line = Line.section('"', 2); // port nodes if(Line.isEmpty()) makeSubcircuit = false; else makeSubcircuit = true; QStringList com; com << (QucsSettings.BinDir + "qucsconv"); if(makeSubcircuit) com << "-g" << "_ref"; com << "-if" << "spice" << "-of" << "qucs"; SimProcess.setArguments(com); QFile SpiceFile; if(FileName.find(QDir::separator()) < 0) // add path ? SpiceFile.setName(QucsWorkDir.path() + QDir::separator() + FileName); else SpiceFile.setName(FileName); if(!SpiceFile.open(IO_ReadOnly)) { ErrText->insert(tr("ERROR: Cannot open SPICE file \"%1\".").arg(FileName)); FinishSimulation(-1); return; } if(makeSubcircuit) { Stream << "\n.Def:" << properName(FileName) << " "; Line.replace(',', ' '); Stream << Line; if(!Line.isEmpty()) Stream << " _ref"; } Stream << "\n"; ProgressText = ""; if(!SimProcess.start()) { ErrText->insert(tr("ERROR: Cannot start QucsConv!")); FinishSimulation(-1); return; } QByteArray SpiceContent = SpiceFile.readAll(); SpiceFile.close(); SimProcess.writeToStdin(SpiceContent); connect(&SimProcess, SIGNAL(wroteToStdin()), SLOT(slotCloseStdin())); }
QString ColorBox::strColor() const { return properName(m_color); }