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 40 of file ngspice.cpp.

41 {
42  init_dll();
43 }
void init_dll()
Definition: ngspice.cpp:275
NGSPICE::~NGSPICE ( )
virtual

Definition at line 46 of file ngspice.cpp.

47 {
48 }

Member Function Documentation

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

Definition at line 484 of file ngspice.cpp.

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

485 {
486  NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
487 
488  if( sim->m_reporter )
489  // I know the test below seems like an error, but well, it works somehow..
490  sim->m_reporter->OnSimStateChange( sim, is_running ? SIM_IDLE : SIM_RUNNING );
491 
492  return 0;
493 }
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 496 of file ngspice.cpp.

References m_error.

497 {
498  // Something went wrong, reload the dll
499  NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
500  sim->m_error = true;
501 
502  return 0;
503 }
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 456 of file ngspice.cpp.

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

457 {
458  NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
459 
460  if( sim->m_reporter )
461  {
462  // strip stdout/stderr from the line
463  if( ( strncasecmp( what, "stdout ", 7 ) == 0 )
464  || ( strncasecmp( what, "stderr ", 7 ) == 0 ) )
465  what += 7;
466 
467  sim->m_reporter->Report( what );
468  }
469 
470  return 0;
471 }
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 474 of file ngspice.cpp.

475 {
476 /* NGSPICE* sim = reinterpret_cast<NGSPICE*>( user );
477  if( sim->m_consoleReporter )
478  sim->m_consoleReporter->Report( what );*/
479 
480  return 0;
481 }
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 241 of file ngspice.cpp.

