From 2dd413e448d8414efef609030f77a5aebd6facf8 Mon Sep 17 00:00:00 2001 From: Dave Brolley Date: Fri, 14 Jul 2006 18:49:32 +0000 Subject: [PATCH] 2006-07-14 Dave Brolley * sid.scm (-op-gen-delayed-set-maybe-trace): If delay used, note the hardware or memory mode which was used. * sid-cpu.scm (hw-need-write-stack?): New function. (-gen-hw-stream-and-destream-fns): Compute stack-regs. Use it to identify hardware which uses write stacks. (useful-mode-names): Renamed to write-stack-memory-mode-names. Initialized to an empty list. (-gen-writestacks, -gen-reset-fn, -gen-unified-write-fn): Use hw-need-write-stack?. * hardware.scm (used-in-delay-rtl?): New member of . (define-getters ): Define used-in-delay-rtl?. (used-in-delay-rtl?): New method of . (hw-used-in-delay-rtl?): New function. --- ChangeLog | 16 ++++++++++++++++ hardware.scm | 15 ++++++++++++++- sid-cpu.scm | 23 ++++++++++++++--------- sid.scm | 5 +++++ 4 files changed, 49 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index ed55e96..f3b4c68 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,19 @@ +2006-07-14 Dave Brolley + + * sid.scm (-op-gen-delayed-set-maybe-trace): If delay used, note the + hardware or memory mode which was used. + * sid-cpu.scm (hw-need-write-stack?): New function. + (-gen-hw-stream-and-destream-fns): Compute stack-regs. Use it to + identify hardware which uses write stacks. + (useful-mode-names): Renamed to write-stack-memory-mode-names. + Initialized to an empty list. + (-gen-writestacks, -gen-reset-fn, -gen-unified-write-fn): Use + hw-need-write-stack?. + * hardware.scm (used-in-delay-rtl?): New member of . + (define-getters ): Define used-in-delay-rtl?. + (used-in-delay-rtl?): New method of . + (hw-used-in-delay-rtl?): New function. + 2006-06-20 Dave Brolley * sid.scm (gen-attr-type): Removed. diff --git a/hardware.scm b/hardware.scm index 70f5a6b..a42aefe 100644 --- a/hardware.scm +++ b/hardware.scm @@ -66,6 +66,10 @@ ; or #f if not computed yet. ; This is a derived from the ISA attribute and is for speed. (isas-cache . #f) + + ; Flag indicates whether this hw has been used in a (delay ...) + ; rtl expression + (used-in-delay-rtl? . #f) ) nil) ) @@ -77,7 +81,7 @@ ; ??? These might be more properly named hw-get/hw-set, but those names ; seem ambiguous. (get . getter) (set . setter) - isas-cache) + isas-cache used-in-delay-rtl?) ) ; Mode,rank,shape support. @@ -160,6 +164,15 @@ (define (hw-isas hw) (send hw 'get-isas)) +; Was this hardware used in a (delay ...) rtl expression? + +(method-make! + 'used-in-delay-rtl? + (lambda (self) (elm-get self 'used-in-delay-rtl?)) +) + +(define (hw-used-in-delay-rtl? hw) (send hw 'used-in-delay-rtl?)) + ; FIXME: replace pc?,memory?,register?,iaddress? with just one method. ; Return boolean indicating if hardware element is the PC. diff --git a/sid-cpu.scm b/sid-cpu.scm index eb6f192..d81218d 100644 --- a/sid-cpu.scm +++ b/sid-cpu.scm @@ -171,6 +171,10 @@ namespace @arch@ { (not (obj-has-attr? hw 'VIRTUAL))) ) +(define (hw-need-write-stack? hw) + (and (register? hw) (hw-used-in-delay-rtl? hw)) +) + ; Subroutine of -gen-hardware-types to generate the struct containing ; hardware elements of one isa. @@ -204,6 +208,7 @@ namespace @arch@ { (define (-gen-hw-stream-and-destream-fns) (let* ((sa string-append) (regs (find hw-need-storage? (current-hw-list))) + (stack-regs (find hw-need-write-stack? (current-hw-list))) (reg-dim (lambda (r) (let ((dims (-hw-vector-dims r))) (if (equal? 0 (length dims)) @@ -211,8 +216,8 @@ namespace @arch@ { (number->string (car dims)))))) (write-stacks (map (lambda (n) (sa n "_writes")) - (append (map (lambda (r) (gen-c-symbol (obj:name r))) regs) - (map (lambda (m) (sa (symbol->string m) "_memory")) useful-mode-names)))) + (append (map (lambda (r) (gen-c-symbol (obj:name r))) stack-regs) + (map (lambda (m) (sa (symbol->string m) "_memory")) write-stack-memory-mode-names)))) (stream-reg (lambda (r) (let ((rname (sa "hardware." (gen-c-symbol (obj:name r))))) (if (hw-scalar? r) @@ -381,7 +386,7 @@ typedef struct { ;;; begin stack-based write schedule ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -(define useful-mode-names '(BI QI HI SI DI UQI UHI USI UDI SF DF)) +(define write-stack-memory-mode-names '()) (define (-calculated-memory-write-buffer-size) (let* ((is-mem? (lambda (op) (eq? (hw-sem-name (op:type op)) 'h-memory))) @@ -444,8 +449,8 @@ typedef struct { (define (-gen-writestacks) - (let* ((hw (find register? (current-hw-list))) - (modes useful-mode-names) + (let* ((hw (find hw-need-write-stack? (current-hw-list))) + (modes write-stack-memory-mode-names) (hw-pairs (map (lambda (h) (list (gen-c-symbol (obj:name h)) (obj:name (hw-mode h)))) hw)) @@ -626,9 +631,9 @@ using namespace cgen; (define (-gen-reset-fn) (let* ((sa string-append) (objs (append (map (lambda (h) (gen-c-symbol (obj:name h))) - (find register? (current-hw-list))) + (find hw-need-write-stack? (current-hw-list))) (map (lambda (m) (sa (symbol->string m) "_memory")) - useful-mode-names))) + write-stack-memory-mode-names))) (clr (lambda (elt) (sa " clear_stacks (" elt "_writes);\n")))) (sa " template \n" @@ -642,8 +647,8 @@ using namespace cgen; " }"))) (define (-gen-unified-write-fn) - (let* ((hw (find register? (current-hw-list))) - (modes useful-mode-names) + (let* ((hw (find hw-need-write-stack? (current-hw-list))) + (modes write-stack-memory-mode-names) (hw-triples (map (lambda (h) (list (gen-c-symbol (obj:name h)) (obj:name (hw-mode h)) (length (-hw-vector-dims h)))) diff --git a/sid.scm b/sid.scm index d1ad559..ec4c493 100644 --- a/sid.scm +++ b/sid.scm @@ -1100,6 +1100,11 @@ (idx-args (if (equal? idx "") "" (string-append ", " idx))) ) + (if delayval + (if (eq? (obj:name hw) 'h-memory) + (set write-stack-memory-mode-names (cons md write-stack-memory-mode-names)) + (elm-set! hw 'used-in-delay-rtl? #t))) + (string-append " {\n" -- 2.43.5