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