From 9e2f02fbe255dff6bd565bfce82d36ad2bbe41c4 Mon Sep 17 00:00:00 2001 From: h_vogt Date: Sat, 20 Mar 2010 15:32:23 +0000 Subject: [PATCH] HERTZ added to B source --- ChangeLog | 5 + src/frontend/subckt.c | 2 +- src/include/cktdefs.h | 2 + src/spicelib/analysis/acan.c | 164 ++++++++++++++++++++------------- src/spicelib/parser/ifeval.c | 3 - src/spicelib/parser/inp2b.c | 17 +++- src/spicelib/parser/inpptree.c | 2 +- 7 files changed, 122 insertions(+), 73 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4899361fc..a8c437110 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2010-03-20 Holger Vogt + * com_compose.c: comment corrected + * subckt.c, cktdefs.h, acan.c, ifeval.c, inp2b.c, inpptree.c: + Variable HERTZ added to B source + 2010-03-16 Holger Vogt * xpressn.c: remove lines 291,292 diff --git a/src/frontend/subckt.c b/src/frontend/subckt.c index b8ab996fc..e69d651ec 100644 --- a/src/frontend/subckt.c +++ b/src/frontend/subckt.c @@ -55,7 +55,7 @@ $Id$ * nodes. On top of that, we have to know how many args BJT's have, * so we have to keep track of model names. *======================================================================*/ - +/*#define TRACE*/ #include "ngspice.h" #include "cpdefs.h" #include "ftedefs.h" diff --git a/src/include/cktdefs.h b/src/include/cktdefs.h index 211cbcb84..c1ffd55cc 100644 --- a/src/include/cktdefs.h +++ b/src/include/cktdefs.h @@ -178,6 +178,8 @@ typedef struct { #define MODEINITTRAN 0x1000 #define MODEINITPRED 0x2000 +#define MODEINITHERTZ 0x4000 + /* old 'nosolv' paramater */ #define MODEUIC 0x10000l diff --git a/src/spicelib/analysis/acan.c b/src/spicelib/analysis/acan.c index 6a60357cd..e55ff337b 100644 --- a/src/spicelib/analysis/acan.c +++ b/src/spicelib/analysis/acan.c @@ -22,7 +22,6 @@ Modified 2001: AlansFixes void SetAnalyse( char * Analyse, int Percent); #endif - int ACan(CKTcircuit *ckt, int restart) { @@ -56,95 +55,91 @@ ACan(CKTcircuit *ckt, int restart) /* gtri - end - wbk */ #endif - + /* start at beginning */ if(((ACAN*)ckt->CKTcurJob)->ACsaveFreq == 0 || restart) { - /* start at beginning */ - - if (((ACAN*)ckt->CKTcurJob)->ACnumberSteps < 1) - ((ACAN*)ckt->CKTcurJob)->ACnumberSteps = 1; + if (((ACAN*)ckt->CKTcurJob)->ACnumberSteps < 1) + ((ACAN*)ckt->CKTcurJob)->ACnumberSteps = 1; switch(((ACAN*)ckt->CKTcurJob)->ACstepType) { case DECADE: ((ACAN*)ckt->CKTcurJob)->ACfreqDelta = - exp(log(10.0)/((ACAN*)ckt->CKTcurJob)->ACnumberSteps); + exp(log(10.0)/((ACAN*)ckt->CKTcurJob)->ACnumberSteps); break; case OCTAVE: ((ACAN*)ckt->CKTcurJob)->ACfreqDelta = - exp(log(2.0)/((ACAN*)ckt->CKTcurJob)->ACnumberSteps); + exp(log(2.0)/((ACAN*)ckt->CKTcurJob)->ACnumberSteps); break; case LINEAR: - if (((ACAN*)ckt->CKTcurJob)->ACnumberSteps-1 > 1) - ((ACAN*)ckt->CKTcurJob)->ACfreqDelta = + if (((ACAN*)ckt->CKTcurJob)->ACnumberSteps-1 > 1) + ((ACAN*)ckt->CKTcurJob)->ACfreqDelta = (((ACAN*)ckt->CKTcurJob)->ACstopFreq - ((ACAN*)ckt->CKTcurJob)->ACstartFreq)/ (((ACAN*)ckt->CKTcurJob)->ACnumberSteps-1); - else - /* Patch from: Richard McRoberts - * This patch is for a rather pathological case: - * a linear step with only one point */ - ((ACAN*)ckt->CKTcurJob)->ACfreqDelta = 0; + else + /* Patch from: Richard McRoberts + * This patch is for a rather pathological case: + * a linear step with only one point */ + ((ACAN*)ckt->CKTcurJob)->ACfreqDelta = 0; break; default: return(E_BADPARM); - } + } #ifdef XSPICE /* gtri - begin - wbk - Call EVTop if event-driven instances exist */ - if(ckt->evt->counts.num_insts != 0) { - error = EVTop(ckt, - (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITJCT, - (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT, - ckt->CKTdcMaxIter, - MIF_TRUE); - EVTdump(ckt, IPC_ANAL_DCOP, 0.0); - EVTop_save(ckt, MIF_TRUE, 0.0); - } - else + if(ckt->evt->counts.num_insts != 0) { + error = EVTop(ckt, + (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITJCT, + (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT, + ckt->CKTdcMaxIter, + MIF_TRUE); + EVTdump(ckt, IPC_ANAL_DCOP, 0.0); + EVTop_save(ckt, MIF_TRUE, 0.0); + } + else #endif /* If no event-driven instances, do what SPICE normally does */ + error = CKTop(ckt, + (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITJCT, + (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT, + ckt->CKTdcMaxIter); - error = CKTop(ckt, - (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITJCT, - (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT, - ckt->CKTdcMaxIter); - - if(error){ - fprintf(stdout,"\nAC operating point failed -\n"); - CKTncDump(ckt); - return(error); - } + if(error){ + fprintf(stdout,"\nAC operating point failed -\n"); + CKTncDump(ckt); + return(error); + } #ifdef XSPICE /* gtri - add - wbk - 12/19/90 - Add IPC stuff */ - /* Send the operating point results for Mspice compatibility */ - if(g_ipc.enabled) - { - /* Call CKTnames to get names of nodes/branches used by - BeginPlot */ - /* Probably should free nameList after this block since - called again... */ - error = CKTnames(ckt,&numNames,&nameList); - if(error) return(error); + /* Send the operating point results for Mspice compatibility */ + if(g_ipc.enabled) + { + /* Call CKTnames to get names of nodes/branches used by + BeginPlot */ + /* Probably should free nameList after this block since + called again... */ + error = CKTnames(ckt,&numNames,&nameList); + if(error) return(error); - /* We have to do a beginPlot here since the data to return is - * different for the DCOP than it is for the AC analysis. - * Moreover the begin plot has not even been done yet at this - * point... - */ - (*(SPfrontEnd->OUTpBeginPlot))((void *)ckt,(void*)ckt->CKTcurJob, - ckt->CKTcurJob->JOBname,(IFuid)NULL,IF_REAL,numNames,nameList, - IF_REAL,&acPlot); - tfree(nameList); + /* We have to do a beginPlot here since the data to return is + * different for the DCOP than it is for the AC analysis. + * Moreover the begin plot has not even been done yet at this + * point... + */ + (*(SPfrontEnd->OUTpBeginPlot))((void *)ckt,(void*)ckt->CKTcurJob, + ckt->CKTcurJob->JOBname,(IFuid)NULL,IF_REAL,numNames,nameList, + IF_REAL,&acPlot); + tfree(nameList); - ipc_send_dcop_prefix(); - CKTdump(ckt,(double)0,acPlot); - ipc_send_dcop_suffix(); - - (*(SPfrontEnd->OUTendPlot))(acPlot); - } + ipc_send_dcop_prefix(); + CKTdump(ckt,(double)0,acPlot); + ipc_send_dcop_suffix(); + (*(SPfrontEnd->OUTendPlot))(acPlot); + } /* gtri - end - wbk */ #endif @@ -224,6 +219,9 @@ ACan(CKTcircuit *ckt, int restart) startlTime = ckt->CKTstat->STATloadTime; startcTime = ckt->CKTstat->STATcombineTime; startkTime = ckt->CKTstat->STATsyncTime; + + + /* main loop through all scheduled frequencies */ while(freq <= ((ACAN*)ckt->CKTcurJob)->ACstopFreq+freqTol) { if( (*(SPfrontEnd->IFpauseTest))() ) { @@ -232,8 +230,48 @@ ACan(CKTcircuit *ckt, int restart) return(E_PAUSE); } ckt->CKTomega = 2.0 * M_PI *freq; - ckt->CKTmode = (ckt->CKTmode&MODEUIC) | MODEAC; + + + +#define NEWOP +#ifdef NEWOP + /* this is a test! Update opertating point, if variable 'hertz' is given */ + if (ckt->CKTmode & MODEINITHERTZ) { +#ifdef XSPICE +/* Call EVTop if event-driven instances exist */ + + if(ckt->evt->counts.num_insts != 0) { + error = EVTop(ckt, + (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITJCT, + (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT, + ckt->CKTdcMaxIter, + MIF_TRUE); + EVTdump(ckt, IPC_ANAL_DCOP, 0.0); + EVTop_save(ckt, MIF_TRUE, 0.0); + } + else +#endif +// If no event-driven instances, do what SPICE normally does + error = CKTop(ckt, + (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITJCT, + (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITFLOAT, + ckt->CKTdcMaxIter); + + if(error){ + fprintf(stdout,"\nAC operating point failed -\n"); + CKTncDump(ckt); + return(error); + } + } + ckt->CKTmode = (ckt->CKTmode & MODEUIC) | MODEDCOP | MODEINITSMSIG; + error = CKTload(ckt); + if(error) return(error); + + /* end of test */ +#endif + + ckt->CKTmode = (ckt->CKTmode&MODEUIC) | MODEAC; error = NIacIter(ckt); if (error) { ckt->CKTcurrentAnalysis = DOING_AC; @@ -250,8 +288,6 @@ ACan(CKTcircuit *ckt, int restart) startkTime; return(error); } - - #ifdef WANT_SENSE2 if(ckt->CKTsenInfo && (ckt->CKTsenInfo->SENmode&ACSEN) ){ @@ -343,7 +379,9 @@ ACan(CKTcircuit *ckt, int restart) break; default: return(E_INTERN); + } + } endsweep: (*(SPfrontEnd->OUTendPlot))(acPlot); diff --git a/src/spicelib/parser/ifeval.c b/src/spicelib/parser/ifeval.c index a7bca3b99..20d464af8 100644 --- a/src/spicelib/parser/ifeval.c +++ b/src/spicelib/parser/ifeval.c @@ -133,9 +133,6 @@ PTeval(INPparseNode * tree, double gmin, double *res, double *vals) break; case PT_FREQUENCY: - /*((ACAN*)ckt->CKTcurJob)->ACsaveFreq;*/ -// *res = ((ACAN*)((CKTcircuit*) tree->data)->CKTcurJob)->ACsaveFreq; - /*ckt->CKTomega = 2.0 * M_PI *freq;*/ *res = (((CKTcircuit*) tree->data) -> CKTomega)/2./M_PI; break; diff --git a/src/spicelib/parser/inp2b.c b/src/spicelib/parser/inp2b.c index 209ba15e8..7a6dffe98 100644 --- a/src/spicelib/parser/inp2b.c +++ b/src/spicelib/parser/inp2b.c @@ -10,6 +10,7 @@ Author: 1988 Thomas L. Quarles #include "inpmacs.h" #include "fteext.h" #include "inp.h" +#include "cktdefs.h" void INP2B(void *ckt, INPtables * tab, card * current) { @@ -29,13 +30,19 @@ void INP2B(void *ckt, INPtables * tab, card * current) double leadval; /* actual value of unlabeled number */ IFuid uid; /* uid for default model name */ + CKTcircuit* inckt = (CKTcircuit*) ckt; /* get circuit struct for hertz-flag */ + /* Arbitrary source. */ type = INPtypelook("ASRC"); if (type < 0) { - LITERR("Device type Asource not supported by this binary\n"); - return; + LITERR("Device type Asource not supported by this binary\n"); + return; } + /* if we find 'hertz' variable, set flag to actual circuit */ + if(strstr(current->line, "hertz")) + inckt->CKTmode = MODEINITHERTZ; + line = current->line; INPgetTok(&line, &name, 1); INPinsert(&name, tab); @@ -47,9 +54,9 @@ void INP2B(void *ckt, INPtables * tab, card * current) error = INPtermInsert(ckt, &nname2, tab, &node2); if (!tab->defBmod) { - /* create default B model */ - IFnewUid(ckt, &uid, (IFuid) NULL, "B", UID_MODEL, (void **) NULL); - IFC(newModel, (ckt, type, &(tab->defBmod), uid)); + /* create default B model */ + IFnewUid(ckt, &uid, (IFuid) NULL, "B", UID_MODEL, (void **) NULL); + IFC(newModel, (ckt, type, &(tab->defBmod), uid)); } IFC(newInstance, (ckt, tab->defBmod, &fast, name)); IFC(bindNode, (ckt, fast, 1, node1)); diff --git a/src/spicelib/parser/inpptree.c b/src/spicelib/parser/inpptree.c index 5c719a7fd..0bdaf746e 100644 --- a/src/spicelib/parser/inpptree.c +++ b/src/spicelib/parser/inpptree.c @@ -2,7 +2,7 @@ Copyright 1990 Regents of the University of California. All rights reserved. Author: 1987 Wayne A. Christopher, U. C. Berkeley CAD Group **********/ -// #define TRACE +/*#define TRACE*/ #include "ngspice.h" #include "ifsim.h"