Skip to content

Commit

Permalink
Implement attaching of SPICE libraries to Qucs XML libraries
Browse files Browse the repository at this point in the history
SPICE libraries referenced by SpiceLibComp are copied to the the
subdirectory when creating a library from project.
  • Loading branch information
ra3xdh committed Jan 19, 2025
1 parent 88fb62f commit 0d53e47
Show file tree
Hide file tree
Showing 12 changed files with 76 additions and 26 deletions.
3 changes: 2 additions & 1 deletion qucs/components/component.h
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ class Component : public Element {
virtual QStringList getExtraVariables();
virtual QString getProbeVariable(bool isXyce = false);
virtual QString getSpiceModel();
virtual QString getSpiceLibrary(bool withDirective = true) { Q_UNUSED(withDirective); return QString(); }
virtual QString getSpiceLibrary() { return QString(); }
virtual QStringList getSpiceLibraryFiles() { return QStringList(); }
virtual QString getNgspiceBeforeSim(QString sim, int lvl=0);
virtual QString getNgspiceAfterSim(QString sim, int lvl=0);
virtual QString getVAvariables() {return QString();};
Expand Down
13 changes: 3 additions & 10 deletions qucs/components/libcomp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -413,7 +413,7 @@ QStringList LibComp::getAttachedMOD()
return mod_lst;
}

QString LibComp::getSpiceLibrary(bool withDirective)
QString LibComp::getSpiceLibrary()
{
QStringList files;
QString content;
Expand All @@ -433,15 +433,8 @@ QString LibComp::getSpiceLibrary(bool withDirective)
}

QString s;
if (withDirective) {
for (const auto &file: files) { // for netlist
s += QStringLiteral(".INCLUDE \"%1\"\n").arg(file);
}
} else {
for (const auto &file: files) { // for making library
QFileInfo inf(file);
s += QStringLiteral("\"%1\" ").arg(inf.fileName());
}
for (const auto &file: files) { // for netlist
s += QStringLiteral(".INCLUDE \"%1\"\n").arg(file);
}
return s;
}
2 changes: 1 addition & 1 deletion qucs/components/libcomp.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class LibComp : public MultiViewComponent {
QString getSubcircuitFile();
QStringList getAttachedMOD(); // LibComp can reference cfunc.mod and ifspec.ifs
QStringList getAttachedIFS(); // These should be compiled before SPICE simulation
QString getSpiceLibrary(bool withDirective);
QString getSpiceLibrary();

protected:
QString netlist();
Expand Down
11 changes: 11 additions & 0 deletions qucs/dialogs/librarydialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -508,6 +508,17 @@ void LibraryDialog::slotSave()
}
kern->createSubNetlsit(ts,true);
intoStream(Stream, tmp, "Spice");

QStringList libs = kern->collectSpiceLibraryFiles(Doc);
QStringList copiedFiles;
for (QString &file: libs) {
QString ofile = file;
intoFile(file, ofile, copiedFiles);
}
if (!copiedFiles.isEmpty()) {
Stream << "<SpiceAttach \"" << copiedFiles.join("\" \"")
<< "\">\n";
}
delete kern;
QucsSettings.DefaultSimulator = sim;
//}
Expand Down
27 changes: 27 additions & 0 deletions qucs/extsimkernels/abstractspicekernel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1595,3 +1595,30 @@ QString AbstractSpiceKernel::collectSpiceLibs(Schematic* sch)
return collected_spicelib.join("");
}


QStringList AbstractSpiceKernel::collectSpiceLibraryFiles(Schematic *sch)
{
QStringList collected_spicelib;
for(Component *pc = sch->a_DocComps.first(); pc != 0; pc = sch->a_DocComps.next()) {
QStringList new_libs;
if (pc->Model == "Sub") {
Schematic *sub = new Schematic(nullptr, ((Subcircuit *)pc)->getSubcircuitFile());
if(!sub->loadDocument()) // load document if possible
{
delete sub;
continue;
}
new_libs = collectSpiceLibraryFiles(sub);
delete sub;
} else {
new_libs = pc->getSpiceLibraryFiles();
}
for (const auto&lib: new_libs) {
if (!collected_spicelib.contains(lib)) {
collected_spicelib.append(lib);
}
}
}
return collected_spicelib;
}

