Browse Source

Better integration into ngspice of cpl. Updated documentation.

pre-master-46
pnenzi 23 years ago
parent
commit
333dba6018
  1. 8
      ChangeLog
  2. 9
      DEVICES
  3. 2
      src/spicelib/devices/cpl/Makefile.am
  4. 8
      src/spicelib/devices/cpl/cpl.c
  5. 42
      src/spicelib/devices/cpl/cplask.c
  6. 17
      src/spicelib/devices/cpl/cpldefs.h
  7. 17
      src/spicelib/devices/cpl/cplext.h
  8. 6
      src/spicelib/devices/cpl/cplinit.c
  9. 120
      src/spicelib/devices/cpl/cplload.c
  10. 49
      src/spicelib/devices/cpl/cplmask.c
  11. 4
      src/spicelib/devices/cpl/cplmpar.c
  12. 10
      src/spicelib/devices/cpl/cplparam.c
  13. 404
      src/spicelib/devices/cpl/cplsetup.c

8
ChangeLog

@ -1,3 +1,11 @@
2004-01-10 Paolo Nenzi <p.nenzi@ieee.org>
* src/spicelib/devices/cpl/*: Added CPLask and CPLmAsk functions to
access device's internals. Added CPLunsetup function to allow
for multiple simulations.
* DEVICES: updated with cpl changes.
2003-12-31 Paolo Nenzi <p.nenzi@ieee.org>
* src/spicelib/devices/tra/*: Cleaned code.

9
DEVICES

@ -70,11 +70,18 @@ CPL - Simple Coupled Multiconductor Lines (Kspice)
Level: 1 (and only)
Status:
This model comes from kspice. It is not documented, if
This model comes from swec and kspice. It is not documented, if
you have kspice docs, can you write a short description
of its use ?
- Does not implement parallel code switches
- Probably a lot of memory leaks
Enhancements over the original model:
- Better integrated into ngspice adding CPLask, CPLmAsk and
CPLunsetup functions
LTRA - Lossy Transmission line
Initial Release.

2
src/spicelib/devices/cpl/Makefile.am

@ -4,7 +4,9 @@ noinst_LIBRARIES = libcpl.a
libcpl_a_SOURCES = \
cpl.c \
cplask.c \
cpldest.c \
cplmask.c \
cplmdel.c \
cplparam.c \
cpldel.c \

8
src/spicelib/devices/cpl/cpl.c

@ -11,10 +11,10 @@ Author: 1992 Charles Hough
#include "suffix.h"
IFparm CPLpTable[] = {
IOP("pos_nodes", CPL_POS_NODE, IF_VECTOR|IF_STRING, "in nodes"),
IOP("neg_nodes", CPL_NEG_NODE, IF_VECTOR|IF_STRING, "out nodes"),
IOP("dimension", CPL_DIM, IF_INTEGER, "number of coupled lines"),
IOP("length", CPL_LENGTH, IF_REAL, "length of lines"),
IOPU("pos_nodes", CPL_POS_NODE, IF_VECTOR|IF_STRING, "in nodes"),
IOPU("neg_nodes", CPL_NEG_NODE, IF_VECTOR|IF_STRING, "out nodes"),
IOP("dimension", CPL_DIM, IF_INTEGER, "number of coupled lines"),
IOP("length", CPL_LENGTH, IF_REAL, "length of lines"),
};
IFparm CPLmPTable[] = { /* model parameters */

42
src/spicelib/devices/cpl/cplask.c

@ -0,0 +1,42 @@
/**********
Copyright 1992 Regents of the University of California. All rights
reserved.
Author: 2004 Paolo Nenzi
**********/
#include "ngspice.h"
#include "const.h"
#include "ifsim.h"
#include "cktdefs.h"
#include "devdefs.h"
#include "cpldefs.h"
#include "sperror.h"
#include "suffix.h"
int
CPLask(CKTcircuit *ckt, GENinstance *inst, int which, IFvalue *value, IFvalue *select)
{
CPLinstance *here = (CPLinstance *)inst;
switch(which) {
case CPL_POS_NODE:
value->v.vec.sVec = here->in_node_names;
value->v.numValue = here->dimension;
return(OK);
case CPL_NEG_NODE:
value->v.vec.sVec = here->out_node_names;
value->v.numValue = here->dimension;
return(OK);
case CPL_DIM:
value->iValue = here->dimension;
return(OK);
case CPL_LENGTH:
value->rValue = here->CPLlength;
return(OK);
default:
return(E_BADPARM);
}
return(OK);
}

17
src/spicelib/devices/cpl/cpldefs.h

