committed by
rlar
2 changed files with 1750 additions and 0 deletions
@ -0,0 +1,268 @@ |
|||||
|
/* header file for shared ngspice */ |
||||
|
/* Copyright 2013 Holger Vogt */ |
||||
|
/* Modified BSD license */ |
||||
|
|
||||
|
/* |
||||
|
Interface between a calling program (caller) and ngspice.dll (ngspice.so) |
||||
|
|
||||
|
** |
||||
|
ngSpice_Init(SendChar*, SendStat*, ControlledExit*, |
||||
|
SendData*, SendInitData*, BGThreadRunning*, void*) |
||||
|
After caller has loaded ngspice.dll, the simulator has to be initialized |
||||
|
by calling ngSpice_Init(). Address pointers of several callback functions |
||||
|
defined in the caller are sent to ngspice.dll. |
||||
|
|
||||
|
Callback funtion typedefs |
||||
|
SendChar typedef of callback function for reading printf, fprintf, fputs |
||||
|
SendStat typedef of callback function for reading status string and precent value |
||||
|
ControlledExit typedef of callback function for tranferring a signal upon |
||||
|
ngspice controlled_exit to caller. May be used by caller |
||||
|
to detach ngspice.dll. |
||||
|
SendData typedef of callback function for sending an array of structs containing |
||||
|
data values of all vectors in the current plot (simulation output) |
||||
|
SendInitData typedef of callback function for sending an array of structs containing info on |
||||
|
all vectors in the current plot (immediately before simulation starts) |
||||
|
BGThreadRunning typedef of callback function for sending a boolean signal (true if thread |
||||
|
is running) |
||||
|
|
||||
|
The void pointer may contain the object address of the calling |
||||
|
function ('self' or 'this' pointer), so that the answer may be directed |
||||
|
to a calling object. Callback functions are defined in the global section. |
||||
|
|
||||
|
** |
||||
|
ngSpice_Command(char*) |
||||
|
Send a valid command (see the control or interactive commands) from caller |
||||
|
to ngspice.dll. Will be executed immediately (as if in interactive mode). |
||||
|
Some commands are rejected (e.g. 'plot', because there is no graphics interface). |
||||
|
Command 'quit' will remove internal data, and then send a notice to caller via |
||||
|
ngexit(). |
||||
|
|
||||
|
** |
||||
|
ngGet_Vec_Info(char*) |
||||
|
receives the name of a vector (may be in the form 'vectorname' or |
||||
|
<plotname>.vectorname) and returns a pointer to a vector_info struct. |
||||
|
The caller may then directly assess the vector data (but probably should |
||||
|
not modify them). |
||||
|
|
||||
|
** |
||||
|
ngSpice_Circ(char**) |
||||
|
sends an array of null-terminated char* to ngspice.dll. Each char* contains a |
||||
|
single line of a circuit (each line like in an input file **.sp). The last |
||||
|
entry to char** has to be NULL. Upon receiving the arry, ngspice.dll will |
||||
|
immediately parse the input and set up the circuit structure (as if received |
||||
|
the circuit from a file by the 'source' command. |
||||
|
|
||||
|
** |
||||
|
char* ngSpice_CurPlot(); |
||||
|
returns to the caller a pointer to the name of the current plot |
||||
|
|
||||
|
** |
||||
|
char** ngSpice_AllPlots() |
||||
|
returns to the caller a pointer to an array of all plots (by their typename) |
||||
|
|
||||
|
** |
||||
|
char** ngSpice_AllVecs(char*); |
||||
|
returns to the caller a pointer to an array of vector names in the plot |
||||
|
named by the string in the argument. |
||||
|
|
||||
|
** |
||||
|
Additional basics: |
||||
|
No memory mallocing and freeing across the interface: |
||||
|
Memory allocated in ngspice.dll has to be freed in ngspice.dll. |
||||
|
Memory allocated in the calling program has to be freed only there. |
||||
|
|
||||
|
ngspice.dll should never call exit() directly, but handle either the 'quit' |
||||
|
request to the caller or an request for exiting upon error, |
||||
|
done by callback function ngexit(). |
||||
|
*/ |
||||
|
|
||||
|
#ifndef NGSPICE_DLL_H |
||||
|
#define NGSPICE_DLL_H |
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
extern "C" { |
||||
|
#endif |
||||
|
|
||||
|
#if defined(__MINGW32__) || defined(_MSC_VER) || defined(__CYGWIN__) |
||||
|
#ifdef SHARED_MODULE |
||||
|
#define IMPEXP __declspec(dllexport) |
||||
|
#else |
||||
|
#define IMPEXP __declspec(dllimport) |
||||
|
#endif |
||||
|
#else |
||||
|
/* use with gcc flag -fvisibility=hidden */ |
||||
|
#if __GNUC__ >= 4 |
||||
|
#define IMPEXP __attribute__ ((visibility ("default"))) |
||||
|
#define IMPEXPLOCAL __attribute__ ((visibility ("hidden"))) |
||||
|
#else |
||||
|
#define IMPEXP |
||||
|
#define IMPEXP_LOCAL |
||||
|
#endif |
||||
|
#endif |
||||
|
|
||||
|
/* required only if header is used by the caller, |
||||
|
is already defined in ngspice.dll */ |
||||
|
#ifndef ngspice_NGSPICE_H |
||||
|
/* Complex numbers. */ |
||||
|
struct ngcomplex { |
||||
|
double cx_real; |
||||
|
double cx_imag; |
||||
|
} ; |
||||
|
|
||||
|
typedef struct ngcomplex ngcomplex_t; |
||||
|
#endif |
||||
|
|
||||
|
/* vector info obtained from any vector in ngspice.dll */ |
||||
|
typedef struct vector_info { |
||||
|
char *v_name; /* Same as so_vname. */ |
||||
|
int v_type; /* Same as so_vtype. */ |
||||
|
short v_flags; /* Flags (a combination of VF_*). */ |
||||
|
double *v_realdata; /* Real data. */ |
||||
|
ngcomplex_t *v_compdata; /* Complex data. */ |
||||
|
int v_length; /* Length of the vector. */ |
||||
|
} vector_info, *pvector_info; |
||||
|
|
||||
|
typedef struct vecvalues { |
||||
|
char* name; |
||||
|
double creal; |
||||
|
double cimag; |
||||
|
bool is_scale; |
||||
|
bool is_complex; |
||||
|
} vecvalues, *pvecvalues; |
||||
|
|
||||
|
typedef struct vecvaluesall { |
||||
|
int veccount; |
||||
|
pvecvalues *vecsa; |
||||
|
} vecvaluesall, *pvecvaluesall; |
||||
|
|
||||
|
/* info for a specific vector */ |
||||
|
typedef struct vecinfo |
||||
|
{ |
||||
|
int number; /* number of vector, as postion in the linked list of vectors, starts with 0 */ |
||||
|
char *vecname; /* name of the actual vector */ |
||||
|
bool is_real; /* TRUE if the actual vector has real data */ |
||||
|
void *pdvec; /* a void pointer to struct dvec *d, the actual vector */ |
||||
|
void *pdvecscale; /* a void pointer to struct dvec *ds, the scale vector */ |
||||
|
} vecinfo, *pvecinfo; |
||||
|
|
||||
|
/* info for the current plot */ |
||||
|
typedef struct vecinfoall |
||||
|
{ |
||||
|
/* the plot */ |
||||
|
char *name; |
||||
|
char *title; |
||||
|
char *date; |
||||
|
char *type; |
||||
|
int veccount; |
||||
|
|
||||
|
/* the data as an array of vecinfo with length equal to the number of vectors in the plot */ |
||||
|
pvecinfo *vecs; |
||||
|
|
||||
|
} vecinfoall, *pvecinfoall; |
||||
|
|
||||
|
|
||||
|
/* callback functions |
||||
|
addresses received from caller with ngSpice_Init() function |
||||
|
*/ |
||||
|
/* sending output from stdout, stderr to caller */ |
||||
|
typedef int (SendChar)(char*, void*); |
||||
|
/* |
||||
|
char* string to be sent to caller output |
||||
|
void* return pointer received from caller, e.g. pointer to object having sent the request |
||||
|
*/ |
||||
|
/* sending simulation status to caller */ |
||||
|
typedef int (SendStat)(char*, void*); |
||||
|
/* |
||||
|
char* simulation status and value (in percent) to be sent to caller |
||||
|
void* return pointer received from caller |
||||
|
*/ |
||||
|
/* asking for controlled exit */ |
||||
|
typedef int (ControlledExit)(int, bool, bool, void*); |
||||
|
/* |
||||
|
int exit status |
||||
|
bool if true: immediate unloading dll, if false: just set flag, unload is done when function has returned |
||||
|
bool if true: exit upon 'quit', if false: exit due to ngspice.dll error |
||||
|
void* return pointer received from caller |
||||
|
*/ |
||||
|
/* send back actual vector data */ |
||||
|
typedef int (SendData)(pvecvaluesall, int, void*); |
||||
|
/* |
||||
|
vecvaluesall* pointer to array of structs containing actual values from all vectors |
||||
|
int number of structs (one per vector) |
||||
|
void* return pointer received from caller |
||||
|
*/ |
||||
|
|
||||
|
/* send back initailization vector data */ |
||||
|
typedef int (SendInitData)(pvecinfoall, void*); |
||||
|
/* |
||||
|
vecinfoall* pointer to array of structs containing data from all vectors right after initialization |
||||
|
void* return pointer received from caller |
||||
|
*/ |
||||
|
|
||||
|
/* indicate if background thread is running */ |
||||
|
typedef int (BGThreadRunning)(bool, void*); |
||||
|
/* |
||||
|
bool true if background thread is running |
||||
|
void* return pointer received from caller |
||||
|
*/ |
||||
|
|
||||
|
|
||||
|
/* ngspice initialization, |
||||
|
printfcn: pointer to callback function for reading printf, fprintf |
||||
|
statfcn: pointer to callback function for the status string and percent value |
||||
|
ControlledExit: pointer to callback function for setting a 'quit' signal in caller |
||||
|
SendData: pointer to callback function for returning data values of all current output vectors |
||||
|
SendInitData: pointer to callback function for returning information of all output vectors just initialized |
||||
|
BGThreadRunning: pointer to callback function indicating if workrt thread is running |
||||
|
userData: pointer to user-defined data, will not be modified, but |
||||
|
handed over back to caller during Callback, e.g. address of calling object */ |
||||
|
IMPEXP |
||||
|
int ngSpice_Init(SendChar* printfcn, SendStat* statfcn, ControlledExit* ngexit, |
||||
|
SendData* sdata, SendInitData* sinitdata, BGThreadRunning* bgtrun, void* userData); |
||||
|
|
||||
|
|
||||
|
/* Caller may send ngspice commands to ngspice.dll. |
||||
|
Commands are executed immediately */ |
||||
|
IMPEXP |
||||
|
int ngSpice_Command(char* command); |
||||
|
|
||||
|
|
||||
|
/* get info about a vector */ |
||||
|
IMPEXP |
||||
|
pvector_info ngGet_Vec_Info(char* vecname); |
||||
|
|
||||
|
|
||||
|
/* send a circuit to ngspice.dll |
||||
|
The circuit description is a dynamic array |
||||
|
of char*. Each char* corresponds to a single circuit |
||||
|
line. The last entry of the array has to be a NULL */ |
||||
|
IMPEXP |
||||
|
int ngSpice_Circ(char** circarray); |
||||
|
|
||||
|
|
||||
|
/* return to the caller a pointer to the name of the current plot */ |
||||
|
IMPEXP |
||||
|
char* ngSpice_CurPlot(void); |
||||
|
|
||||
|
|
||||
|
/* return to the caller a pointer to an array of all plots created |
||||
|
so far by ngspice.dll */ |
||||
|
IMPEXP |
||||
|
char** ngSpice_AllPlots(void); |
||||
|
|
||||
|
|
||||
|
/* return to the caller a pointer to an array of vector names in the plot |
||||
|
named by plotname */ |
||||
|
IMPEXP |
||||
|
char** ngSpice_AllVecs(char* plotname); |
||||
|
|
||||
|
/* returns TRUE if ngspice is running in a second (background) thread */ |
||||
|
IMPEXP |
||||
|
bool ngSpice_running(void); |
||||
|
|
||||
|
|
||||
|
#ifdef __cplusplus |
||||
|
} |
||||
|
#endif |
||||
|
|
||||
|
#endif |
||||
1482
src/sharedspice.c
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
Write
Preview
Loading…
Cancel
Save
Reference in new issue