;;; -*- 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)))
