From 79e2aa917481302f6d216730523ef38bc43b7beb Mon Sep 17 00:00:00 2001 From: Holger Vogt Date: Tue, 22 Jul 2025 19:16:54 +0200 Subject: [PATCH] Bug fixes: fix function rdivide fix a copy/paste bug in cpline add copying of tlines --- src/xspice/icm/tlines/cpline/cfunc.mod | 18 ++++++++++-------- src/xspice/icm/tlines/cpmlin/cfunc.mod | 10 ++++++---- src/xspice/icm/tlines/mlin/cfunc.mod | 10 ++++++---- src/xspice/icm/tlines/msopen/cfunc.mod | 10 ++++++---- src/xspice/icm/tlines/tline/cfunc.mod | 10 ++++++---- visualc/make-install-vngspice.bat | 2 ++ visualc/make-install-vngspiced.bat | 2 ++ 7 files changed, 38 insertions(+), 24 deletions(-) diff --git a/src/xspice/icm/tlines/cpline/cfunc.mod b/src/xspice/icm/tlines/cpline/cfunc.mod index c963ae9d0..92faae21b 100644 --- a/src/xspice/icm/tlines/cpline/cfunc.mod +++ b/src/xspice/icm/tlines/cpline/cfunc.mod @@ -39,16 +39,18 @@ static void copy_complex(DoubleComplex s, Complex_t *d) static DoubleComplex divide(DoubleComplex n1, DoubleComplex n2) { DoubleComplex rez; - rez._Val[0] = (n1._Val[0] * n2._Val[0] + n1._Val[1] * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); - rez._Val[1] = (n1._Val[1] * n2._Val[0] - n1._Val[0] * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); + double denom = n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]; + rez._Val[0] = (n1._Val[0] * n2._Val[0] + n1._Val[1] * n2._Val[1]) / denom; + rez._Val[1] = (n1._Val[1] * n2._Val[0] - n1._Val[0] * n2._Val[1]) / denom; return rez; } static DoubleComplex rdivide(double n1, DoubleComplex n2) { DoubleComplex rez; - rez._Val[0] = (n1 * n2._Val[0] + n1 * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); - rez._Val[1] = (n1 * n2._Val[0] - n1 * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); + double denom = n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]; + rez._Val[0] = (n1 * n2._Val[0]) / denom; + rez._Val[1] = (-1. * n1 * n2._Val[1]) / denom; return rez; } #endif @@ -116,10 +118,10 @@ void cm_cpline (ARGS) double bon = o*l/C0*sqrt(ero); DoubleComplex ge = _Cbuild(aen, ben); DoubleComplex go = _Cbuild(aon, bon); - DoubleComplex tango = _Cmulcr(ctanh(_Cmulcr(go, l)), 2.); - DoubleComplex tange = _Cmulcr(ctanh(_Cmulcr(ge, l)), 2.); - DoubleComplex singo = _Cmulcr(csinh(_Cmulcr(go, l)), 2.); - DoubleComplex singe = _Cmulcr(csinh(_Cmulcr(ge, l)), 2.); + DoubleComplex tango = _Cmulcr(ctanh(go), 2.); + DoubleComplex tange = _Cmulcr(ctanh(ge), 2.); + DoubleComplex singo = _Cmulcr(csinh(go), 2.); + DoubleComplex singe = _Cmulcr(csinh(ge), 2.); DoubleComplex zotango = rdivide(zo, tango); DoubleComplex zetange = rdivide(ze, tange); diff --git a/src/xspice/icm/tlines/cpmlin/cfunc.mod b/src/xspice/icm/tlines/cpmlin/cfunc.mod index 24c1b8981..5e12c2650 100644 --- a/src/xspice/icm/tlines/cpmlin/cfunc.mod +++ b/src/xspice/icm/tlines/cpmlin/cfunc.mod @@ -41,16 +41,18 @@ static void copy_complex(DoubleComplex s, Complex_t *d) static DoubleComplex divide(DoubleComplex n1, DoubleComplex n2) { DoubleComplex rez; - rez._Val[0] = (n1._Val[0] * n2._Val[0] + n1._Val[1] * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); - rez._Val[1] = (n1._Val[1] * n2._Val[0] - n1._Val[0] * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); + double denom = n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]; + rez._Val[0] = (n1._Val[0] * n2._Val[0] + n1._Val[1] * n2._Val[1]) / denom; + rez._Val[1] = (n1._Val[1] * n2._Val[0] - n1._Val[0] * n2._Val[1]) / denom; return rez; } static DoubleComplex rdivide(double n1, DoubleComplex n2) { DoubleComplex rez; - rez._Val[0] = (n1 * n2._Val[0] + n1 * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); - rez._Val[1] = (n1 * n2._Val[0] - n1 * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); + double denom = n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]; + rez._Val[0] = (n1 * n2._Val[0]) / denom; + rez._Val[1] = (-1. * n1 * n2._Val[1]) / denom; return rez; } #endif diff --git a/src/xspice/icm/tlines/mlin/cfunc.mod b/src/xspice/icm/tlines/mlin/cfunc.mod index d0520a8cf..2661ecdb5 100644 --- a/src/xspice/icm/tlines/mlin/cfunc.mod +++ b/src/xspice/icm/tlines/mlin/cfunc.mod @@ -32,16 +32,18 @@ typedef double complex DoubleComplex; static DoubleComplex divide(DoubleComplex n1, DoubleComplex n2) { DoubleComplex rez; - rez._Val[0] = (n1._Val[0] * n2._Val[0] + n1._Val[1] * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); - rez._Val[1] = (n1._Val[1] * n2._Val[0] - n1._Val[0] * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); + double denom = n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]; + rez._Val[0] = (n1._Val[0] * n2._Val[0] + n1._Val[1] * n2._Val[1]) / denom; + rez._Val[1] = (n1._Val[1] * n2._Val[0] - n1._Val[0] * n2._Val[1]) / denom; return rez; } static DoubleComplex rdivide(double n1, DoubleComplex n2) { DoubleComplex rez; - rez._Val[0] = (n1 * n2._Val[0] + n1 * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); - rez._Val[1] = (n1 * n2._Val[0] - n1 * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); + double denom = n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]; + rez._Val[0] = (n1 * n2._Val[0]) / denom; + rez._Val[1] = (-1. * n1 * n2._Val[1]) / denom; return rez; } #endif diff --git a/src/xspice/icm/tlines/msopen/cfunc.mod b/src/xspice/icm/tlines/msopen/cfunc.mod index 08fa954cb..561a14eaf 100644 --- a/src/xspice/icm/tlines/msopen/cfunc.mod +++ b/src/xspice/icm/tlines/msopen/cfunc.mod @@ -33,16 +33,18 @@ typedef double complex DoubleComplex; static DoubleComplex divide(DoubleComplex n1, DoubleComplex n2) { DoubleComplex rez; - rez._Val[0] = (n1._Val[0] * n2._Val[0] + n1._Val[1] * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); - rez._Val[1] = (n1._Val[1] * n2._Val[0] - n1._Val[0] * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); + double denom = n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]; + rez._Val[0] = (n1._Val[0] * n2._Val[0] + n1._Val[1] * n2._Val[1]) / denom; + rez._Val[1] = (n1._Val[1] * n2._Val[0] - n1._Val[0] * n2._Val[1]) / denom; return rez; } static DoubleComplex rdivide(double n1, DoubleComplex n2) { DoubleComplex rez; - rez._Val[0] = (n1 * n2._Val[0] + n1 * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); - rez._Val[1] = (n1 * n2._Val[0] - n1 * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); + double denom = n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]; + rez._Val[0] = (n1 * n2._Val[0]) / denom; + rez._Val[1] = (-1. * n1 * n2._Val[1]) / denom; return rez; } #endif diff --git a/src/xspice/icm/tlines/tline/cfunc.mod b/src/xspice/icm/tlines/tline/cfunc.mod index 60a9b6a64..e0fe74ec5 100644 --- a/src/xspice/icm/tlines/tline/cfunc.mod +++ b/src/xspice/icm/tlines/tline/cfunc.mod @@ -31,16 +31,18 @@ typedef double complex DoubleComplex; static DoubleComplex divide(DoubleComplex n1, DoubleComplex n2) { DoubleComplex rez; - rez._Val[0] = (n1._Val[0] * n2._Val[0] + n1._Val[1] * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); - rez._Val[1] = (n1._Val[1] * n2._Val[0] - n1._Val[0] * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); + double denom = n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]; + rez._Val[0] = (n1._Val[0] * n2._Val[0] + n1._Val[1] * n2._Val[1]) / denom; + rez._Val[1] = (n1._Val[1] * n2._Val[0] - n1._Val[0] * n2._Val[1]) / denom; return rez; } static DoubleComplex rdivide(double n1, DoubleComplex n2) { DoubleComplex rez; - rez._Val[0] = (n1 * n2._Val[0] + n1 * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); - rez._Val[1] = (n1 * n2._Val[0] - n1 * n2._Val[1]) / (n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]); + double denom = n2._Val[0] * n2._Val[0] + n2._Val[1] * n2._Val[1]; + rez._Val[0] = (n1 * n2._Val[0]) / denom; + rez._Val[1] = (-1. * n1 * n2._Val[1]) / denom; return rez; } #endif diff --git a/visualc/make-install-vngspice.bat b/visualc/make-install-vngspice.bat index 98b22ed6f..aa8a3e0ae 100644 --- a/visualc/make-install-vngspice.bat +++ b/visualc/make-install-vngspice.bat @@ -20,6 +20,7 @@ copy %cmsrc%\table.cm %dst%\lib\ngspice\table.cm copy %cmsrc%\xtraevt.cm %dst%\lib\ngspice\xtraevt.cm copy %cmsrc%\xtradev.cm %dst%\lib\ngspice\xtradev.cm copy %cmsrc%\spice2poly.cm %dst%\lib\ngspice\spice2poly.cm +copy %cmsrc%\tlines.cm %dst%\lib\ngspice\tlines.cm copy xspice\verilog\ivlng.dll %dst%\lib\ngspice\ivlng.dll copy xspice\verilog\shim.vpi %dst%\lib\ngspice\ivlng.vpi @@ -50,6 +51,7 @@ copy %cmsrc%\table64.cm %dst%\lib\ngspice\table.cm copy %cmsrc%\xtraevt64.cm %dst%\lib\ngspice\xtraevt.cm copy %cmsrc%\xtradev64.cm %dst%\lib\ngspice\xtradev.cm copy %cmsrc%\spice2poly64.cm %dst%\lib\ngspice\spice2poly.cm +copy %cmsrc%\tlines64.cm %dst%\lib\ngspice\tlines.cm copy xspice\verilog\ivlng.dll %dst%\lib\ngspice\ivlng.dll copy xspice\verilog\shim.vpi %dst%\lib\ngspice\ivlng.vpi diff --git a/visualc/make-install-vngspiced.bat b/visualc/make-install-vngspiced.bat index fdfa2e283..0f1d3548d 100644 --- a/visualc/make-install-vngspiced.bat +++ b/visualc/make-install-vngspiced.bat @@ -20,6 +20,7 @@ copy %cmsrc%\table.cm %dst%\lib\ngspice\table.cm copy %cmsrc%\xtraevt.cm %dst%\lib\ngspice\xtraevt.cm copy %cmsrc%\xtradev.cm %dst%\lib\ngspice\xtradev.cm copy %cmsrc%\spice2poly.cm %dst%\lib\ngspice\spice2poly.cm +copy %cmsrc%\tlines.cm %dst%\lib\ngspice\tlines.cm copy xspice\verilog\ivlng.dll %dst%\lib\ngspice\ivlng.dll copy xspice\verilog\shim.vpi %dst%\lib\ngspice\ivlng.vpi @@ -50,6 +51,7 @@ copy %cmsrc%\table64.cm %dst%\lib\ngspice\table.cm copy %cmsrc%\xtraevt64.cm %dst%\lib\ngspice\xtraevt.cm copy %cmsrc%\xtradev64.cm %dst%\lib\ngspice\xtradev.cm copy %cmsrc%\spice2poly64.cm %dst%\lib\ngspice\spice2poly.cm +copy %cmsrc%\tlines64.cm %dst%\lib\ngspice\tlines.cm copy xspice\verilog\ivlng.dll %dst%\lib\ngspice\ivlng.dll copy xspice\verilog\shim.vpi %dst%\lib\ngspice\ivlng.vpi