From bd985bc28fe2ac642f2e00f451ad818603c32f8d Mon Sep 17 00:00:00 2001 From: dwarning Date: Thu, 14 Oct 2010 09:18:48 +0000 Subject: [PATCH] trtol to 1 only for A devices --- ChangeLog | 9 +++++++ src/include/cktdefs.h | 9 ++++--- src/spicelib/analysis/cktdojob.c | 10 +++++++- src/spicelib/analysis/cktntask.c | 10 -------- src/spicelib/devices/cktinit.c | 3 +++ src/spicelib/parser/inppas2.c | 40 ++++++++++++++++++-------------- 6 files changed, 49 insertions(+), 32 deletions(-) diff --git a/ChangeLog b/ChangeLog index 6fe5cdad8..50d8b2e4f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +2010-10-13 Dietmar Warning + * src/frontend/com_option.c: better formatting the output and + add some useful parameters if command 'option' is given + * src/include/cktdefs.h, + * src/spicelib/analysis/cktdojob.c, cktntask.c, + * src/spicelib/devices/cktinit.c, + * src/spicelib/parser/inppas2.c: + Reduction of trtol to 1 only if 'A' devices in the circuit and xspice is enabled + 2010-10-09 Robert Larice * src/include/complex.h : !REVERT! remove typedef for _complex, which is used nowhere diff --git a/src/include/cktdefs.h b/src/include/cktdefs.h index e0e6a6f49..4b14864e2 100644 --- a/src/include/cktdefs.h +++ b/src/include/cktdefs.h @@ -234,6 +234,9 @@ struct CKTcircuit { point brute force, but to use gmin stepping first */ unsigned int CKTisSetup:1; /* flag to indicate if CKTsetup done */ +#ifdef XSPICE + unsigned int CKTadevFlag:1; /* flag indicates 'A' devices in the circuit */ +#endif JOB *CKTcurJob; /* Next analysis to be performed ??? */ SENstruct *CKTsenInfo; /* the sensitivity information */ @@ -255,11 +258,11 @@ struct CKTcircuit { double CKTrelDv; /* rel limit for iter-iter voltage change */ int CKTtroubleNode; /* Non-convergent node number */ GENinstance *CKTtroubleElt; /* Non-convergent device instance */ - int CKTvarHertz; /* variable HERTZ in B source */ + int CKTvarHertz; /* variable HERTZ in B source */ /* gtri - evt - wbk - 5/20/91 - add event-driven and enhancements data */ #ifdef XSPICE - Evt_Ckt_Data_t *evt; /* all data about event driven stuff */ - Enh_Ckt_Data_t *enh; /* data used by general enhancements */ + Evt_Ckt_Data_t *evt; /* all data about event driven stuff */ + Enh_Ckt_Data_t *enh; /* data used by general enhancements */ #endif /* gtri - evt - wbk - 5/20/91 - add event-driven and enhancements data */ diff --git a/src/spicelib/analysis/cktdojob.c b/src/spicelib/analysis/cktdojob.c index 07aafa7bc..11b8b572a 100644 --- a/src/spicelib/analysis/cktdojob.c +++ b/src/spicelib/analysis/cktdojob.c @@ -71,7 +71,15 @@ CKTdoJob(CKTcircuit *inCkt, int reset, TSKtask *inTask) ckt->CKTgmin = task->TSKgmin; ckt->CKTgshunt = task->TSKgshunt; ckt->CKTdelmin = task->TSKdelmin; - ckt->CKTtrtol = task->TSKtrtol; +#ifdef XSPICE +/* Lower default value of trtol to give more accuracy */ +/* but only if there are 'A' devices in the circuit */ + if (ckt->CKTadevFlag && (ckt->CKTtrtol > 1)) { + printf("Reducing trtol to 1 for xspice 'A' devices\n"); + ckt->CKTtrtol = 1; + } else +#endif + ckt->CKTtrtol = task->TSKtrtol; ckt->CKTdefaultMosM = task->TSKdefaultMosM; ckt->CKTdefaultMosL = task->TSKdefaultMosL; ckt->CKTdefaultMosW = task->TSKdefaultMosW; diff --git a/src/spicelib/analysis/cktntask.c b/src/spicelib/analysis/cktntask.c index 57616b2ec..75d5a5eea 100644 --- a/src/spicelib/analysis/cktntask.c +++ b/src/spicelib/analysis/cktntask.c @@ -86,17 +86,7 @@ CKTnewTask(CKTcircuit *ckt, TSKtask **taskPtr, IFuid taskName, TSKtask **defPtr) tsk->TSKlteReltol = 1e-3; tsk->TSKlteAbstol = 1e-6; #endif /* NEWTRUNC */ - -/* gtri - modify - 4/17/91 - wbk - Change trtol default */ -#ifdef XSPICE -/* Lower default value of trtol to give more accuracy */ -/* tsk->TSKtrtol = 7; */ - tsk->TSKtrtol = 1; -/* gtri - modify - 4/17/91 - wbk - Change trtol default */ -#else tsk->TSKtrtol = 7; -#endif /* XSPICE */ - tsk->TSKbypass = 0; tsk->TSKtranMaxIter = 10; tsk->TSKdcMaxIter = 100; diff --git a/src/spicelib/devices/cktinit.c b/src/spicelib/devices/cktinit.c index 0d4da4db5..2ad3f8a59 100644 --- a/src/spicelib/devices/cktinit.c +++ b/src/spicelib/devices/cktinit.c @@ -54,6 +54,9 @@ CKTinit(CKTcircuit **ckt) /* new circuit to create */ sckt->CKTtrtol = 7; sckt->CKTbypass = 0; sckt->CKTisSetup = 0; +#ifdef XSPICE + sckt->CKTadevFlag = 0; /* flag indicates A devices in the circuit */ +#endif sckt->CKTtranMaxIter = 10; sckt->CKTdcMaxIter = 100; sckt->CKTdcTrcvMaxIter = 50; diff --git a/src/spicelib/parser/inppas2.c b/src/spicelib/parser/inppas2.c index e55d50421..1d101fbef 100644 --- a/src/spicelib/parser/inppas2.c +++ b/src/spicelib/parser/inppas2.c @@ -3,10 +3,9 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1985 Thomas L. Quarles **********/ -#include -#include -#include -#include +#include "ngspice.h" +#include "iferrmsg.h" +#include "inpmacs.h" #include "inppas2.h" #include "inp.h" @@ -45,6 +44,10 @@ void INPpas2(CKTcircuit *ckt, card * data, INPtables * tab, TSKtask *task) printf("Entered INPpas2 . . . .\n"); #endif +#ifdef XSPICE + if (!ckt->CKTadevFlag) ckt->CKTadevFlag = 0; +#endif + error = INPgetTok(&groundname, &gname, 1); if (error) data->error = @@ -62,12 +65,12 @@ void INPpas2(CKTcircuit *ckt, card * data, INPtables * tab, TSKtask *task) #ifdef TRACE printf("Examining this deck:\n"); for (current = data; current != NULL; current = current->nextcard) { - printf("%s\n", current->line); + printf("%s\n", current->line); } printf("\n"); #endif - + #ifdef HAS_WINDOWS for (current = data; current != NULL; current = current->nextcard) linecount++; @@ -100,14 +103,15 @@ void INPpas2(CKTcircuit *ckt, card * data, INPtables * tab, TSKtask *task) #ifdef XSPICE /* gtri - add - wbk - 10/23/90 - add case for 'A' devices */ - - case 'A': /* Aname */ - MIF_INP2A(ckt,tab,current); + + case 'A': /* Aname */ + MIF_INP2A(ckt, tab, current); + ckt->CKTadevFlag = 1; /* an 'A' device is requested */ break; - + /* gtri - end - wbk - 10/23/90 */ #endif - + case 'R': /* Rname [][][w=][l=] */ INP2R(ckt, tab, current); @@ -168,7 +172,7 @@ void INPpas2(CKTcircuit *ckt, card * data, INPtables * tab, TSKtask *task) INP2M(ckt, tab, current); break; #ifdef NDEV - case 'N': + case 'N': /* Nname [...] [] */ INP2N(ckt, tab, current); break; @@ -230,7 +234,7 @@ void INPpas2(CKTcircuit *ckt, card * data, INPtables * tab, TSKtask *task) INP2Y(ckt, tab, current); break; /* end Kspice */ - + case 'K': /* Kname Lname Lname */ INP2K(ckt, tab, current); @@ -246,10 +250,10 @@ void INPpas2(CKTcircuit *ckt, card * data, INPtables * tab, TSKtask *task) INP2B(ckt, tab, current); break; - case '.': /* . Many possibilities */ - if (INP2dot(ckt,tab,current,task,gnode)) - return; - break; + case '.': /* . Many possibilities */ + if (INP2dot(ckt,tab,current,task,gnode)) + return; + break; case 0: break; @@ -259,7 +263,7 @@ void INPpas2(CKTcircuit *ckt, card * data, INPtables * tab, TSKtask *task) LITERR(" unknown device type - error \n"); break; } - } + } return; }