KiCad PCB EDA Suite
NGSPICE Class Reference

#include <ngspice.h>

Inheritance diagram for NGSPICE:
SPICE_SIMULATOR

Public Member Functions

 NGSPICE ()
 
virtual ~NGSPICE ()
 
void Init () override
 > More...
 
bool LoadNetlist (const std::string &aNetlist) override
 > More...
 
bool Run () override
 > More...
 
bool Stop () override
 > More...
 
bool IsRunning () override
 > More...
 
bool Command (const std::string &aCmd) override
 > More...
 
std::string GetXAxis (SIM_TYPE aType) const override
 > More...
 
std::vector< COMPLEXGetPlot (const std::string &aName, int aMaxLen=-1) override
 > More...
 
std::vector< double > GetRealPlot (const std::string &aName, int aMaxLen=-1) override
 > More...
 
std::vector< double > GetImagPlot (const std::string &aName, int aMaxLen=-1) override
 > More...
 
std::vector< double > GetMagPlot (const std::string &aName, int aMaxLen=-1) override
 > More...
 
std::vector< double > GetPhasePlot (const std::string &aName, int aMaxLen=-1) override
 > More...
 
virtual const std::string GetNetlist () const override
 > More...
 
virtual void SetReporter (SPICE_REPORTER *aReporter)
 

Sets a SPICE_REPORTER object to receive the simulation log.

More...
 

Static Public Member Functions

static std::shared_ptr< SPICE_SIMULATORCreateInstance (const std::string &aName)
 

Creates a simulator instance of particular type (currently only ngspice is handled)

More...
 

Protected Attributes

SPICE_REPORTERm_reporter
 

Reporter object to receive simulation log

More...
 

Private Types

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)
 

Private Member Functions

void init ()
 
void init_dll ()
 
bool loadSpinit (const std::string &aFileName)
 

Executes commands from a file

More...
 
std::string findCmPath () const
 

Checks a few different locations for codemodel files and returns one if it exists

More...
 
bool loadCodemodels (const std::string &aPath)
 

Loads codemodel files from a directory

More...
 
void validate ()
 

Static Private Member Functions

static int cbSendChar (char *what, int id, void *user)
 
static int cbSendStat (char *what, int id, void *user)
 
static int cbBGThreadRunning (bool is_running, int id, void *user)
 
static int cbControlledExit (int status, bool immediate, bool exit_upon_quit, int id, void *user)
 

Private Attributes

ngSpice_Init m_ngSpice_Init
 

Handles to DLL functions

More...
 
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
 
bool m_error
 

Error flag indicating that ngspice needs to be reloaded

More...
 
std::string m_netlist
 

current netlist

More...
 

Static Private Attributes

static bool m_initialized = false
 

NGspice should be initialized only once

More...
 

Detailed Description

Definition at line 35 of file ngspice.h.

Member Typedef Documentation

typedef pvector_info(* NGSPICE::ngGet_Vec_Info) (char *vecname)
private

Definition at line 91 of file ngspice.h.

typedef char**(* NGSPICE::ngSpice_AllPlots) (void)
private

Definition at line 92 of file ngspice.h.

typedef char**(* NGSPICE::ngSpice_AllVecs) (char *plotname)
private

Definition at line 93 of file ngspice.h.

typedef int(* NGSPICE::ngSpice_Circ) (char **circarray)
private

Definition at line 89 of file ngspice.h.

typedef int(* NGSPICE::ngSpice_Command) (char *command)
private

Definition at line 90 of file ngspice.h.

typedef void(* NGSPICE::ngSpice_Init) (SendChar *, SendStat *, ControlledExit *, SendData *, SendInitData *, BGThreadRunning *, void *)
private

Definition at line 87 of file ngspice.h.

typedef bool(* NGSPICE::ngSpice_Running) (void)
private

Definition at line 94 of file ngspice.h.

Constructor & Destructor Documentation

NGSPICE::NGSPICE ( )

Definition at line 42 of file ngspice.cpp.

References init_dll().

42  :
43  m_error( false )
44 {
45  init_dll();
46 }
bool m_error
Error flag indicating that ngspice needs to be reloaded
Definition: ngspice.h:127
void init_dll()
Definition: ngspice.cpp:278
NGSPICE::~NGSPICE ( )
virtual

Definition at line 49 of file ngspice.cpp.