@ -21,11 +21,12 @@ typedef struct sCPLinstance {
* current model*/
IFuid CPLname; /* pointer to character string naming this instance */
int CPLowner; /* number of owner process */
int CPLowner; /* number of owner process */
int CPLstate; /* not used */
int dimension;
int *CPLposNodes;
int *CPLnegNodes;
int dimension;
double CPLlength;
int *CPLibr1;
int *CPLibr2;
@ -52,10 +53,10 @@ typedef struct sCPLinstance {
double ***CPLibr1Ibr2;
double ***CPLibr2Ibr1;
unsigned CPLibr1Given : 1;
unsigned CPLibr2Given : 1;
unsigned CPLdcGiven : 1;
unsigned CPLlengthgiven : 1;
unsigned CPLibr1Given : 1;
unsigned CPLibr2Given : 1;
unsigned CPLdcGiven : 1;
unsigned CPLlengthGiven : 1;
} CPLinstance ;
@ -71,9 +72,13 @@ typedef struct sCPLmodel { /* model structure for a cpl */
IFuid CPLmodName; /* pointer to character string naming this model */
double *Rm;
int Rm_counter;
double *Gm;
int Gm_counter;
double *Lm;
int Lm_counter;
double *Cm;
int Cm_counter;
double length;
unsigned Rmgiven : 1;
unsigned Lmgiven : 1;

17
src/spicelib/devices/cpl/cplext.h

@ -3,11 +3,14 @@ Copyright 1992 Regents of the University of California. All rights
reserved.
**********/
/* extern int CPLaccept(CKTcircuit*,GENmodel*); */
extern int CPLdelete(GENmodel*,IFuid,GENinstance**);
/* extern int CPLaccept(CKTcircuit*, GENmodel*); */
extern int CPLask(CKTcircuit*, GENinstance*, int, IFvalue*, IFvalue*);
extern int CPLdelete(GENmodel*, IFuid,GENinstance**);
extern void CPLdestroy(GENmodel**);
extern int CPLload(GENmodel*,CKTcircuit*);
extern int CPLmDelete(GENmodel**,IFuid,GENmodel*);
extern int CPLmParam(int,IFvalue*,GENmodel*);
extern int CPLparam(int,IFvalue*,GENinstance*,IFvalue*);
extern int CPLsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
extern int CPLload(GENmodel*, CKTcircuit*);
extern int CPLmAsk(CKTcircuit*, GENmodel*, int, IFvalue*);
extern int CPLmDelete(GENmodel**, IFuid,GENmodel*);
extern int CPLmParam(int,IFvalue*, GENmodel*);
extern int CPLparam(int,IFvalue*, GENinstance*, IFvalue*);
extern int CPLsetup(SMPmatrix*, GENmodel*, CKTcircuit*, int*);
extern int CPLunsetup(GENmodel*, CKTcircuit*);

6
src/spicelib/devices/cpl/cplinit.c

@ -44,7 +44,7 @@ SPICEdev CPLinfo = {
DEVmodParam : CPLmParam,
DEVload : CPLload,
DEVsetup : CPLsetup,
DEVunsetup : NULL,
DEVunsetup : CPLunsetup,
DEVpzSetup : NULL,
DEVtemperature : NULL,
DEVtrunc : NULL,
@ -55,8 +55,8 @@ SPICEdev CPLinfo = {
DEVmodDelete : CPLmDelete,
DEVdelete : CPLdelete,
DEVsetic : NULL,
DEVask : NULL,
DEVmodAsk : NULL,
DEVask : CPLask,
DEVmodAsk : CPLmAsk,
DEVpzLoad : NULL,
DEVconvTest : NULL,
DEVsenSetup : NULL,

120
src/spicelib/devices/cpl/cplload.c

@ -12,26 +12,25 @@ Author: 1992 Charles Hough
VI_list *pool_vi;
static double ratio[MAX_CP_TX_LINES];
static VI_list *new_vi();
static void free_vi();
static VI_list *new_vi(void);
static void free_vi(VI_list*);
static int get_pvs_vi();
static int update_cnv();
static int add_new_vi();
static int right_consts();
static int update_delayed_cnv();
static int multC();
static int expC();
static int divC();
static void update_cnv_a();
static void copy_cp();
static int update_cnv(CPLine*, float);
static int add_new_vi(CPLinstance*, CKTcircuit*, int);
static int right_consts(CPLinstance*, CPLine*, int, int, double, double, int*, int*, CKTcircuit*);
static int update_delayed_cnv(CPLine*, float);
static int multC(double, double, double, double, double*, double*);
static int expC(double, double, double, double*, double*);
static int divC(double, double, double, double, double*, double*);
static void update_cnv_a(TMS*, float, double, double, double, double, double, double);
static void copy_cp(CPLine*, CPLine*);
/*ARGSUSED*/
int
CPLload(GENmodel *inModel, CKTcircuit *ckt)
{
register CPLmodel *model = (CPLmodel *)inModel;
register CPLinstance *here;
CPLmodel *model = (CPLmodel *)inModel;
CPLinstance *here;
CPLine *cp, *cp2;
int *k, *l;
int time, time2;
@ -62,6 +61,7 @@ CPLload(GENmodel *inModel, CKTcircuit *ckt)
here=here->CPLnextInstance) {
cp = here->cplines;
if (cond1 || cp->vi_head == NULL) continue;
noL = cp->noL = here->dimension;
@ -130,7 +130,7 @@ CPLload(GENmodel *inModel, CKTcircuit *ckt)
if (cond1) {
resindex = 0;
for (m = 0; m < noL; m++) {
if (here->CPLlengthgiven)
if (here->CPLlengthGiven)
g = model->Rm[resindex] * here->CPLlength;
else g = model->Rm[resindex] * here->CPLmodPtr->length;
*(here->CPLposIbr1[m]) += 1.0;
@ -301,8 +301,7 @@ CPLload(GENmodel *inModel, CKTcircuit *ckt)
}
static void
copy_cp(new, old)
CPLine *new, *old;
copy_cp(CPLine *new, CPLine *old)
{
int i, j, k, l, m;
VI_list *temp;
@ -359,6 +358,7 @@ CPLine *new, *old;
}
}
while (new->vi_head->time < old->vi_head->time) {
temp = new->vi_head;
new->vi_head = new->vi_head->next;
@ -368,13 +368,8 @@ CPLine *new, *old;
static int
right_consts(here, cp, t, time, h, h1, l1, l2, ckt)
CPLinstance *here;
CPLine *cp;
int t, time;
double h, h1;
int *l1, *l2;
CKTcircuit *ckt;
right_consts(CPLinstance *here, CPLine *cp, int t, int time, double h, double h1,
int *l1, int *l2, CKTcircuit *ckt)
{
int i, j, k, l;
double e;
@ -388,12 +383,12 @@ CKTcircuit *ckt;
double i1_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES];
double i2_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES];
int ext;
register int noL;
int noL;
noL = cp->noL;
for (j = 0; j < noL; j++) {
register double ff1;
double ff1;
ff[j] = 0.0;
gg[j] = 0.0;
@ -437,14 +432,14 @@ CKTcircuit *ckt;
v1_o, v2_o, i1_o, i2_o);
for (j = 0; j < noL; j++) { /** current eqn **/
register TERM *tm;
TERM *tm;
for (k = 0; k < noL; k++) /** node voltage **/
for (l = 0; l < noL; l++) /** different mode **/
if (cp->h3t[j][k][l]) {
if (cp->h3t[j][k][l]->ifImg) {
double er, ei, a, b, a1, b1, a2, b2;
register TMS *tms;
TMS *tms;
tms = cp->h3t[j][k][l];
expC(tms->tm[1].x, tms->tm[2].x, h, &er, &ei);
a2 = h1 * tms->tm[1].c;
@ -490,7 +485,7 @@ CKTcircuit *ckt;
if (cp->h2t[j][k][l]) {
if (cp->h2t[j][k][l]->ifImg) {
double er, ei, a, b, a1, b1, a2, b2;
register TMS *tms;
TMS *tms;
tms = cp->h2t[j][k][l];
expC(tms->tm[1].x, tms->tm[2].x, h, &er, &ei);
a2 = h1 * tms->tm[1].c;
@ -542,16 +537,14 @@ CKTcircuit *ckt;
}
static int
update_cnv(cp, h)
CPLine *cp;
float h;
update_cnv(CPLine *cp, float h)
{
int i, j, k;
register int noL;
int noL;
double ai, bi, ao, bo;
double e, t;
register TMS *tms;
register TERM *tm;
TMS *tms;
TERM *tm;
noL = cp->noL;
for (j = 0; j < noL; j++)
@ -596,7 +589,7 @@ float h;
}
static VI_list
*new_vi()
*new_vi(void)
{
VI_list *q;
@ -608,8 +601,7 @@ static VI_list
}
static void
free_vi(q)
VI_list *q;
free_vi(VI_list *q)
{
q->pool = pool_vi;
pool_vi = q;
@ -617,13 +609,10 @@ VI_list *q;
static int
add_new_vi(here, ckt, time)
CPLinstance *here;
CKTcircuit *ckt;
int time;
add_new_vi(CPLinstance *here, CKTcircuit *ckt, int time)
{
VI_list *vi;
register int i, noL;
int i, noL;
CPLine *cp, *cp2;
cp = here->cplines;
@ -666,13 +655,13 @@ get_pvs_vi(t1, t2, cp, v1_i, v2_i, i1_i, i2_i, v1_o, v2_o, i1_o, i2_o)
double i2_o[MAX_CP_TX_LINES][MAX_CP_TX_LINES];
{
double ta[MAX_CP_TX_LINES], tb[MAX_CP_TX_LINES];
register VI_list *vi, *vi1;
register double f;
register int i, j;
VI_list *vi, *vi1;
double f;
int i, j;
int mini = -1;
double minta = 123456789.0;
int ext = 0;
register int noL;
int noL;
noL = cp->noL;
@ -775,16 +764,14 @@ errordetect:
static int
update_delayed_cnv(cp, h)
CPLine *cp;
float h;
update_delayed_cnv(CPLine *cp, float h)
{
int i, j, k;
float *ratio;
register double f;
register VI_list *vi;
register TMS *tms;
register int noL;
double f;
VI_list *vi;
TMS *tms;
int noL;
h *= 0.5e-12;
ratio = cp->ratio;
@ -823,9 +810,8 @@ update_delayed_cnv(cp, h)
}
static int expC(ar, ai, h, cr, ci)
double ar, ai, *cr, *ci;
double h;
static int
expC(double ar, double ai, double h, double *cr, double *ci)
{
double e, cs, si;
@ -838,11 +824,11 @@ double h;
return(1);
}
static int multC(ar, ai, br, bi, cr, ci)
double ar, ai, br, bi;
double *cr, *ci;
static int
multC(double ar, double ai, double br, double bi,
double *cr, double *ci)
{
register double tp;
double tp;
tp = ar*br - ai*bi;
*ci = ar*bi+ai*br;
@ -853,11 +839,8 @@ double *cr, *ci;
}
static void
update_cnv_a(tms, h, ai, ao, bi, bo, er, ei)
TMS *tms;
float h;
double ai, bi, ao, bo;
double er, ei;
update_cnv_a(TMS *tms, float h, double ai, double ao, double bi, double bo,
double er, double ei)
{
double a, b, a1, b1;
@ -872,9 +855,8 @@ update_cnv_a(tms, h, ai, ao, bi, bo, er, ei)
tms->tm[2].cnv_o = b + h * (b1 * bo + ao * tms->tm[2].c);
}
static int divC(ar, ai, br, bi, cr, ci)
double ar, ai, br, bi;
double *cr, *ci;
static int
divC(double ar, double ai, double br, double bi, double *cr, double *ci)
{
double t;

49
src/spicelib/devices/cpl/cplmask.c

@ -0,0 +1,49 @@
/**********
Copyright 1992 Regents of the University of California. All rights
reserved.
Author: 2004 Paolo Nenzi
**********/
#include "ngspice.h"
#include "const.h"
#include "ifsim.h"
#include "cktdefs.h"
#include "devdefs.h"
#include "cpldefs.h"
#include "sperror.h"
#include "suffix.h"
/*ARGSUSED*/
int
CPLmAsk(CKTcircuit *ckt, GENmodel *inModel, int which, IFvalue *value)
{
CPLmodel *model = (CPLmodel *)inModel;
switch(which) {
case CPL_R:
value->v.vec.rVec = model->Rm;
value->v.numValue = model->Rm_counter;
return(OK);
case CPL_L:
value->v.vec.rVec = model->Lm;
value->v.numValue = model->Lm_counter;
return(OK);
case CPL_G:
value->v.vec.rVec = model->Gm;
value->v.numValue = model->Gm_counter;
return(OK);
case CPL_C:
value->v.vec.rVec = model->Cm;
value->v.numValue = model->Cm_counter;
return(OK);
case CPL_length:
value->rValue = model->length;
return(OK);
case CPL_MOD_R:
/* No op */
return(OK);
default:
return(E_BADPARM);
}
/* NOTREACHED */
}

4
src/spicelib/devices/cpl/cplmpar.c

@ -20,18 +20,22 @@ CPLmParam(int param, IFvalue *value, GENmodel *inModel)
switch(param) {
case CPL_R:
model->Rm = value->v.vec.rVec;
model->Rm_counter = value->v.numValue;
model->Rmgiven = TRUE;
break;
case CPL_L:
model->Lm = value->v.vec.rVec;
model->Lm_counter = value->v.numValue;
model->Lmgiven = TRUE;
break;
case CPL_G:
model->Gm = value->v.vec.rVec;
model->Gm_counter = value->v.numValue;
model->Gmgiven = TRUE;
break;
case CPL_C:
model->Cm = value->v.vec.rVec;
model->Cm_counter = value->v.numValue;
model->Cmgiven = TRUE;
break;
case CPL_length:

10
src/spicelib/devices/cpl/cplparam.c

@ -17,6 +17,7 @@ Author: 1992 Charles Hough
int
CPLparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
{
CPLinstance *here = (CPLinstance *)inst;
switch(param) {
case CPL_POS_NODE:
@ -28,11 +29,10 @@ CPLparam(int param, IFvalue *value, GENinstance *inst, IFvalue *select)
case CPL_DIM:
here->dimension = value->iValue;
break;
case CPL_LENGTH:
here->CPLlength = value->rValue;
here->CPLlengthgiven = TRUE;
break;
case CPL_LENGTH:
here->CPLlength = value->rValue;
here->CPLlengthGiven = TRUE;
break;
default:
return(E_BADPARM);
}

404
src/spicelib/devices/cpl/cplsetup.c

@ -2,6 +2,7 @@
Copyright 1992 Regents of the University of California. All rights
reserved.
Author: 1992 Charles Hough
Modified: 2004 Paolo Nenzi - (ng)spice integration
**********/
@ -11,24 +12,31 @@ Author: 1992 Charles Hough
#include "sperror.h"
#include "suffix.h"
#include "../cap/capdefs.h"
#include "multi_line.h"
#define VECTOR_ALLOC(vec, n) { \
int i; \
vec = (double **) malloc(n * sizeof(double *)); \
for (i = 0; i < n; i++) { \
vec[i] = (double *) malloc(sizeof(double)); \
} \
vec = (double **) tmalloc(n * sizeof(double *)); \
}
#define MATRIX_ALLOC(mat, m, j) { \
int k; \
mat = (double ***) malloc(m * sizeof(double **)); \
mat = (double ***) tmalloc(m * sizeof(double **)); \
for (k = 0; k < m; k++) { \
VECTOR_ALLOC(mat[k], j); \
} \
}
#define VECTOR_FREE(vec) free(vec)
#define MATRIX_FREE(mat, m, j) { \
int k; \
for (k = 0; k < m; k++) { \
free(mat[k]); \
} \
free(mat); \
}
#define MAX_DEG 8
#define epsilon 1.0e-88
#define MAX_STRING 128
@ -69,72 +77,69 @@ static double Scaling_F;
static double Scaling_F2;
/* misc.c match */
static void new_memory();
static double *vector();
static void free_vector();
static void polint();
/*static int match_x();*/
static int match();
static int Gaussian_Elimination2();
static void eval_Si_Si_1();
static void loop_ZY();
static void poly_matrix();
/*static int checkW();*/
static void poly_W();
static void eval_frequency();
static void store();
static void store_SiSv_1();
/*static int check();*/
static int coupled();
static int generate_out();
static int ReadCpL();
/*static int divC();*/
static void new_memory(int, int, int);
static double *vector(int, int);
static void free_vector(double*, int, int);
static void polint(double*, double*, int, double, double*, double*);
static int match(int, double*, double*, double*);
/* static int match_x(int, double*, double*, double*); */
static int Gaussian_Elimination2(int, int);
static void eval_Si_Si_1(int, double);
static void loop_ZY(int, double);
static void poly_matrix(); /* quale è il prototipo ? */
/* static int checkW(double*, double); */
static void poly_W(int, int);
static void eval_frequency(int, int);
static void store(int, int);
static void store_SiSv_1(int, int);
/*static int check(); quale è il prototipo ?*/
static int coupled(int);
static int generate_out(int, int);
static int ReadCpL(CPLinstance*, CKTcircuit*);
/* static int divC(double, double, double, double, double*, double*); */
/* mult */
static void mult_p();
static void matrix_p_mult();
static double approx_mode();
static double eval2();
static int get_c();
static int Pade_apx();
static int Gaussian_Elimination();
static double root3();
static int div3();
static int find_roots();
static NODE* insert_node();
static NDnamePt insert_ND();
static NODE* NEW_node();
static void mult_p(double*, double*, double*, int, int, int);
static void matrix_p_mult(); /* quale è il prototipo ?*/
static double approx_mode(double*, double*, double);
static double eval2(double, double, double, double);
static int get_c(double, double, double, double, double, double, double, double*, double*);
static int Pade_apx(double, double*, double*, double*, double*, double*, double*, double*);
static int Gaussian_Elimination(int);
static double root3(double, double, double, double);
static int div3(double, double, double, double, double*, double*);
static int find_roots(double, double, double, double*, double*,double*);
static NODE* insert_node(char*);
static NDnamePt insert_ND(char*, NDnamePt*);
static NODE* NEW_node(void);
static NDnamePt ndn;
static NODE *node_tab;
#define epsi_mult 1e-28
/* diag */
static MAXE_PTR sort();
static void ordering();
static MAXE_PTR delete_1();
static void reordering();
static void diag();
static int rotate();
static MAXE_PTR sort(MAXE_PTR, float, int, int, MAXE_PTR);
static void ordering(void);
static MAXE_PTR delete_1(MAXE_PTR*, int);
static void reordering(int, int);
static void diag(int);
static int rotate(int, int, int);
#define epsi 1.0e-16
static char *message = "tau of coupled lines is larger than max time step";
/* ARGSUSED */
int
CPLsetup(matrix,inModel,ckt,state)
register SMPmatrix *matrix;
GENmodel *inModel;
CKTcircuit*ckt;
int *state;
CPLsetup(SMPmatrix *matrix, GENmodel *inModel, CKTcircuit *ckt, int *state)
{
register CPLmodel *model = (CPLmodel *)inModel;
register CPLinstance *here;
CPLmodel *model = (CPLmodel *)inModel;
CPLinstance *here;
CKTnode *tmp, *node;
int error, m, p;
char **branchname;
int noL;
/* loop through all the models */
for( ; model != NULL; model = model->CPLnextModel ) {
@ -142,26 +147,32 @@ CPLsetup(matrix,inModel,ckt,state)
for (here = model->CPLinstances; here != NULL ;
here=here->CPLnextInstance) {
if (!here->CPLlengthGiven)
here->CPLlength=0.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);\
}
noL = here->dimension;
here->CPLposNodes = (int *) malloc(noL * sizeof(int));
here->CPLnegNodes = (int *) malloc(noL * sizeof(int));
here->CPLibr1 = (int *) malloc(noL * sizeof(int));
here->CPLibr2 = (int *) malloc(noL * sizeof(int));
here->CPLposNodes = (int *) tmalloc(noL * sizeof(int));
here->CPLnegNodes = (int *) tmalloc(noL * sizeof(int));
here->CPLibr1 = (int *) tmalloc(noL * sizeof(int));
here->CPLibr2 = (int *) tmalloc(noL * sizeof(int));
VECTOR_ALLOC(here->CPLibr1Ibr1, noL);
VECTOR_ALLOC(here->CPLibr2Ibr2, noL);
VECTOR_ALLOC(here->CPLposIbr1, noL);
VECTOR_ALLOC(here->CPLnegIbr2, noL);
VECTOR_ALLOC(here->CPLposPos, noL);
VECTOR_ALLOC(here->CPLnegIbr2, noL);
VECTOR_ALLOC(here->CPLposPos, noL);
VECTOR_ALLOC(here->CPLnegNeg, noL);
VECTOR_ALLOC(here->CPLnegPos, noL);
VECTOR_ALLOC(here->CPLposNeg, noL);
VECTOR_ALLOC(here->CPLnegPos, noL);
VECTOR_ALLOC(here->CPLposNeg, noL);
MATRIX_ALLOC(here->CPLibr1Pos, noL, noL);
MATRIX_ALLOC(here->CPLibr2Neg, noL, noL);
@ -170,10 +181,11 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
MATRIX_ALLOC(here->CPLibr1Ibr2, noL, noL);
MATRIX_ALLOC(here->CPLibr2Ibr1, noL, noL);
branchname = (char **) malloc(sizeof(char *) * here->dimension);
branchname = (char **) tmalloc(sizeof(char *) * here->dimension);
if (! here->CPLibr1Given) {
for (m = 0; m < here->dimension; m++) {
branchname[m] = malloc(MAX_STRING);
branchname[m] = tmalloc(MAX_STRING);
sprintf(branchname[m], "branch1_%d", m);
error =
CKTmkCur(ckt, &tmp, here->CPLname, branchname[m]);
@ -183,10 +195,10 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
here->CPLibr1Given = 1;
}
free(branchname);
branchname = (char **) malloc(sizeof(char *) * here->dimension);
branchname = (char **) tmalloc(sizeof(char *) * here->dimension);
if (! here->CPLibr2Given) {
for (m = 0; m < here->dimension; m++) {
branchname[m] = malloc(MAX_STRING);
branchname[m] = tmalloc(MAX_STRING);
sprintf(branchname[m], "branch2_%d", m);
error =
CKTmkCur(ckt, &tmp, here->CPLname, branchname[m]);
@ -245,10 +257,72 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
}
int
CPLunsetup(GENmodel *inModel, CKTcircuit *ckt)
{
CPLmodel *model;
CPLinstance *here;
int m;
int noL;
for (model = (CPLmodel *) inModel; model != NULL;
model = model->CPLnextModel) {
for (here = model->CPLinstances; here != NULL;
here = here->CPLnextInstance) {
noL = here->dimension;
VECTOR_FREE(here->CPLibr1Ibr1);
VECTOR_FREE(here->CPLibr2Ibr2);
VECTOR_FREE(here->CPLposIbr1);
VECTOR_FREE(here->CPLnegIbr2);
VECTOR_FREE(here->CPLposPos);
VECTOR_FREE(here->CPLnegNeg);
VECTOR_FREE(here->CPLnegPos);
VECTOR_FREE(here->CPLposNeg);
MATRIX_FREE(here->CPLibr1Pos, noL, noL);
MATRIX_FREE(here->CPLibr2Neg, noL, noL);
MATRIX_FREE(here->CPLibr1Neg, noL, noL);
MATRIX_FREE(here->CPLibr2Pos, noL, noL);
MATRIX_FREE(here->CPLibr1Ibr2, noL, noL);
MATRIX_FREE(here->CPLibr2Ibr1, noL, noL);
for (m = 0; m < noL; m++) {
if (here->CPLibr1[m]) {
CKTdltNNum(ckt, here->CPLibr1[m]);
here->CPLibr1[m] = 0;
}
}
for (m = 0; m < noL; m++) {
if (here->CPLibr2[m]) {
CKTdltNNum(ckt, here->CPLibr2[m]);
here->CPLibr2[m] = 0;
}
}
free(here->CPLposNodes);
free(here->CPLnegNodes);
free(here->CPLibr1);
free(here->CPLibr2);
/* reset switches */
here->CPLdcGiven=0;
here->CPLibr1Given = 0;
here->CPLibr2Given = 0;
}
}
return OK;
}
static int
ReadCpL(here, ckt)
CPLinstance *here;
CKTcircuit *ckt;
ReadCpL(CPLinstance *here, CKTcircuit *ckt)
{
int i, j, noL, counter;
float f;
@ -259,15 +333,15 @@ CKTcircuit *ckt;
RLINE *lines[MAX_CP_TX_LINES];
ERLINE *er;
c = (CPLine *) malloc(sizeof (CPLine));
c2 = (CPLine *) malloc(sizeof (CPLine));
c = (CPLine *) tmalloc(sizeof (CPLine));
c2 = (CPLine *) tmalloc(sizeof (CPLine));
c->vi_head = c->vi_tail = NULL;
noL = c->noL = here->dimension;
here->cplines = c;
here->cplines2 = c2;
for (i = 0; i < noL; i++) {
ec = (ECPLine *) malloc(sizeof (ECPLine));
ec = (ECPLine *) tmalloc(sizeof (ECPLine));
name = here->in_node_names[i];
nd = insert_node(name);
ec->link = nd->cplptr;
@ -276,17 +350,17 @@ CKTcircuit *ckt;
c->in_node[i] = nd;
c2->in_node[i] = nd;
er = (ERLINE *) malloc(sizeof (ERLINE));
er = (ERLINE *) tmalloc(sizeof (ERLINE));
er->link = nd->rlptr;
nd->rlptr = er;
er->rl = lines[i] = (RLINE *) malloc(sizeof (RLINE));
er->rl = lines[i] = (RLINE *) tmalloc(sizeof (RLINE));
er->rl->in_node = nd;
c->dc1[i] = c->dc2[i] = 0.0;
}
for (i = 0; i < noL; i++) {
ec = (ECPLine *) malloc(sizeof (ECPLine));
ec = (ECPLine *) tmalloc(sizeof (ECPLine));
name = here->out_node_names[i];
nd = insert_node(name);
ec->link = nd->cplptr;
@ -295,7 +369,7 @@ CKTcircuit *ckt;
c->out_node[i] = nd;
c2->out_node[i] = nd;
er = (ERLINE *) malloc(sizeof (ERLINE));
er = (ERLINE *) tmalloc(sizeof (ERLINE));
er->link = nd->rlptr;
nd->rlptr = er;
er->rl = lines[i];
@ -314,7 +388,7 @@ CKTcircuit *ckt;
}
else {
f = here->CPLmodPtr->Rm[counter];
R_m[i][j] =here->CPLmodPtr->Rm[counter]= MAX(f, 1.0e-4);
R_m[i][j] = here->CPLmodPtr->Rm[counter] = MAX(f, 1.0e-4);
G_m[i][j] = here->CPLmodPtr->Gm[counter];
L_m[i][j] = here->CPLmodPtr->Lm[counter];
C_m[i][j] = here->CPLmodPtr->Cm[counter];
@ -322,7 +396,7 @@ CKTcircuit *ckt;
}
}
}
if (here->CPLlengthgiven)
if (here->CPLlengthGiven)
length = here->CPLlength;
else length = here->CPLmodPtr->length;
@ -340,7 +414,7 @@ CKTcircuit *ckt;
if (SIV[i][j].C_0 == 0.0)
c->h1t[i][j] = NULL;
else {
c->h1t[i][j] = (TMS *) malloc(sizeof (TMS));
c->h1t[i][j] = (TMS *) tmalloc(sizeof (TMS));
d = c->h1t[i][j]->aten = SIV[i][j].C_0;
c->h1t[i][j]->ifImg = (int) SIV[i][j].Poly[6] - 1.0;
/* since originally 2 for img 1 for noimg */
@ -364,7 +438,7 @@ CKTcircuit *ckt;
if (IWI[i][j].C_0[k] == 0.0)
c->h2t[i][j][k] = NULL;
else {
c->h2t[i][j][k] = (TMS *) malloc(sizeof (TMS));
c->h2t[i][j][k] = (TMS *) tmalloc(sizeof (TMS));
d = c->h2t[i][j][k]->aten = IWI[i][j].C_0[k];
c->h2t[i][j][k]->ifImg = (int) IWI[i][j].Poly[k][6] - 1.0;
/* since originally 2 for img 1 for noimg */
@ -385,7 +459,7 @@ CKTcircuit *ckt;
if (IWV[i][j].C_0[k] == 0.0)
c->h3t[i][j][k] = NULL;
else {
c->h3t[i][j][k] = (TMS *) malloc(sizeof (TMS));
c->h3t[i][j][k] = (TMS *) tmalloc(sizeof (TMS));
d = c->h3t[i][j][k]->aten = IWV[i][j].C_0[k];
c->h3t[i][j][k]->ifImg = (int) IWV[i][j].Poly[k][6] - 1.0;
/* since originally 2 for img 1 for noimg */
@ -409,7 +483,7 @@ CKTcircuit *ckt;
for (i = 0; i < noL; i++) {
if (c->taul[i] < ckt->CKTmaxStep) {
errMsg = MALLOC(strlen(message)+1);
errMsg = tmalloc(strlen(message)+1);
strcpy(errMsg,message);
return(-1);
}
@ -426,8 +500,7 @@ CKTcircuit *ckt;
static void
new_memory(dim, deg, deg_o)
int dim, deg, deg_o;
new_memory(int dim, int deg, int deg_o)
{
int i, j;
@ -460,14 +533,13 @@ new_memory(dim, deg, deg_o)
static double
*vector(nl, nh)
int nl, nh;
*vector(int nl, int nh)
{
double *v;
v = (double *) malloc((unsigned) (nh - nl +1) * sizeof(double));
v = (double *) tmalloc((unsigned) (nh - nl +1) * sizeof(double));
if (!v) {
fprintf(stderr, "Memory Allocation Error by malloc in vector().\n");
fprintf(stderr, "Memory Allocation Error by tmalloc in vector().\n");
fprintf(stderr, "...now exiting to system ...\n");
exit(0);
}
@ -475,28 +547,23 @@ static double
}
static void
free_vector(v, nl, nh)
double *v;
int nl, nh;
free_vector(double *v, int nl, int nh)
{
free((char*) (v +nl));
free((void*) (v +nl));
}
static void
polint(xa, ya, n, x, y, dy)
polint(double *xa, double *ya, int n, double x, double *y, double *dy)
/*
Given arrays xa[1..n] and ya[1..n], and given a value x, this routine
returns a value y, and an error estimate dy. If P(x) is the
polynomial of degree n-1 such that P(xa) = ya, then the returned
value y = P(x)
*/
double xa[], ya[], x, *y, *dy;
int n;
{
int i, m, ns = 1;
double den, dif, dift, ho, hp, w;
double *c, *d, *vector();
void free_vector();
double *c, *d;
dif = ABS(x - xa[1]);
c = vector(1, n);
@ -531,9 +598,7 @@ polint(xa, ya, n, x, y, dy)
}
static int
match(n, cof, xa, ya)
double xa[], ya[], cof[];
int n;
match(int n, double *cof, double *xa, double *ya)
/*
Given arrays xa[0..n] and ya[0..n] containing a tabulated function
ya = f(xa), this routine returns an array of coefficients cof[0..n],
@ -541,8 +606,7 @@ match(n, cof, xa, ya)
*/
{
int k, j, i;
double xmin, dy, *x, *y, *xx, *vector();
void polint(), free_vector();
double xmin, dy, *x, *y, *xx;
x = vector(0, n);
y = vector(0, n);
@ -591,11 +655,7 @@ match(n, cof, xa, ya)
***/
/***
static int
match_x(dim, Alfa, X, Y)
int dim;
double X[];
double Y[];
double Alfa[];
match_x(int dim, double *Alfa, double *X, double *Y)
{
int i, j;
double f;
@ -645,14 +705,12 @@ match_x(dim, Alfa, X, Y)
***/
static int
Gaussian_Elimination2(dims, type)
Gaussian_Elimination2(int dims, int type)
/* type = 1 : to solve a linear system
-1 : to inverse a matrix */
int dims;
int type;
{
register int i, j, k, dim;
register double f;
int i, j, k, dim;
double f;
double max;
int imax;
@ -702,9 +760,7 @@ Gaussian_Elimination2(dims, type)
/***
static void
eval_Si_Si_1(dim, y)
int dim;
double y;
eval_Si_Si_1(int dim, double y)
{
int i, j, k;
@ -743,9 +799,7 @@ eval_Si_Si_1(dim, y)
***/
static void
eval_Si_Si_1(dim, y)
int dim;
double y;
eval_Si_Si_1(int dim, double y)
{
int i, j, k;
@ -782,9 +836,7 @@ eval_Si_Si_1(dim, y)
/***
static void
loop_ZY(dim, y)
int dim;
double y;
loop_ZY(int dim, double y)
{
int i, j, k;
double fmin, fmin1;
@ -877,9 +929,7 @@ loop_ZY(dim, y)
***/
static void
loop_ZY(dim, y)
int dim;
double y;
loop_ZY(int dim, double y)
{
int i, j, k;
double fmin, fmin1;
@ -976,7 +1026,7 @@ loop_ZY(dim, y)
***/
static void
poly_matrix(A, dim, deg)
poly_matrix(A, dim, deg)
double *A[MAX_DIM][MAX_DIM];
int dim, deg;
{
@ -991,8 +1041,7 @@ poly_matrix(A, dim, deg)
***/
/***
static int
checkW(W, d)
double W[], d;
checkW(double *W, double d)
{
double f, y;
float y1;
@ -1017,11 +1066,9 @@ checkW(W, d)
***/
static void
poly_W(dim, deg)
int dim, deg;
poly_W(int dim, int deg)
{
int i;
extern double approx_mode();
for (i = 0; i < dim; i++) {
match(deg, W[i], frequency, W[i]);
@ -1036,8 +1083,7 @@ poly_W(dim, deg)
***/
static void
eval_frequency(dim, deg_o)
int deg_o;
eval_frequency(int dim, int deg_o)
{
int i, im;
double min;
@ -1077,8 +1123,7 @@ eval_frequency(dim, deg_o)
***/
static void
store(dim, ind)
int ind;
store(int dim, int ind)
{
int i, j;
@ -1100,7 +1145,7 @@ store(dim, ind)
***/
static void
store_SiSv_1(dim, ind)
store_SiSv_1(int dim, int ind)
{
int i, j, k;
double temp;
@ -1198,8 +1243,7 @@ check(Sip, Si_1p, Sv_1p, SiSv_1p)
***/
static int
coupled(dim)
int dim;
coupled(int dim)
{
int deg, deg_o;
int i;
@ -1247,8 +1291,7 @@ coupled(dim)
***/
static int
generate_out(dim, deg_o)
int dim, deg_o;
generate_out(int dim, int deg_o)
{
int i, j, k, rtv;
double C;
@ -1373,10 +1416,8 @@ generate_out(dim, deg_o)
****************************************************************/
static void
mult_p(p1, p2, p3, d1, d2, d3)
mult_p(double *p1, double *p2, double *p3, int d1, int d2, int d3)
/* p3 = p1 * p2 */
double *p1, *p2, *p3;
int d1, d2, d3;
{
int i, j, k;
@ -1447,8 +1488,7 @@ matrix_p_mult(A, D, B, dim, deg, deg_o, X)
***/
static double
approx_mode(X, b, length)
double X[], b[], length;
approx_mode(double *X, double *b, double length)
{
double w0, w1, w2, w3, w4, w5;
double a[8];
@ -1504,8 +1544,7 @@ approx_mode(X, b, length)
***/
static double
eval2(a, b, c, x)
double a, b, c, x;
eval2(double a, double b, double c, double x)
{
return(a*x*x + b*x + c);
}
@ -1514,9 +1553,8 @@ eval2(a, b, c, x)
***/
static int
get_c(q1, q2, q3, p1, p2, a, b, cr, ci)
double q1, q2, q3, p1, p2, a, b;
double *cr, *ci;
get_c(double q1, double q2, double q3, double p1, double p2, double a, double b,
double *cr, double *ci)
{
double d, n;
@ -1534,7 +1572,8 @@ get_c(q1, q2, q3, p1, p2, a, b, cr, ci)
static int
Pade_apx(a_b, b, c1, c2, c3, x1, x2, x3)
Pade_apx(double a_b, double *b, double *c1, double *c2, double *c3,
double *x1, double *x2, double *x3)
/*
b[0] + b[1]*y + b[2]*y^2 + ... + b[5]*y^5 + ...
= (q3*y^3 + q2*y^2 + q1*y + 1) / (p3*y^3 + p2*y^2 + p1*y + 1)
@ -1546,10 +1585,6 @@ Pade_apx(a_b, b, c1, c2, c3, x1, x2, x3)
= (s^3 + q1*s^2 + q2*s + q3) / (s^3 + p1*s^2 + p2*s + p3)
= c1 / (s - x1) + c2 / (s - x2) + c3 / (s - x3) + 1.0
*/
double a_b;
double b[];
double *c1, *c2, *c3;
double *x1, *x2, *x3;
{
double p1, p2, p3, q1, q2, q3;
@ -1604,11 +1639,10 @@ Pade_apx(a_b, b, c1, c2, c3, x1, x2, x3)
}
static int
Gaussian_Elimination(dims)
int dims;
Gaussian_Elimination(int dims)
{
register int i, j, k, dim;
register double f;
int i, j, k, dim;
double f;
double max;
int imax;
@ -1652,9 +1686,7 @@ Gaussian_Elimination(dims)
}
static double
root3(a1, a2, a3, x)
double x;
double a1, a2, a3;
root3(double a1, double a2, double a3, double x)
{
double t1, t2;
@ -1665,10 +1697,7 @@ root3(a1, a2, a3, x)
}
static int
div3(a1, a2, a3, x, p1, p2)
double x;
double a1, a2, a3;
double *p1, *p2;
div3(double a1, double a2, double a3, double x, double *p1, double *p2)
{
*p1 = a1 + x;
@ -1681,9 +1710,7 @@ div3(a1, a2, a3, x, p1, p2)
static int
find_roots(a1, a2, a3, x1, x2, x3)
double a1, a2, a3;
double *x1, *x2, *x3;
find_roots(double a1, double a2, double a3, double *x1, double *x2, double *x3)
{
double x, t;
double p, q;
@ -1783,15 +1810,13 @@ find_roots(a1, a2, a3, x1, x2, x3)
static NDnamePt
insert_ND(name, ndn)
char *name;
NDnamePt *ndn;
insert_ND(char *name, NDnamePt *ndn)
{
int cmp;
NDnamePt p;
if (*ndn == NULL) {
p = *ndn = (NDnamePt) malloc(sizeof (NDname));
p = *ndn = (NDnamePt) tmalloc(sizeof (NDname));
p->nd = NULL;
p->right = p->left = NULL;
strcpy(p->id, name);
@ -1809,8 +1834,7 @@ insert_ND(name, ndn)
}
static NODE *
insert_node(name)
char *name;
insert_node(char *name)
{
NDnamePt n;
NODE *p;
@ -1827,9 +1851,7 @@ insert_node(name)
return(n->nd);
}
/***
static int divC(ar, ai, br, bi, cr, ci)
double ar, ai, br, bi;
double *cr, *ci;
static int divC(double ar, double ai, double br, double bi, double *cr, double *ci)
{
double t;
@ -1842,14 +1864,14 @@ double *cr, *ci;
***/
static NODE
*NEW_node()
*NEW_node(void)
{
/*
char *malloc();
char *tmalloc();
*/
NODE *n;
n = (NODE *) malloc (sizeof (NODE));
n = (NODE *) tmalloc (sizeof (NODE));
n->mptr = NULL;
n->gptr = NULL;
n->cptr = NULL;
@ -1885,10 +1907,7 @@ static int dim;
static MAXE_PTR row;
static MAXE_PTR
sort(list, val, r, c, e)
MAXE_PTR list, e;
float val;
int r, c;
sort(MAXE_PTR list, float val, int r, int c, MAXE_PTR e)
{
if (list == NULL || list->value < val) {
e->row = r;
@ -1904,7 +1923,7 @@ sort(list, val, r, c, e)
static void
ordering()
ordering(void)
{
MAXE_PTR e;
int i, j, m;
@ -1919,16 +1938,14 @@ ordering()
mv = ABS(ZY[i][j]);
m = j;
}
e = (MAXE_PTR) malloc(sizeof (MAXE));
e = (MAXE_PTR) tmalloc(sizeof (MAXE));
row = sort(row, mv, i, m, e);
}
}
static MAXE_PTR
delete_1(list, rc)
MAXE_PTR *list;
int rc;
delete_1(MAXE_PTR *list, int rc)
{
MAXE_PTR list1, e;
@ -1945,8 +1962,7 @@ delete_1(list, rc)
static void
reordering(p, q)
int p, q;
reordering(int p, int q)
{
MAXE_PTR e;
int j, m;
@ -1978,8 +1994,7 @@ reordering(p, q)
}
static void
diag(dims)
int dims;
diag(int dims)
{
int i, j, c;
double fmin, fmax;
@ -2029,8 +2044,7 @@ diag(dims)
****************************************************************/
static int
rotate(dim, p, q)
int p, q, dim;
rotate(int dim, int p, int q)
{
int j;
double co, si;

Loading…
Cancel
Save