OpenCores
URL https://opencores.org/ocsvn/core_arm/core_arm/trunk

Subversion Repositories core_arm

[/] [core_arm/] [trunk/] [soft/] [cdef/] [cdef_lib_i1.el] - Rev 4

Compare with Previous | Blame | View Log

; Konrad Eisele <eiselekd@web.de>
; cdef_lib_i1.el: Some insn functions
;-----------------------------------------------------------------------
 
(defun is-decoder (l)
  (and (listp l) (eq (length l) 5) (hash-table-p (nth 3 l))))
 
(defun space-string (n c)
  (let ((str "")
	(e 0))
    (dotimes (e n)
      (setq str (concat str c))
    )
    `,str
  )
)
 
(defun print-decode-hash (dec depth)
  (cond 
     ((hash-table-p dec)
     (let ((p ""))
       ( maphash (function (lambda (k v)
	 (let ((p2 ""))
	   (setq p2 (concat p2 (space-string (- depth 1) "|") "+" (mapconcat 'number-to-string k "" ) "=" ))
	   (if (is-decoder v)
	       (setq p2 (concat p2 "\n" (print-decoder v depth)))
	       (setq p2 (concat p2 (mapconcat 'symbol-name v "," ) "\n"))
	   )
	   (setq p (concat p p2))
	 ))) dec )
       `,p
     ))
     ((listp dec)
      (mapconcat 'print-list dec " ")
     )
     ((t) ('"?")))
)
 
(defun print-decoder (d depth)
  (let ((l (- 31 (nth 1 d)))
	(r (+ (- 31 (nth 2 d)) 1))
	(dec (nth 3 d))
	(def (nth 4 d))
        (p ""))
    (if (not (and (eq l 31) (eq r 32)))
        (progn
	  (setq p (concat p (space-string depth "|") "[" (number-to-string l) "-" (number-to-string r) "]\n"  ))
	  (setq p (concat p (print-decode-hash dec (+ 1 depth) )))
        )
    )
    (if (eq (length def) 5)
	(if (and (eq (nth 0 def) 0) (eq (nth 1 def) 0) (> (length (nth 4 def)) 0))
	    (setq p (concat p (space-string depth "|") "+" "def=" (mapconcat 'symbol-name (nth 4 def)  " ") "\n" ))
	    (setq p (concat p (space-string depth "|") "+" "def=\n" (print-decoder def depth)))
	)
    )
    `,p
  )
)
 
(defun or-insn-set (insn) 
  (let ((e '())
	(v '())
	(m '()))
    (dolist (e insn v)
      (if (eq v '())
	(setq v (make-setbit-groups (make-set-bitstring (symbol-value e))))
	(setq v (or-setbit-groups  v (make-setbit-groups (make-set-bitstring (symbol-value e))) ))
      )
    )
  )
)
 
(defun insn-max-setenc-set-acc (start end i)
  (let ((a '())
        (v '())
	(e '()))
    (mapcar (function (lambda (x)
       (if (cmp* (cut-copy-list (make-set-bitstring (symbol-value x)) start end) 1)
	   (setq a (cons x a)))
       )) i)
    `,a
    )
  )
 
 
;cc: (( 0 0 0) (1 1) (0 0))
;i: 1           x
;(clear-setenc-set '(( 0 0 0) (1 1) (1 1)) 1)
(defun clear-setenc-set (cc i)
  (let ((e '())
	(v '())
	(j 0))
    (dolist (e cc v)
      (if (eq i j)
	  (setq v (append `(,(make-list (length e) 0)) v))
	  (setq v (append `(,e) v))
      )
      (setq j (1+ j))
    )
    (reverse v)
  )
)
 
(defun setenc-set-p (cc)
  ; check weater a setbit set is remaining
  (let ((e '())
	(v '()))
    (dolist (e cc v)
      (if (eq (nth 0 e) 1)
	(setq v 't)
      )
    )
  )
)
 
 
; returns: (ccindex ((insn set)(insn set complement)))
(defun insn-max-setenc-set (cc insn)
  "Resturn row encode set that has the most members" 
  (let ((a (mapcar-setbit 'insn-max-setenc-set-acc cc insn))
	(v '())
	(e '())
	(i 0)
	(j -1)
	(off 0))
    (dolist (e a v)
      (if (not (memq 'nil e))
	  (if (> (length e)(length v)) 
	      (progn 
		(setq v e)
		(setq j i)
	      )
          )
      )
      (setq i (+ i 1))
    )
    `(,j ( ,v ,(remq* v insn) ) )
  )
)
 
;cc: ((0 0 0) (1 1) (1) (0 0 0))
;i: 1          x
;r: (3 5)
;(insn-get-encrange '((0 0 0) (1 1) (1) (0 0 0)) 1)
 
(defun insn-get-encrange (cc i)
  ;get range of index <i> if bitset cc 
  (let ((j 0)
	(off 0)
	(end 0))
    (dotimes (j i off) 
      (setq off (+ off (length (nth j cc)))) )
    (setq end (+ off (length (nth i cc))))
    `(,off ,end)
  )
)
 
(defun get-insn-enc (insn start end)
  ;get the encod value of insn
  (cut-copy-list (symbol-value insn) start end)
)
 
(defun create-decoder-setenc (cc insnset depth) 
  (let ((i 0)
	(start 0)
	(insn '())
	(insnc '())
	(end 0)
	(range '())
	(nset '())
	(nkey '())
	(nval '())
	(dec)
	(defdec insnset)
	)
    (if (setenc-set-p cc)
	(progn
	  (setq range (insn-max-setenc-set cc insnset))
	  (setq i (nth 0 range))
	  (setq insn (nth 0 (nth 1 range)))
	  (setq insnc (nth 1 (nth 1 range)))
	  (setq start (nth 0 (insn-get-encrange cc i)))
	  (setq end (nth 1 (insn-get-encrange cc i)))
 
	  (define-hash-table-test 'contents-hash 'equal 'sxhash)
	  (setq dec (make-hash-table :test 'contents-hash))
	  (let ((e '())
		(k '())
		(v '())
		)
	    (dolist (e insn)
	      (setq k (get-insn-enc e start end))
	      (puthash k (cons e (gethash k dec '())) dec )
	      )
	    )
	  (setq nset (clear-setenc-set cc i))
	  (maphash (function (lambda (k v)
	     (if (setenc-set-p (and-setbit-groups nset (or-insn-set v)))
		 (puthash k (create-decoder-setenc (and-setbit-groups nset (or-insn-set v) ) v (+ 1 depth)) dec)
	     )
	  )) dec)
	  (setq defdec '())
          (if (> (length insnc) 0)
	      (setq defdec (create-decoder-setenc (and-setbit-groups nset (or-insn-set insnc)  ) insnc (+ 1 depth)))
	  )
        )
    )
    `(,i ,start ,end ,dec ,defdec ) ;defdec
  )
)
 
 
;-----------------------------------------------------------------------
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2025 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.