50 {
51 }

Member Function Documentation

int NGSPICE::cbBGThreadRunning ( bool  is_running,
int  id,
void *  user 
)
staticprivate

Definition at line 487 of file ngspice.cpp.

References SPICE_SIMULATOR::m_reporter, SPICE_REPORTER::OnSimStateChange(), SIM_IDLE, and SIM_RUNNING.

Referenced by init_dll().

488 {
489  NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
490 
491  if( sim->m_reporter )
492  // I know the test below seems like an error, but well, it works somehow..
493  sim->m_reporter->OnSimStateChange( sim, is_running ? SIM_IDLE : SIM_RUNNING );
494 
495  return 0;
496 }
SPICE_REPORTER * m_reporter
Reporter object to receive simulation log
virtual void OnSimStateChange(SPICE_SIMULATOR *aObject, SIM_STATE aNewState)=0
int NGSPICE::cbControlledExit ( int  status,
bool  immediate,
bool  exit_upon_quit,
int  id,
void *  user 
)
staticprivate

Definition at line 499 of file ngspice.cpp.

References m_error.

Referenced by init_dll().

500 {
501  // Something went wrong, reload the dll
502  NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
503  sim->m_error = true;
504 
505  return 0;
506 }
bool m_error
Error flag indicating that ngspice needs to be reloaded
Definition: ngspice.h:127
int NGSPICE::cbSendChar ( char *  what,
int  id,
void *  user 
)
staticprivate

Definition at line 459 of file ngspice.cpp.

References SPICE_SIMULATOR::m_reporter, and REPORTER::Report().

Referenced by init_dll().

460 {
461  NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
462 
463  if( sim->m_reporter )
464  {
465  // strip stdout/stderr from the line
466  if( ( strncasecmp( what, "stdout ", 7 ) == 0 )
467  || ( strncasecmp( what, "stderr ", 7 ) == 0 ) )
468  what += 7;
469 
470  sim->m_reporter->Report( what );
471  }
472 
473  return 0;
474 }
SPICE_REPORTER * m_reporter
Reporter object to receive simulation log
virtual REPORTER & Report(const wxString &aText, SEVERITY aSeverity=RPT_UNDEFINED)=0
Function Report is a pure virtual function to override in the derived object.
int NGSPICE::cbSendStat ( char *  what,
int  id,
void *  user 
)
staticprivate

Definition at line 477 of file ngspice.cpp.

Referenced by init_dll().

478 {
479 /* NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
480  if( sim->m_consoleReporter )
481  sim->m_consoleReporter->Report( what );*/
482 
483  return 0;
484 }
bool NGSPICE::Command ( const std::string &  aCmd)
overridevirtual

>

Executes a Spice command as if it was typed into console.

Parameters
aCmdis the command to be issued.

Implements SPICE_SIMULATOR.

Definition at line 244 of file ngspice.cpp.

References m_ngSpice_Command, and validate().

Referenced by Init(), init_dll(), loadCodemodels(), loadSpinit(), Run(), and Stop().

