22 changed files with 1013 additions and 0 deletions
-
30src/spicelib/devices/ndev/Makefile.am
-
39src/spicelib/devices/ndev/ndev.c
-
70src/spicelib/devices/ndev/ndevaccept.c
-
26src/spicelib/devices/ndev/ndevacld.c
-
28src/spicelib/devices/ndev/ndevask.c
-
75src/spicelib/devices/ndev/ndevdefs.h
-
38src/spicelib/devices/ndev/ndevdel.c
-
36src/spicelib/devices/ndev/ndevdest.c
-
40src/spicelib/devices/ndev/ndevdump.c
-
69src/spicelib/devices/ndev/ndevexch.h
-
29src/spicelib/devices/ndev/ndevext.h
-
85src/spicelib/devices/ndev/ndevinit.c
-
13src/spicelib/devices/ndev/ndevinit.h
-
10src/spicelib/devices/ndev/ndevitf.h
-
104src/spicelib/devices/ndev/ndevload.c
-
20src/spicelib/devices/ndev/ndevmdel.c
-
38src/spicelib/devices/ndev/ndevmpar.c
-
30src/spicelib/devices/ndev/ndevparm.c
-
22src/spicelib/devices/ndev/ndevpzld.c
-
161src/spicelib/devices/ndev/ndevset.c
-
27src/spicelib/devices/ndev/ndevtemp.c
-
23src/spicelib/devices/ndev/ndevtrun.c
@ -0,0 +1,30 @@ |
|||
## Process this file with automake to produce Makefile.in
|
|||
|
|||
noinst_LIBRARIES = libndev.a |
|||
|
|||
libndev_a_SOURCES = \
|
|||
ndev.c \
|
|||
ndevacld.c \
|
|||
ndevaccept.c \
|
|||
ndevask.c \
|
|||
ndevdefs.h \
|
|||
ndevdel.c \
|
|||
ndevdest.c \
|
|||
ndevdump.c \
|
|||
ndevext.h \
|
|||
ndevinit.c \
|
|||
ndevinit.h \
|
|||
ndevitf.h \
|
|||
ndevload.c \
|
|||
ndevmdel.c \
|
|||
ndevmpar.c \
|
|||
ndevparm.c \
|
|||
ndevpzld.c \
|
|||
ndevset.c \
|
|||
ndevtemp.c \
|
|||
ndevtrun.c |
|||
|
|||
|
|||
INCLUDES = -I$(top_srcdir)/src/include |
|||
|
|||
MAINTAINERCLEANFILES = Makefile.in |
|||
@ -0,0 +1,39 @@ |
|||
/********** |
|||
Permit to use it as your wish. |
|||
Author: 2007 Gong Ding, gdiso@ustc.edu |
|||
University of Science and Technology of China |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "devdefs.h" |
|||
#include "ndevdefs.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
IFparm NDEVpTable[] = { /* parameters */ |
|||
/* numerical-device models no longer have parameters */ |
|||
/* one is left behind to keep the table from being empty */ |
|||
IP("ndev", NDEV_MOD_NDEV, IF_FLAG, "Numerical Device"), |
|||
}; |
|||
|
|||
IFparm NDEVmPTable[] = { /* model parameters */ |
|||
IP("ndev", NDEV_MOD_NDEV, IF_FLAG, "Numerical Device"), |
|||
IP("remote", NDEV_REMOTE, IF_STRING, "Remote computer run device simulation"), |
|||
IP("port", NDEV_PORT, IF_INTEGER, "Remote port") |
|||
}; |
|||
|
|||
char *NDEVnames[] = { |
|||
"pin1", |
|||
"pin2", |
|||
"pin3", |
|||
"pin4", |
|||
"pin5", |
|||
"pin6", |
|||
"pin7" |
|||
}; |
|||
|
|||
int NDEVnSize = NUMELEMS(NDEVnames); |
|||
int NDEVpTSize = NUMELEMS(NDEVpTable); |
|||
int NDEVmPTSize = NUMELEMS(NDEVmPTable); |
|||
int NDEViSize = sizeof(NDEVinstance); |
|||
int NDEVmSize = sizeof(NDEVmodel); |
|||
@ -0,0 +1,70 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Thomas L. Quarles |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "const.h" |
|||
#include "ifsim.h" |
|||
#include "cktdefs.h" |
|||
#include "devdefs.h" |
|||
#include "ndevdefs.h" |
|||
#include "complex.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
|
|||
int NDEVaccept(CKTcircuit *ckt, GENmodel *inModel) |
|||
{ |
|||
NDEVmodel *model = (NDEVmodel *)inModel; |
|||
NDEVinstance *here; |
|||
/* loop through all the ndev models */ |
|||
for( ; model != NULL; model = model->NDEVnextModel ) |
|||
{ |
|||
/* loop through all the instances of the model */ |
|||
for (here = model->NDEVinstances; here != NULL ; here=here->NDEVnextInstance) |
|||
{ |
|||
|
|||
if (here->NDEVowner != ARCHme) continue; |
|||
|
|||
/* set ckt accept_flag */ |
|||
here->CKTInfo.DEV_CALL = NDEV_ACCEPT; |
|||
here->CKTInfo.CKTmode = ckt->CKTmode; |
|||
here->CKTInfo.time = ckt->CKTtime; |
|||
here->CKTInfo.dt = ckt->CKTdelta; |
|||
here->CKTInfo.dt_old = ckt->CKTdeltaOld[0]; |
|||
here->CKTInfo.accept_flag = 1; |
|||
send(model->sock,&here->CKTInfo,sizeof(sCKTinfo),0); |
|||
} |
|||
} |
|||
return (OK); |
|||
/* NOTREACHED */ |
|||
} |
|||
|
|||
|
|||
int NDEVconvTest(GENmodel *inModel, CKTcircuit *ckt) |
|||
{ |
|||
NDEVmodel *model = (NDEVmodel *)inModel; |
|||
NDEVinstance *here; |
|||
|
|||
for( ; model != NULL; model = model->NDEVnextModel) { |
|||
for(here=model->NDEVinstances;here!=NULL;here = here->NDEVnextInstance){ |
|||
if (here->NDEVowner != ARCHme) continue; |
|||
/* |
|||
* get convergence information from ndev |
|||
*/ |
|||
here->CKTInfo.DEV_CALL = NDEV_CONVERGINCE_TEST; |
|||
send(model->sock,&here->CKTInfo,sizeof(sCKTinfo),0); |
|||
recv(model->sock,&here->CKTInfo,sizeof(sCKTinfo),MSG_WAITALL); |
|||
|
|||
if (here->CKTInfo.convergence_flag<0) { |
|||
/* no reason to continue - we've failed... */ |
|||
ckt->CKTnoncon++; |
|||
ckt->CKTtroubleElt = (GENinstance *) here; |
|||
return(OK); |
|||
} |
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
@ -0,0 +1,26 @@ |
|||
/********** |
|||
Copyright 1992 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group |
|||
**********/ |
|||
|
|||
/* |
|||
* Function to load the COMPLEX circuit matrix using the small signal |
|||
* parameters saved during a previous DC operating point analysis. |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "ndevdefs.h" |
|||
#include "sperror.h" |
|||
#include "complex.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
int |
|||
NDEVacLoad(inModel, ckt) |
|||
GENmodel *inModel; |
|||
CKTcircuit *ckt; |
|||
{ |
|||
|
|||
return (OK); |
|||
} |
|||
@ -0,0 +1,28 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Thomas L. Quarles |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "const.h" |
|||
#include "ifsim.h" |
|||
#include "cktdefs.h" |
|||
#include "devdefs.h" |
|||
#include "ndevdefs.h" |
|||
#include "complex.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
/* ARGSUSED */ |
|||
int |
|||
NDEVask(ckt, inInst, which, value, select) |
|||
CKTcircuit *ckt; |
|||
GENinstance *inInst; |
|||
int which; |
|||
IFvalue *value; |
|||
IFvalue *select; |
|||
{ |
|||
return (OK); |
|||
/* NOTREACHED */ |
|||
} |
|||
@ -0,0 +1,75 @@ |
|||
/********** |
|||
Permit to use it as your wish. |
|||
Author: 2007 Gong Ding, gdiso@ustc.edu |
|||
University of Science and Technology of China |
|||
**********/ |
|||
|
|||
#ifndef NDEV_H |
|||
#define NDEV_H |
|||
|
|||
|
|||
/* circuit level includes */ |
|||
#include "ifsim.h" |
|||
#include "inpmacs.h" |
|||
#include "cktdefs.h" |
|||
#include "gendefs.h" |
|||
#include "ndevexch.h" |
|||
|
|||
/* network function */ |
|||
#include <errno.h> |
|||
#include <netinet/in.h> /* IPv4 socket address structres. */ |
|||
#include <netdb.h> /* Access to DNS lookups. */ |
|||
#include <arpa/inet.h> /* inet_ntop function. */ |
|||
#include <sys/socket.h> /* Socket functions. */ |
|||
|
|||
/* information needed per instance */ |
|||
typedef struct sNDEVinstance { |
|||
struct sNDEVmodel *NDEVmodPtr;/* back pointer to model */ |
|||
struct sNDEVinstance *NDEVnextInstance; /* pointer to next instance |
|||
* of current model */ |
|||
IFuid NDEVname; /* pointer to character string naming this |
|||
* instance */ |
|||
int NDEVowner; /* number of owner process */ |
|||
int NDEVstate; /* pointer to start of state vector for diode */ |
|||
int pin[7]; /* max 7 terminals are allowed */ |
|||
int term; /* the real number of terminals */ |
|||
void *node[7]; /* the array of CKT node's node pointer */ |
|||
char *bname[7]; /* the electrode boundary label for numerical solver */ |
|||
sCKTinfo CKTInfo; |
|||
sDeviceinfo Ndevinfo; |
|||
sPINinfo PINinfos[7]; |
|||
double * mat_pointer[49]; /* the pointer array to matrix */ |
|||
} NDEVinstance; |
|||
|
|||
|
|||
/* per model data */ |
|||
|
|||
typedef struct sNDEVmodel { /* model structure for a diode */ |
|||
/* the following 4 entries should always exist */ |
|||
int NDEVmodType; /* type index of this device type */ |
|||
struct sNDEVmodel *NDEVnextModel; /* pointer to next possible model in linked list */ |
|||
NDEVinstance *NDEVinstances; /* pointer to list of instances that have this model */ |
|||
IFuid NDEVmodName; /* pointer to character string naming this model */ |
|||
/* here can be freely defined as your wish*/ |
|||
|
|||
char * NDEVmodelfile; |
|||
char * host; |
|||
int port; /* Port number. */ |
|||
int sock; /* Our connection socket. */ |
|||
|
|||
} NDEVmodel; |
|||
|
|||
|
|||
|
|||
|
|||
/* device parameters */ |
|||
#define NDEV_MODEL_FILE 1 |
|||
/* model parameters */ |
|||
#define NDEV_MOD_NDEV 101 |
|||
#define NDEV_REMOTE 102 |
|||
#define NDEV_PORT 103 |
|||
|
|||
#include "ndevext.h" |
|||
|
|||
|
|||
#endif /* NDEV_H */ |
|||
@ -0,0 +1,38 @@ |
|||
/********** |
|||
Permit to use it as your wish. |
|||
Author: 2007 Gong Ding, gdiso@ustc.edu |
|||
University of Science and Technology of China |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "ndevdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
int |
|||
NDEVdelete(inModel, name, kill) |
|||
GENmodel *inModel; |
|||
IFuid name; |
|||
GENinstance **kill; |
|||
|
|||
{ |
|||
NDEVmodel *model = (NDEVmodel *)inModel; |
|||
NDEVinstance **fast = (NDEVinstance **)kill; |
|||
NDEVinstance **prev = NULL; |
|||
NDEVinstance *here; |
|||
|
|||
for( ; model ; model = model->NDEVnextModel) { |
|||
prev = &(model->NDEVinstances); |
|||
for(here = *prev; here ; here = *prev) { |
|||
if(here->NDEVname == name || (fast && here==*fast) ) { |
|||
*prev= here->NDEVnextInstance; |
|||
FREE(here); |
|||
return(OK); |
|||
} |
|||
prev = &(here->NDEVnextInstance); |
|||
} |
|||
} |
|||
return(E_NODEV); |
|||
|
|||
return (E_NODEV); |
|||
} |
|||
@ -0,0 +1,36 @@ |
|||
/********** |
|||
Permit to use it as your wish. |
|||
Author: 2007 Gong Ding, gdiso@ustc.edu |
|||
University of Science and Technology of China |
|||
**********/ |
|||
|
|||
|
|||
#include "ngspice.h" |
|||
#include "ndevdefs.h" |
|||
#include "suffix.h" |
|||
|
|||
void |
|||
NDEVdestroy(GENmodel **inModel) |
|||
{ |
|||
|
|||
NDEVmodel **model = (NDEVmodel **)inModel; |
|||
NDEVinstance *here; |
|||
NDEVinstance *prev = NULL; |
|||
NDEVmodel *mod = *model; |
|||
NDEVmodel *oldmod = NULL; |
|||
|
|||
for( ; mod ; mod = mod->NDEVnextModel) { |
|||
if(oldmod) FREE(oldmod); |
|||
oldmod = mod; |
|||
prev = (NDEVinstance *)NULL; |
|||
for(here = mod->NDEVinstances ; here ; here = here->NDEVnextInstance) { |
|||
if(prev) FREE(prev); |
|||
prev = here; |
|||
} |
|||
if(prev) FREE(prev); |
|||
close(mod->sock); |
|||
fprintf(stdout,"Disconnect to remote NDEV server %s:%d\n",mod->host,mod->port); |
|||
} |
|||
if(oldmod) FREE(oldmod); |
|||
*model = NULL; |
|||
} |
|||
@ -0,0 +1,40 @@ |
|||
/********** |
|||
Copyright 1992 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group |
|||
Author: 1991 David A. Gates, U. C. Berkeley CAD Group |
|||
**********/ |
|||
|
|||
/* |
|||
* This is a simple routine to dump the internal device states. It produces |
|||
* states for .OP, .DC, & .TRAN simulations. |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "ndevdefs.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
/* State Counter */ |
|||
static int state_numOP = 0; |
|||
static int state_numDC = 0; |
|||
static int state_numTR = 0; |
|||
|
|||
void |
|||
NDEV_dump(inModel, ckt) |
|||
GENmodel *inModel; |
|||
CKTcircuit *ckt; |
|||
{ |
|||
|
|||
} |
|||
|
|||
|
|||
|
|||
void |
|||
NDEV_acct(inModel, ckt, file) |
|||
GENmodel *inModel; |
|||
CKTcircuit *ckt; |
|||
FILE *file; |
|||
{ |
|||
|
|||
} |
|||
@ -0,0 +1,69 @@ |
|||
#ifndef _netexchange_h_ |
|||
#define _netexchange_h_ |
|||
|
|||
#define NG_QUERY "This is ngspice. Are you ready?" |
|||
#define NDEV_REPLY "Waiting orders!" |
|||
#define NG_STOP "Ngspice finished, goodbye." |
|||
|
|||
#define NDEV_LOAD 0x0001 |
|||
#define NDEV_ACCEPT 0x0002 |
|||
#define NDEV_CONVERGINCE_TEST 0x0004 |
|||
#define NDEV_TRUNCATION_ERROR 0x0008 |
|||
|
|||
#define NDEV_TEMPERATURE 0x1000 |
|||
#define NDEV_AC_LOAD 0x0010 |
|||
#define NDEV_PZ_LOAD 0x0020 |
|||
|
|||
#ifndef CKT |
|||
/* defines for CKTmode */ |
|||
/* this should be the same as cktdefs.h */ |
|||
/* old 'mode' parameters */ |
|||
#define MODE 0x3 |
|||
#define MODETRAN 0x1 |
|||
#define MODEAC 0x2 |
|||
|
|||
/* old 'modedc' parameters */ |
|||
#define MODEDC 0x70 |
|||
#define MODEDCOP 0x10 |
|||
#define MODETRANOP 0x20 |
|||
#define MODEDCTRANCURVE 0x40 |
|||
|
|||
/* old 'initf' parameters */ |
|||
#define INITF 0x3f00 |
|||
#define MODEINITFLOAT 0x100 |
|||
#define MODEINITJCT 0x200 |
|||
#define MODEINITFIX 0x400 |
|||
#define MODEINITSMSIG 0x800 |
|||
#define MODEINITTRAN 0x1000 |
|||
#define MODEINITPRED 0x2000 |
|||
|
|||
/* old 'nosolv' paramater */ |
|||
#define MODEUIC 0x10000l |
|||
#endif |
|||
|
|||
typedef struct { |
|||
char NDEVname[32]; |
|||
int term; |
|||
}sDeviceinfo; |
|||
|
|||
|
|||
typedef struct { |
|||
int pin; |
|||
char name[32]; |
|||
double V,I; |
|||
double V_old; |
|||
double dI_dV[7]; |
|||
} sPINinfo; |
|||
|
|||
typedef struct { |
|||
long DEV_CALL; |
|||
long CKTmode; |
|||
double time; |
|||
double dt; |
|||
double dt_old; |
|||
double omega; |
|||
int accept_flag; |
|||
int convergence_flag; |
|||
}sCKTinfo; |
|||
|
|||
#endif |
|||
@ -0,0 +1,29 @@ |
|||
/********** |
|||
Copyright 1990 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Karti Mayaram |
|||
**********/ |
|||
|
|||
#ifndef NDEVEXT_H |
|||
#define NDEVEXT_H |
|||
|
|||
|
|||
extern int NDEVacLoad(GENmodel *, CKTcircuit *); |
|||
extern int NDEVask(CKTcircuit *, GENinstance *, int, IFvalue *, IFvalue *); |
|||
extern int NDEVdelete(GENmodel *, IFuid, GENinstance **); |
|||
extern void NDEVdestroy(GENmodel **); |
|||
extern int NDEVgetic(GENmodel *, CKTcircuit *); |
|||
extern int NDEVload(GENmodel *, CKTcircuit *); |
|||
extern int NDEVaccept(CKTcircuit *, GENmodel *); |
|||
extern int NDEVconvTest(GENmodel *, CKTcircuit *); |
|||
extern int NDEVmDelete(GENmodel **, IFuid, GENmodel *); |
|||
extern int NDEVmParam(int, IFvalue *, GENmodel *); |
|||
extern int NDEVparam(int, IFvalue *, GENinstance *, IFvalue *); |
|||
extern int NDEVpzLoad(GENmodel *, CKTcircuit *, SPcomplex *); |
|||
extern int NDEVsetup(SMPmatrix *, GENmodel *, CKTcircuit *, int *); |
|||
extern int NDEVtemp(GENmodel *, CKTcircuit *); |
|||
extern int NDEVtrunc(GENmodel *, CKTcircuit *, double *); |
|||
|
|||
extern void NDEV_dump(GENmodel *, CKTcircuit *); |
|||
extern void NDEV_acct(GENmodel *, CKTcircuit *, FILE *); |
|||
|
|||
#endif /* NDEVEXT_H */ |
|||
@ -0,0 +1,85 @@ |
|||
#include <config.h> |
|||
|
|||
#include <devdefs.h> |
|||
|
|||
#include "ndevitf.h" |
|||
#include "ndevext.h" |
|||
#include "ndevinit.h" |
|||
|
|||
|
|||
SPICEdev NDEVinfo = { |
|||
{ |
|||
"NDEV", |
|||
"Numerical Device", |
|||
|
|||
&NDEVnSize, /* number of terminals */ |
|||
&NDEVnSize, |
|||
NDEVnames, /* the name of terminals*/ |
|||
|
|||
&NDEVpTSize, /*number of instance parameters */ |
|||
NDEVpTable, /*the array of instance parameters */ |
|||
|
|||
&NDEVmPTSize, /* number of model parameter, NDEV does not have this parameter */ |
|||
NDEVmPTable, /*the array of model parameters */ |
|||
|
|||
#ifdef XSPICE |
|||
/*---- Fixed by SDB 5.2.2003 to enable XSPICE/tclspice integration -----*/ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
|
|||
0, /* This is a SPICE device, it has no MIF info data */ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
|
|||
0, /* This is a SPICE device, it has no MIF info data */ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
|
|||
0, /* This is a SPICE device, it has no MIF info data */ |
|||
NULL, /* This is a SPICE device, it has no MIF info data */ |
|||
/*--------------------------- End of SDB fix -------------------------*/ |
|||
#endif |
|||
|
|||
DEV_DEFAULT |
|||
}, |
|||
|
|||
DEVparam : NDEVparam, |
|||
DEVmodParam : NDEVmParam, |
|||
DEVload : NDEVload, |
|||
DEVsetup : NDEVsetup, |
|||
DEVunsetup : NULL, |
|||
DEVpzSetup : NDEVsetup, |
|||
DEVtemperature: NDEVtemp, |
|||
DEVtrunc : NDEVtrunc, |
|||
DEVfindBranch : NULL, |
|||
DEVacLoad : NDEVacLoad, |
|||
DEVaccept : NDEVaccept, |
|||
DEVdestroy : NDEVdestroy, |
|||
DEVmodDelete : NDEVmDelete, |
|||
DEVdelete : NDEVdelete, |
|||
DEVsetic : NDEVgetic, |
|||
DEVask : NDEVask, |
|||
DEVmodAsk : NULL, |
|||
DEVpzLoad : NDEVpzLoad, |
|||
DEVconvTest : NDEVconvTest, |
|||
DEVsenSetup : NULL, |
|||
DEVsenLoad : NULL, |
|||
DEVsenUpdate : NULL, |
|||
DEVsenAcLoad : NULL, |
|||
DEVsenPrint : NULL, |
|||
DEVsenTrunc : NULL, |
|||
DEVdisto : NULL, |
|||
DEVnoise : NULL, |
|||
#ifdef CIDER |
|||
DEVdump : NULL, |
|||
DEVacct : NULL, |
|||
#endif |
|||
|
|||
DEVinstSize : &NDEViSize, |
|||
DEVmodSize : &NDEVmSize |
|||
|
|||
}; |
|||
|
|||
|
|||
SPICEdev * |
|||
get_ndev_info(void) |
|||
{ |
|||
return &NDEVinfo; |
|||
} |
|||
@ -0,0 +1,13 @@ |
|||
#ifndef _NDEVINIT_H |
|||
#define _NDEVINIT_H |
|||
|
|||
extern IFparm NDEVpTable[ ]; |
|||
extern IFparm NDEVmPTable[ ]; |
|||
extern char *NDEVnames[ ]; |
|||
extern int NDEVpTSize; |
|||
extern int NDEVmPTSize; |
|||
extern int NDEVnSize; |
|||
extern int NDEViSize; |
|||
extern int NDEVmSize; |
|||
|
|||
#endif |
|||
@ -0,0 +1,10 @@ |
|||
/********** |
|||
Copyright 1991 Regents of the University of California. All rights reserved. |
|||
**********/ |
|||
|
|||
#ifndef DEV_NDEV |
|||
#define DEV_NDEV |
|||
|
|||
extern SPICEdev *get_ndev_info(void); |
|||
|
|||
#endif |
|||
@ -0,0 +1,104 @@ |
|||
/********** |
|||
Permit to use it as your wish. |
|||
Author: 2007 Gong Ding, gdiso@ustc.edu |
|||
University of Science and Technology of China |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "devdefs.h" |
|||
#include "cktdefs.h" |
|||
#include "ndevdefs.h" |
|||
#include "numenum.h" |
|||
#include "trandefs.h" |
|||
#include "complex.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
int |
|||
NDEVload(GENmodel * inModel, CKTcircuit * ckt) |
|||
{ |
|||
NDEVmodel *model = (NDEVmodel *)inModel; |
|||
NDEVinstance *here; |
|||
int i,j; |
|||
|
|||
/* loop through all the ndev models */ |
|||
for( ; model != NULL; model = model->NDEVnextModel ) |
|||
{ |
|||
|
|||
/* loop through all the instances of the model */ |
|||
for (here = model->NDEVinstances; here != NULL ; here=here->NDEVnextInstance) |
|||
{ |
|||
|
|||
if (here->NDEVowner != ARCHme) continue; |
|||
|
|||
/* sent ckt information to device simulator */ |
|||
here->CKTInfo.DEV_CALL = NDEV_LOAD; |
|||
here->CKTInfo.CKTmode = ckt->CKTmode; |
|||
here->CKTInfo.time = ckt->CKTtime; |
|||
here->CKTInfo.dt = ckt->CKTdelta; |
|||
here->CKTInfo.dt_old = ckt->CKTdeltaOld[0]; |
|||
here->CKTInfo.accept_flag = 0; |
|||
send(model->sock,&here->CKTInfo,sizeof(sCKTinfo),0); |
|||
|
|||
/* send terminal voltage to device simulator */ |
|||
for(i=0;i<here->term;i++) |
|||
{ |
|||
here->PINinfos[i].V_old = here->PINinfos[i].V; |
|||
here->PINinfos[i].V = *(ckt->CKTrhsOld+here->pin[i]); |
|||
send(model->sock,&here->PINinfos[i],sizeof(here->PINinfos[i]),0); |
|||
} |
|||
} |
|||
} |
|||
|
|||
/* loop through all the ndev models */ |
|||
|
|||
for(model = (NDEVmodel *)inModel; model != NULL; model = model->NDEVnextModel ) |
|||
{ |
|||
|
|||
/* loop through all the instances of the model */ |
|||
for (here = model->NDEVinstances; here != NULL ; here=here->NDEVnextInstance) |
|||
{ |
|||
if (here->NDEVowner != ARCHme) continue; |
|||
/* reveive terminal current and conductional matrix from device simulator */ |
|||
for(i=0;i<here->term;i++) |
|||
{ |
|||
recv(model->sock,&here->PINinfos[i],sizeof(here->PINinfos[i]),MSG_WAITALL); |
|||
*(ckt->CKTrhs+here->pin[i]) += here->PINinfos[i].I; |
|||
for(j=0;j<here->term;j++) |
|||
*(here->mat_pointer[i*here->term+j]) += here->PINinfos[i].dI_dV[j]; |
|||
} |
|||
} |
|||
} |
|||
|
|||
return(OK); |
|||
} |
|||
|
|||
int NDEVgetic(GENmodel *inModel, CKTcircuit *ckt) |
|||
{ |
|||
NDEVmodel *model = (NDEVmodel*)inModel; |
|||
NDEVinstance *here; |
|||
/* |
|||
* grab initial conditions out of rhs array. User specified, so use |
|||
* external nodes to get values |
|||
*/ |
|||
|
|||
printf("set ic\n"); |
|||
|
|||
for( ; model ; model = model->NDEVnextModel) { |
|||
for(here = model->NDEVinstances; here ; here = here->NDEVnextInstance) { |
|||
if (here->NDEVowner != ARCHme) continue; |
|||
/* |
|||
if(!here->DIOinitCondGiven) { |
|||
here->DIOinitCond = |
|||
*(ckt->CKTrhs + here->DIOposNode) - |
|||
*(ckt->CKTrhs + here->DIOnegNode); |
|||
|
|||
} |
|||
*/ |
|||
} |
|||
} |
|||
return(OK); |
|||
} |
|||
|
|||
|
|||
@ -0,0 +1,20 @@ |
|||
/********** |
|||
Copyright 1992 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "ndevdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
int |
|||
NDEVmDelete(inModel, modname, kill) |
|||
GENmodel **inModel; |
|||
IFuid modname; |
|||
GENmodel *kill; |
|||
{ |
|||
|
|||
|
|||
return (OK); |
|||
} |
|||
@ -0,0 +1,38 @@ |
|||
/********** |
|||
Copyright 1992 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group |
|||
**********/ |
|||
|
|||
/* |
|||
* This routine sets model parameters for NDEVs in the circuit. |
|||
*/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "const.h" |
|||
#include "ifsim.h" |
|||
#include "ndevdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
int |
|||
NDEVmParam(int param, IFvalue * value, GENmodel * inModel) |
|||
{ |
|||
|
|||
NDEVmodel *model = (NDEVmodel *) inModel; |
|||
switch (param) { |
|||
case NDEV_REMOTE: |
|||
model->host = value->sValue; |
|||
break; |
|||
case NDEV_PORT: |
|||
model->port = value->iValue; |
|||
break; |
|||
case NDEV_MOD_NDEV: |
|||
/* no action , but this */ |
|||
/* makes life easier for spice-2 like parsers */ |
|||
break; |
|||
default: |
|||
return (E_BADPARM); |
|||
} |
|||
|
|||
return (OK); |
|||
} |
|||
@ -0,0 +1,30 @@ |
|||
/********** |
|||
Copyright 1992 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "ifsim.h" |
|||
#include "const.h" |
|||
#include "ndevdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
int |
|||
NDEVparam(param, value, inInst, select) |
|||
int param; |
|||
IFvalue *value; |
|||
GENinstance *inInst; |
|||
IFvalue *select; |
|||
{ |
|||
NDEVinstance *inst = (NDEVinstance *) inInst; |
|||
switch (param) { |
|||
case NDEV_MOD_NDEV: |
|||
/* no action , but this */ |
|||
/* makes life easier for spice-2 like parsers */ |
|||
break; |
|||
default: |
|||
return (E_BADPARM); |
|||
} |
|||
return (OK); |
|||
} |
|||
@ -0,0 +1,22 @@ |
|||
/********** |
|||
Copyright 1992 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "complex.h" |
|||
#include "sperror.h" |
|||
#include "ndevdefs.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
int |
|||
NDEVpzLoad(inModel, ckt, s) |
|||
GENmodel *inModel; |
|||
register CKTcircuit *ckt; |
|||
SPcomplex *s; |
|||
{ |
|||
|
|||
return (OK); |
|||
} |
|||
@ -0,0 +1,161 @@ |
|||
/********** |
|||
Permit to use it as your wish. |
|||
Author: 2007 Gong Ding, gdiso@ustc.edu |
|||
University of Science and Technology of China |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "smpdefs.h" |
|||
#include "ndevdefs.h" |
|||
#include "numconst.h" |
|||
#include "numenum.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
#define NIL(type) ((type *)0) |
|||
#define TSCALLOC(var, size, type)\ |
|||
if (size && (!(var =(type *)calloc(1, (unsigned)(size)*sizeof(type))))) {\ |
|||
return(E_NOMEM);\ |
|||
} |
|||
|
|||
int NDEVmodelConnect(GENmodel *inModel); |
|||
|
|||
|
|||
int NDEVsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *states) |
|||
/* |
|||
* load the structure with those pointers needed later for fast matrix |
|||
* loading |
|||
*/ |
|||
{ |
|||
NDEVmodel *model = (NDEVmodel *)inModel; |
|||
NDEVinstance *here; |
|||
int i,j; |
|||
CKTnode *node; |
|||
|
|||
/* loop through all the ndev models */ |
|||
for( ; model != NULL; model = model->NDEVnextModel ) { |
|||
|
|||
/* connect to remote device simulator */ |
|||
if(NDEVmodelConnect(model)) return E_PRIVATE; |
|||
|
|||
/* loop through all the instances of the model */ |
|||
for (here = model->NDEVinstances; here != NULL ; |
|||
here=here->NDEVnextInstance) { |
|||
|
|||
here->Ndevinfo.term = here->term; |
|||
strncpy(here->Ndevinfo.NDEVname,here->NDEVname,32); |
|||
send(model->sock,&(here->Ndevinfo),sizeof(here->Ndevinfo),0); |
|||
/* macro to make elements with built in test for out of memory */ |
|||
#define TSTALLOC(ptr,first,second) \ |
|||
if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\ |
|||
return(E_NOMEM);\ |
|||
} |
|||
|
|||
for(i=0;i<here->term;i++) |
|||
for(j=0;j<here->term;j++) |
|||
{ |
|||
TSTALLOC(mat_pointer[i*here->term+j], pin[i], pin[j]); |
|||
} |
|||
|
|||
for(i=0;i<here->term;i++) |
|||
{ |
|||
node = (CKTnode *)here->node[i]; |
|||
here->PINinfos[i].pin=node->number; |
|||
strncpy(here->PINinfos[i].name,here->bname[i],32); |
|||
here->PINinfos[i].V = 0.0; |
|||
send(model->sock,&here->PINinfos[i],sizeof(here->PINinfos[i]),0); |
|||
} |
|||
|
|||
} |
|||
} |
|||
return(OK); |
|||
|
|||
} |
|||
|
|||
int NDEVmodelConnect(GENmodel *inModel) |
|||
{ |
|||
NDEVmodel *model = (NDEVmodel *)inModel; |
|||
struct hostent *hostlist; /* List of hosts returned by gethostbyname. */ |
|||
char dotted_ip[15]; /* Buffer for converting |
|||
the resolved address to |
|||
a readable format. */ |
|||
struct sockaddr_in sa; /* Connection address. */ |
|||
void * buf = malloc(128); |
|||
|
|||
/* Look up the hostname with DNS. gethostbyname |
|||
(at least most UNIX versions of it) properly |
|||
handles dotted IP addresses as well as hostnames. */ |
|||
hostlist = gethostbyname(model->host); |
|||
if (hostlist == NULL) |
|||
{ |
|||
fprintf(stderr,"NDEV: Unable to resolve host %s.\n", model->host); |
|||
return E_PRIVATE; |
|||
} |
|||
/* Good, we have an address. However, some sites |
|||
are moving over to IPv6 (the newer version of |
|||
IP), and we're not ready for it (since it uses |
|||
a new address format). It's a good idea to check |
|||
for this. */ |
|||
if (hostlist->h_addrtype != AF_INET) |
|||
{ |
|||
fprintf(stderr,"NDEV: Host %s doesn't seem to be an IPv4 address.\n",model->host); |
|||
return E_PRIVATE; |
|||
} |
|||
|
|||
/* inet_ntop converts a 32-bit IP address to |
|||
the dotted string notation (suitable for printing). |
|||
hostlist->h_addr_list is an array of possible addresses |
|||
(in case a name resolves to more than on IP). In most |
|||
cases we just want the first. */ |
|||
inet_ntop(AF_INET, hostlist->h_addr_list[0], dotted_ip, 15); |
|||
/* Create a socket for the connection. */ |
|||
model->sock = socket(PF_INET, SOCK_STREAM, IPPROTO_IP); |
|||
|
|||
if (model->sock < 0) |
|||
{ |
|||
fprintf(stderr, "NDEV: Unable to create a socket %s.\n", strerror(errno)); |
|||
return E_PRIVATE; |
|||
} |
|||
/* Fill in the sockaddr_in structure. The address is |
|||
already in network byte order (from the gethostbyname |
|||
call). We need to convert the port number with the htons |
|||
macro. Before we do anything else, we'll zero out the |
|||
entire structure. */ |
|||
|
|||
memset(&sa, 0, sizeof(struct sockaddr_in)); |
|||
sa.sin_port = htons(model->port); |
|||
/* The IP address was returned as a char * for |
|||
various reasons. |
|||
Just memcpy it into the sockaddr_in structure. */ |
|||
memcpy(&sa.sin_addr, hostlist->h_addr_list[0], |
|||
hostlist->h_length); |
|||
/* This is an Internet socket. */ |
|||
sa.sin_family = AF_INET; |
|||
/* Connect! */ |
|||
if (connect(model->sock, (struct sockaddr *)&sa, sizeof(sa)) < 0) |
|||
{ |
|||
fprintf(stderr, "NDEV: Unable to connect %s\n",strerror(errno)); |
|||
return E_PRIVATE; |
|||
} |
|||
|
|||
sprintf((char *)buf,NG_QUERY); |
|||
send(model->sock,buf,128,0); |
|||
if(recv(model->sock,buf,128,MSG_WAITALL)<128) |
|||
{ |
|||
fprintf(stderr, "NDEV: Remote answer error. %s\n",strerror(errno)); |
|||
return E_PRIVATE; |
|||
} |
|||
|
|||
if(strncmp((char *)buf,NDEV_REPLY,sizeof(NDEV_REPLY))) |
|||
{ |
|||
fprintf(stderr, "NDEV: Remote answer error. %s\n",(char *)buf); |
|||
return E_PRIVATE; |
|||
} |
|||
|
|||
|
|||
free(buf); |
|||
return (OK); |
|||
} |
|||
|
|||
|
|||
@ -0,0 +1,27 @@ |
|||
/********** |
|||
Copyright 1992 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group |
|||
Author: 1992 David A. Gates, U. C. Berkeley CAD Group |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "ndevdefs.h" |
|||
#include "numenum.h" |
|||
#include "carddefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
#define NIL(type) ((type *)0) |
|||
|
|||
int |
|||
NDEVtemp(inModel, ckt) |
|||
GENmodel *inModel; |
|||
register CKTcircuit *ckt; |
|||
/* |
|||
* perform the temperature update to the diode |
|||
*/ |
|||
{ |
|||
|
|||
return (OK); |
|||
} |
|||
@ -0,0 +1,23 @@ |
|||
/********** |
|||
Copyright 1992 Regents of the University of California. All rights reserved. |
|||
Author: 1987 Kartikeya Mayaram, U. C. Berkeley CAD Group |
|||
**********/ |
|||
|
|||
#include "ngspice.h" |
|||
#include "cktdefs.h" |
|||
#include "ndevdefs.h" |
|||
#include "sperror.h" |
|||
#include "suffix.h" |
|||
|
|||
|
|||
|
|||
int |
|||
NDEVtrunc(inModel, ckt, timeStep) |
|||
GENmodel *inModel; |
|||
register CKTcircuit *ckt; |
|||
double *timeStep; |
|||
|
|||
{ |
|||
|
|||
return (OK); |
|||
} |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue