Numerical Device Interface

This commit is contained in:
gdiso 2007-05-01 03:34:34 +00:00
parent 57b40c8470
commit e98da264e1
22 changed files with 1013 additions and 0 deletions

View File

@ -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

View File

@ -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);

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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 */
}

View File

@ -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 */

View File

@ -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);
}

View File

@ -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;
}

View File

@ -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;
{
}

View 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

View File

@ -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 */

View File

@ -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;
}

View File

@ -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

View File

@ -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

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}