;;; -*- Mode:LISP; Package:USER; Base:10; Readtable:CL -*- (defun clocks (&aux (freqs nil) (prev nil)) (format t "~&Clock derived from multiple of 10 Mhz NuBus clock:") (format t "~2&Period Clock freq PLL freq Divisor") (do ((mul 1 (1+ mul))) ;multiply nubus by ((> mul 15)) (do ((div 1 (1+ div))) ;then divide by ((> div 100)) (let ((mhz (/ (* 10.0 mul) div)) (pll (* 10.0 mul))) (when (and (> mhz 10) (< mhz 20)) ; (format t "~&~5,2f Mhz ~3d Mhz ~5,1,3f ns" mhz (fix pll) (/ 1.0 mhz)) (push (list mhz (fix pll) (/ 1.0 mhz) div) freqs) )))) (setq freqs (sort freqs #'cmp-freq)) (dolist (f freqs) (when (or (null prev) (not (= (caddr prev) (caddr f)))) (format t "~&~4,1,3f ns ~5,2f Mhz ~3d Mhz ~d" (caddr f) (car f) (cadr f) (cadddr f))) (setq prev f)) ) (defun cmp-freq (f1 f2) (if (not (= (caddr f1) (caddr f2))) (< (caddr f1) (caddr f2)) (< (cadr f1) (cadr f2)))) (defun c1 () (format t "~&clock freq PLL freq period") (do ((mhz 10 (+ .25 mhz))) ((= mhz 20)) (format t "~&~5,2f Mhz ~3d Mhz ~5,1,3f ns" mhz (xlcm 10 (rationalize mhz)) (/ 1.0 mhz)))) (defun flcm (n &rest r) "attempt at lcm of real numbers" (/ (lexpr-funcall #'lcm (fix (* n 1000)) (mapcar #'fix (mapcar #'* r (circular-list 1000)))) 1000)) (defun xlcm (&rest r) "attempt at lcm of real numbers" (let ((mult (apply #'lcm (mapcar #'denominator r)))) (/ (apply #'lcm (mapcar #'(lambda (x) (* x mult)) r)) mult)))