summaryrefslogtreecommitdiff
path: root/books/workshops/2000/manolios/pipeline/pipeline/deterministic-systems/ma/isa.lisp
blob: 993f9c14f799bf0ec3f1dd35e7125cd20af38501 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
;  Copyright (C) 2000 Panagiotis Manolios

;  This program is free software; you can redistribute it and/or modify
;  it under the terms of the GNU General Public License as published by
;  the Free Software Foundation; either version 2 of the License, or
;  (at your option) any later version.

;  This program is distributed in the hope that it will be useful,
;  but WITHOUT ANY WARRANTY; without even the implied warranty of
;  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;  GNU General Public License for more details.

;  You should have received a copy of the GNU General Public License
;  along with this program; if not, write to the Free Software
;  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

;  Written by Panagiotis Manolios who can be reached as follows.

;  Email: pete@cs.utexas.edu

;  Postal Mail:
;  Department of Computer Science
;  The University of Texas at Austin
;  Austin, TX 78701 USA

#|

The ISA specification of Sawada's machine.

|#

(in-package "ACL2")

(include-book "../../top/alist-thms")
(include-book "../top/inst")

(defun ISA-state (pc regs mem)
  (list 'ISA pc regs mem))

(defun ISA-p (x)
  (equal (car x) 'ISA))

(defmacro ISA-pc () 1)

(defmacro ISA-regs () 2)

(defmacro ISA-mem () 3)

(defun add-rc (ra rb rc regs)
  (update-valuation rc
		    (+ (value-of ra regs)
		       (value-of rb regs))
		    regs))

(defun sub-rc (ra rb rc regs)
  (update-valuation rc
		    (- (value-of ra regs)
		       (value-of rb regs))
		    regs))

(defun ISA-add (rc ra rb ISA)
  (ISA-state (1+ (nth (ISA-pc) ISA))
	     (add-rc ra rb rc (nth (ISA-regs) ISA))
	     (nth (ISA-mem) ISA)))

(defun ISA-sub (rc ra rb ISA)
  (ISA-state (1+ (nth (ISA-pc) ISA))
	     (sub-rc ra rb rc (nth (ISA-regs) ISA))
	     (nth (ISA-mem) ISA)))

(defun ISA-default (ISA)
  (ISA-state (1+ (nth (ISA-pc) ISA))
	     (nth (ISA-regs) ISA)
	     (nth (ISA-mem) ISA)))

(defun ISA-step (ISA)
  (let ((inst (value-of (nth (ISA-pc) ISA) (nth (ISA-mem) ISA))))
    (let ((op (nth (Inst-opcode) inst))
	  (rc (nth (Inst-rc) inst))
	  (ra (nth (Inst-ra) inst))
	  (rb (nth (Inst-rb) inst)))
      (cond ((equal op 0) ; add
	     (ISA-add rc ra rb ISA))
	    ((equal op 1) ; sub
	     (ISA-sub rc ra rb ISA))
	    (t (ISA-default ISA))))))