#| -*-Scheme-*-
-$Id: parass.scm,v 1.1 1994/11/19 02:02:36 adams Exp $
+$Id: parass.scm,v 1.2 1995/03/08 05:14:24 adams Exp $
Copyright (c) 1994 Massachusetts Institute of Technology
(topo-node/make dependency)))
dependencies)))
(for-each
- (lambda (pair)
- (let ((before (cdr pair)))
- (for-each
- (lambda (dependent)
- (let ((pair (assq dependent pairs)))
- (and pair
- (let ((after (cdr pair)))
- ;; For parallel assignment,
- ;; self-dependence is irrelevant.
- (and (not (eq? after before))
- (set-topo-node/before!
- after
- (cons before (topo-node/before after)))
- (set-topo-node/after!
- before
- (cons after (topo-node/after before))))))))
- (cdr (topo-node/contents before)))))
- pairs)
+ (lambda (pair)
+ (let ((before (cdr pair)))
+ (for-each
+ (lambda (dependent)
+ (let ((pair (assq dependent pairs)))
+ (if pair
+ (let ((after (cdr pair)))
+ ;; For parallel assignment,
+ ;; self-dependence is irrelevant.
+ (if (not (eq? after before))
+ (begin
+ (set-topo-node/before!
+ after
+ (cons before (topo-node/before after)))
+ (set-topo-node/after!
+ before
+ (cons after (topo-node/after before)))))))))
+ (cdr (topo-node/contents before)))))
+ pairs)
;; *** This should use the heuristics for n < 6 ***
- (let loop ((nodes* (reverse (sort-topologically (map cdr pairs))))
- (result '())
+ (let loop ((nodes* (reverse (sort-topologically (map cdr pairs))))
+ (result '())
(needed-to-right '()))
(if (null? nodes*)
result
- (let* ((node (car nodes*))
- (dependency (topo-node/contents node))
- (references (cdr dependency)))
+ (let* ((node (car nodes*))
+ (dependency (topo-node/contents node))
+ (references (cdr dependency)))
(loop (cdr nodes*)
(cons (vector (topo-node/early? node)
dependency
(conc-name topo-node/)
(constructor topo-node/make (contents)))
(contents false read-only true)
- (before '() read-only false)
- (after '() read-only false)
- (nbefore false read-only false)
- (early? false read-only false)
+ (before '() read-only false)
+ (after '() read-only false)
+ (nbefore false read-only false)
+ (early? false read-only false)
(dequeued false read-only false))
(define (sort-topologically nodes)
- (let* ((nnodes (length nodes))
- (buckets (make-vector (+ 1 nnodes) '())))
+ (let* ((nnodes (length nodes))
+ (buckets (make-vector (+ 1 nnodes) '())))
(define (update! node)
(set-topo-node/dequeued! node true)
(for-each (lambda (node*)
nbefore*
(cons node*
(vector-ref buckets nbefore*))))))
- (topo-node/after node)))
+ (topo-node/after node)))
(define (phase-2 left accum)
;; There must be a cycle, remove an early block
(vector-set! buckets
n
(cons node (vector-ref buckets n)))))
- nodes)
+ nodes)
(phase-1 nnodes '())))
\ No newline at end of file