1 change: 1 addition & 0 deletions qucs/extsimkernels/abstractspicekernel.h
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ class AbstractSpiceKernel : public QObject
virtual void SaveNetlist(QString filename);
virtual bool waitEndOfSimulation();
void setConsole(QPlainTextEdit *console) { a_console = console; }
QStringList collectSpiceLibraryFiles(Schematic *sch);
static QString collectSpiceLibs(Schematic* sch);

signals:
Expand Down
15 changes: 14 additions & 1 deletion qucs/spicecomponents/sp_include.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ Element* S4Q_Include::info(QString& Name, char* &BitmapFile, bool getNewOne)
return 0;
}

QString S4Q_Include::getSpiceLibrary(bool withDirective)
QString S4Q_Include::getSpiceLibrary()
{
if (isActive != COMP_IS_ACTIVE) return QString();
QString s;
Expand All @@ -99,3 +99,16 @@ QString S4Q_Include::getSpiceLibrary(bool withDirective)
return s;
}

QStringList S4Q_Include::getSpiceLibraryFiles()
{
QStringList files;
for (Property *pp : Props) {
QString val = pp->Value;
if (!val.isEmpty()) {
val = misc::properAbsFileName(val, containingSchematic);
files.append(val);
}
}
return files;
}

3 changes: 2 additions & 1 deletion qucs/spicecomponents/sp_include.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ class S4Q_Include : public Component {
~S4Q_Include();
Component* newOne();
static Element* info(QString&, char* &, bool getNewOne=false);
QString getSpiceLibrary(bool withDirective = true);
QString getSpiceLibrary();
QStringList getSpiceLibraryFiles();

protected:
QString vhdlCode(int) { return QString(); }
Expand Down
2 changes: 1 addition & 1 deletion qucs/spicecomponents/sp_lib.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ Element* S4Q_Lib::info(QString& Name, char* &BitmapFile, bool getNewOne)
return 0;
}

QString S4Q_Lib::getSpiceLibrary(bool withDirective)
QString S4Q_Lib::getSpiceLibrary()
{
if (isActive != COMP_IS_ACTIVE) return QString();
QString s;
Expand Down
2 changes: 1 addition & 1 deletion qucs/spicecomponents/sp_lib.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class S4Q_Lib : public Component {
~S4Q_Lib();
Component* newOne();
static Element* info(QString&, char* &, bool getNewOne=false);
QString getSpiceLibrary(bool withDirective = true);
QString getSpiceLibrary();

protected:
QString vhdlCode(int) { return QString(); }
Expand Down
20 changes: 11 additions & 9 deletions qucs/spicecomponents/spicelibcomp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -246,16 +246,18 @@ QString SpiceLibComp::cdl_netlist()
return spice_netlist(spicecompat::CDL);
}

QString SpiceLibComp::getSpiceLibrary(bool withDirective)
QString SpiceLibComp::getSpiceLibrary()
{
if (isActive != COMP_IS_ACTIVE) return QString();
QString f = misc::properAbsFileName(getProperty("File")->Value, containingSchematic);
QString s;
if (withDirective) {
s = QStringLiteral(".INCLUDE \"%1\"\n").arg(f);
} else {
QFileInfo inf(f);
s = QStringLiteral("\"%1\" ").arg(inf.fileName());
}
QString f = misc::properAbsFileName(Props.at(0)->Value, containingSchematic);
QString s = QStringLiteral(".INCLUDE \"%1\"\n").arg(f);
return s;
}

QStringList SpiceLibComp::getSpiceLibraryFiles()
{
QString f = misc::properAbsFileName(getProperty("File")->Value, containingSchematic);
QStringList files;
files.append(f);
return files;
}
3 changes: 2 additions & 1 deletion qucs/spicecomponents/spicelibcomp.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,8 @@ class SpiceLibComp : public MultiViewComponent {
~SpiceLibComp() {};
Component* newOne();
static Element* info(QString&, char* &, bool getNewOne=false);
QString getSpiceLibrary(bool withDirective = true);
QString getSpiceLibrary();
QStringList getSpiceLibraryFiles();

protected:
QString spice_netlist(spicecompat::SpiceDialect dialect = spicecompat::SPICEDefault);
Expand Down

0 comments on commit 0d53e47

Please sign in to comment.