Cleaned up code for TXL and added unsetup function.

This commit is contained in:
pnenzi 2004-01-14 18:58:44 +00:00
parent 0603ce82f1
commit 17cd696a62
6 changed files with 165 additions and 163 deletions

View File

@ -1,3 +1,10 @@
2004-01-14 Paolo Nenzi <p.nenzi@ieee.org>
* src/spicelib/devices/txl/*: Added TXLunsetup function to allow
for multiple simulations.
* DEVICES: Updated txl status.
2004-01-11 Paolo Nenzi <p.nenzi@ieee.org>
* src/spicelib/analysis/*: Removed redundant includes. File stdio.h

View File

@ -11,18 +11,18 @@ Author: 1992 Charles Hough
#include "suffix.h"
IFparm TXLpTable[] = {
IP("pos_node", TXL_IN_NODE, IF_INTEGER,"Positive node of txl"),
IP("neg_node", TXL_OUT_NODE, IF_INTEGER,"Negative node of txl"),
IP("pos_node", TXL_IN_NODE, IF_INTEGER,"Positive node of txl"),
IP("neg_node", TXL_OUT_NODE, IF_INTEGER,"Negative node of txl"),
IOP("length", TXL_LENGTH, IF_REAL,"length of line"),
};
IFparm TXLmPTable[] = { /* model parameters */
IOP( "r", TXL_R, IF_REAL,"resistance per length"),
IOP( "l", TXL_L, IF_REAL,"inductance per length"),
IOP( "c", TXL_C, IF_REAL,"capacitance per length"),
IOP( "g", TXL_G, IF_REAL,"conductance per length"),
IOP( "r", TXL_R, IF_REAL,"resistance per length"),
IOP( "l", TXL_L, IF_REAL,"inductance per length"),
IOP( "c", TXL_C, IF_REAL,"capacitance per length"),
IOP( "g", TXL_G, IF_REAL,"conductance per length"),
IOP( "length", TXL_length, IF_REAL,"length"),
IP( "txl", TXL_MOD_R, IF_FLAG,"Device is a txl model"),
IP( "txl", TXL_MOD_R, IF_FLAG,"Device is a txl model"),
};
char *TXLnames[] = {

View File

@ -11,3 +11,4 @@ extern int TXLmDelete(GENmodel**,IFuid,GENmodel*);
extern int TXLmParam(int,IFvalue*,GENmodel*);
extern int TXLparam(int,IFvalue*,GENinstance*,IFvalue*);
extern int TXLsetup(SMPmatrix*,GENmodel*,CKTcircuit*,int*);
extern int TXLunsetup(GENmodel*, CKTcircuit*);

View File

@ -49,7 +49,7 @@ SPICEdev TXLinfo = {
DEVmodParam : TXLmParam,
DEVload : TXLload,
DEVsetup : TXLsetup,
DEVunsetup : NULL,
DEVunsetup : TXLunsetup,
DEVpzSetup : NULL,
DEVtemperature: NULL,
DEVtrunc : NULL,

View File

@ -12,16 +12,17 @@ Author: 1992 Charles Hough
static double ratio[MAX_CP_TX_LINES];
static int update_cnv_txl();
static VI_list_txl *new_vi_txl();
static void free_vi_txl();
static int add_new_vi_txl();
static int get_pvs_vi_txl();
static int right_consts_txl();
static int update_delayed_cnv_txl();
static int multC();
static int expC();
static void copy_tx();
static int update_cnv_txl(TXLine*, float);
static VI_list_txl *new_vi_txl(void);
static void free_vi_txl(VI_list_txl*);
static int add_new_vi_txl(TXLinstance*, CKTcircuit*, int);
static int get_pvs_vi_txl(int, int, TXLine*, double*, double*, double*, double*, double*,
double*, double*, double*);
static int right_consts_txl(TXLine*, int, int, double, double, int, int, CKTcircuit*);
static int update_delayed_cnv_txl(TXLine*, float);
static int multC(double, double, double, double, double*, double*);
static int expC(double, double, float, double*, double*);
static void copy_tx(TXLine *, TXLine *);
/*static char *message = "tau of txl line is larger than max time step";*/
/*ARGSUSED*/
@ -249,8 +250,8 @@ TXLload(GENmodel *inModel, CKTcircuit *ckt)
return(OK);
}
static void copy_tx(new, old)
TXLine *new, *old;
static void
copy_tx(TXLine *new, TXLine *old)
{
int i;
VI_list_txl *temp;
@ -298,14 +299,13 @@ TXLine *new, *old;
}
static int update_cnv_txl(tx, h)
TXLine *tx;
float h;
static int
update_cnv_txl(TXLine *tx, float h)
{
int i;
double ai, bi, ao, bo;
register double e, t;
double e, t;
ai = tx->in_node->V;
ao = tx->out_node->V;
@ -313,7 +313,7 @@ static int update_cnv_txl(tx, h)
bo = tx->out_node->dv;
for (i = 0; i < 3; i++) {
register TERM *tm;
TERM *tm;
tm = &(tx->h1_term[i]);
e = tx->h1e[i];
@ -330,7 +330,7 @@ static int update_cnv_txl(tx, h)
static VI_list_txl
*new_vi_txl()
*new_vi_txl(void)
{
VI_list_txl *q;
@ -339,22 +339,19 @@ static VI_list_txl
pool_vi_txl = pool_vi_txl->pool;
return(q);
} else
return((VI_list_txl *) malloc (sizeof (VI_list_txl)));
return((VI_list_txl *) tmalloc (sizeof (VI_list_txl)));
}
static void
free_vi_txl(q)
VI_list_txl *q;
free_vi_txl(VI_list_txl *q)
{
q->pool = pool_vi_txl;
pool_vi_txl = q;
}
static int add_new_vi_txl(here, ckt, time)
TXLinstance *here;
CKTcircuit *ckt;
int time;
static int
add_new_vi_txl(TXLinstance *here, CKTcircuit *ckt, int time)
{
VI_list_txl *vi;
TXLine *tx, *tx2;
@ -378,15 +375,13 @@ int time;
}
static int
get_pvs_vi_txl(t1, t2, tx, v1_i, v2_i, i1_i, i2_i, v1_o, v2_o, i1_o, i2_o)
TXLine *tx;
int t1, t2;
double *v1_i, *v2_i, *i1_i, *i2_i, *v1_o, *v2_o, *i1_o, *i2_o;
static int
get_pvs_vi_txl(int t1, int t2, TXLine *tx, double *v1_i, double *v2_i, double *i1_i, double *i2_i,
double *v1_o, double *v2_o, double *i1_o, double *i2_o)
{
double ta, tb;
register VI_list_txl *vi, *vi1;
register double f;
VI_list_txl *vi, *vi1;
double f;
int ext = 0;
ta = t1 - tx->taul;
@ -465,21 +460,17 @@ get_pvs_vi_txl(t1, t2, tx, v1_i, v2_i, i1_i, i2_i, v1_o, v2_o, i1_o, i2_o)
static int
right_consts_txl(tx, t, time, h, h1, l1, l2, ckt)
TXLine *tx;
int t, time;
double h, h1; /*** h1 = 0.5 * h ***/
int l1, l2;
CKTcircuit *ckt;
right_consts_txl(TXLine *tx, int t, int time, double h, double h1, int l1, int l2, CKTcircuit *ckt)
/*** h1 = 0.5 * h ***/
{
int i;
register double ff=0.0, gg=0.0, e;
double ff=0.0, gg=0.0, e;
double v1_i, v2_i, i1_i, i2_i;
double v1_o, v2_o, i1_o, i2_o;
int ext;
if (! tx->lsl) {
register double ff1=0.0;
double ff1=0.0;
for (i = 0; i < 3; i++) {
tx->h1e[i] = e = exp((double) tx->h1_term[i].x * h);
ff1 -= tx->h1_term[i].c * e;
@ -500,7 +491,7 @@ CKTcircuit *ckt;
double a, b, er, ei, a1, b1, a2, b2;
for (i = 0; i < 4; i++) {
register TERM *tm;
TERM *tm;
tm = &(tx->h3_term[i]);
e = exp((double) tm->x * h);
tm->cnv_i = tm->cnv_i * e + h1 * tm->c * (v1_i * e + v2_i);
@ -535,7 +526,7 @@ CKTcircuit *ckt;
gg += tx->h3_term[4].cnv_i;
{
register TERM *tm;
TERM *tm;
tm = &(tx->h2_term[0]);
e = exp((double) tm->x * h);
@ -566,7 +557,7 @@ CKTcircuit *ckt;
2.0 * tx->h2_term[1].cnv_i;
} else {
for (i = 0; i < 6; i++) {
register TERM *tm;
TERM *tm;
tm = &(tx->h3_term[i]);
e = exp((double) tm->x * h);
@ -583,7 +574,7 @@ CKTcircuit *ckt;
}
for (i = 0; i < 3; i++) {
register TERM *tm;
TERM *tm;
tm = &(tx->h2_term[i]);
e = exp((double) tm->x * h);
@ -609,14 +600,12 @@ CKTcircuit *ckt;
static int
update_delayed_cnv_txl(tx, h)
TXLine *tx;
float h;
update_delayed_cnv_txl(TXLine *tx, float h)
{
float ratio;
register double f;
register VI_list_txl *vi;
register TERM *tms;
double f;
VI_list_txl *vi;
TERM *tms;
h *= 0.5e-12;
ratio = tx->ratio;
@ -655,9 +644,8 @@ update_delayed_cnv_txl(tx, h)
return(1);
}
static int expC(ar, ai, h, cr, ci)
double ar, ai, *cr, *ci;
float h;
static int
expC(double ar, double ai, float h, double *cr, double *ci)
{
double e, cs, si;
@ -670,9 +658,8 @@ static int expC(ar, ai, h, cr, ci)
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;

View File

@ -11,38 +11,36 @@ Author: 1992 Charles Hough
#include "sperror.h"
#include "suffix.h"
#include "../cap/capdefs.h"
static int ReadTxL();
static int ReadTxL(TXLinstance*, CKTcircuit*);
/*static int multC();*/
static int main_pade();
static int mac();
static int main_pade(double, double, double, double, double, TXLine*);
static int mac(double, double, double*, double*, double*, double*, double*);
/*static int divC();*/
static int div_C();
static int div3();
static int div_C(double, double, double, double, double*, double*);
static int div3(double, double, double, double, double*, double*);
/*static double approx1();*/
/*static double approx2();*/
static int find_roots();
static int find_roots(double, double, double, double*, double*, double*);
/*static double f3();*/
/*static double f2();*/
/*static int expC();*/
/*static double exp_approx1();*/
/*static double exp_approx2();*/
static int exp_pade();
static int exp_pade(float, float, float, float, float, TXLine*);
/*static int exp_div3();*/
static int exp_find_roots();
static double eval2();
static int get_c();
static int get_h3();
static int Gaussian_Elimination2();
static int Gaussian_Elimination1();
static int pade();
static int update_h1C_c();
static void y_pade();
static double root3();
static NDnamePt insert_ND();
static NODE *insert_node();
static NODE *NEW_node();
static int exp_find_roots(double, double, double, 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 get_h3(TXLine*);
static int Gaussian_Elimination2(int);
static int Gaussian_Elimination1(int);
static int pade(float);
static int update_h1C_c(TXLine *);
static void y_pade(double, double, double, double, TXLine*);
static double root3(double, double, double, double);
static NDnamePt insert_ND(char*, NDnamePt*);
static NODE *insert_node(char*);
static NODE *NEW_node(void);
/*static VI_list_txl *new_vi_txl();*/
NODE *node_tab = NULL;
@ -131,9 +129,37 @@ if((here->ptr = SMPmakeElt(matrix,here->first,here->second))==(double *)NULL){\
return(OK);
}
int
TXLunsetup(GENmodel *inModel, CKTcircuit *ckt)
{
TXLmodel *model;
TXLinstance *here;
for (model = (TXLmodel *) inModel; model != NULL;
model = model->TXLnextModel) {
for (here = model->TXLinstances; here != NULL;
here = here->TXLnextInstance) {
if (here->TXLibr1) {
CKTdltNNum(ckt, here->TXLibr1);
here->TXLibr1 = 0;
}
if (here->TXLibr2) {
CKTdltNNum(ckt, here->TXLibr2);
here->TXLibr2 = 0;
}
here->TXLdcGiven=0;
}
}
return OK;
}
/***
static VI_list_txl
*new_vi_txl()
*new_vi_txl(void)
{
VI_list_txl *q;
@ -142,13 +168,12 @@ static VI_list_txl
pool_vi_txl = pool_vi_txl->pool;
return(q);
} else
return((VI_list_txl *) malloc (sizeof (VI_list_txl)));
return((VI_list_txl *) tmalloc (sizeof (VI_list_txl)));
}
***/
static int ReadTxL(tx, ckt)
TXLinstance *tx;
CKTcircuit *ckt;
static int
ReadTxL(TXLinstance *tx, CKTcircuit *ckt)
{
double R, L, G, C, l;
char *p, *n;
@ -162,11 +187,11 @@ CKTcircuit *ckt;
p = tx->in_node_name;
n = tx->out_node_name;
line = (RLINE *) malloc(sizeof (RLINE));
er = (ERLINE *) malloc(sizeof (ERLINE));
et = (ETXLine *) malloc(sizeof (ETXLine));
t = (TXLine *) malloc(sizeof (TXLine));
t2 = (TXLine *) malloc(sizeof (TXLine));
line = (RLINE *) tmalloc(sizeof (RLINE));
er = (ERLINE *) tmalloc(sizeof (ERLINE));
et = (ETXLine *) tmalloc(sizeof (ETXLine));
t = (TXLine *) tmalloc(sizeof (TXLine));
t2 = (TXLine *) tmalloc(sizeof (TXLine));
tx->txline = t;
tx->txline2 = t2;
t->newtp = 0;
@ -182,14 +207,14 @@ CKTcircuit *ckt;
nd->rlptr = er;
er->rl = line;
line->in_node = nd;
et = (ETXLine *) malloc(sizeof (ETXLine));
et = (ETXLine *) tmalloc(sizeof (ETXLine));
nd = insert_node(n);
et->link = nd->tptr;
nd->tptr = et;
et->line = t;
t->out_node = nd;
t2->out_node = nd;
er = (ERLINE *) malloc(sizeof (ERLINE));
er = (ERLINE *) tmalloc(sizeof (ERLINE));
er->link = nd->rlptr;
nd->rlptr = er;
er->rl = line;
@ -240,9 +265,8 @@ CKTcircuit *ckt;
****************************************************************/
static int main_pade(R, L, G, C, l, h)
double R, L, G, C, l;
TXLine *h;
static int
main_pade(double R, double L, double G, double C, double l, TXLine *h)
{
y_pade(R, L, G, C, h);
h->ifImg = exp_pade(R, L, G, C, l, h);
@ -253,9 +277,8 @@ static int main_pade(R, L, G, C, l, h)
return(1);
}
static int div_C(ar, ai, br, bi, cr, ci)
double ar, ai, br, bi;
double *cr, *ci;
static int
div_C(double ar, double ai, double br, double bi, double *cr, double *ci)
{
*cr = ar * br + ai * bi;
*ci = - ar * bi + ai * br;
@ -307,8 +330,8 @@ static int divC(ar, ai, br, bi, cr, ci)
}
***/
static int get_h3(h)
TXLine *h;
static int
get_h3(TXLine *h)
{
double cc1, cc2, cc3, cc4, cc5, cc6;
double xx1, xx2, xx3, xx4, xx5, xx6;
@ -363,8 +386,8 @@ static int get_h3(h)
return(1);
}
static int update_h1C_c(h)
TXLine *h;
static int
update_h1C_c(TXLine *h)
{
int i;
double d = 0;
@ -388,8 +411,8 @@ static int update_h1C_c(h)
****************************************************************/
static double eval2(a, b, c, x)
double a, b, c, x;
static double
eval2(double a, double b, double c, double x)
{
return(a*x*x + b*x + c);
}
@ -415,9 +438,8 @@ static double approx2(st)
}
***/
static void y_pade(R, L, G, C, h)
double R, L, G, C;
TXLine *h;
static void
y_pade(double R, double L, double G, double C, TXLine *h)
{
/* float RdL, GdC; */
@ -472,11 +494,11 @@ static void y_pade(R, L, G, C, h)
}
static int Gaussian_Elimination1(dims)
int dims;
static int
Gaussian_Elimination1(int dims)
{
register int i, j, k, dim;
register double f;
int i, j, k, dim;
double f;
int imax;
double max;
@ -519,9 +541,8 @@ static int Gaussian_Elimination1(dims)
return(1);
}
static double root3(a1, a2, a3, x)
double x;
double a1, a2, a3;
static double
root3(double a1, double a2, double a3, double x)
{
double t1, t2;
@ -531,10 +552,8 @@ static double root3(a1, a2, a3, x)
return(x - t1 / t2);
}
static int div3(a1, a2, a3, x, p1, p2)
double x;
double a1, a2, a3;
double *p1, *p2;
static int
div3(double a1, double a2, double a3, double x, double *p1, double *p2)
{
*p1 = a1 + x;
*p2 = - a3 / x;
@ -551,8 +570,7 @@ static int div3(a1, a2, a3, x, p1, p2)
****************************************************************/
/***
static double f3(a, b, z)
double a, b, z;
static double f3(double a, double b, double z)
{
double t4, t3, t2, t1;
double t14, t13, t12, t11;
@ -606,10 +624,9 @@ static double f2(a, b, z)
}
***/
static int mac(at, bt, b1, b2, b3, b4, b5)
static int
mac(double at, double bt, double *b1, double *b2, double *b3, double *b4, double *b5)
/* float at, bt; */
double at, bt;
double *b1, *b2, *b3, *b4, *b5;
{
double a, b;
double y1, y2, y3, y4, y5;
@ -643,8 +660,7 @@ static int mac(at, bt, b1, b2, b3, b4, b5)
****************************************************/
/***
static double exp_approx1(st)
double st;
static double exp_approx1(double st)
{
double s3, s2, s1;
@ -657,9 +673,9 @@ static double exp_approx1(st)
}
***/
static int get_c(eq1, eq2, eq3, ep1, ep2, a, b, cr, ci)
double eq1, eq2, eq3, ep1, ep2, a, b;
double *cr, *ci;
static int
get_c(double eq1, double eq2, double eq3, double ep1, double ep2, double a, double b,
double *cr, double *ci)
{
double d, n;
@ -676,8 +692,7 @@ static int get_c(eq1, eq2, eq3, ep1, ep2, a, b, cr, ci)
}
/***
static double exp_approx2(st)
double st;
static double exp_approx2(double st)
{
if (ifImg)
return(1.0 + ec1/(st - ex1) + 2.0*(ec2*(st-ex2)-ec3*ex3) /
@ -687,9 +702,8 @@ static double exp_approx2(st)
}
***/
static int exp_pade(R, L, G, C, l, h)
float R, L, G, C, l;
TXLine *h;
static int
exp_pade(float R, float L, float G, float C, float l, TXLine *h)
{
tau = sqrt((double) L*C);
@ -767,8 +781,7 @@ static int exp_pade(R, L, G, C, l, h)
return(ifImg);
}
static int pade(l)
float l;
static int pade(float l)
{
int i, j;
double a[6];
@ -841,11 +854,11 @@ static int pade(l)
return (1);
}
static int Gaussian_Elimination2(dims)
int dims;
static int
Gaussian_Elimination2(int dims)
{
register int i, j, k, dim;
register double f;
int i, j, k, dim;
double f;
double max;
int imax;
@ -889,10 +902,9 @@ static int Gaussian_Elimination2(dims)
}
/***
static int exp_div3(a1, a2, a3, x, p1, p2)
double x;
double a1, a2, a3;
double *p1, *p2;
static int
exp_div3(double a1, double a2, double a3, double x,
double *p1, double *p2)
{
*p1 = a1 + x;
*p2 = - a3 / x;
@ -904,9 +916,8 @@ static int exp_div3(a1, a2, a3, x, p1, p2)
/***
***/
static int exp_find_roots(a1, a2, a3, ex1, ex2, ex3)
double a1, a2, a3;
double *ex1, *ex2, *ex3;
static int
exp_find_roots(double a1, double a2, double a3, double *ex1, double *ex2, double *ex3)
{
double x, t;
double p, q;
@ -982,15 +993,13 @@ static int exp_find_roots(a1, a2, a3, ex1, ex2, ex3)
return(1);
}
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);
@ -1009,8 +1018,7 @@ insert_ND(name, ndn)
static NODE
*insert_node(name)
char *name;
*insert_node(char *name)
{
NDnamePt n;
NODE *p;
@ -1028,11 +1036,11 @@ static NODE
}
static NODE
*NEW_node()
*NEW_node(void)
{
NODE *n;
n = (NODE *) malloc (sizeof (NODE));
n = (NODE *) tmalloc (sizeof (NODE));
n->mptr = NULL;
n->gptr = NULL;
n->cptr = NULL;
@ -1056,9 +1064,8 @@ static NODE
return(n);
}
static int find_roots(a1, a2, a3, x1, x2, x3)
double a1, a2, a3;
double *x1, *x2, *x3;
static int
find_roots(double a1, double a2, double a3, double *x1, double *x2, double *x3)
{
double x, t;
double p, q;