Index: batchsim/Makefile
==================================================================
--- batchsim/Makefile
+++ batchsim/Makefile
@@ -1,7 +1,8 @@
+RUN=default.scm
 
 all : batchsim
-	./batchsim
+	./batchsim $(RUN)
 
 batchsim : batchsim.scm
 	csc batchsim.scm
 

Index: batchsim/batchsim.scm
==================================================================
--- batchsim/batchsim.scm
+++ batchsim/batchsim.scm
@@ -61,10 +61,74 @@
    15  ;; height
    400 ;; length
    ))
 (define *use-log* #f)
 (define *job-log-scale* 10)
+
+;;======================================================================
+;; CPU
+;;======================================================================
+
+(define-record cpu name num-cores mem job x y)
+
+;;======================================================================
+;; CPU Pool
+;;======================================================================
+
+(define-record pool name x y w h gap boxw cpus delta nrows ncols cpunum)
+
+(define (new-pool name x y nrows ncols gap boxw)
+  (let* ((delta (+ gap boxw))
+	 ;; (nrows (quotient h (+ gap delta)))
+	 ;; (ncols (quotient w (+ gap delta)))
+	 (w     (+ gap (* nrows delta)))
+	 (h     (+ gap (* ncols delta)))
+	 (cpus  (make-vector (* nrows ncols) #f))
+	 (npool (make-pool name x y w h gap boxw cpus delta nrows ncols 0)))
+    npool))
+
+(define (pool:add-cpu pool name num-cores mem)
+  (let* ((cpu (make-cpu name num-cores mem #f #f #f)))
+    (vector-set! (pool-cpus pool)(pool-cpunum pool) cpu)
+    (pool-cpunum-set! pool (+ 1 (pool-cpunum pool)))
+    cpu))
+
+(define (pool:draw ezx pool)
+  (let ((nrows (pool-nrows pool))
+	(ncols (pool-ncols pool))
+	(x     (pool-x     pool))
+	(y     (pool-y     pool))
+	(w     (pool-w     pool))
+	(h     (pool-h     pool))
+	(gap   (pool-gap   pool))
+	(boxw  (pool-boxw  pool))
+	(delta (pool-delta pool))
+	(cpus  (pool-cpus  pool)))
+    (ezx-select-layer ezx 1)
+    ;(ezx-wipe-layer   ezx 1)
+    ;; draw time at upper right
+    (ezx-str-2d ezx x y (pool-name pool) *black*)
+    (ezx-rect-2d ezx x y (+ x w)(+ y h) *black* 1)
+    (let loop ((row    0)
+	       (col    0)
+	       (cpunum 0))
+      (let* ((cpu  (vector-ref cpus cpunum))
+	     (xval (+ x gap (* row delta)))
+	     (yval (+ y gap (* col delta))))
+	(if cpu
+	    (begin
+	      (cpu-x-set! cpu xval)
+	      (cpu-y-set! cpu yval))
+	    (vector-set! cpus cpunum (make-cpu (conc cpunum) 1 1 #f xval yval)))
+	;; (print "box at " xval ", " yval)
+	(ezx-rect-2d ezx xval yval (+ xval boxw) (+ yval boxw) *grey* 1)
+	(if (< col (- ncols 1))
+	    (loop row (+ col 1)(+ cpunum 1))
+	    (if (< row (- nrows 1))
+		(loop (+ row 1) 0 (+ cpunum 1))))))
+    (ezx-redraw ezx)))
+	       
 
 ;;======================================================================
 ;; Users
 ;;======================================================================
 

Index: batchsim/default.scm
==================================================================
--- batchsim/default.scm
+++ batchsim/default.scm
@@ -7,10 +7,18 @@
 (let loop ((count 200))
   (add-cpu (conc "cpu_" count) 1 1)
   (if (>= count 0)(loop (- count 1))))
 
 (draw-cpus)
+
+(define *pool1* (new-pool "generic" 100 100 100 100 2 10))
+(let loop ((count 10))
+  (pool:add-cpu *pool1* (conc count) 1 1)
+  (if (> count 0)
+      (loop (- count 1))))
+
+(pool:draw *ezx* *pool1*)
 
 ;; init the queues
 ;;
 (hash-table-set! *queues* "normal" '())
 (hash-table-set! *queues* "quick"  '())

ADDED   batchsim/testing.scm
Index: batchsim/testing.scm
==================================================================
--- /dev/null
+++ batchsim/testing.scm
@@ -0,0 +1,135 @@
+;; run sim for four hours
+;;
+(define *end-time* (* 60 50))
+
+;; create the cpus
+;;
+(let loop ((count 200))
+  (add-cpu (conc "cpu_" count) 1 1)
+  (if (>= count 0)(loop (- count 1))))
+
+;; (draw-cpus)
+
+(define *pool1* (new-pool "generic" 20 20 12 80 2 4))
+(let loop ((count 10))
+  (pool:add-cpu *pool1* (conc count) 1 1)
+  (if (> count 0)
+      (loop (- count 1))))
+
+(pool:draw *ezx* *pool1*)
+
+;; ;; init the queues
+;; ;;
+;; (hash-table-set! *queues* "normal" '())
+;; (hash-table-set! *queues* "quick"  '())
+;; (draw-queues)
+;; 
+;; ;; user k adds 200 jobs at time zero
+;; ;;
+;; (event *start-time*
+;;        (lambda ()
+;; 	 (let loop ((count 300)) ;; add 500 jobs
+;; 	   (add-job "normal" "k" 600 1 1)
+;; 	   (if (>= count 0)(loop (- count 1))))))
+;; 
+;; ;; one minute in user m runs ten jobs
+;; ;;
+;; (event (+ 600 *start-time*)
+;;        (lambda ()
+;; 	 (let loop ((count 300)) ;; add 100 jobs
+;; 	   (add-job "normal" "m" 600 1 1)
+;; 	   (if (> count 0)(loop (- count 1))))))
+;; 
+;; ;; every minute user j runs ten jobs
+;; ;;
+;; (define *user-j-jobs* 300)
+;; (event (+ 600 *start-time*)
+;;        (lambda ()
+;; 	 (let f ()
+;; 	   (schedule 60)
+;; 	   (if (> *user-j-jobs* 0)
+;; 	       (begin
+;; 		 (let loop ((count 5)) ;; add 100 jobs
+;; 		   (add-job "quick" "j" 600 1 1)
+;; 		   (if (> count 0)(loop (- count 1))))
+;; 		 (set! *user-j-jobs* (- *user-j-jobs* 5))))
+;; 	   (if (and (not *done*)
+;; 		    (> *user-j-jobs* 0))
+;; 	       (f))))) ;; Megatest user running 200 jobs
+;; 
+;; ;; every minute user j runs ten jobs
+;; ;;
+;; (define *user-j-jobs* 300)
+;; (event (+ 630 *start-time*)
+;;        (lambda ()
+;; 	 (let f ()
+;; 	   (schedule 60)
+;; 	   (if (> *user-j-jobs* 0)
+;; 	       (begin
+;; 		 (let loop ((count 5)) ;; add 100 jobs
+;; 		   (add-job "quick" "n" 600 1 1)
+;; 		   (if (> count 0)(loop (- count 1))))
+;; 		 (set! *user-j-jobs* (- *user-j-jobs* 5))))
+;; 	   (if (and (not *done*)
+;; 		    (> *user-j-jobs* 0))
+;; 	       (f))))) ;; Megatest user running 200 jobs
+;; 
+;; ;; ;;
+;; ;; (event *start-time*
+;; ;;        (lambda ()
+;; ;; 	 (let f ((count 200))
+;; ;; 	   (schedule 10)
+;; ;; 	   (add-job "normal" "t" 60 1 1)
+;; ;; 	   (if (and (not *done*)
+;; ;; 		    (>= count 0))
+;; ;; 	       (f (- count 1))))))
+;; 
+;; ;; every 3 seconds check for available machines and launch a job
+;; ;;
+;; (event *start-time*
+;;        (lambda ()
+;; 	 (let f ()
+;; 	   (schedule 3)
+;; 	   (let ((queue-names (random-sort (hash-table-keys *queues*))))
+;; 	     (let loop ((cpu   (get-cpu))
+;; 			(count (+ (length queue-names) 4))
+;; 			(qname (car queue-names))
+;; 			(remq  (cdr queue-names)))
+;; 	       (if (and cpu
+;; 			(> count 0))
+;; 		   (begin
+;; 		     (if (peek-job qname) ;; any jobs to do in normal queue
+;; 			 (let ((job (take-job qname)))
+;; 			   (run-job cpu job)))
+;; 		     (loop (get-cpu)
+;; 			   (- count 1)
+;; 			   (if (null? remq)
+;; 			       (car queue-names)
+;; 			       (car remq))
+;; 			   (if (null? remq)
+;; 			       (cdr queue-names)
+;; 			       (cdr remq)))))))
+;; 	   (if (not *done*)(f)))))
+;; 
+;; ;; screen updates
+;; ;;
+(event *start-time* (lambda ()
+		      (let f ()
+			(schedule 60) ;; update the screen every 60 seconds of sim time
+			;; (draw-cpus) ;; (print "Now: " *now* " queue: " (hash-table->alist *queues*))
+			(pool:draw *ezx* *pool1*)
+
+			(wait-for-next-draw-time)
+			(if (not *done*) (f)))))
+;; 
+;; 
+;; ;; end the simulation
+;; ;;
+(event *end-time*
+       (lambda () 
+	 (set! *event-list* '())
+	 (set! *done* #t)))
+;; 
+(start)
+;; ;; (exit 0)
+;;