aboutsummaryrefslogtreecommitdiffstats
path: root/cad/spice
diff options
context:
space:
mode:
authorjdp <jdp@FreeBSD.org>2006-05-15 00:48:07 +0800
committerjdp <jdp@FreeBSD.org>2006-05-15 00:48:07 +0800
commitd14af2bad7924e3581c3ed08115e2099bafafaa2 (patch)
tree18b2a26a97a3bb1c4201eb16d225f6af9771db25 /cad/spice
parentd3c8e948019c16d7114471a427f4fbebce2e0de1 (diff)
downloadfreebsd-ports-gnome-d14af2bad7924e3581c3ed08115e2099bafafaa2.tar.gz
freebsd-ports-gnome-d14af2bad7924e3581c3ed08115e2099bafafaa2.tar.zst
freebsd-ports-gnome-d14af2bad7924e3581c3ed08115e2099bafafaa2.zip
The spice3 "^" operator (power) did not work properly unless its
right-hand operand was a constant, because of a bug in the code to take the derivative of an expression. Add a patch to fix that.
Diffstat (limited to 'cad/spice')
-rw-r--r--cad/spice/files/patch-src_lib_inp_inpptree_c34
1 files changed, 34 insertions, 0 deletions
diff --git a/cad/spice/files/patch-src_lib_inp_inpptree_c b/cad/spice/files/patch-src_lib_inp_inpptree_c
new file mode 100644
index 000000000000..0819cac1407d
--- /dev/null
+++ b/cad/spice/files/patch-src_lib_inp_inpptree_c
@@ -0,0 +1,34 @@
+--- src/lib/inp/inpptree.c.orig Mon May 3 02:16:54 1993
++++ src/lib/inp/inpptree.c Sun May 14 09:34:56 2006
+@@ -1,6 +1,8 @@
+ /**********
+ Copyright 1990 Regents of the University of California. All rights reserved.
+ Author: 1987 Wayne A. Christopher, U. C. Berkeley CAD Group
++Modified: 2006 John D. Polstra - Fix differentiation of a^b where b is not
++ constant.
+ **********/
+
+ #include "spice.h"
+@@ -206,18 +208,10 @@
+ mkcon(p->right->constant - 1))),
+ arg1);
+ } else {
+- /* This is complicated. f(x) ^ g(x) ->
+- * exp(y(x) * ln(f(x)) ...
+- */
+- arg1 = PTdifferentiate(p->left, varnum);
+- arg2 = PTdifferentiate(p->right, varnum);
+- newp = mkb(PT_TIMES, mkf(PTF_EXP, mkb(PT_TIMES,
+- p->right, mkf(PTF_LN, p->left))),
+- mkb(PT_PLUS, mkb(PT_TIMES, p->right,
+- mkb(PT_DIVIDE, arg1, p->left)),
+- mkb(PT_TIMES, arg2,
+- mkf(PTF_LN, arg1))));
+-
++ /* Rewrite a^b as exp(ln(a) * b) */
++ newp = mkf(PTF_EXP, mkb(PT_TIMES, mkf(PTF_LN, p->left), p->right));
++ /* Differentiate the rewritten form. */
++ newp = PTdifferentiate(newp, varnum);
+ }
+ break;
+