From 1bb270e3019c0b20cb46396996e31fde2eca832d Mon Sep 17 00:00:00 2001 From: dwarning Date: Sun, 7 Jul 2013 11:35:29 +0200 Subject: [PATCH] inp2y.c, TXL bug fix reported by John Reuben P on the ngspice-users mailing list need to insert instance names into the symbol table with INPinsert() --- src/spicelib/parser/inp2y.c | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/spicelib/parser/inp2y.c b/src/spicelib/parser/inp2y.c index 49545098d..a735e6737 100644 --- a/src/spicelib/parser/inp2y.c +++ b/src/spicelib/parser/inp2y.c @@ -30,8 +30,8 @@ char *buf; /* temporary buffer for parsing */ char *model; /* the name of the resistor's model */ char *nname1; /* the first node's name */ char *nname2; /* the second node's name */ -char rname1[10], rname2[10], rname3[10]; -char cname1[10], cname2[10], cname3[10], cname4[10]; +char *rname1, *rname2, *rname3; +char *cname1, *cname2, *cname3, *cname4; char *internal1, *internal2; char *ground1, *ground2; CKTnode *node1; /* the first node's node pointer */ @@ -115,15 +115,16 @@ int lenvalgiven = 0; INPgetTok(&line,&buf,1); } if (lenval && rval && lval && rval/lval > 1.6e10) { - /* use 3-pi model */ + /* use 3-pi model for high resistance as fall back */ rval = 3.0 / (rval * lenval); cval = cval * lenval / 6.0; type = INPtypelook("Resistor"); /* resistor between node1 and internal1 */ - internal1 = TMALLOC(char, 10); + internal1 = TMALLOC(char, 10 + strlen(name)); strcpy(internal1, "txlnd1"); + strcat(internal1, name); INPtermInsert(ckt, &internal1, tab, &inode1); if(!tab->defRmod) { /* create default R model */ @@ -131,7 +132,10 @@ int lenvalgiven = 0; IFC(newModel, (ckt,type,&(tab->defRmod),uid)) } mdfast = tab->defRmod; + rname1 = TMALLOC(char, 10 + strlen(name)); strcpy(rname1, "txlres1"); + strcat(rname1, name); + INPinsert(&rname1, tab); IFC(newInstance,(ckt,mdfast,&fast,rname1)) IFC(bindNode,(ckt,fast,1,node1)) IFC(bindNode,(ckt,fast,2,inode1)) @@ -139,10 +143,14 @@ int lenvalgiven = 0; GCA(INPpName,("resistance",&ptemp,ckt,type,fast)) /* resistor between internal1 and internal2 */ - internal2 = TMALLOC(char, 10); + internal2 = TMALLOC(char, 10 + strlen(name)); strcpy(internal2, "txlnd2"); + strcat(internal2, name); INPtermInsert(ckt, &internal2, tab, &inode2); + rname2 = TMALLOC(char, 10 + strlen(name)); strcpy(rname2, "txlres2"); + strcat(rname2, name); + INPinsert(&rname2, tab); mdfast2 = tab->defRmod; IFC(newInstance,(ckt,mdfast2,&fast2,rname2)) IFC(bindNode,(ckt,fast2,1,inode1)) @@ -151,7 +159,10 @@ int lenvalgiven = 0; GCA(INPpName,("resistance",&ptemp,ckt,type,fast2)) /* resistor between internal2 and node2 */ + rname3 = TMALLOC(char, 10 + strlen(name)); strcpy(rname3, "txlres3"); + strcat(rname3, name); + INPinsert(&rname3, tab); mdfast3 = tab->defRmod; IFC(newInstance,(ckt,mdfast3,&fast3,rname3)) IFC(bindNode,(ckt,fast3,1,inode2)) @@ -166,7 +177,10 @@ int lenvalgiven = 0; IFC(newModel,(ckt,type,&(tab->defCmod),uid)) } mdfast4 = tab->defCmod; + cname1 = TMALLOC(char, 10 + strlen(name)); strcpy(cname1, "txlcap1"); + strcat(cname1, name); + INPinsert(&cname1, tab); IFC(newInstance,(ckt,mdfast4,&fast4,cname1)) IFC(bindNode,(ckt,fast4,1,node1)) IFC(bindNode,(ckt,fast4,2,gnode1)) @@ -174,7 +188,10 @@ int lenvalgiven = 0; GCA(INPpName,("capacitance",&ptemp,ckt,type,fast4)) /* capacitor on internal1 */ + cname2 = TMALLOC(char, 10 + strlen(name)); strcpy(cname2, "txlcap2"); + strcat(cname2, name); + INPinsert(&cname2, tab); mdfast4 = tab->defCmod; IFC(newInstance,(ckt,mdfast4,&fast4,cname2)) IFC(bindNode,(ckt,fast4,1,inode1)) @@ -183,7 +200,10 @@ int lenvalgiven = 0; GCA(INPpName,("capacitance",&ptemp,ckt,type,fast4)) /* capacitor on internal2 */ + cname3 = TMALLOC(char, 10 + strlen(name)); strcpy(cname3, "txlcap3"); + strcat(cname3, name); + INPinsert(&cname3, tab); mdfast5 = tab->defCmod; IFC(newInstance,(ckt,mdfast5,&fast5,cname3)) IFC(bindNode,(ckt,fast5,1,inode2)) @@ -192,7 +212,10 @@ int lenvalgiven = 0; GCA(INPpName,("capacitance",&ptemp,ckt,type,fast5)) /* capacitor on node2 */ + cname4 = TMALLOC(char, 10 + strlen(name)); strcpy(cname4, "txlcap4"); + strcat(cname4, name); + INPinsert(&cname4, tab); mdfast6 = tab->defCmod; IFC(newInstance,(ckt,mdfast6,&fast6,cname4)) IFC(bindNode,(ckt,fast6,1,node2))