;;;-*-mode:lisp;package:lambda;base:8.-*-

(defselect (PDL-POINTER-PASS-AROUND-ACTOR)
  (:read (address) address
    *PASS-AROUND-DATA*)
  (:write (address data) address
    (WRITE-SPY-REG DATA)
    (LAM-EXECUTE (UINST-CLOCK-PLUS-UINST-CLOCK-LOW)
	LAM-IR-M-SRC LAM-M-SRC-SPY-REG
	LAM-IR-ALUF LAM-ALU-SETM 
	LAM-IR-OB LAM-OB-ALU
	LAM-IR-FUNC-DEST LAM-FUNC-DEST-C-PP)		;ADR
    (LAM-EXECUTE (EXECUTOR LAM-EXECUTE-R-NO-CHECK)
		  LAM-IR-M-SRC LAM-M-SRC-C-PP
		  LAM-IR-ALUF LAM-ALU-SETM
		  LAM-IR-OB LAM-OB-ALU)
    (SETQ *PASS-AROUND-DATA* (READ-MFO))
    (ADVANCE-TO-NEXT-UINST-CLOCK)
    (FORCE-UINST-CLOCK-LOW)
    ))

(defun test-c-pp-pass-data-path ()
  (test-data-path "pdl-pointer-pass-around" 'pdl-pointer-pass-around-actor 32.))

(defselect (PDL-INDEX-PASS-AROUND-ACTOR)
  (:read (address) address
    *PASS-AROUND-DATA*)
  (:write (address data) address
    (WRITE-SPY-REG DATA)
    (LAM-EXECUTE (UINST-CLOCK-PLUS-UINST-CLOCK-LOW)
	LAM-IR-M-SRC LAM-M-SRC-SPY-REG
	LAM-IR-ALUF LAM-ALU-SETM 
	LAM-IR-OB LAM-OB-ALU
	LAM-IR-FUNC-DEST LAM-FUNC-DEST-C-PI)		;ADR
    (LAM-EXECUTE (EXECUTOR LAM-EXECUTE-R-NO-CHECK)
		  LAM-IR-M-SRC LAM-M-SRC-c-PI
		  LAM-IR-ALUF LAM-ALU-SETM
		  LAM-IR-OB LAM-OB-ALU)
    (SETQ *PASS-AROUND-DATA* (READ-MFO))
    (ADVANCE-TO-NEXT-UINST-CLOCK)
    (FORCE-UINST-CLOCK-LOW)
    ))

(defun test-c-pi-pass-data-path ()
  (test-data-path "pdl-index-pass-around" 'pdl-index-pass-around-actor 32.))

(DEF-UTEST FAST-TEST-PDL-PP-PI-AND-M-PASS-AROUND "C-PP C-PI C-MEM PASS AROUND TEST"

  :ARGUMENTS (MAX START-FOR-PP START-FOR-PI START-FOR-MEM)
  
  :CONSTANTS ((M-CONTENTS-OF-PP 4)
	      (M-CONTENTS-OF-PI 5)
	      (M-CONTENTS-OF-MEM 6)
	      (M-SCRATCH-OF-PP 7)
	      (M-SCRATCH-OF-PI 8.)
	      (M-SCRATCH-OF-MEM 9.)
	      (M-TIMES 10.)
	      (M-NUMBER-OF-TIMES-MAX 11.)
	      (M-CONTENTS-OF-MEM-DEST 12.))

  :INPUT-VALUES (((M-MEM M-CONTENTS-OF-PP) 'START-FOR-PP)
		 ((M-MEM M-CONTENTS-OF-PI) 'START-FOR-PI)
		 ((M-MEM M-CONTENTS-OF-MEM) 'START-FOR-MEM)
		 ((M-MEM M-NUMBER-OF-TIMES-MAX) 'MAX)
		 ((m-mem m-times) 0))

  :ERROR-STOPS ((ERROR-PP "ERROR IN PASS AROUND OF CONTENTS OF LOCATION POINTED TO BY PP")
		(ERROR-PI "ERROR IN PASS AROUND OF CONTENTS OF LOCATION POINTED TO BY PI")
		(ERROR-M "ERROR IN PASS AROUND OF CONTENTS OF M MEMORY"))

  :GOOD-STOP GS

  :TIME-OUT 30.

  :START START-LOOP

  :CODE (

     START-LOOP
     
        (LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC M-CONTENTS-OF-PP
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-C-PP
	 LAM-IR-ALUF LAM-ALU-SETM)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-MEM-DEST M-SCRATCH-OF-PP
	 LAM-IR-M-SRC LAM-M-SRC-C-PP
	 LAM-IR-ALUF LAM-ALU-SETM)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC M-CONTENTS-OF-PI
	 LAM-IR-FUNC-DEST LAM-FUNC-DEST-C-PI
	 LAM-IR-ALUF LAM-ALU-SETM)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-MEM-DEST M-SCRATCH-OF-PI
	 LAM-IR-M-SRC LAM-M-SRC-C-PI
	 LAM-IR-ALUF LAM-ALU-SETM)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC M-CONTENTS-OF-MEM
	 LAM-IR-M-MEM-DEST M-CONTENTS-OF-MEM-DEST 
	 LAM-IR-ALUF LAM-ALU-SETM)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-M-SRC M-CONTENTS-OF-MEM-DEST
	 LAM-IR-M-MEM-DEST M-SCRATCH-OF-MEM
	 LAM-IR-ALUF LAM-ALU-SETM)

	(LAM-IR-OP LAM-OP-JUMP
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	 LAM-IR-JUMP-ADDR ERROR-PP-1
	 LAM-IR-M-SRC M-CONTENTS-OF-PP
	 LAM-IR-A-SRC M-SCRATCH-OF-PP
	 LAM-IR-N 1)

	(LAM-IR-OP LAM-OP-JUMP
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	 LAM-IR-JUMP-ADDR ERROR-PI-1
	 LAM-IR-M-SRC M-CONTENTS-OF-PI
	 LAM-IR-A-SRC M-SCRATCH-OF-PI
	 LAM-IR-N 1)

	(LAM-IR-OP LAM-OP-JUMP
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M-NEQ-A
	 LAM-IR-JUMP-ADDR ERROR-M-1
	 LAM-IR-M-SRC M-CONTENTS-OF-MEM
	 LAM-IR-A-SRC M-SCRATCH-OF-MEM
	 LAM-IR-N 1)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-ALUF LAM-ALU-M+1
	 LAM-IR-M-SRC M-CONTENTS-OF-PP
	 LAM-IR-M-MEM-DEST M-CONTENTS-OF-PP)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-ALUF LAM-ALU-M+1
	 LAM-IR-M-SRC M-CONTENTS-OF-PI
	 LAM-IR-M-MEM-DEST M-CONTENTS-OF-PI)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-ALUF LAM-ALU-M+1
	 LAM-IR-M-SRC M-CONTENTS-OF-MEM
	 LAM-IR-M-MEM-DEST M-CONTENTS-OF-MEM)

	(LAM-IR-OP LAM-OP-JUMP
	 LAM-IR-JUMP-COND LAM-JUMP-COND-M<=A
	 LAM-IR-JUMP-ADDR START-LOOP
	 LAM-IR-M-SRC M-TIMES
	 LAM-IR-A-SRC M-NUMBER-OF-TIMES-MAX
	 LAM-IR-N 0)

	(LAM-IR-OP LAM-OP-ALU
	 LAM-IR-OB LAM-OB-ALU
	 LAM-IR-ALUF LAM-ALU-M+1
	 LAM-IR-M-SRC M-TIMES
	 LAM-IR-M-MEM-DEST M-TIMES)

	(LAM-IR-HALT 1)	

    GS
        (LAM-IR-HALT 1)
    error-pi-1
	(lam-ir-halt 1)
    ERROR-PI
        (LAM-IR-HALT 1)
    error-pp-1
        (lam-ir-halt 1)
    ERROR-PP
        (LAM-IR-HALT 1)
    error-m-1
        (lam-ir-halt 1)
    ERROR-M
        (LAM-IR-HALT 1)

	(LAM-IR-HALT 1)))