242 {
243  LOCALE_IO c_locale; // ngspice works correctly only with C locale
244  validate();
245  m_ngSpice_Command( (char*) aCmd.c_str() );
246  return true;
247 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
void validate()
Definition: ngspice.cpp:506
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 413 of file ngspice.cpp.

References traceNgspice.

414 {
415  const vector<string> cmPaths =
416  {
417 #ifdef __WXMAC__
418  "/Applications/ngspice/lib/ngspice",
419  "Contents/Frameworks",
420  wxStandardPaths::Get().GetPluginsDir() + "/sim/ngspice",
421  wxFileName( wxStandardPaths::Get().GetExecutablePath() ).GetPath() + "/../../../../../Contents/PlugIns/sim/ngspice"
422 #endif /* __WXMAC__ */
423  "../lib/ngspice",
424  "../../lib/ngspice"
425  "lib/ngspice",
426  "ngspice"
427  };
428 
429  for( const auto& path : cmPaths )
430  {
431  wxLogTrace( traceNgspice, "ngspice code models search path: %s", path );
432 
433  if( wxFileName::FileExists( path + "/spice2poly.cm" ) )
434  {
435  wxLogTrace( traceNgspice, "ngspice code models found in: %s", path );
436  return path;
437  }
438  }
439 
440  return string();
441 }
static const wxChar *const traceNgspice
Definition: ngspice.cpp:38
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 116 of file ngspice.cpp.

References i, and min.

117 {
118  LOCALE_IO c_locale; // ngspice works correctly only with C locale
119  vector<double> data;
120  vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
121 
122  if( vi )
123  {
124  int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
125  data.reserve( length );
126 
127  if( vi->v_compdata )
128  {
129  for( int i = 0; i < length; i++ )
130  {
131  data.push_back( vi->v_compdata[i].cx_imag );
132  }
133  }
134  }
135 
136  return data;
137 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
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 140 of file ngspice.cpp.

References i, and min.

141 {
142  LOCALE_IO c_locale; // ngspice works correctly only with C locale
143  vector<double> data;
144  vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
145 
146  if( vi )
147  {
148  int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
149  data.reserve( length );
150 
151  if( vi->v_realdata )
152  {
153  for( int i = 0; i < length; i++ )
154  data.push_back( vi->v_realdata[i] );
155  }
156  else if( vi->v_compdata )
157  {
158  for( int i = 0; i < length; i++ )
159  data.push_back( hypot( vi->v_compdata[i].cx_real, vi->v_compdata[i].cx_imag ) );
160  }
161  }
162 
163  return data;
164 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
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 516 of file ngspice.cpp.

References m_initialized.

517 {
518  return m_netlist;
519 }
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 167 of file ngspice.cpp.

References i, and min.

168 {
169  LOCALE_IO c_locale; // ngspice works correctly only with C locale
170  vector<double> data;
171  vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
172 
173  if( vi )
174  {
175  int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
176  data.reserve( length );
177 
178  if( vi->v_realdata )
179  {
180  for( int i = 0; i < length; i++ )
181  data.push_back( 0.0 ); // well, that's life
182  }
183  else if( vi->v_compdata )
184  {
185  for( int i = 0; i < length; i++ )
186  data.push_back( atan2( vi->v_compdata[i].cx_imag, vi->v_compdata[i].cx_real ) );
187  }
188  }
189 
190  return data;
191 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
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 57 of file ngspice.cpp.

References i, and min.

58 {
59  LOCALE_IO c_locale; // ngspice works correctly only with C locale
60  vector<COMPLEX> data;
61  vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
62 
63  if( vi )
64  {
65  int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
66  data.reserve( length );
67 
68  if( vi->v_realdata )
69  {
70  for( int i = 0; i < length; i++ )
71  data.push_back( COMPLEX( vi->v_realdata[i], 0.0 ) );
72  }
73  else if( vi->v_compdata )
74  {
75  for( int i = 0; i < length; i++ )
76  data.push_back( COMPLEX( vi->v_compdata[i].cx_real, vi->v_compdata[i].cx_imag ) );
77  }
78  }
79 
80  return data;
81 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
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 84 of file ngspice.cpp.

References i, and min.

85 {
86  LOCALE_IO c_locale; // ngspice works correctly only with C locale
87  vector<double> data;
88  vector_info* vi = m_ngGet_Vec_Info( (char*) aName.c_str() );
89 
90  if( vi )
91  {
92  int length = aMaxLen < 0 ? vi->v_length : std::min( aMaxLen, vi->v_length );
93  data.reserve( length );
94 
95  if( vi->v_realdata )
96  {
97  for( int i = 0; i < length; i++ )
98  {
99  data.push_back( vi->v_realdata[i] );
100  }
101  }
102  else if( vi->v_compdata )
103  {
104  for( int i = 0; i < length; i++ )
105  {
106  assert( vi->v_compdata[i].cx_imag == 0.0 );
107  data.push_back( vi->v_compdata[i].cx_real );
108  }
109  }
110  }
111 
112  return data;
113 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
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 250 of file ngspice.cpp.

References ST_AC, ST_DC, ST_NOISE, and ST_TRANSIENT.

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

>

Intializes the simulator

Implements SPICE_SIMULATOR.

Definition at line 51 of file ngspice.cpp.

52 {
53  Command( "reset" );
54 }
bool Command(const std::string &aCmd) override
>
Definition: ngspice.cpp:241
void NGSPICE::init ( )
private
void NGSPICE::init_dll ( )
private

Definition at line 275 of file ngspice.cpp.

References traceNgspice.

276 {
277  if( m_initialized )
278  return;
279 
280  LOCALE_IO c_locale; // ngspice works correctly only with C locale
281  const wxStandardPaths& stdPaths = wxStandardPaths::Get();
282 
283  if( m_dll.IsLoaded() ) // enable force reload
284  m_dll.Unload();
285 
286 // Extra effort to find libngspice
287 #if defined(__WINDOWS__) || (__WXMAC__)
288 #ifdef __WINDOWS__
289  wxFileName dllFile( "", "libngspice-0.dll" );
290  const vector<string> dllPaths = { "", "/mingw64/bin", "/mingw32/bin" };
291 #endif /* __WINDOWS__ */
292 #ifdef __WXMAC__
293  wxFileName dllFile( "", "libngspice.0.dylib" );
294  const vector<string> dllPaths = {
295  GetOSXKicadUserDataDir() + "/PlugIns/ngspice",
296  GetOSXKicadMachineDataDir() + "/PlugIns/ngspice",
297  // when running kicad.app
298  stdPaths.GetPluginsDir() + "/sim",
299  // when running eeschema.app
300  wxFileName( stdPaths.GetExecutablePath() ).GetPath() + "/../../../../../Contents/PlugIns/sim"
301  };
302 #endif /* __WXMAC__ */
303 
304  for( const auto& path : dllPaths )
305  {
306  dllFile.SetPath( path );
307  wxLogTrace( traceNgspice, "libngspice search path: %s", dllFile.GetFullPath() );
308  m_dll.Load( dllFile.GetFullPath(), wxDL_VERBATIM | wxDL_QUIET | wxDL_NOW );
309 
310  if( m_dll.IsLoaded() )
311  {
312  wxLogTrace( traceNgspice, "libngspice path found in: %s", dllFile.GetFullPath() );
313  break;
314  }
315  }
316 
317  if( !m_dll.IsLoaded() ) // try also the system libraries
318 #endif /* __WINDOWS || __WXMAC__ */
319  m_dll.Load( wxDynamicLibrary::CanonicalizeName( "ngspice" ) );
320 
321  if( !m_dll.IsLoaded() )
322  throw std::runtime_error( "Missing ngspice shared library" );
323 
324  m_error = false;
325 
326  // Obtain function pointers
327  m_ngSpice_Init = (ngSpice_Init) m_dll.GetSymbol( "ngSpice_Init" );
328  m_ngSpice_Circ = (ngSpice_Circ) m_dll.GetSymbol( "ngSpice_Circ" );
329  m_ngSpice_Command = (ngSpice_Command) m_dll.GetSymbol( "ngSpice_Command" );
330  m_ngGet_Vec_Info = (ngGet_Vec_Info) m_dll.GetSymbol( "ngGet_Vec_Info" );
331  m_ngSpice_AllPlots = (ngSpice_AllPlots) m_dll.GetSymbol( "ngSpice_AllPlots" );
332  m_ngSpice_AllVecs = (ngSpice_AllVecs) m_dll.GetSymbol( "ngSpice_AllVecs" );
333  m_ngSpice_Running = (ngSpice_Running) m_dll.GetSymbol( "ngSpice_running" ); // it is not a typo
334 
336 
337  // Load a custom spinit file, to fix the problem with loading .cm files
338  // Switch to the executable directory, so the relative paths are correct
339  wxString cwd( wxGetCwd() );
340  wxFileName exeDir( stdPaths.GetExecutablePath() );
341  wxSetWorkingDirectory( exeDir.GetPath() );
342 
343  // Find *.cm files
344  string cmPath = findCmPath();
345 
346  // __CMPATH is used in custom spinit file to point to the codemodels directory
347  if( !cmPath.empty() )
348  Command( "set __CMPATH=\"" + cmPath + "\"" );
349 
350  // Possible relative locations for spinit file
351  const vector<string> spiceinitPaths =
352  {
353  ".",
354 #ifdef __WXMAC__
355  stdPaths.GetPluginsDir() + "/sim/ngspice/scripts",
356  wxFileName( stdPaths.GetExecutablePath() ).GetPath() + "/../../../../../Contents/PlugIns/sim/ngspice/scripts"
357 #endif /* __WXMAC__ */
358  "../share/kicad",
359  "../share",
360  "../../share/kicad",
361  "../../share"
362  };
363 
364  bool foundSpiceinit = false;
365 
366  for( const auto& path : spiceinitPaths )
367  {
368  wxLogTrace( traceNgspice, "ngspice init script search path: %s", path );
369 
370  if( loadSpinit( path + "/spiceinit" ) )
371  {
372  wxLogTrace( traceNgspice, "ngspice path found in: %s", path );
373  foundSpiceinit = true;
374  break;
375  }
376  }
377 
378  // Last chance to load codemodel files, we have not found
379  // spiceinit file, but we know the path to *.cm files
380  if( !foundSpiceinit && !cmPath.empty() )
381  loadCodemodels( cmPath );
382 
383  // Restore the working directory
384  wxSetWorkingDirectory( cwd );
385 
386  // Workarounds to avoid hang ups on certain errors
387  // These commands have to be called, no matter what is in the spinit file
388  Command( "unset interactive" );
389  Command( "set noaskquit" );
390  Command( "set nomoremode" );
391 
392  m_initialized = true;
393 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
static int cbBGThreadRunning(bool is_running, int id, void *user)
Definition: ngspice.cpp:484
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:496
static int cbSendChar(char *what, int id, void *user)
Definition: ngspice.cpp:456
wxDynamicLibrary m_dll
Definition: ngspice.h:105
bool loadCodemodels(const std::string &aPath)
Loads codemodel files from a directory
Definition: ngspice.cpp:444
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:38
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:413
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:241
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:396
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:474
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 234 of file ngspice.cpp.

235 {
236  LOCALE_IO c_locale; // ngspice works correctly only with C locale
237  return m_ngSpice_Running();
238 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
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 444 of file ngspice.cpp.

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

>

Implements SPICE_SIMULATOR.

Definition at line 194 of file ngspice.cpp.

195 {
196  LOCALE_IO c_locale; // ngspice works correctly only with C locale
197  vector<char*> lines;
198  stringstream ss( aNetlist );
199 
200  m_netlist = "";
201 
202  while( !ss.eof() )
203  {
204  char line[1024];
205  ss.getline( line, sizeof( line ) );
206  lines.push_back( strdup( line ) );
207  m_netlist += std::string( line ) + std::string( "\n" );
208  }
209 
210  lines.push_back( nullptr ); // sentinel, as requested in ngSpice_Circ description
211  m_ngSpice_Circ( lines.data() );
212 
213  for( auto line : lines )
214  free( line );
215 
216  return true;
217 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
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 396 of file ngspice.cpp.

397 {
398  if( !wxFileName::FileExists( aFileName ) )
399  return false;
400 
401  wxTextFile file;
402 
403  if( !file.Open( aFileName ) )
404  return false;
405 
406  for( auto cmd = file.GetFirstLine(); !file.Eof(); cmd = file.GetNextLine() )
407  Command( cmd.ToStdString() );
408 
409  return true;
410 }
bool Command(const std::string &aCmd) override
>
Definition: ngspice.cpp:241
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 220 of file ngspice.cpp.

221 {
222  LOCALE_IO c_locale; // ngspice works correctly only with C locale
223  return Command( "bg_run" ); // bg_* commands execute in a separate thread
224 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
bool Command(const std::string &aCmd) override
>
Definition: ngspice.cpp:241
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 227 of file ngspice.cpp.

228 {
229  LOCALE_IO c_locale; // ngspice works correctly only with C locale
230  return Command( "bg_halt" ); // bg_* commands execute in a separate thread
231 }
Class LOCALE_IO is a class that can be instantiated within a scope in which you are expecting excepti...
Definition: common.h:166
bool Command(const std::string &aCmd) override
>
Definition: ngspice.cpp:241
void NGSPICE::validate ( )
private

Definition at line 506 of file ngspice.cpp.

507 {
508  if( m_error )
509  {
510  m_initialized = false;
511  init_dll();
512  }
513 }
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:275

Member Data Documentation

wxDynamicLibrary NGSPICE::m_dll
private

Definition at line 105 of file ngspice.h.

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().

bool NGSPICE::m_initialized = false
staticprivate

NGspice should be initialized only once

Definition at line 130 of file ngspice.h.

Referenced by GetNetlist().

std::string NGSPICE::m_netlist
private

current netlist

Definition at line 133 of file ngspice.h.

ngGet_Vec_Info NGSPICE::m_ngGet_Vec_Info
private

Definition at line 100 of file ngspice.h.

ngSpice_AllPlots NGSPICE::m_ngSpice_AllPlots
private

Definition at line 101 of file ngspice.h.

ngSpice_AllVecs NGSPICE::m_ngSpice_AllVecs
private

Definition at line 102 of file ngspice.h.

ngSpice_Circ NGSPICE::m_ngSpice_Circ
private

Definition at line 98 of file ngspice.h.

ngSpice_Command NGSPICE::m_ngSpice_Command
private

Definition at line 99 of file ngspice.h.

ngSpice_Init NGSPICE::m_ngSpice_Init
private

Handles to DLL functions

Definition at line 97 of file ngspice.h.

ngSpice_Running NGSPICE::m_ngSpice_Running
private

Definition at line 103 of file ngspice.h.

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: