Browse Source

sharedspice.c, .h: fcn to initialize Sync, fcn to set breakpoint, callback fcn to read vsrc external inputs

pre-master-46
h_vogt 13 years ago
committed by rlar
parent
commit
e929275cdf
  1. 22
      src/include/ngspice/sharedspice.h
  2. 106
      src/sharedspice.c

22
src/include/ngspice/sharedspice.h

@ -209,6 +209,18 @@ typedef int (BGThreadRunning)(bool, void*);
void* return pointer received from caller void* return pointer received from caller
*/ */
/* callback functions
addresses received from caller with ngSpice_Init_Sync() function
*/
/* ask for VSRC EXTERNAL value */
typedef int (GetVSRCData)(double*, double, char*, void*);
/*
double* return voltage value
double actual time
char* node name
void* return pointer received from caller
*/
/* ngspice initialization, /* ngspice initialization,
printfcn: pointer to callback function for reading printf, fprintf printfcn: pointer to callback function for reading printf, fprintf
@ -223,6 +235,12 @@ IMPEXP
int ngSpice_Init(SendChar* printfcn, SendStat* statfcn, ControlledExit* ngexit, int ngSpice_Init(SendChar* printfcn, SendStat* statfcn, ControlledExit* ngexit,
SendData* sdata, SendInitData* sinitdata, BGThreadRunning* bgtrun, void* userData); SendData* sdata, SendInitData* sinitdata, BGThreadRunning* bgtrun, void* userData);
/* initialization of synchronizing functions
vsrcdat: pointer to callback function for retrieving a voltage source value
ident: pointer to integer unique to this shared library (defaults to 0)
*/
IMPEXP
int ngSpice_Init_Sync(GetVSRCData *vsrcdat, int *ident, void *userData);
/* Caller may send ngspice commands to ngspice.dll. /* Caller may send ngspice commands to ngspice.dll.
Commands are executed immediately */ Commands are executed immediately */
@ -263,6 +281,10 @@ char** ngSpice_AllVecs(char* plotname);
IMPEXP IMPEXP
bool ngSpice_running(void); bool ngSpice_running(void);
/* set a breakpoint in ngspice */
IMPEXP
bool ngSpice_SetBkpt(double time);
#ifdef __cplusplus #ifdef __cplusplus
} }

106
src/sharedspice.c

@ -192,6 +192,7 @@ int sh_vfprintf(FILE *f, const char *fmt, va_list args);
int sh_fputsll(const char *input, FILE* outf); int sh_fputsll(const char *input, FILE* outf);
int sh_ExecutePerLoop(void); int sh_ExecutePerLoop(void);
double getvsrcval(double, char*);
int sh_vecinit(runDesc *run); int sh_vecinit(runDesc *run);
void shared_exit(int status); void shared_exit(int status);
@ -200,6 +201,8 @@ void sighandler_sharedspice(int num);
void wl_delete_first(wordlist **wlstart, wordlist **wlend); void wl_delete_first(wordlist **wlstart, wordlist **wlend);
int add_bkpt(void);
#if !defined(low_latency) #if !defined(low_latency)
static char* outstorage(char*, bool); static char* outstorage(char*, bool);
static void printsend(void); static void printsend(void);
@ -214,6 +217,7 @@ static ControlledExit* ngexit;
static SendData* datfcn; static SendData* datfcn;
static SendInitData* datinitfcn; static SendInitData* datinitfcn;
static BGThreadRunning* bgtr; static BGThreadRunning* bgtr;
static GetVSRCData* getvdat;
static pvector_info myvec = NULL; static pvector_info myvec = NULL;
char **allvecs = NULL; char **allvecs = NULL;
char **allplots = NULL; char **allplots = NULL;
@ -222,6 +226,7 @@ static bool nostatuswanted = FALSE;
static bool nodatawanted = FALSE; static bool nodatawanted = FALSE;
static bool nodatainitwanted = FALSE; static bool nodatainitwanted = FALSE;
static bool nobgtrwanted = FALSE; static bool nobgtrwanted = FALSE;
static bool wantvdat = FALSE;
static bool immediate = FALSE; static bool immediate = FALSE;
static bool coquit = FALSE; static bool coquit = FALSE;
static jmp_buf errbufm, errbufc; static jmp_buf errbufm, errbufc;
@ -241,6 +246,9 @@ mutexType fputsMutex;
static bool is_initialized = FALSE; static bool is_initialized = FALSE;
static char* no_init = "Error: ngspice is not initialized!\n Run ngSpice_Init first"; static char* no_init = "Error: ngspice is not initialized!\n Run ngSpice_Init first";
/* identifier for this ngspice invocation */
static int ng_ident = 0;
static struct plot * static struct plot *
get_plot_byname(char* plotname) get_plot_byname(char* plotname)
@ -477,6 +485,26 @@ ngSpice_running (void)
#endif #endif
/* Initialise external voltage source */
IMPEXP
int
ngSpice_Init_Sync(GetVSRCData* vsrcdat, int *ident, void *userData)
{
getvdat = vsrcdat;
/* set userdata, but don't overwrite with NULL */
if (userData)
userptr = userData;
/* set ngspice shared lib identification number */
ng_ident = *ident;
/* if caller sends NULL, don't try to retrieve voltage */
if (getvdat) {
wantvdat = TRUE;
return 0;
}
return 1;
}
/* Initialise ngspice and setup native methods */ /* Initialise ngspice and setup native methods */
IMPEXP IMPEXP
int int
@ -803,6 +831,67 @@ char** ngSpice_AllVecs(char* plotname)
} }
static double *bkpttmp = NULL;
static int bkpttmpsize = 0;
/* set a breakpoint in ngspice */
IMPEXP
bool ngSpice_SetBkpt(double time)
{
int error;
CKTcircuit *ckt = NULL;
if (!ft_curckt || !ft_curckt->ci_ckt) {
fprintf(cp_err, "Error: no circuit loaded.\n");
return(FALSE);
}
ckt = ft_curckt->ci_ckt;
if (ckt->CKTbreakSize == 0) {
/* breakpoints have not yet been set up, so store here preliminary
and add with fcn add_bkpt() called from DCTran() */
if (bkpttmp == NULL) {
bkpttmp = TMALLOC(double, bkpttmpsize + 1);
if(bkpttmp == NULL)
return(FALSE);
bkpttmpsize++;
}
else {
bkpttmp = TREALLOC(double, bkpttmp, bkpttmpsize + 1);
bkpttmpsize++;
}
bkpttmp[bkpttmpsize-1] = time;
error = 0;
}
else
error = CKTsetBreak(ckt, time);
if(error)
return(FALSE);
return(TRUE);
}
/* add the preliminary breakpoints to the list.
called from dctran.c */
int
add_bkpt(void)
{
int i;
int error = 0;
CKTcircuit *ckt = ft_curckt->ci_ckt;
if((bkpttmp) && (bkpttmpsize > 0)) {
for (i = 0; i < bkpttmpsize; i++)
error = CKTsetBreak(ckt, bkpttmp[i]);
FREE(bkpttmp);
bkpttmpsize = 0;
}
if(error)
return(error);
return(OK);
}
/*------------------------------------------------------*/ /*------------------------------------------------------*/
/* Redefine the vfprintf() functions for callback */ /* Redefine the vfprintf() functions for callback */
/*------------------------------------------------------*/ /*------------------------------------------------------*/
@ -1591,3 +1680,20 @@ int sh_vecinit(runDesc *run)
return 0; return 0;
} }
/* issue callback to request external voltage data for source vname */
double
getvsrcval(double time, char *vname)
{
double vval;
if (!wantvdat) {
fprintf(stderr, "Error: No callback supplied for source %s\n", vname);
shared_exit(EXIT_BAD);
return(EXIT_BAD);
}
else {
/* callback fcn */
getvdat(&vval, time, vname, userptr);
return vval;
}
}
Loading…
Cancel
Save