// ------------------------------------------------------- QString SParamFile::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 // output all properties Property *p2 = Props.first(); s += " "+p2->Name+"=\"{"+getSubcircuitFile()+"}\""; // data type p2 = Props.next(); s += " "+p2->Name+"=\""+p2->Value+"\""; // interpolator type p2 = Props.next(); s += " "+p2->Name+"=\""+p2->Value+"\""; // DC property p2 = Props.next(); s += " "+p2->Name+"=\""+p2->Value+"\"\n"; return s; }
// --------------------------------------------------------------------- // Makes the schematic symbol subcircuit with the correct number // of ports. void Subcircuit::createSymbol() { int No; QString FileName(Props.getFirst()->Value); FileName = getSubcircuitFile(); tx = INT_MIN; ty = INT_MIN; if(loadSymbol(FileName) > 0) { // try to load subcircuit symbol if(tx == INT_MIN) tx = x1+4; if(ty == INT_MIN) ty = y2+4; // remove unused ports for(Port *pp = Ports.first(); pp != 0; ) { if(!pp->avail) { Ports.remove(); pp = Ports.current (); } else pp = Ports.next(); } } else { No = QucsApp::testFile(FileName); if(No < 0) No = 0; Ports.clear(); remakeSymbol(No); // no symbol was found -> create standard symbol } }
// --------------------------------------------------------------------- // Makes the schematic symbol subcircuit with the correct number // of ports. void Subcircuit::createSymbol() { int No; QString FileName(Props.getFirst()->Value); FileName = getSubcircuitFile(); tx = INT_MIN; ty = INT_MIN; if(loadSymbol(FileName) > 0) { // try to load subcircuit symbol if(tx == INT_MIN) tx = x1+4; if(ty == INT_MIN) ty = y2+4; // remove unused ports QMutableListIterator<Port *> ip(Ports); Port *pp; while (ip.hasNext()) { pp = ip.next(); if(!pp->avail) { pp = ip.peekNext(); ip.remove(); } } } else { No = QucsApp::testFile(FileName); if(No < 0) No = 0; Ports.clear(); remakeSymbol(No); // no symbol was found -> create standard symbol } }
// ------------------------------------------------------- bool VHDL_File::createSubNetlist(QTextStream *stream) { ErrText = ""; // check filename QString FileName = Props.getFirst()->Value; if(FileName.isEmpty()) { ErrText += QObject::tr("ERROR: No file name in %1 component \"%2\"."). arg(Model).arg(Name); return false; } // construct full filename FileName = getSubcircuitFile(); // open file for reading QFile f(FileName); if(!f.open(QIODevice::ReadOnly)) { ErrText += QObject::tr("ERROR: Cannot open %1 file \"%2\"."). arg(Model).arg(FileName); return false; } // write the whole VHDL file into the netlist output QByteArray FileContent = f.readAll(); f.close(); (*stream) << '\n'; //? stream->writeRawBytes(FileContent.data(), FileContent.size()); (*stream) << FileContent.data(); (*stream) << '\n'; return true; }
// ------------------------------------------------------------------------- bool SpiceFile::createSubNetlist(QTextStream *stream) { // check file name QString FileName = Props.first()->Value; if(FileName.isEmpty()) { ErrText += QObject::tr("ERROR: No file name in SPICE component \"%1\"."). arg(Name); return false; } // check input and output file QFile SpiceFile, ConvFile; FileName = getSubcircuitFile(); SpiceFile.setName(FileName); if(!SpiceFile.open(QIODevice::ReadOnly)) { ErrText += QObject::tr("ERROR: Cannot open SPICE file \"%1\"."). arg(FileName); return false; } SpiceFile.close(); QString ConvName = SpiceFile.name() + ".lst"; ConvFile.setName(ConvName); QFileInfo Info(ConvName); // re-create converted file if necessary if(changed || !ConvFile.exists() || (lastLoaded.isValid() && lastLoaded < Info.lastModified())) { if(!ConvFile.open(QIODevice::WriteOnly)) { ErrText += QObject::tr("ERROR: Cannot save converted SPICE file \"%1\"."). arg(FileName + ".lst"); return false; } outstream = stream; filstream = new QTextStream(&ConvFile); QString SpiceName = SpiceFile.name(); bool ret = recreateSubNetlist(&SpiceName, &FileName); ConvFile.close(); delete filstream; return ret; } // load old file and stuff into stream if(!ConvFile.open(QIODevice::ReadOnly)) { ErrText += QObject::tr("ERROR: Cannot open converted SPICE file \"%1\"."). arg(FileName + ".lst"); return false; } QByteArray FileContent = ConvFile.readAll(); ConvFile.close(); //? stream->writeRawBytes(FileContent.data(), FileContent.size()); (*stream) << FileContent.data(); return true; }
bool SpiceFile::createSpiceSubckt(QTextStream *stream) { (*stream)<<"\n"; QFile sub_file(getSubcircuitFile()); if (sub_file.open(QIODevice::ReadOnly|QFile::Text)) { QTextStream ts(&sub_file); (*stream)<<ts.readAll().remove(QChar(0x1A)); sub_file.close(); } (*stream)<<"\n"; return true; }
QString SpiceFile::getSubcktName() { QString s = ""; QFile sub_file(getSubcircuitFile()); if (sub_file.open(QIODevice::ReadOnly)) { QStringList lst = QString(sub_file.readAll()).split("\n"); foreach (QString str, lst) { QRegExp subckt_header("^\\s*\\.(S|s)(U|u)(B|b)(C|c)(K|k)(T|t)\\s.*"); if (subckt_header.exactMatch(str)) { QRegExp sep("\\s"); s = str.section(sep,1,1,QString::SectionSkipEmpty); } }
// ------------------------------------------------------- QString iFile::netlist() { QString s = Model+":"+Name; // output all node names foreach(Port *p1, Ports) s += " "+p1->Connection->Name; // node names // output file properties Property *p2 = Props.first(); s += " "+p2->Name+"=\"{"+getSubcircuitFile()+"}\""; // output all remaining properties for(p2 = Props.next(); p2 != 0; p2 = Props.next()) s += " "+p2->Name+"=\""+p2->Value+"\""; return s + "\n"; }
// ------------------------------------------------------- bool LibComp::createSubNetlist(QTextStream *stream, QStringList &FileList, int type) { int r = -1; QString FileString; QStringList Includes; if(type&1) { r = loadSection("Model", FileString, &Includes); } else if(type&2) { r = loadSection("VHDLModel", FileString, &Includes); } else if(type&4) { r = loadSection("VerilogModel", FileString, &Includes); } if(r < 0) return false; // also include files int error = 0; for(QStringList::Iterator it = Includes.begin(); it != Includes.end(); ++it ) { QString s = getSubcircuitFile()+"/"+*it; if(FileList.findIndex(s) >= 0) continue; FileList.append(s); // load file and stuff into stream QFile file(s); if(!file.open(QIODevice::ReadOnly)) { error++; } else { QByteArray FileContent = file.readAll(); file.close(); //?stream->writeRawBytes(FileContent.data(), FileContent.size()); (*stream) << FileContent.data(); qDebug() << "hi from libcomp"; } } (*stream) << "\n" << FileString << "\n"; return error > 0 ? false : true; }