diff --git a/ngspice-bjt.patch b/ngspice-bjt.patch new file mode 100644 index 0000000..b1d3fdc --- /dev/null +++ b/ngspice-bjt.patch @@ -0,0 +1,206 @@ +--- /home/chitlesh/rpmbuild/SOURCES/ng-spice-rework-17/src/spicelib/parser/inp2q.c 2004-01-27 22:57:20.000000000 +0100 ++++ ../SOURCES/ng-spice-rework-17/inp2q.c 2007-03-17 10:55:57.000000000 +0100 +@@ -18,33 +18,41 @@ + /* Qname [] [] [OFF] + * [IC=,] */ + +- int mytype; /* the type we looked up */ +- int type; /* the type the model says it is */ +- char *line; /* the part of the current line left to parse */ +- char *name; /* the resistor's name */ +- char *nname1; /* the first node's name */ +- char *nname2; /* the second node's name */ +- char *nname3; /* the third node's name */ +- char *nname4; /* the fourth node's name */ +- void *node1; /* the first node's node pointer */ +- void *node2; /* the second node's node pointer */ +- void *node3; /* the third node's node pointer */ +- void *node4; /* the fourth node's node pointer */ +- int error; /* error code temporary */ +- void *fast; /* pointer to the actual instance */ +- IFvalue ptemp; /* a value structure to package resistance into */ +- int waslead; /* flag to indicate that funny unlabeled number was found */ +- double leadval; /* actual value of unlabeled number */ +- char *model; /* the name of the model */ +- INPmodel *thismodel; /* pointer to model description for user's model */ +- void *mdfast; /* pointer to the actual model */ +- IFuid uid; /* uid of default model */ ++ int mytype; /* the type we looked up */ ++ int type; /* the type the model says it is */ ++ char *line; /* the part of the current line left to parse */ ++ char *name; /* the resistor's name */ ++ char *nname1; /* the first node's name */ ++ char *nname2; /* the second node's name */ ++ char *nname3; /* the third node's name */ ++ char *nname4; /* the fourth node's name */ ++ char *nname5; /* the fifth node's name */ ++ void *node1; /* the first node's node pointer */ ++ void *node2; /* the second node's node pointer */ ++ void *node3; /* the third node's node pointer */ ++ void *node4; /* the fourth node's node pointer */ ++ void *node5; /* the fifth node's node pointer */ ++ int error; /* error code temporary */ ++ int nodeflag; /* flag indicating 4 or 5 nodes */ ++ void *fast; /* pointer to the actual instance */ ++ IFvalue ptemp; /* a value structure to package resistance into */ ++ int waslead; /* flag to indicate that funny unlabeled number was found */ ++ double leadval; /* actual value of unlabeled number */ ++ char *model; /* the name of the model */ ++ INPmodel *thismodel; /* pointer to model description for user's model */ ++ void *mdfast; /* pointer to the actual model */ ++ IFuid uid; /* uid of default model */ + + mytype = INPtypelook("BJT"); + if (mytype < 0) { +- LITERR("Device type BJT not supported by this binary\n"); +- return; ++ LITERR("Device type BJT not supported by this binary\n"); ++ return; + } ++#ifdef TRACE ++ printf("INP2Q: Parsing '%s'\n",current->line); ++#endif ++ ++ nodeflag = 0; /* initially specify a 4 terminal device */ + line = current->line; + INPgetTok(&line, &name, 1); + INPinsert(&name, tab); +@@ -55,63 +63,111 @@ + INPgetNetTok(&line, &nname3, 1); + INPtermInsert(ckt, &nname3, tab, &node3); + INPgetTok(&line, &model, 1); ++ ++ /* See if 4th token after device specification is a model name */ + if (INPlookMod(model)) { +- /* do nothing for now */ +- node4 = gnode; +- /* no action required */ ++ /* 3-terminal device - substrate to ground */ ++ node4 = gnode; ++ INPinsert(&model, tab); + } else { +- nname4 = model; +- INPtermInsert(ckt, &nname4, tab, &node4); +- INPgetTok(&line, &model, 1); ++ nname4 = model; ++ INPtermInsert(ckt, &nname4, tab, &node4); ++ INPgetTok(&line, &model, 1); ++ /* See if 5th token after device specification is a model name */ ++#ifdef TRACE ++ printf("INP2Q: checking for 4 node device\n"); ++#endif ++ if (INPlookMod(model)) { ++ /* 4-terminal device - special case with tnodeout flag not handled */ ++ INPinsert(&model, tab); ++#ifdef ADMS ++ } else { ++ /* 5-terminal device */ ++#ifdef TRACE ++ printf("INP2Q: checking for 5 node device\n"); ++#endif ++ nodeflag = 1; /* now specify a 5 node device */ ++ nname5 = model; ++ INPtermInsert(ckt, &nname5, tab, &node5); ++ INPgetTok(&line, &model, 1); ++ INPinsert(&model, tab); ++#endif ++ } + } +- INPinsert(&model, tab); ++ + current->error = INPgetMod(ckt, model, &thismodel, tab); ++#ifdef TRACE ++ printf("INP2Q: Looking up model\n"); ++#endif + if (thismodel != NULL) { +- if((thismodel->INPmodType != INPtypelook("BJT")) ++ if((thismodel->INPmodType != INPtypelook("BJT")) + && (thismodel->INPmodType != INPtypelook("BJT2")) + && (thismodel->INPmodType != INPtypelook("VBIC")) + #ifdef CIDER + && (thismodel->INPmodType != INPtypelook("NBJT")) + && (thismodel->INPmodType != INPtypelook("NBJT2")) + #endif +- ) { ++#ifdef ADMS ++ && (thismodel->INPmodType != INPtypelook("hicum0")) ++ && (thismodel->INPmodType != INPtypelook("hicum2")) ++ && (thismodel->INPmodType != INPtypelook("mextram")) ++#endif ++ ) { + LITERR("incorrect model type") + return; + } ++#ifdef ADMS ++ if (nodeflag && (thismodel->INPmodType != INPtypelook("hicum2"))) ++ { ++ LITERR("Too much nodes for this model type") ++ return; ++ } ++#endif + type = (thismodel->INPmodType); +- mdfast = (thismodel->INPmodfast); ++ mdfast = (thismodel->INPmodfast); + } else { +- type = mytype; +- if (!tab->defQmod) { +- /* create default Q model */ +- IFnewUid(ckt, &uid, (IFuid) NULL, "Q", UID_MODEL, +- (void **) NULL); +- IFC(newModel, (ckt, type, &(tab->defQmod), uid)); +- } +- mdfast = tab->defQmod; ++ type = mytype; ++ if (!tab->defQmod) { ++ /* create default Q model */ ++ IFnewUid(ckt, &uid, (IFuid) NULL, "Q", UID_MODEL, ++ (void **) NULL); ++ IFC(newModel, (ckt, type, &(tab->defQmod), uid)); ++ } ++ mdfast = tab->defQmod; + } +- ++ + #ifdef TRACE +- /* --- SDB debug statement --- */ +- printf ("In INP2Q, just about to dive into newInstance\n"); ++ printf ("INP2Q: Just about to dive into newInstance\n"); + #endif +- ++ + IFC(newInstance, (ckt, mdfast, &fast, name)); + IFC(bindNode, (ckt, fast, 1, node1)); + IFC(bindNode, (ckt, fast, 2, node2)); + IFC(bindNode, (ckt, fast, 3, node3)); + IFC(bindNode, (ckt, fast, 4, node4)); ++ ++ if ((type == INPtypelook ("hicum0")) || ++ (type == INPtypelook ("hicum2")) || ++ (type == INPtypelook ("mextram")) ) ++ { ++ if (nodeflag) { ++ IFC(bindNode, (ckt, fast, 5, node5)); ++ } else { ++ ((GENinstance *) fast)->GENnode5 = -1; ++ } ++ } + PARSECALL((&line, ckt, type, fast, &leadval, &waslead, tab)); + if (waslead) { + #ifdef CIDER + if( type == INPtypelook("NBJT2") ) { +- LITERR(" error: no unlabelled parameter permitted on NBJT2\n") +- } else { ++ LITERR(" error: no unlabeled parameter permitted on NBJT2\n") ++ } else { + #endif +- ptemp.rValue = leadval; +- GCA(INPpName, ("area", &ptemp, ckt, type, fast)); ++ ptemp.rValue = leadval; ++ GCA(INPpName, ("area", &ptemp, ckt, type, fast)); + } + #ifdef CIDER + } +-#endif ++#endif + } ++ diff --git a/ngspice.spec b/ngspice.spec index 25bfa58..bcbe0ff 100644 --- a/ngspice.spec +++ b/ngspice.spec @@ -1,6 +1,6 @@ Name: ngspice Version: 17 -Release: 9%{?dist} +Release: 10%{?dist} Summary: A mixed level/signal circuit simulator License: BSD @@ -9,13 +9,13 @@ URL: http://%{name}.sourceforge.net/ Source0: http://ovh.dl.sourceforge.net/sourceforge/%{name}/ng-spice-rework-%{version}.tar.gz BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) + Patch0: %{name}-%{version}-pipemode.patch +Patch1: %{name}-bjt.patch BuildRequires: readline-devel, libXext-devel, libpng-devel, libICE-devel BuildRequires: libXaw-devel, mesa-libGL-devel, libXt-devel -Requires(post): /sbin/install-info -Requires(preun): /sbin/install-info %description Ngspice is a general-purpose circuit simulator program. @@ -41,6 +41,8 @@ Summary: Documentation for ngspice, a mixed level/signal circuit simul Group: Documentation Requires: ngspice = %{version} +Requires(post): /sbin/install-info +Requires(preun): /sbin/install-info %description doc This package contains the documentation of ngspice in pdf, postscript @@ -51,6 +53,7 @@ and info format. %setup -q -n ng-spice-rework-%{version} %patch0 -p0 -b .pipemode-xcircuit +%patch1 -p0 -b .bjt %build %ifarch x86_64 sparc64 ppc64 amd64 @@ -137,6 +140,10 @@ fi %{_datadir}/ng-spice-rework/examples/ %Changelog +* Sat Mar 17 2007 Chitlesh Goorah 17-10 +- fixed bug #227519 in spec file - Ville Skyttä +- patch: ngspice-bjt.patch fixes the problem with bjt devices that have less than five nodes + * Tue Jan 09 2007 Chitlesh Goorah 17-9 - dropped --enable-cider since it requires non-opensource software - dropped --enable-predictor from %%configure