From 6903584e992f42ebc9eb014202d0d1647f871f51 Mon Sep 17 00:00:00 2001 From: rlar Date: Sun, 25 Feb 2018 21:00:04 +0100 Subject: [PATCH] asrc/asrcacld.c, bug fix, reciproc tc coefficient --- src/spicelib/devices/asrc/asrcacld.c | 6 ++-- tests/regression/misc/Makefile.am | 2 +- tests/regression/misc/asrc-tc-1.cir | 48 +++++++++++++++++++++++++ tests/regression/misc/asrc-tc-1.out | 1 + tests/regression/misc/asrc-tc-2.cir | 54 ++++++++++++++++++++++++++++ tests/regression/misc/asrc-tc-2.out | 1 + 6 files changed, 108 insertions(+), 4 deletions(-) create mode 100644 tests/regression/misc/asrc-tc-1.cir create mode 100644 tests/regression/misc/asrc-tc-1.out create mode 100644 tests/regression/misc/asrc-tc-2.cir create mode 100644 tests/regression/misc/asrc-tc-2.out diff --git a/src/spicelib/devices/asrc/asrcacld.c b/src/spicelib/devices/asrc/asrcacld.c index 115dd678c..f7ddd78be 100644 --- a/src/spicelib/devices/asrc/asrcacld.c +++ b/src/spicelib/devices/asrc/asrcacld.c @@ -57,13 +57,13 @@ ASRCacLoad(GENmodel *inModel, CKTcircuit *ckt) *(here->ASRCposPtr[j++]) += 1.0; for (i = 0; i < here->ASRCtree->numVars; i++) - *(here->ASRCposPtr[j++]) -= derivs[i] / factor; + *(here->ASRCposPtr[j++]) -= derivs[i] * factor; } else { for (i = 0; i < here->ASRCtree->numVars; i++) { - *(here->ASRCposPtr[j++]) += derivs[i] / factor; - *(here->ASRCposPtr[j++]) -= derivs[i] / factor; + *(here->ASRCposPtr[j++]) += derivs[i] * factor; + *(here->ASRCposPtr[j++]) -= derivs[i] * factor; } } diff --git a/tests/regression/misc/Makefile.am b/tests/regression/misc/Makefile.am index acd352b45..db683dbf4 100644 --- a/tests/regression/misc/Makefile.am +++ b/tests/regression/misc/Makefile.am @@ -1,7 +1,7 @@ ## Process this file with automake to produce Makefile.in -TESTS = bugs-1.cir bugs-2.cir dollar-1.cir empty-1.cir resume-1.cir log-functions-1.cir alter-vec.cir test-noise-2.cir test-noise-3.cir ac-zero.cir +TESTS = bugs-1.cir bugs-2.cir dollar-1.cir empty-1.cir resume-1.cir log-functions-1.cir alter-vec.cir test-noise-2.cir test-noise-3.cir ac-zero.cir asrc-tc-1.cir asrc-tc-2.cir TESTS_ENVIRONMENT = ngspice_vpath=$(srcdir) $(SHELL) $(top_srcdir)/tests/bin/check.sh $(top_builddir)/src/ngspice diff --git a/tests/regression/misc/asrc-tc-1.cir b/tests/regression/misc/asrc-tc-1.cir new file mode 100644 index 000000000..0dd3f4ede --- /dev/null +++ b/tests/regression/misc/asrc-tc-1.cir @@ -0,0 +1,48 @@ +* test ASRC temperature coeff + +v1 1 0 dc=100 ac=1 + +b2 2 0 i=v(1) tc1=0.001 +v2 0 2 0 + +b3 3 0 v=v(1) tc1=0.001 + +.temp 127.0 + +.control +op +let idc2_gold = 100 * (1 + 100*0.001) +let vdc3_gold = 100 * (1 + 100*0.001) +let idc2=i(v2) +let vdc3=v(3) + +* print idc2 vdc3 idc2_gold vdc3_gold + +let err1 = idc2/idc2_gold - 1 +let err2 = vdc3/vdc3_gold - 1 + +if abs(err1) > 1e-9 or abs(err2) > 1e-9 + echo "ERROR: dc test failed, err1 = $&err1 err2 = $&err2" + quit 1 +end + +ac dec 1 1kHz 1kHz +let iac2_gold = 1.0 * (1 + 100*0.001) +let vac3_gold = 1.0 * (1 + 100*0.001) +let iac2=i(v2) +let vac3=v(3) + +* print iac2 vac3 iac2_gold vac3_gold + +let err3 = iac2/iac2_gold - 1 +let err4 = vac3/vac3_gold - 1 + +if abs(err3) > 1e-9 or abs(err4) > 1e-9 + echo "ERROR: ac test failed, err3 = $&err3 err4 = $&err4" + quit 1 +end + +echo "INFO: success" +quit 0 + +.endc diff --git a/tests/regression/misc/asrc-tc-1.out b/tests/regression/misc/asrc-tc-1.out new file mode 100644 index 000000000..8e9036969 --- /dev/null +++ b/tests/regression/misc/asrc-tc-1.out @@ -0,0 +1 @@ +INFO: success diff --git a/tests/regression/misc/asrc-tc-2.cir b/tests/regression/misc/asrc-tc-2.cir new file mode 100644 index 000000000..58ea2f4b7 --- /dev/null +++ b/tests/regression/misc/asrc-tc-2.cir @@ -0,0 +1,54 @@ +* test ASRC temperature coeff + +v0 9 0 dc=0 ac=0 + +v1 1 0 dc=100 ac=10 + +* a real resistor, in devices/res +r2 1 2 1k tc1=0.001 +v2 2 0 dc=0 ac=0 + +* a behavioural resistor, which is mapped to devices/asrc in inpcom.c +r3 1 3 r = {1k + v(9)} tc1=0.001 +v3 3 0 dc=0 ac=0 + +.temp 127.0 + +.control + +* listing extended + +op +let idc_gold = 100 / (1k * (1 + 100*0.001)) +let idc2=i(v2) +let idc3=i(v3) + +* print idc2 idc3 idc_gold + +let err1 = idc2/idc_gold - 1 +let err2 = idc3/idc_gold - 1 + +if abs(err1) > 1e-9 or abs(err2) > 1e-9 + echo "ERROR: dc test failed, err1 = $&err1 err2 = $&err2" + quit 1 +end + +ac dec 1 1kHz 1kHz +let iac_gold = 10 / (1k * (1 + 100*0.001)) +let iac2=i(v2) +let iac3=i(v3) + +* print iac2 iac3 iac_gold + +let err3 = iac2/iac_gold - 1 +let err4 = iac3/iac_gold - 1 + +if abs(err3) > 1e-9 or abs(err4) > 1e-9 + echo "ERROR: ac test failed, err3 = $&err3 err4 = $&err4" + quit 1 +end + +echo "INFO: success" +quit 0 + +.endc diff --git a/tests/regression/misc/asrc-tc-2.out b/tests/regression/misc/asrc-tc-2.out new file mode 100644 index 000000000..8e9036969 --- /dev/null +++ b/tests/regression/misc/asrc-tc-2.out @@ -0,0 +1 @@ +INFO: success