Merge branch 'master' for ngspice-42 into bt_dev
This commit is contained in:
commit
f74d1e33ef
8
NEWS
8
NEWS
|
|
@ -3,7 +3,7 @@ Ngspice-42, Dec 24th, 2023
|
||||||
- New features:
|
- New features:
|
||||||
+ New optional matrix solver KLU (select by 'option klu')
|
+ New optional matrix solver KLU (select by 'option klu')
|
||||||
+ improve error messages (more verbose, user centric)
|
+ improve error messages (more verbose, user centric)
|
||||||
+ Add variable wr_onspace to allow printing the vetor name with
|
+ Add variable wr_onspace to allow printing the vector name with
|
||||||
one space delimiter
|
one space delimiter
|
||||||
+ Re-write of the code model PWM generator
|
+ Re-write of the code model PWM generator
|
||||||
+ Linked list modtab has been enhanced by a hash table
|
+ Linked list modtab has been enhanced by a hash table
|
||||||
|
|
@ -18,9 +18,11 @@ Ngspice-42, Dec 24th, 2023
|
||||||
+ Add functions ngSpice_LockRealloc and ngSpice_UnlockRealloc
|
+ Add functions ngSpice_LockRealloc and ngSpice_UnlockRealloc
|
||||||
+ Add new code model function cm_irreversible().
|
+ Add new code model function cm_irreversible().
|
||||||
+ Add XSPICE code model d_cosim, a generic adaptor for digital cosimulation.
|
+ Add XSPICE code model d_cosim, a generic adaptor for digital cosimulation.
|
||||||
|
+ Script 'vlnggen' may be used with Verilator and d_cosim to create
|
||||||
|
XSPICE code models controlled by HDL code.
|
||||||
+ New interpreter commands strstr, strslice, fopen, fread and fclose.
|
+ New interpreter commands strstr, strslice, fopen, fread and fclose.
|
||||||
+ Recognise *ng_script_with_params"
|
+ Recognise *ng_script_with_params
|
||||||
+ Add a predifined variable 'skywaterpdk' to speed up circuit
|
+ Add a predefined variable 'skywaterpdk' to speed up circuit
|
||||||
loading and parsing.
|
loading and parsing.
|
||||||
+ Add scripts for running the paranoia tests in parallel on Linux with valgrind.
|
+ Add scripts for running the paranoia tests in parallel on Linux with valgrind.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
# problem to the user.
|
# problem to the user.
|
||||||
AC_PREREQ([2.59])
|
AC_PREREQ([2.59])
|
||||||
|
|
||||||
m4_define([ngspice_major_version], [41+])
|
m4_define([ngspice_major_version], [42])
|
||||||
m4_define([ngspice_minor_version], [0])
|
m4_define([ngspice_minor_version], [0])
|
||||||
m4_define([ngspice_version],
|
m4_define([ngspice_version],
|
||||||
[ngspice_major_version])
|
[ngspice_major_version])
|
||||||
|
|
@ -117,8 +117,8 @@ LT_INIT([shared static])
|
||||||
# --> Set 'LT_NGSPICE_AGE' to 0.
|
# --> Set 'LT_NGSPICE_AGE' to 0.
|
||||||
|
|
||||||
LT_NGSPICE_CURRENT=0
|
LT_NGSPICE_CURRENT=0
|
||||||
LT_NGSPICE_REVISION=8
|
LT_NGSPICE_REVISION=9
|
||||||
LT_NGSPICE_AGE=1
|
LT_NGSPICE_AGE=2
|
||||||
LIBNGSPICE_SO_VERSION=$LT_NGSPICE_CURRENT.$LT_NGSPICE_REVISION.$LT_NGSPICE_AGE
|
LIBNGSPICE_SO_VERSION=$LT_NGSPICE_CURRENT.$LT_NGSPICE_REVISION.$LT_NGSPICE_AGE
|
||||||
|
|
||||||
# Announce the libtool version
|
# Announce the libtool version
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,8 @@ To run the paranoia test suite in parallel on Linux with valgrind:
|
||||||
1. Download the paranoia tests (paranoia.7z) from the ngspice Quality web page.
|
1. Download the paranoia tests (paranoia.7z) from the ngspice Quality web page.
|
||||||
|
|
||||||
2. p7zip -d paranoia.7z
|
2. p7zip -d paranoia.7z
|
||||||
Rename the unzipped directory to a name without spaces which would otherwise
|
Rename the unzipped directory to a name without spaces which would
|
||||||
confuse valgrind.
|
otherwise confuse valgrind.
|
||||||
|
|
||||||
3. cd into the renamed unzipped directory.
|
3. cd into the renamed unzipped directory.
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -8165,6 +8165,9 @@ static void inp_meas_current(struct card *deck)
|
||||||
else if (ciprefix(".ends", curr_line)) {
|
else if (ciprefix(".ends", curr_line)) {
|
||||||
subs--;
|
subs--;
|
||||||
subc_start = subc_prev;
|
subc_start = subc_prev;
|
||||||
|
/* FIXME: just a hack, needs proper levelling */
|
||||||
|
if (subs == 0)
|
||||||
|
subc_start = NULL;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
|
|
|
||||||
|
|
@ -1469,21 +1469,18 @@ InterpFileAdd(runDesc *run, IFvalue *refValue, IFvalue *valuePtr)
|
||||||
if (run->refIndex != -1) {
|
if (run->refIndex != -1) {
|
||||||
/* Save first time step */
|
/* Save first time step */
|
||||||
if (refValue->rValue == run->circuit->CKTinitTime) {
|
if (refValue->rValue == run->circuit->CKTinitTime) {
|
||||||
timeold = refValue->rValue;
|
|
||||||
fileStartPoint(run->fp, run->binary, run->pointCount);
|
fileStartPoint(run->fp, run->binary, run->pointCount);
|
||||||
fileAddRealValue(run->fp, run->binary, run->circuit->CKTinitTime);
|
fileAddRealValue(run->fp, run->binary, run->circuit->CKTinitTime);
|
||||||
interpolatenow = nodata = FALSE;
|
interpolatenow = nodata = FALSE;
|
||||||
}
|
}
|
||||||
/* Save last time step */
|
/* Save last time step */
|
||||||
else if (refValue->rValue == run->circuit->CKTfinalTime) {
|
else if (refValue->rValue == run->circuit->CKTfinalTime) {
|
||||||
timeold = refValue->rValue;
|
|
||||||
fileStartPoint(run->fp, run->binary, run->pointCount);
|
fileStartPoint(run->fp, run->binary, run->pointCount);
|
||||||
fileAddRealValue(run->fp, run->binary, run->circuit->CKTfinalTime);
|
fileAddRealValue(run->fp, run->binary, run->circuit->CKTfinalTime);
|
||||||
interpolatenow = nodata = FALSE;
|
interpolatenow = nodata = FALSE;
|
||||||
}
|
}
|
||||||
/* Save exact point */
|
/* Save exact point */
|
||||||
else if (refValue->rValue == timestep) {
|
else if (refValue->rValue == timestep) {
|
||||||
timeold = refValue->rValue;
|
|
||||||
fileStartPoint(run->fp, run->binary, run->pointCount);
|
fileStartPoint(run->fp, run->binary, run->pointCount);
|
||||||
fileAddRealValue(run->fp, run->binary, timestep);
|
fileAddRealValue(run->fp, run->binary, timestep);
|
||||||
timestep += run->circuit->CKTstep;
|
timestep += run->circuit->CKTstep;
|
||||||
|
|
@ -1501,7 +1498,6 @@ InterpFileAdd(runDesc *run, IFvalue *refValue, IFvalue *valuePtr)
|
||||||
else {
|
else {
|
||||||
/* Do not save this step */
|
/* Do not save this step */
|
||||||
run->pointCount--;
|
run->pointCount--;
|
||||||
timeold = refValue->rValue;
|
|
||||||
nodata = TRUE;
|
nodata = TRUE;
|
||||||
interpolatenow = FALSE;
|
interpolatenow = FALSE;
|
||||||
}
|
}
|
||||||
|
|
@ -1542,7 +1538,6 @@ InterpFileAdd(runDesc *run, IFvalue *refValue, IFvalue *valuePtr)
|
||||||
newval = (timestep - run->circuit->CKTstep - timeold)/(timenew - timeold) * (valuenew[i] - valueold[i]) + valueold[i];
|
newval = (timestep - run->circuit->CKTstep - timeold)/(timenew - timeold) * (valuenew[i] - valueold[i]) + valueold[i];
|
||||||
fileAddRealValue(run->fp, run->binary, newval);
|
fileAddRealValue(run->fp, run->binary, newval);
|
||||||
valueold[i] = valuenew[i];
|
valueold[i] = valuenew[i];
|
||||||
timeold = refValue->rValue;
|
|
||||||
}
|
}
|
||||||
else if (nodata)
|
else if (nodata)
|
||||||
/* Just keep the transient output value corresponding to timeold,
|
/* Just keep the transient output value corresponding to timeold,
|
||||||
|
|
@ -1574,7 +1569,6 @@ InterpFileAdd(runDesc *run, IFvalue *refValue, IFvalue *valuePtr)
|
||||||
newval = (timestep - run->circuit->CKTstep - timeold)/(timenew - timeold) * (valuenew[i] - valueold[i]) + valueold[i];
|
newval = (timestep - run->circuit->CKTstep - timeold)/(timenew - timeold) * (valuenew[i] - valueold[i]) + valueold[i];
|
||||||
fileAddRealValue(run->fp, run->binary, newval);
|
fileAddRealValue(run->fp, run->binary, newval);
|
||||||
valueold[i] = valuenew[i];
|
valueold[i] = valuenew[i];
|
||||||
timeold = refValue->rValue;
|
|
||||||
}
|
}
|
||||||
else if (nodata)
|
else if (nodata)
|
||||||
/* Just keep the transient output value corresponding to timeold,
|
/* Just keep the transient output value corresponding to timeold,
|
||||||
|
|
@ -1587,7 +1581,7 @@ InterpFileAdd(runDesc *run, IFvalue *refValue, IFvalue *valuePtr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
timeold = refValue->rValue;
|
||||||
fileEndPoint(run->fp, run->binary);
|
fileEndPoint(run->fp, run->binary);
|
||||||
|
|
||||||
/* Check that the write to disk completed successfully, otherwise abort */
|
/* Check that the write to disk completed successfully, otherwise abort */
|
||||||
|
|
@ -1634,19 +1628,16 @@ InterpPlotAdd(runDesc *run, IFvalue *refValue, IFvalue *valuePtr)
|
||||||
|
|
||||||
/* Save first time step */
|
/* Save first time step */
|
||||||
if (refValue->rValue == run->circuit->CKTinitTime) {
|
if (refValue->rValue == run->circuit->CKTinitTime) {
|
||||||
timeold = refValue->rValue;
|
|
||||||
plotAddRealValue(&run->data[iscale], refValue->rValue);
|
plotAddRealValue(&run->data[iscale], refValue->rValue);
|
||||||
interpolatenow = nodata = FALSE;
|
interpolatenow = nodata = FALSE;
|
||||||
}
|
}
|
||||||
/* Save last time step */
|
/* Save last time step */
|
||||||
else if (refValue->rValue == run->circuit->CKTfinalTime) {
|
else if (refValue->rValue == run->circuit->CKTfinalTime) {
|
||||||
timeold = refValue->rValue;
|
|
||||||
plotAddRealValue(&run->data[iscale], run->circuit->CKTfinalTime);
|
plotAddRealValue(&run->data[iscale], run->circuit->CKTfinalTime);
|
||||||
interpolatenow = nodata = FALSE;
|
interpolatenow = nodata = FALSE;
|
||||||
}
|
}
|
||||||
/* Save exact point */
|
/* Save exact point */
|
||||||
else if (refValue->rValue == timestep) {
|
else if (refValue->rValue == timestep) {
|
||||||
timeold = refValue->rValue;
|
|
||||||
plotAddRealValue(&run->data[iscale], timestep);
|
plotAddRealValue(&run->data[iscale], timestep);
|
||||||
timestep += run->circuit->CKTstep;
|
timestep += run->circuit->CKTstep;
|
||||||
interpolatenow = nodata = FALSE;
|
interpolatenow = nodata = FALSE;
|
||||||
|
|
@ -1662,7 +1653,6 @@ InterpPlotAdd(runDesc *run, IFvalue *refValue, IFvalue *valuePtr)
|
||||||
else {
|
else {
|
||||||
/* Do not save this step */
|
/* Do not save this step */
|
||||||
run->pointCount--;
|
run->pointCount--;
|
||||||
timeold = refValue->rValue;
|
|
||||||
nodata = TRUE;
|
nodata = TRUE;
|
||||||
interpolatenow = FALSE;
|
interpolatenow = FALSE;
|
||||||
}
|
}
|
||||||
|
|
@ -1707,7 +1697,6 @@ InterpPlotAdd(runDesc *run, IFvalue *refValue, IFvalue *valuePtr)
|
||||||
newval = (timestep - run->circuit->CKTstep - timeold)/(timenew - timeold) * (valuenew[i] - valueold[i]) + valueold[i];
|
newval = (timestep - run->circuit->CKTstep - timeold)/(timenew - timeold) * (valuenew[i] - valueold[i]) + valueold[i];
|
||||||
plotAddRealValue(&run->data[i], newval);
|
plotAddRealValue(&run->data[i], newval);
|
||||||
valueold[i] = valuenew[i];
|
valueold[i] = valuenew[i];
|
||||||
timeold = refValue->rValue;
|
|
||||||
}
|
}
|
||||||
else if (nodata)
|
else if (nodata)
|
||||||
/* Just keep the transient output value corresponding to timeold,
|
/* Just keep the transient output value corresponding to timeold,
|
||||||
|
|
@ -1730,7 +1719,6 @@ InterpPlotAdd(runDesc *run, IFvalue *refValue, IFvalue *valuePtr)
|
||||||
newval = (timestep - run->circuit->CKTstep - timeold)/(timenew - timeold) * (valuenew[i] - valueold[i]) + valueold[i];
|
newval = (timestep - run->circuit->CKTstep - timeold)/(timenew - timeold) * (valuenew[i] - valueold[i]) + valueold[i];
|
||||||
plotAddRealValue(&run->data[i], newval);
|
plotAddRealValue(&run->data[i], newval);
|
||||||
valueold[i] = valuenew[i];
|
valueold[i] = valuenew[i];
|
||||||
timeold = refValue->rValue;
|
|
||||||
}
|
}
|
||||||
else if (nodata)
|
else if (nodata)
|
||||||
/* Just keep the transient output value corresponding to timeold,
|
/* Just keep the transient output value corresponding to timeold,
|
||||||
|
|
@ -1744,7 +1732,7 @@ InterpPlotAdd(runDesc *run, IFvalue *refValue, IFvalue *valuePtr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
timeold = refValue->rValue;
|
||||||
gr_iplot(run->runPlot);
|
gr_iplot(run->runPlot);
|
||||||
|
|
||||||
if (ft_bpcheck(run->runPlot, run->pointCount) == FALSE)
|
if (ft_bpcheck(run->runPlot, run->pointCount) == FALSE)
|
||||||
|
|
|
||||||
|
|
@ -3,8 +3,10 @@
|
||||||
noinst_HEADERS = \
|
noinst_HEADERS = \
|
||||||
tclspice.h \
|
tclspice.h \
|
||||||
acdefs.h \
|
acdefs.h \
|
||||||
|
amd.h \
|
||||||
bdrydefs.h \
|
bdrydefs.h \
|
||||||
bool.h \
|
bool.h \
|
||||||
|
btf.h \
|
||||||
carddefs.h \
|
carddefs.h \
|
||||||
ciderinp.h \
|
ciderinp.h \
|
||||||
cidersupt.h \
|
cidersupt.h \
|
||||||
|
|
@ -14,10 +16,12 @@ noinst_HEADERS = \
|
||||||
cm.h \
|
cm.h \
|
||||||
cmproto.h \
|
cmproto.h \
|
||||||
cmtypes.h \
|
cmtypes.h \
|
||||||
|
colamd.h \
|
||||||
compatmode.h \
|
compatmode.h \
|
||||||
complex.h \
|
complex.h \
|
||||||
const.h \
|
const.h \
|
||||||
contdefs.h \
|
contdefs.h \
|
||||||
|
cosim.h \
|
||||||
cpdefs.h \
|
cpdefs.h \
|
||||||
cpextern.h \
|
cpextern.h \
|
||||||
cpstd.h \
|
cpstd.h \
|
||||||
|
|
@ -63,7 +67,9 @@ noinst_HEADERS = \
|
||||||
ipcproto.h \
|
ipcproto.h \
|
||||||
ipctiein.h \
|
ipctiein.h \
|
||||||
jobdefs.h \
|
jobdefs.h \
|
||||||
logicexp.h \
|
klu.h \
|
||||||
|
klu-binding.h \
|
||||||
|
logicexp.h \
|
||||||
lsort.h \
|
lsort.h \
|
||||||
macros.h \
|
macros.h \
|
||||||
material.h \
|
material.h \
|
||||||
|
|
@ -123,6 +129,7 @@ noinst_HEADERS = \
|
||||||
twomesh.h \
|
twomesh.h \
|
||||||
typedefs.h \
|
typedefs.h \
|
||||||
udevices.h \
|
udevices.h \
|
||||||
|
UFconfig.h \
|
||||||
wordlist.h \
|
wordlist.h \
|
||||||
1-f-code.h \
|
1-f-code.h \
|
||||||
FastNorm3.h \
|
FastNorm3.h \
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,10 @@ not modify them).
|
||||||
***************** If XSPICE is enabled *************************************
|
***************** If XSPICE is enabled *************************************
|
||||||
**
|
**
|
||||||
ngCM_Input_Path(const char*)
|
ngCM_Input_Path(const char*)
|
||||||
sets the input path for files loaded by code models.
|
Set the input path for files loaded by code models
|
||||||
|
like d_state, file_source, d_source.
|
||||||
|
Useful when netlist is sent by ngSpice_Circ and therefore
|
||||||
|
Infile_Path cannot be retrieved automatically.
|
||||||
If NULL is sent, return the current Infile_Path.
|
If NULL is sent, return the current Infile_Path.
|
||||||
|
|
||||||
**
|
**
|
||||||
|
|
@ -82,6 +85,13 @@ char** ngSpice_AllVecs(char*);
|
||||||
returns to the caller a pointer to an array of vector names in the plot
|
returns to the caller a pointer to an array of vector names in the plot
|
||||||
named by the string in the argument.
|
named by the string in the argument.
|
||||||
|
|
||||||
|
**
|
||||||
|
int ngSpice_LockRealloc(void)
|
||||||
|
int ngSpice_UnlockRealloc(void)
|
||||||
|
Locking and unlocking the realloc of output vectors during simulation. May be set
|
||||||
|
during reading output vectors in the primary thread, while the simulation in the
|
||||||
|
background thread is moving on.
|
||||||
|
|
||||||
**
|
**
|
||||||
Additional basics:
|
Additional basics:
|
||||||
No memory mallocing and freeing across the interface:
|
No memory mallocing and freeing across the interface:
|
||||||
|
|
@ -97,7 +107,7 @@ are of type bool if sharedspice.h is used externally.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef NGSPICE_PACKAGE_VERSION
|
#ifndef NGSPICE_PACKAGE_VERSION
|
||||||
#define NGSPICE_PACKAGE_VERSION "41+"
|
#define NGSPICE_PACKAGE_VERSION "42"
|
||||||
#endif
|
#endif
|
||||||
/* we have NG_BOOL instead of BOOL */
|
/* we have NG_BOOL instead of BOOL */
|
||||||
#ifndef HAS_NG_BOOL
|
#ifndef HAS_NG_BOOL
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,16 @@
|
||||||
## Process this file with automake to produce Makefile.in
|
## Process this file with automake to produce Makefile.in
|
||||||
|
|
||||||
|
EXTRA_DIST = SuiteSparse.org
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libKLU_real.la libKLU_complex.la libKLU.la
|
noinst_LTLIBRARIES = libKLU_real.la libKLU_complex.la libKLU.la
|
||||||
|
|
||||||
|
noinst_HEADERS = \
|
||||||
|
amd_internal.h \
|
||||||
|
btf_internal.h \
|
||||||
|
klu_internal.h \
|
||||||
|
klu_version.h
|
||||||
|
|
||||||
|
|
||||||
libKLU_real_la_SOURCES = \
|
libKLU_real_la_SOURCES = \
|
||||||
klu.c \
|
klu.c \
|
||||||
klu_diagnostics.c \
|
klu_diagnostics.c \
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
noinst_LTLIBRARIES = libmisc.la
|
noinst_LTLIBRARIES = libmisc.la
|
||||||
|
|
||||||
|
EXTRA_DIST = win_time.c
|
||||||
|
|
||||||
libmisc_la_SOURCES = \
|
libmisc_la_SOURCES = \
|
||||||
getopt_long_bsd.c \
|
getopt_long_bsd.c \
|
||||||
|
|
|
||||||
|
|
@ -1102,13 +1102,15 @@ int ngSpice_Command(char* comexec)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef XSPICE
|
/* Set the input path for files loaded by code models
|
||||||
/* Set the input path for files loaded by code models.
|
like d_state, file_source, d_source.
|
||||||
|
Useful when netlist is sent by ngSpice_Circ and therefore
|
||||||
|
Infile_Path cannot be retrieved automatically.
|
||||||
If NULL is sent, return the current Infile_Path. */
|
If NULL is sent, return the current Infile_Path. */
|
||||||
IMPEXP
|
IMPEXP
|
||||||
char *ngCM_Input_Path(const char* path)
|
char *ngCM_Input_Path(const char* path)
|
||||||
{
|
{
|
||||||
/* delete existing command memory */
|
/* override existing path */
|
||||||
if (path) {
|
if (path) {
|
||||||
txfree(Infile_Path);
|
txfree(Infile_Path);
|
||||||
Infile_Path = copy(path);
|
Infile_Path = copy(path);
|
||||||
|
|
@ -1116,7 +1118,6 @@ char *ngCM_Input_Path(const char* path)
|
||||||
fprintf(stdout, "Note: Codel model file loading path is %s\n", Infile_Path);
|
fprintf(stdout, "Note: Codel model file loading path is %s\n", Infile_Path);
|
||||||
return Infile_Path;
|
return Infile_Path;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Return information about a vector to the caller */
|
/* Return information about a vector to the caller */
|
||||||
IMPEXP
|
IMPEXP
|
||||||
|
|
@ -1357,6 +1358,7 @@ int ngSpice_UnlockRealloc(void)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* add the preliminary breakpoints to the list.
|
/* add the preliminary breakpoints to the list.
|
||||||
called from dctran.c */
|
called from dctran.c */
|
||||||
int
|
int
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,8 @@ CKTop (CKTcircuit *ckt, long int firstmode, long int continuemode,
|
||||||
int converged;
|
int converged;
|
||||||
|
|
||||||
#ifdef HAS_PROGREP
|
#ifdef HAS_PROGREP
|
||||||
if (!ckt->CKTnoOpIter || ckt->CKTnumGminSteps >= 1 || ckt->CKTnumSrcSteps >= 1)
|
/* If this is called from dc simulation, don't set "op" */
|
||||||
|
if (ckt->CKTcurJob->JOBtype != 2 && (!ckt->CKTnoOpIter || ckt->CKTnumGminSteps >= 1 || ckt->CKTnumSrcSteps >= 1))
|
||||||
SetAnalyse("op", 0);
|
SetAnalyse("op", 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -127,6 +127,7 @@ CKTsetup(CKTcircuit *ckt)
|
||||||
|
|
||||||
/* Allocate space for the matrix diagonal data */
|
/* Allocate space for the matrix diagonal data */
|
||||||
if(num_nodes > 0) {
|
if(num_nodes > 0) {
|
||||||
|
FREE(ckt->enh->rshunt_data.diag);
|
||||||
ckt->enh->rshunt_data.diag =
|
ckt->enh->rshunt_data.diag =
|
||||||
TMALLOC(double *, num_nodes);
|
TMALLOC(double *, num_nodes);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,8 @@ Copyright 1991 Regents of the University of California. All rights reserved.
|
||||||
#include "ngspice/ifsim.h"
|
#include "ngspice/ifsim.h"
|
||||||
#include "ngspice/sensgen.h"
|
#include "ngspice/sensgen.h"
|
||||||
|
|
||||||
/* XXX */
|
/* Used by sensitivity code in cktsens.c */
|
||||||
|
|
||||||
extern char *Sfilter;
|
extern char *Sfilter;
|
||||||
|
|
||||||
int set_model(sgen *);
|
int set_model(sgen *);
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,7 @@ Modified: 1999 Paolo Nenzi
|
||||||
#include "ngspice/const.h"
|
#include "ngspice/const.h"
|
||||||
#include "ngspice/sperror.h"
|
#include "ngspice/sperror.h"
|
||||||
#include "ngspice/fteext.h"
|
#include "ngspice/fteext.h"
|
||||||
|
#include "ngspice/compatmode.h"
|
||||||
|
|
||||||
#ifdef XSPICE
|
#ifdef XSPICE
|
||||||
#include "ngspice/evt.h"
|
#include "ngspice/evt.h"
|
||||||
|
|
@ -297,8 +298,8 @@ DCtrCurv(CKTcircuit *ckt, int restart)
|
||||||
if (ckt->evt->counts.num_insts == 0) {
|
if (ckt->evt->counts.num_insts == 0) {
|
||||||
/* If no event-driven instances, do what SPICE normally does */
|
/* If no event-driven instances, do what SPICE normally does */
|
||||||
#endif
|
#endif
|
||||||
converged = NIiter(ckt, ckt->CKTdcTrcvMaxIter);
|
|
||||||
if (converged != 0) {
|
if (newcompat.hs) {
|
||||||
converged = CKTop(ckt,
|
converged = CKTop(ckt,
|
||||||
(ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT,
|
(ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT,
|
||||||
(ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITFLOAT,
|
(ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITFLOAT,
|
||||||
|
|
@ -306,6 +307,17 @@ DCtrCurv(CKTcircuit *ckt, int restart)
|
||||||
if (converged != 0)
|
if (converged != 0)
|
||||||
return(converged);
|
return(converged);
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
converged = NIiter(ckt, ckt->CKTdcTrcvMaxIter);
|
||||||
|
if (converged != 0) {
|
||||||
|
converged = CKTop(ckt,
|
||||||
|
(ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITJCT,
|
||||||
|
(ckt->CKTmode & MODEUIC) | MODEDCTRANCURVE | MODEINITFLOAT,
|
||||||
|
ckt->CKTdcMaxIter);
|
||||||
|
if (converged != 0)
|
||||||
|
return(converged);
|
||||||
|
}
|
||||||
|
}
|
||||||
#ifdef XSPICE
|
#ifdef XSPICE
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
|
||||||
|
|
@ -45,6 +45,7 @@ NON-STANDARD FEATURES
|
||||||
#include "ngspice/ngspice.h"
|
#include "ngspice/ngspice.h"
|
||||||
#include "ngspice/cktdefs.h"
|
#include "ngspice/cktdefs.h"
|
||||||
|
|
||||||
|
#include "ngspice/mif.h"
|
||||||
#include "ngspice/evt.h"
|
#include "ngspice/evt.h"
|
||||||
|
|
||||||
#include "ngspice/evtproto.h"
|
#include "ngspice/evtproto.h"
|
||||||
|
|
@ -74,6 +75,12 @@ void EVTcall_hybrids(
|
||||||
|
|
||||||
/* Call EVTload for all hybrids */
|
/* Call EVTload for all hybrids */
|
||||||
|
|
||||||
for(i = 0; i < num_hybrids; i++)
|
for(i = 0; i < num_hybrids; i++) {
|
||||||
EVTload_with_event(ckt, hybrids[i], MIF_STEP_PENDING);
|
EVTload_with_event(ckt, hybrids[i], MIF_STEP_PENDING);
|
||||||
|
if (g_mif_info.breakpoint.current < ckt->CKTtime) {
|
||||||
|
/* An XSPICE instance rejected the time-step. */
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -467,7 +467,7 @@ FILE *fopen_with_path(const char *path, const char *mode)
|
||||||
{
|
{
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
if((path[0] != '/') && (path[1] != ':')) { /* path absolue (probably) */
|
if((path[0] != '/') && (path[1] != ':')) { /* path is (probably) not absolute */
|
||||||
// const char *x = getenv("ngspice_vpath");
|
// const char *x = getenv("ngspice_vpath");
|
||||||
const char *x = cm_get_path();
|
const char *x = cm_get_path();
|
||||||
if (x) {
|
if (x) {
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@
|
||||||
#define PACKAGE "ngspice"
|
#define PACKAGE "ngspice"
|
||||||
|
|
||||||
/* Version number of package */
|
/* Version number of package */
|
||||||
#define VERSION "41+"
|
#define VERSION "42"
|
||||||
|
|
||||||
/* Define the directory for executables */
|
/* Define the directory for executables */
|
||||||
#define NGSPICEBINDIR "../bin"
|
#define NGSPICEBINDIR "../bin"
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue