Revert "libngspice is linked at compile time"

This reverts commit 75f8b20493.
In case of problems, ngspice demands to be detached which is not
possible when it is linked at compile time.
This commit is contained in:
Maciej Suminski 2018-03-21 10:42:39 +01:00
parent dfd2a8fc48
commit 33620ecc85
3 changed files with 70 additions and 16 deletions

View File

@ -316,7 +316,6 @@ target_link_libraries( eeschema_kiface
gal gal
${wxWidgets_LIBRARIES} ${wxWidgets_LIBRARIES}
${GDI_PLUS_LIBRARIES} ${GDI_PLUS_LIBRARIES}
${NGSPICE_LIBRARY}
) )
set_target_properties( eeschema_kiface PROPERTIES set_target_properties( eeschema_kiface PROPERTIES
# Decorate OUTPUT_NAME with PREFIX and SUFFIX, creating something like # Decorate OUTPUT_NAME with PREFIX and SUFFIX, creating something like

View File

@ -29,24 +29,33 @@
#include <common.h> // LOCALE_IO #include <common.h> // LOCALE_IO
#include <wx/stdpaths.h> #include <wx/stdpaths.h>
#include <wx/dir.h> #include <wx/dir.h>
#include <wx/dynlib.h>
#include <sstream> #include <sstream>
#include <stdexcept>
using namespace std; using namespace std;
NGSPICE::NGSPICE() NGSPICE::NGSPICE()
{ {
init(); init_dll();
} }
NGSPICE::~NGSPICE() NGSPICE::~NGSPICE()
{ {
delete m_dll;
} }
void NGSPICE::Init() void NGSPICE::Init()
{ {
if( m_error )
{
delete m_dll;
init_dll();
}
Command( "reset" ); Command( "reset" );
} }
@ -55,7 +64,7 @@ vector<COMPLEX> NGSPICE::GetPlot( const string& aName, int aMaxLen )
{ {
LOCALE_IO c_locale; // ngspice works correctly only with C locale LOCALE_IO c_locale; // ngspice works correctly only with C locale
vector<COMPLEX> data; vector<COMPLEX> data;
vector_info* vi = ngGet_Vec_Info( (char*) aName.c_str() ); vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
if( vi ) if( vi )
{ {
@ -82,7 +91,7 @@ vector<double> NGSPICE::GetRealPlot( const string& aName, int aMaxLen )
{ {
LOCALE_IO c_locale; // ngspice works correctly only with C locale LOCALE_IO c_locale; // ngspice works correctly only with C locale
vector<double> data; vector<double> data;
vector_info* vi = ngGet_Vec_Info( (char*) aName.c_str() ); vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
if( vi ) if( vi )
{ {
@ -114,7 +123,7 @@ vector<double> NGSPICE::GetImagPlot( const string& aName, int aMaxLen )
{ {
LOCALE_IO c_locale; // ngspice works correctly only with C locale LOCALE_IO c_locale; // ngspice works correctly only with C locale
vector<double> data; vector<double> data;
vector_info* vi = ngGet_Vec_Info( (char*) aName.c_str() ); vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
if( vi ) if( vi )
{ {
@ -138,7 +147,7 @@ vector<double> NGSPICE::GetMagPlot( const string& aName, int aMaxLen )
{ {
LOCALE_IO c_locale; // ngspice works correctly only with C locale LOCALE_IO c_locale; // ngspice works correctly only with C locale
vector<double> data; vector<double> data;
vector_info* vi = ngGet_Vec_Info( (char*) aName.c_str() ); vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
if( vi ) if( vi )
{ {
@ -165,7 +174,7 @@ vector<double> NGSPICE::GetPhasePlot( const string& aName, int aMaxLen )
{ {
LOCALE_IO c_locale; // ngspice works correctly only with C locale LOCALE_IO c_locale; // ngspice works correctly only with C locale
vector<double> data; vector<double> data;
vector_info* vi = ngGet_Vec_Info( (char*) aName.c_str() ); vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
if( vi ) if( vi )
{ {
@ -205,8 +214,7 @@ bool NGSPICE::LoadNetlist( const string& aNetlist )
} }
lines.push_back( nullptr ); lines.push_back( nullptr );
m_ngSpice_Circ( lines.data() );
ngSpice_Circ( lines.data() );
for( auto line : lines ) for( auto line : lines )
free( line ); free( line );
@ -232,15 +240,14 @@ bool NGSPICE::Stop()
bool NGSPICE::IsRunning() bool NGSPICE::IsRunning()
{ {
LOCALE_IO c_locale; // ngspice works correctly only with C locale LOCALE_IO c_locale; // ngspice works correctly only with C locale
return ngSpice_running(); return m_ngSpice_Running();
} }
bool NGSPICE::Command( const string& aCmd ) bool NGSPICE::Command( const string& aCmd )
{ {
LOCALE_IO c_locale; // ngspice works correctly only with C locale LOCALE_IO c_locale; // ngspice works correctly only with C locale
ngSpice_Command( (char*) aCmd.c_str() ); m_ngSpice_Command( (char*) aCmd.c_str() );
return true; return true;
} }
@ -270,13 +277,34 @@ string NGSPICE::GetXAxis( SIM_TYPE aType ) const
} }
void NGSPICE::init() void NGSPICE::init_dll()
{ {
if( m_initialized ) if( m_initialized )
return; return;
LOCALE_IO c_locale; // ngspice works correctly only with C locale LOCALE_IO c_locale; // ngspice works correctly only with C locale
ngSpice_Init( &cbSendChar, &cbSendStat, &cbControlledExit, NULL, NULL, &cbBGThreadRunning, this );
#ifdef __WINDOWS__
m_dll = new wxDynamicLibrary( "libngspice-0.dll" );
#else
m_dll = new wxDynamicLibrary( wxDynamicLibrary::CanonicalizeName( "ngspice" ) );
#endif
if( !m_dll || !m_dll->IsLoaded() )
throw std::runtime_error( "Missing ngspice shared library" );
m_error = false;
// Obtain function pointers
m_ngSpice_Init = (ngSpice_Init) m_dll->GetSymbol( "ngSpice_Init" );
m_ngSpice_Circ = (ngSpice_Circ) m_dll->GetSymbol( "ngSpice_Circ" );
m_ngSpice_Command = (ngSpice_Command) m_dll->GetSymbol( "ngSpice_Command" );
m_ngGet_Vec_Info = (ngGet_Vec_Info) m_dll->GetSymbol( "ngGet_Vec_Info" );
m_ngSpice_AllPlots = (ngSpice_AllPlots) m_dll->GetSymbol( "ngSpice_AllPlots" );
m_ngSpice_AllVecs = (ngSpice_AllVecs) m_dll->GetSymbol( "ngSpice_AllVecs" );
m_ngSpice_Running = (ngSpice_Running) m_dll->GetSymbol( "ngSpice_running" ); // it is not a typo
m_ngSpice_Init( &cbSendChar, &cbSendStat, &cbControlledExit, NULL, NULL, &cbBGThreadRunning, this );
// Load a custom spinit file, to fix the problem with loading .cm files // Load a custom spinit file, to fix the problem with loading .cm files
// Switch to the executable directory, so the relative paths are correct // Switch to the executable directory, so the relative paths are correct
@ -321,8 +349,8 @@ void NGSPICE::init()
// Restore the working directory // Restore the working directory
wxSetWorkingDirectory( cwd ); wxSetWorkingDirectory( cwd );
// Workarounds to avoid hang ups on certain errors, // Workarounds to avoid hang ups on certain errors
// they have to be called, no matter what is in the spinit file // These commands have to be called, no matter what is in the spinit file
Command( "unset interactive" ); Command( "unset interactive" );
Command( "set noaskquit" ); Command( "set noaskquit" );
Command( "set nomoremode" ); Command( "set nomoremode" );

View File

@ -79,6 +79,30 @@ public:
private: private:
void init(); void init();
// Performs DLL initialization, obtains function pointers
void init_dll();
// ngspice library functions
typedef void (*ngSpice_Init)( SendChar*, SendStat*, ControlledExit*,
SendData*, SendInitData*, BGThreadRunning*, void* );
typedef int (*ngSpice_Circ)( char** circarray );
typedef int (*ngSpice_Command)( char* command );
typedef pvector_info (*ngGet_Vec_Info)( char* vecname );
typedef char** (*ngSpice_AllPlots)( void );
typedef char** (*ngSpice_AllVecs)( char* plotname );
typedef bool (*ngSpice_Running)( void );
///> Handles to DLL functions
ngSpice_Init m_ngSpice_Init;
ngSpice_Circ m_ngSpice_Circ;
ngSpice_Command m_ngSpice_Command;
ngGet_Vec_Info m_ngGet_Vec_Info;
ngSpice_AllPlots m_ngSpice_AllPlots;
ngSpice_AllVecs m_ngSpice_AllVecs;
ngSpice_Running m_ngSpice_Running;
wxDynamicLibrary* m_dll;
///> Executes commands from a file ///> Executes commands from a file
bool loadSpinit( const std::string& aFileName ); bool loadSpinit( const std::string& aFileName );
@ -97,6 +121,9 @@ private:
void dump(); void dump();
///> Error flag, meaning ngspice needs to be reloaded
bool m_error;
///> NGspice should be initialized only once ///> NGspice should be initialized only once
static bool m_initialized; static bool m_initialized;