245 {
246  LOCALE_IO c_locale; // ngspice works correctly only with C locale
247  validate();
248  m_ngSpice_Command( (char*) aCmd.c_str() );
249  return true;
250 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:167
void validate()
Definition: ngspice.cpp:509
ngSpice_Command m_ngSpice_Command
Definition: ngspice.h:99
std::shared_ptr< SPICE_SIMULATOR > SPICE_SIMULATOR::CreateInstance ( const std::string &  aName)
staticinherited

Creates a simulator instance of particular type (currently only ngspice is handled)

Definition at line 29 of file spice_simulator.cpp.

References DisplayError().

Referenced by SIM_PLOT_FRAME::SIM_PLOT_FRAME(), and SPICE_SIMULATOR::~SPICE_SIMULATOR().

30 {
31  try
32  {
33  static std::shared_ptr<SPICE_SIMULATOR> ngspiceInstance;
34 
35  if( !ngspiceInstance )
36  ngspiceInstance.reset( new NGSPICE );
37 
38  return ngspiceInstance;
39  }
40  catch( std::exception& e )
41  {
42  DisplayError( NULL, e.what() );
43  }
44 
45  return NULL;
46 }
void DisplayError(wxWindow *parent, const wxString &text, int displaytime)
Function DisplayError displays an error or warning message box with aMessage.
Definition: confirm.cpp:185
string NGSPICE::findCmPath ( ) const
private

Checks a few different locations for codemodel files and returns one if it exists

Definition at line 416 of file ngspice.cpp.

References traceNgspice.

Referenced by init_dll().

417 {
418  const vector<string> cmPaths =
419  {
420 #ifdef __WXMAC__
421  "/Applications/ngspice/lib/ngspice",
422  "Contents/Frameworks",
423  wxStandardPaths::Get().GetPluginsDir() + "/sim/ngspice",
424  wxFileName( wxStandardPaths::Get().GetExecutablePath() ).GetPath() + "/../../../../../Contents/PlugIns/sim/ngspice"
425 #endif /* __WXMAC__ */
426  "../lib/ngspice",
427  "../../lib/ngspice"
428  "lib/ngspice",
429  "ngspice"
430  };
431 
432  for( const auto& path : cmPaths )
433  {
434  wxLogTrace( traceNgspice, "ngspice code models search path: %s", path );
435 
436  if( wxFileName::FileExists( path + "/spice2poly.cm" ) )
437  {
438  wxLogTrace( traceNgspice, "ngspice code models found in: %s", path );
439  return path;
440  }
441  }
442 
443  return string();
444 }
static const wxChar *const traceNgspice
Definition: ngspice.cpp:40
vector< double > NGSPICE::GetImagPlot ( const std::string &  aName,
int  aMaxLen = -1 
)
overridevirtual

>

Returns a requested vector with imaginary values. If the vector is complex, then the imaginary part is returned. If the vector is reql, then only zeroes are returned.

Parameters
aNameis the vector named in Spice convention (e.g. V(3), I(R1)).
aMaxLenis max count of returned values. if -1 (default) all available values are returned.
Returns
Requested vector. It might be empty if there is no vector with requested name.

Implements SPICE_SIMULATOR.

Definition at line 119 of file ngspice.cpp.

References i, m_ngGet_Vec_Info, and min.

120 {
121  LOCALE_IO c_locale; // ngspice works correctly only with C locale
122  vector<double> data;
123  vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
124 
125  if( vi )
126  {
127  int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
128  data.reserve( length );
129 
130  if( vi->v_compdata )
131  {
132  for( int i = 0; i < length; i++ )
133  {
134  data.push_back( vi->v_compdata[i].cx_imag );
135  }
136  }
137  }
138 
139  return data;
140 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:167
ngGet_Vec_Info m_ngGet_Vec_Info
Definition: ngspice.h:100
size_t i
Definition: json11.cpp:597
#define min(a, b)
Definition: auxiliary.h:85
vector< double > NGSPICE::GetMagPlot ( const std::string &  aName,
int  aMaxLen = -1 
)
overridevirtual

>

Returns a requested vector with magnitude values.

Parameters
aNameis the vector named in Spice convention (e.g. V(3), I(R1)).
aMaxLenis max count of returned values. if -1 (default) all available values are returned.
Returns
Requested vector. It might be empty if there is no vector with requested name.

Implements SPICE_SIMULATOR.

Definition at line 143 of file ngspice.cpp.

References i, m_ngGet_Vec_Info, and min.

144 {
145  LOCALE_IO c_locale; // ngspice works correctly only with C locale
146  vector<double> data;
147  vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
148 
149  if( vi )
150  {
151  int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
152  data.reserve( length );
153 
154  if( vi->v_realdata )
155  {
156  for( int i = 0; i < length; i++ )
157  data.push_back( vi->v_realdata[i] );
158  }
159  else if( vi->v_compdata )
160  {
161  for( int i = 0; i < length; i++ )
162  data.push_back( hypot( vi->v_compdata[i].cx_real, vi->v_compdata[i].cx_imag ) );
163  }
164  }
165 
166  return data;
167 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:167
ngGet_Vec_Info m_ngGet_Vec_Info
Definition: ngspice.h:100
size_t i
Definition: json11.cpp:597
#define min(a, b)
Definition: auxiliary.h:85
const std::string NGSPICE::GetNetlist ( ) const
overridevirtual

>

Returns current SPICE netlist used by the simulator.

Returns
The netlist.

Implements SPICE_SIMULATOR.

Definition at line 519 of file ngspice.cpp.

References m_initialized, and m_netlist.

520 {
521  return m_netlist;
522 }
std::string m_netlist
current netlist
Definition: ngspice.h:133
vector< double > NGSPICE::GetPhasePlot ( const std::string &  aName,
int  aMaxLen = -1 
)
overridevirtual

>

Returns a requested vector with phase values.

Parameters
aNameis the vector named in Spice convention (e.g. V(3), I(R1)).
aMaxLenis max count of returned values. if -1 (default) all available values are returned.
Returns
Requested vector. It might be empty if there is no vector with requested name.

Implements SPICE_SIMULATOR.

Definition at line 170 of file ngspice.cpp.

References i, m_ngGet_Vec_Info, and min.

171 {
172  LOCALE_IO c_locale; // ngspice works correctly only with C locale
173  vector<double> data;
174  vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
175 
176  if( vi )
177  {
178  int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
179  data.reserve( length );
180 
181  if( vi->v_realdata )
182  {
183  for( int i = 0; i < length; i++ )
184  data.push_back( 0.0 ); // well, that's life
185  }
186  else if( vi->v_compdata )
187  {
188  for( int i = 0; i < length; i++ )
189  data.push_back( atan2( vi->v_compdata[i].cx_imag, vi->v_compdata[i].cx_real ) );
190  }
191  }
192 
193  return data;
194 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:167
ngGet_Vec_Info m_ngGet_Vec_Info
Definition: ngspice.h:100
size_t i
Definition: json11.cpp:597
#define min(a, b)
Definition: auxiliary.h:85
vector< COMPLEX > NGSPICE::GetPlot ( const std::string &  aName,
int  aMaxLen = -1 
)
overridevirtual

>

Returns a requested vector with complex values. If the vector is real, then the imaginary part is set to 0 in all values.

Parameters
aNameis the vector named in Spice convention (e.g. V(3), I(R1)).
aMaxLenis max count of returned values. if -1 (default) all available values are returned.
Returns
Requested vector. It might be empty if there is no vector with requested name.

Implements SPICE_SIMULATOR.

Definition at line 60 of file ngspice.cpp.

References i, m_ngGet_Vec_Info, and min.

61 {
62  LOCALE_IO c_locale; // ngspice works correctly only with C locale
63  vector<COMPLEX> data;
64  vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
65 
66  if( vi )
67  {
68  int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
69  data.reserve( length );
70 
71  if( vi->v_realdata )
72  {
73  for( int i = 0; i < length; i++ )
74  data.push_back( COMPLEX( vi->v_realdata[i], 0.0 ) );
75  }
76  else if( vi->v_compdata )
77  {
78  for( int i = 0; i < length; i++ )
79  data.push_back( COMPLEX( vi->v_compdata[i].cx_real, vi->v_compdata[i].cx_imag ) );
80  }
81  }
82 
83  return data;
84 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:167
std::complex< double > COMPLEX
ngGet_Vec_Info m_ngGet_Vec_Info
Definition: ngspice.h:100
size_t i
Definition: json11.cpp:597
#define min(a, b)
Definition: auxiliary.h:85
vector< double > NGSPICE::GetRealPlot ( const std::string &  aName,
int  aMaxLen = -1 
)
overridevirtual

>

Returns a requested vector with real values. If the vector is complex, then the real part is returned.

Parameters
aNameis the vector named in Spice convention (e.g. V(3), I(R1)).
aMaxLenis max count of returned values. if -1 (default) all available values are returned.
Returns
Requested vector. It might be empty if there is no vector with requested name.

Implements SPICE_SIMULATOR.

Definition at line 87 of file ngspice.cpp.

References i, m_ngGet_Vec_Info, and min.

88 {
89  LOCALE_IO c_locale; // ngspice works correctly only with C locale
90  vector<double> data;
91  vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
92 
93  if( vi )
94  {
95  int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
96  data.reserve( length );
97 
98  if( vi->v_realdata )
99  {
100  for( int i = 0; i < length; i++ )
101  {
102  data.push_back( vi->v_realdata[i] );
103  }
104  }
105  else if( vi->v_compdata )
106  {
107  for( int i = 0; i < length; i++ )
108  {
109  assert( vi->v_compdata[i].cx_imag == 0.0 );
110  data.push_back( vi->v_compdata[i].cx_real );
111  }
112  }
113  }
114 
115  return data;
116 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:167
ngGet_Vec_Info m_ngGet_Vec_Info
Definition: ngspice.h:100
size_t i
Definition: json11.cpp:597
#define min(a, b)
Definition: auxiliary.h:85
string NGSPICE::GetXAxis ( SIM_TYPE  aType) const
overridevirtual

>

Returns X axis name for a given simulation type

Implements SPICE_SIMULATOR.

Definition at line 253 of file ngspice.cpp.

References ST_AC, ST_DC, ST_NOISE, and ST_TRANSIENT.

254 {
255  switch( aType )
256  {
257  case ST_AC:
258  case ST_NOISE:
259  return string( "frequency" );
260  break;
261 
262  case ST_DC:
263  return string( "v-sweep" );
264  break;
265 
266  case ST_TRANSIENT:
267  return string( "time" );
268  break;
269 
270  default:
271  break;
272  }
273 
274  return string( "" );
275 }
void NGSPICE::Init ( )
overridevirtual

>

Intializes the simulator

Implements SPICE_SIMULATOR.

Definition at line 54 of file ngspice.cpp.

References Command().

55 {
56  Command( "reset" );
57 }
bool Command(const std::string &aCmd) override
>
Definition: ngspice.cpp:244
void NGSPICE::init ( )
private
void NGSPICE::init_dll ( )
private

Definition at line 278 of file ngspice.cpp.

References cbBGThreadRunning(), cbControlledExit(), cbSendChar(), cbSendStat(), Command(), findCmPath(), loadCodemodels(), loadSpinit(), m_dll, m_error, m_initialized, m_ngGet_Vec_Info, m_ngSpice_AllPlots, m_ngSpice_AllVecs, m_ngSpice_Circ, m_ngSpice_Command, m_ngSpice_Init, m_ngSpice_Running, and traceNgspice.

Referenced by NGSPICE(), and validate().

279 {
280  if( m_initialized )
281  return;
282 
283  LOCALE_IO c_locale; // ngspice works correctly only with C locale
284  const wxStandardPaths& stdPaths = wxStandardPaths::Get();
285 
286  if( m_dll.IsLoaded() ) // enable force reload
287  m_dll.Unload();
288 
289 // Extra effort to find libngspice
290 #if defined(__WINDOWS__) || (__WXMAC__)
291 #ifdef __WINDOWS__
292  wxFileName dllFile( "", "libngspice-0.dll" );
293  const vector<string> dllPaths = { "", "/mingw64/bin", "/mingw32/bin" };
294 #endif /* __WINDOWS__ */
295 #ifdef __WXMAC__
296  wxFileName dllFile( "", "libngspice.0.dylib" );
297  const vector<string> dllPaths = {
298  GetOSXKicadUserDataDir() + "/PlugIns/ngspice",
299  GetOSXKicadMachineDataDir() + "/PlugIns/ngspice",
300  // when running kicad.app
301  stdPaths.GetPluginsDir() + "/sim",
302  // when running eeschema.app
303  wxFileName( stdPaths.GetExecutablePath() ).GetPath() + "/../../../../../Contents/PlugIns/sim"
304  };
305 #endif /* __WXMAC__ */
306 
307  for( const auto& path : dllPaths )
308  {
309  dllFile.SetPath( path );
310  wxLogTrace( traceNgspice, "libngspice search path: %s", dllFile.GetFullPath() );
311  m_dll.Load( dllFile.GetFullPath(), wxDL_VERBATIM | wxDL_QUIET | wxDL_NOW );
312 
313  if( m_dll.IsLoaded() )
314  {
315  wxLogTrace( traceNgspice, "libngspice path found in: %s", dllFile.GetFullPath() );
316  break;
317  }
318  }
319 
320  if( !m_dll.IsLoaded() ) // try also the system libraries
321 #endif /* __WINDOWS || __WXMAC__ */
322  m_dll.Load( wxDynamicLibrary::CanonicalizeName( "ngspice" ) );
323 
324  if( !m_dll.IsLoaded() )
325  throw std::runtime_error( "Missing ngspice shared library" );
326 
327  m_error = false;
328 
329  // Obtain function pointers
330  m_ngSpice_Init = (ngSpice_Init) m_dll.GetSymbol( "ngSpice_Init" );
331  m_ngSpice_Circ = (ngSpice_Circ) m_dll.GetSymbol( "ngSpice_Circ" );
332  m_ngSpice_Command = (ngSpice_Command) m_dll.GetSymbol( "ngSpice_Command" );
333  m_ngGet_Vec_Info = (ngGet_Vec_Info) m_dll.GetSymbol( "ngGet_Vec_Info" );
334  m_ngSpice_AllPlots = (ngSpice_AllPlots) m_dll.GetSymbol( "ngSpice_AllPlots" );
335  m_ngSpice_AllVecs = (ngSpice_AllVecs) m_dll.GetSymbol( "ngSpice_AllVecs" );
336  m_ngSpice_Running = (ngSpice_Running) m_dll.GetSymbol( "ngSpice_running" ); // it is not a typo
337 
339 
340  // Load a custom spinit file, to fix the problem with loading .cm files
341  // Switch to the executable directory, so the relative paths are correct
342  wxString cwd( wxGetCwd() );
343  wxFileName exeDir( stdPaths.GetExecutablePath() );
344  wxSetWorkingDirectory( exeDir.GetPath() );
345 
346  // Find *.cm files
347  string cmPath = findCmPath();
348 
349  // __CMPATH is used in custom spinit file to point to the codemodels directory
350  if( !cmPath.empty() )
351  Command( "set __CMPATH=\"" + cmPath + "\"" );
352 
353  // Possible relative locations for spinit file
354  const vector<string> spiceinitPaths =
355  {
356  ".",
357 #ifdef __WXMAC__
358  stdPaths.GetPluginsDir() + "/sim/ngspice/scripts",
359  wxFileName( stdPaths.GetExecutablePath() ).GetPath() + "/../../../../../Contents/PlugIns/sim/ngspice/scripts"
360 #endif /* __WXMAC__ */
361  "../share/kicad",
362  "../share",
363  "../../share/kicad",
364  "../../share"
365  };
366 
367  bool foundSpiceinit = false;
368 
369  for( const auto& path : spiceinitPaths )
370  {
371  wxLogTrace( traceNgspice, "ngspice init script search path: %s", path );
372 
373  if( loadSpinit( path + "/spiceinit" ) )
374  {
375  wxLogTrace( traceNgspice, "ngspice path found in: %s", path );
376  foundSpiceinit = true;
377  break;
378  }
379  }
380 
381  // Last chance to load codemodel files, we have not found
382  // spiceinit file, but we know the path to *.cm files
383  if( !foundSpiceinit && !cmPath.empty() )
384  loadCodemodels( cmPath );
385 
386  // Restore the working directory
387  wxSetWorkingDirectory( cwd );
388 
389  // Workarounds to avoid hang ups on certain errors
390  // These commands have to be called, no matter what is in the spinit file
391  Command( "unset interactive" );
392  Command( "set noaskquit" );
393  Command( "set nomoremode" );
394 
395  m_initialized = true;
396 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:167
static int cbBGThreadRunning(bool is_running, int id, void *user)
Definition: ngspice.cpp:487
int(* ngSpice_Command)(char *command)
Definition: ngspice.h:90
char **(* ngSpice_AllPlots)(void)
Definition: ngspice.h:92
static int cbControlledExit(int status, bool immediate, bool exit_upon_quit, int id, void *user)
Definition: ngspice.cpp:499
static int cbSendChar(char *what, int id, void *user)
Definition: ngspice.cpp:459
wxDynamicLibrary m_dll
Definition: ngspice.h:105
bool loadCodemodels(const std::string &aPath)
Loads codemodel files from a directory
Definition: ngspice.cpp:447
ngSpice_Running m_ngSpice_Running
Definition: ngspice.h:103
static bool m_initialized
NGspice should be initialized only once
Definition: ngspice.h:130
bool(* ngSpice_Running)(void)
Definition: ngspice.h:94
ngGet_Vec_Info m_ngGet_Vec_Info
Definition: ngspice.h:100
bool m_error
Error flag indicating that ngspice needs to be reloaded
Definition: ngspice.h:127
static const wxChar *const traceNgspice
Definition: ngspice.cpp:40
pvector_info(* ngGet_Vec_Info)(char *vecname)
Definition: ngspice.h:91
ngSpice_Init m_ngSpice_Init
Handles to DLL functions
Definition: ngspice.h:97
std::string findCmPath() const
Checks a few different locations for codemodel files and returns one if it exists ...
Definition: ngspice.cpp:416
void(* ngSpice_Init)(SendChar *, SendStat *, ControlledExit *, SendData *, SendInitData *, BGThreadRunning *, void *)
Definition: ngspice.h:87
char **(* ngSpice_AllVecs)(char *plotname)
Definition: ngspice.h:93
bool Command(const std::string &aCmd) override
>
Definition: ngspice.cpp:244
ngSpice_AllVecs m_ngSpice_AllVecs
Definition: ngspice.h:102
ngSpice_Command m_ngSpice_Command
Definition: ngspice.h:99
bool loadSpinit(const std::string &aFileName)
Executes commands from a file
Definition: ngspice.cpp:399
int(* ngSpice_Circ)(char **circarray)
Definition: ngspice.h:89
ngSpice_Circ m_ngSpice_Circ
Definition: ngspice.h:98
ngSpice_AllPlots m_ngSpice_AllPlots
Definition: ngspice.h:101
static int cbSendStat(char *what, int id, void *user)
Definition: ngspice.cpp:477
bool NGSPICE::IsRunning ( )
overridevirtual

>

Checks if simulation is running at the moment.

Returns
True if simulation is currently executed.

Implements SPICE_SIMULATOR.

Definition at line 237 of file ngspice.cpp.

References m_ngSpice_Running.

238 {
239  LOCALE_IO c_locale; // ngspice works correctly only with C locale
240  return m_ngSpice_Running();
241 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:167
ngSpice_Running m_ngSpice_Running
Definition: ngspice.h:103
bool NGSPICE::loadCodemodels ( const std::string &  aPath)
private

Loads codemodel files from a directory

Definition at line 447 of file ngspice.cpp.

References Command().

Referenced by init_dll().

448 {
449  wxArrayString cmFiles;
450  size_t count = wxDir::GetAllFiles( aPath, &cmFiles );
451 
452  for( const auto& cm : cmFiles )
453  Command( "codemodel " + cm.ToStdString() );
454 
455  return count != 0;
456 }
bool Command(const std::string &aCmd) override
>
Definition: ngspice.cpp:244
bool NGSPICE::LoadNetlist ( const std::string &  aNetlist)
overridevirtual

>

Implements SPICE_SIMULATOR.

Definition at line 197 of file ngspice.cpp.

References m_netlist, and m_ngSpice_Circ.

198 {
199  LOCALE_IO c_locale; // ngspice works correctly only with C locale
200  vector<char*> lines;
201  stringstream ss( aNetlist );
202 
203  m_netlist = "";
204 
205  while( !ss.eof() )
206  {
207  char line[1024];
208  ss.getline( line, sizeof( line ) );
209  lines.push_back( strdup( line ) );
210  m_netlist += std::string( line ) + std::string( "\n" );
211  }
212 
213  lines.push_back( nullptr ); // sentinel, as requested in ngSpice_Circ description
214  m_ngSpice_Circ( lines.data() );
215 
216  for( auto line : lines )
217  free( line );
218 
219  return true;
220 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:167
std::string m_netlist
current netlist
Definition: ngspice.h:133
ngSpice_Circ m_ngSpice_Circ
Definition: ngspice.h:98
bool NGSPICE::loadSpinit ( const std::string &  aFileName)
private

Executes commands from a file

Definition at line 399 of file ngspice.cpp.

References Command().

Referenced by init_dll().

400 {
401  if( !wxFileName::FileExists( aFileName ) )
402  return false;
403 
404  wxTextFile file;
405 
406  if( !file.Open( aFileName ) )
407  return false;
408 
409  for( auto cmd = file.GetFirstLine(); !file.Eof(); cmd = file.GetNextLine() )
410  Command( cmd.ToStdString() );
411 
412  return true;
413 }
bool Command(const std::string &aCmd) override
>
Definition: ngspice.cpp:244
bool NGSPICE::Run ( )
overridevirtual

>

Executes the simulation with currently loaded netlist.

Returns
True in case of success, false otherwise.

Implements SPICE_SIMULATOR.

Definition at line 223 of file ngspice.cpp.

References Command().

224 {
225  LOCALE_IO c_locale; // ngspice works correctly only with C locale
226  return Command( "bg_run" ); // bg_* commands execute in a separate thread
227 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:167
bool Command(const std::string &aCmd) override
>
Definition: ngspice.cpp:244
virtual void SPICE_SIMULATOR::SetReporter ( SPICE_REPORTER aReporter)
inlinevirtualinherited

Sets a SPICE_REPORTER object to receive the simulation log.

Definition at line 86 of file spice_simulator.h.

References SPICE_SIMULATOR::GetImagPlot(), SPICE_SIMULATOR::GetMagPlot(), SPICE_SIMULATOR::GetNetlist(), SPICE_SIMULATOR::GetPhasePlot(), SPICE_SIMULATOR::GetPlot(), SPICE_SIMULATOR::GetRealPlot(), and SPICE_SIMULATOR::m_reporter.

87  {
88  m_reporter = aReporter;
89  }
SPICE_REPORTER * m_reporter
Reporter object to receive simulation log
bool NGSPICE::Stop ( )
overridevirtual

>

Halts the simulation.

Returns
True in case of success, false otherwise.

Implements SPICE_SIMULATOR.

Definition at line 230 of file ngspice.cpp.

References Command().

231 {
232  LOCALE_IO c_locale; // ngspice works correctly only with C locale
233  return Command( "bg_halt" ); // bg_* commands execute in a separate thread
234 }
Instantiate the current locale within a scope in which you are expecting exceptions to be thrown...
Definition: common.h:167
bool Command(const std::string &aCmd) override
>
Definition: ngspice.cpp:244
void NGSPICE::validate ( )
private

Definition at line 509 of file ngspice.cpp.

References init_dll(), m_error, and m_initialized.

Referenced by Command().

510 {
511  if( m_error )
512  {
513  m_initialized = false;
514  init_dll();
515  }
516 }
static bool m_initialized
NGspice should be initialized only once
Definition: ngspice.h:130
bool m_error
Error flag indicating that ngspice needs to be reloaded
Definition: ngspice.h:127
void init_dll()
Definition: ngspice.cpp:278

Member Data Documentation

wxDynamicLibrary NGSPICE::m_dll
private

Definition at line 105 of file ngspice.h.

Referenced by init_dll().

bool NGSPICE::m_error
private

Error flag indicating that ngspice needs to be reloaded

Definition at line 127 of file ngspice.h.

Referenced by cbControlledExit(), init_dll(), and validate().

bool NGSPICE::m_initialized = false
staticprivate

NGspice should be initialized only once

Definition at line 130 of file ngspice.h.

Referenced by GetNetlist(), init_dll(), and validate().

std::string NGSPICE::m_netlist
private

current netlist

Definition at line 133 of file ngspice.h.

Referenced by GetNetlist(), and LoadNetlist().

ngGet_Vec_Info NGSPICE::m_ngGet_Vec_Info
private

Definition at line 100 of file ngspice.h.

Referenced by GetImagPlot(), GetMagPlot(), GetPhasePlot(), GetPlot(), GetRealPlot(), and init_dll().

ngSpice_AllPlots NGSPICE::m_ngSpice_AllPlots
private

Definition at line 101 of file ngspice.h.

Referenced by init_dll().

ngSpice_AllVecs NGSPICE::m_ngSpice_AllVecs
private

Definition at line 102 of file ngspice.h.

Referenced by init_dll().

ngSpice_Circ NGSPICE::m_ngSpice_Circ
private

Definition at line 98 of file ngspice.h.

Referenced by init_dll(), and LoadNetlist().

ngSpice_Command NGSPICE::m_ngSpice_Command
private

Definition at line 99 of file ngspice.h.

Referenced by Command(), and init_dll().

ngSpice_Init NGSPICE::m_ngSpice_Init
private

Handles to DLL functions

Definition at line 97 of file ngspice.h.

Referenced by init_dll().

ngSpice_Running NGSPICE::m_ngSpice_Running
private

Definition at line 103 of file ngspice.h.

Referenced by init_dll(), and IsRunning().

SPICE_REPORTER* SPICE_SIMULATOR::m_reporter
protectedinherited

Reporter object to receive simulation log

Definition at line 147 of file spice_simulator.h.

Referenced by cbBGThreadRunning(), cbSendChar(), and SPICE_SIMULATOR::SetReporter().


The documentation for this class was generated from the following files: