user1 <···@net.com> wrote:
> Actually I would be surprised if there were no errors in the original
> schematic. I'm sure it could be improved in numerous ways.
there is no error in your schematic, I've checked it with the Lisp
program below, which I've extracted from your schematic:
http://www.frank-buss.de/tmp/life.png
I'm crossposting this to comp.lang.lisp, because I wonder if it is
possible to write a program, which simplifies the boolean expression,
which is calculated by (get-bool 0) or if it is possible to create the
simplest possible boolean expression from a given truth table.
(defparameter *inputs* '(a b c d e f g h s))
(defparameter *gates*
'(logior
logand
logxor
logand
logxor
logand
logxor
logand
logxor
logand
logxor
logand
logxor
logxor
logand
logxor
logand
logxor
logxor
logand
logxor
logand
logxor
logxor
logand
logxor
logand
logxor
logxor
logand
logxor
logxor
lognot
logand
logand
logand
lognot
logand))
(defparameter *wires*
'((35 37)
(a b)
(a b)
(2 c)
(2 c)
(1 3)
(1 3)
(4 d)
(4 d)
(6 7)
(6 7)
(8 e)
(8 e)
(5 9)
(10 11)
(10 11)
(12 f)
(12 f)
(13 14)
(15 16)
(15 16)
(17 g)
(17 g)
(18 19)
(20 21)
(20 21)
(22 h)
(22 h)
(23 24)
(25 26)
(25 26)
(28 29)
(31)
(30 32)
(30 27)
(33 s)
(31)
(36 34)))
(defun get-bool (gate)
(if (find gate *inputs*)
gate
(let ((wire (elt *wires* gate)))
(append (list (elt *gates* gate)) (mapcar #'get-bool wire)))))
(defmacro life ()
(get-bool 0))
(defun test ()
(let ((false 0))
(loop for i from 0 to 511 do
(let* ((a (if (> (logand i 1) 0) 1 0))
(b (if (> (logand i 2) 0) 1 0))
(c (if (> (logand i 4) 0) 1 0))
(d (if (> (logand i 8) 0) 1 0))
(e (if (> (logand i 16) 0) 1 0))
(f (if (> (logand i 32) 0) 1 0))
(g (if (> (logand i 64) 0) 1 0))
(h (if (> (logand i 128) 0) 1 0))
(s (if (> (logand i 256) 0) 1 0))
(next-life (life))
(count 0)
(next-calculated 0))
(when (= a 1) (incf count))
(when (= b 1) (incf count))
(when (= c 1) (incf count))
(when (= d 1) (incf count))
(when (= e 1) (incf count))
(when (= f 1) (incf count))
(when (= g 1) (incf count))
(when (= h 1) (incf count))
(setf next-calculated s)
(when (= count 3) (setf next-calculated 1))
(when (< count 2) (setf next-calculated 0))
(when (> count 3) (setf next-calculated 0))
(when (/= next-life next-calculated) (incf false))))
(format t "false: ~a~%" false)))
Using Lisp syntax the boolean expression for the next state (which is
returned by "(get-bool 0)") looks like this:
(LOGIOR (LOGAND (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGXOR
(LOGAND A B) (LOGAND (LOGXOR A B) C)) (LOGAND (LOGXOR (LOGXOR A B) C) D))
(LOGAND (LOGXOR (LOGXOR (LOGXOR A B) C) D) E)) (LOGAND (LOGXOR (LOGXOR
(LOGXOR (LOGXOR A B) C) D) E) F)) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR
(LOGXOR A B) C) D) E) F) G)) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR
(LOGXOR (LOGXOR A B) C) D) E) F) G) H)) (LOGNOT (LOGXOR (LOGXOR (LOGXOR
(LOGXOR (LOGXOR (LOGAND (LOGAND A B) (LOGAND (LOGXOR A B) C)) (LOGAND
(LOGXOR (LOGAND A B) (LOGAND (LOGXOR A B) C)) (LOGAND (LOGXOR (LOGXOR A
B) C) D))) (LOGAND (LOGXOR (LOGXOR (LOGAND A B) (LOGAND (LOGXOR A B) C))
(LOGAND (LOGXOR (LOGXOR A B) C) D)) (LOGAND (LOGXOR (LOGXOR (LOGXOR A B)
C) D) E))) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGAND A B) (LOGAND (LOGXOR A
B) C)) (LOGAND (LOGXOR (LOGXOR A B) C) D)) (LOGAND (LOGXOR (LOGXOR
(LOGXOR A B) C) D) E)) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR A B) C) D)
E) F))) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGAND A B) (LOGAND
(LOGXOR A B) C)) (LOGAND (LOGXOR (LOGXOR A B) C) D)) (LOGAND (LOGXOR
(LOGXOR (LOGXOR A B) C) D) E)) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR A
B) C) D) E) F)) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGXOR A B) C)
D) E) F) G))) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGAND A
B) (LOGAND (LOGXOR A B) C)) (LOGAND (LOGXOR (LOGXOR A B) C) D)) (LOGAND
(LOGXOR (LOGXOR (LOGXOR A B) C) D) E)) (LOGAND (LOGXOR (LOGXOR (LOGXOR
(LOGXOR A B) C) D) E) F)) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGXOR
A B) C) D) E) F) G)) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGXOR
(LOGXOR A B) C) D) E) F) G) H))))) S) (LOGAND (LOGNOT (LOGXOR (LOGXOR
(LOGXOR (LOGXOR (LOGXOR (LOGAND (LOGAND A B) (LOGAND (LOGXOR A B) C))
(LOGAND (LOGXOR (LOGAND A B) (LOGAND (LOGXOR A B) C)) (LOGAND (LOGXOR
(LOGXOR A B) C) D))) (LOGAND (LOGXOR (LOGXOR (LOGAND A B) (LOGAND (LOGXOR
A B) C)) (LOGAND (LOGXOR (LOGXOR A B) C) D)) (LOGAND (LOGXOR (LOGXOR
(LOGXOR A B) C) D) E))) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGAND A B)
(LOGAND (LOGXOR A B) C)) (LOGAND (LOGXOR (LOGXOR A B) C) D)) (LOGAND
(LOGXOR (LOGXOR (LOGXOR A B) C) D) E)) (LOGAND (LOGXOR (LOGXOR (LOGXOR
(LOGXOR A B) C) D) E) F))) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR
(LOGAND A B) (LOGAND (LOGXOR A B) C)) (LOGAND (LOGXOR (LOGXOR A B) C) D))
(LOGAND (LOGXOR (LOGXOR (LOGXOR A B) C) D) E)) (LOGAND (LOGXOR (LOGXOR
(LOGXOR (LOGXOR A B) C) D) E) F)) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR
(LOGXOR A B) C) D) E) F) G))) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR
(LOGXOR (LOGAND A B) (LOGAND (LOGXOR A B) C)) (LOGAND (LOGXOR (LOGXOR A
B) C) D)) (LOGAND (LOGXOR (LOGXOR (LOGXOR A B) C) D) E)) (LOGAND (LOGXOR
(LOGXOR (LOGXOR (LOGXOR A B) C) D) E) F)) (LOGAND (LOGXOR (LOGXOR (LOGXOR
(LOGXOR (LOGXOR A B) C) D) E) F) G)) (LOGAND (LOGXOR (LOGXOR (LOGXOR
(LOGXOR (LOGXOR (LOGXOR A B) C) D) E) F) G) H)))) (LOGAND (LOGXOR (LOGXOR
(LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGAND A B) (LOGAND (LOGXOR A B) C))
(LOGAND (LOGXOR (LOGXOR A B) C) D)) (LOGAND (LOGXOR (LOGXOR (LOGXOR A B)
C) D) E)) (LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR A B) C) D) E) F))
(LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGXOR A B) C) D) E) F) G))
(LOGAND (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGXOR A B) C) D) E) F)
G) H)) (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGXOR (LOGXOR A B) C) D)
E) F) G) H))))
--
Frank Bu�, ··@frank-buss.de
http://www.frank-buss.de, http://www.it4-systems.de