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

Subversion Repositories igor

[/] [igor/] [trunk/] [microprogram_assembler/] [sexptomem.lisp] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 atypic
;;;
2
;;; Sexp to memory file
3
;;;
4
 
5
(defpackage #:sexptomem
6
  (:use #:cl))
7
 
8
(in-package #:sexptomem)
9
 
10
(defvar *symbolinfo*)
11
(defvar *symbolinfopos*)
12
(defvar *datastartpos* #x1000)
13
(defvar *symbolstartpos* (+ *datastartpos* 2))
14
 
15
(defun listify (list)
16
  (if (listp list)
17
      list
18
      (list list)))
19
 
20
(defun handle-integer (x)
21
  (values nil
22
          (format nil "int ~X" x)
23
          1))
24
 
25
(defvar *character-start-position* #x200)
26
(defun char-position (char)
27
  (+ *character-start-position* (char-code char)))
28
 
29
(defun handle-string (str)
30
  (let ((len (length str)))
31
    (values
32
     nil
33
     (concatenate 'list
34
      (list (format nil "array ~X" len))
35
      (loop for ch across str
36
         collect (format nil "ptr ~X" (char-position ch)))
37
      (list "snoc 0"))
38
     (+ 2 len))))
39
 
40
(defun handle-special-list (op cons)
41
  t)
42
 
43
(defun handle-cons (cons)
44
  (if (eq cons nil)
45
      (values t 0 0)
46
      (if (eq (type-of (car cons)) 'keyword)
47
          (handle-special-list (car cons) (cdr cons))
48
          (handle-list cons))))
49
 
50
(defun handle-list (cons)
51
  (if (not cons)
52
      (values t 0 0)
53
      (multiple-value-bind (carinplace cars carp)
54
          (sexp-to-memory-fun (car cons))
55
        (multiple-value-bind (cdrinplace cdrs cdrp)
56
            (handle-list (cdr cons))
57
          (let ((list (concatenate 'list
58
                                   (list
59
                                    (if carinplace
60
                                        (format nil "cons ~X" cars)
61
                                        (format nil "cons +~X" 2)))
62
                                   (list (if (not (cdr cons))
63
                                             (format nil "snoc 0")
64
                                             (if cdrinplace
65
                                                 (format nil "snoc ~X" cdrs)
66
                                                 (format nil "snoc +~X" (1+ (if carinplace 0 carp))))))
67
                                   (listify (if carinplace () cars))
68
                                   (listify (if cdrinplace () cdrs)))))
69
            (values nil list
70
                    (+ 2 (if carinplace 0 carp) (if cdrinplace 0 cdrp))))))))
71
 
72
(defun handle-symbol (sym)
73
  (let ((res (assoc sym *symbolinfo*)))
74
    (if (not res)
75
        (progn
76
          (setf *symbolinfo* (append *symbolinfo* (list (cons sym *symbolinfopos*))))
77
          (incf *symbolinfopos*)
78
          (handle-symbol sym))
79
        (values t (cdr res) 0))))
80
 
81
(defun handle-character (char)
82
;  (values nil (format nil "char ~X ~A" (char-code char) char) 1))
83
  (values t (char-position char) 0))
84
 
85
(defun sexp-to-memory-fun (body)
86
  (typecase body
87
    (list (handle-cons body))
88
    (string (handle-string body))
89
    (integer (handle-integer body))
90
    (symbol (handle-symbol body))
91
    (character (handle-character body))
92
    (t (error "Unknown type: ~A~%" (type-of body)))))
93
 
94
(defun rewrite-sexp-expr-list-to-cons (list)
95
  (if list
96
      `(%cons ,(rewrite-sexp-expr (car list))
97
              ,(rewrite-sexp-expr-list-to-cons (cdr list)))
98
      '%nil))
99
 
100
(defun rewrite-sexp-expr-list (list)
101
  (cond ((eq (car list) '%%list)
102
         (rewrite-sexp-expr-list-to-cons (cdr list)))
103
        ((eq (car list) 'quote)
104
         (cons '%quote (cdr list)))
105
        ((eq (car list) 'let)
106
         `((%lambda anonymous (,(caaadr list))
107
                    (%progn
108
                     ,@(mapcar #'rewrite-sexp-expr (cddr list))))
109
           ,(rewrite-sexp-expr (cadr (caadr list)))))
110
        ((eq (car list) 'defun)
111
         (when (< (length list) 4)
112
           (error "Malformed DEFUN ~A" list))
113
         (let ((name (cadr list))
114
               (params (caddr list))
115
               (body (if (= (length list) 4)
116
                         (rewrite-sexp-expr (cadddr list))
117
                         `(%progn ,@(mapcar #'rewrite-sexp-expr
118
                                            (cdddr list))))))
119
           `(%define (%quote ,name)
120
                     (%lambda ,name ,params ,body))))
121
        ((eq (car list) 'dolist)
122
         (let ((elm (cadr list))
123
               (in-list (rewrite-sexp-expr (caddr list)))
124
               (body (rewrite-sexp-expr (cadddr list))))
125
           `((%lambda
126
              dolist
127
              (_rec in-list)
128
              (_rec in-list))
129
             (%lambda dolist-rec (lst)
130
                      (if lst
131
                          ((%lambda inder-rec (,elm)
132
                                    (%progn
133
                                     ,body
134
                                     (_rec (cdr lst)))))
135
                          nil))
136
             ,in-list)))
137
        (t (mapcar #'rewrite-sexp-expr list))))
138
 
139
(defun rewrite-sexp-expr (body)
140
  (typecase body
141
    (list (rewrite-sexp-expr-list body))
142
    (t body)))
143
 
144
(defmacro sexp-to-memory* (&body body)
145
  `(sexp-to-memory
146
     ,(car body)
147
 
148
     ,@(loop for a in (cdr body)
149
            collect (rewrite-sexp-expr a))))
150
 
151
 
152
(defmacro sexp-to-memory (&body body)
153
  (let ((sexpvar (gensym)))
154
    `(let* ((*symbolinfopos* 0)
155
            (outlist ())
156
            (symbols (loop for sym in ',(car body)
157
                        for i from 0
158
                        do (setf *symbolinfopos* i)
159
                        collect (cons sym i))))
160
       (setf *symbolinfopos* *symbolstartpos*)
161
       (with-open-file (out
162
                        "/tmp/initmem"
163
                        :element-type 'character
164
                        :direction :output
165
                        :if-does-not-exist :create
166
                        :if-exists :supersede)
167
         (let ((pos 0)
168
               (*symbolinfo* symbols))
169
           (loop for ,sexpvar in ',(cdr body)
170
              do (cond ((keywordp ,sexpvar)
171
                        (let ((addr (parse-integer (format nil "~A" ,sexpvar) :radix 16)))
172
                          (setf outlist (append outlist (list (format nil "~%addr ~X~%" addr))))
173
                          (format t "Changing address from 0x~X to 0x~X~%" pos addr)
174
                          (setf pos addr)))
175
                       (t
176
                        (multiple-value-bind (special list num)
177
                            (sexp-to-memory-fun ,sexpvar)
178
                          (declare (ignore special))
179
                          (incf pos num)
180
                          (setf outlist (append outlist (listify list)))))))
181
 
182
 
183
           (let* ((newsymbols (nthcdr (length ',(car body)) *symbolinfo*)))
184
             (let* ((sympos (+ *symbolstartpos* (length newsymbols)))
185
                    ;; Build symbols and symbol names
186
                    (symbols
187
                     (loop for (sym . pos) in newsymbols
188
                        collect (multiple-value-bind (special b c)
189
                                    (sexp-to-memory-fun (format nil "~A" sym))
190
                                  (declare (ignore special))
191
                                  (format t "Increasing sympos by: ~A for ~A~%" c sym)
192
                                  (let ((sympos* sympos))
193
                                    (incf sympos c)
194
                                    (list b (format nil "symbol ~X ~A" sympos* sym))))))
195
                    (dataposition sympos)
196
                    (symboltable-start dataposition)
197
                    ;; Build symboltable
198
                    (symboltable (multiple-value-bind (special data len)
199
                                     (sexp-to-memory-fun (mapcar #'car newsymbols))
200
                                   (declare (ignore special))
201
                                   ;; Link it up against the cpu symboltable
202
                                   (setf (nth (1- (length data)) data) "snoc E00")
203
                                   (incf dataposition (length data))
204
                                   data))
205
                    (environment-position dataposition)
206
                    ;; Build our environment
207
                    (env (let ((env* (list "cons +2" "snoc 0"
208
                                           "cons +2" "snoc 0"
209
                                           (format nil "cons ~X" (multiple-value-bind (special data len)
210
                                                                     (handle-symbol '%symbol-table)
211
                                                                   (declare (ignore special len))
212
                                                                   data))
213
                                           (format nil "snoc ~X" symboltable-start))))
214
                           (incf dataposition (length env*))
215
                           env*)))
216
 
217
               (let ((curpos *datastartpos*))
218
                 (flet ((printinc ()
219
                          ;(format out "# Add ~X~%" curpos)
220
                          (incf curpos)))
221
 
222
                   ;; Intial setup, start address. Pointer to expression and environment
223
                   (format out "addr ~X~%" *datastartpos*)
224
                   (format out "start ~X~%" *datastartpos*)
225
                   (printinc)
226
                   (format out "cons ~X~%" dataposition)
227
                   (printinc)
228
                   (format out "snoc ~X~%" environment-position)
229
                   ;; Symbols
230
                   (format out "# Symbols~%")
231
                   (dolist (sym (mapcar #'second symbols))
232
                     (printinc)
233
                     (format out "~A~%" sym))
234
                   ;; Symbol names
235
                   (format out "# Symbol names~%")
236
                   (dolist (name (mapcar #'first symbols))
237
                     (dolist (elem name)
238
                       (printinc)
239
                       (format out "~A~%" elem)))
240
 
241
                   ;; Symbol table
242
                   (format out "# Symboltable~%")
243
                   (dolist (elem symboltable)
244
                     (printinc)
245
                     (format out "~A~%" elem))
246
 
247
                   ;; Environment
248
                   (format out "# Environment~%")
249
                   (dolist (elem env)
250
                     (printinc)
251
                     (format out "~A~%" elem))
252
 
253
                   ;; Program
254
                   (format out "# Program~%")
255
                   (dolist (a outlist)
256
                     (printinc)
257
                     (format out "~A~%" a)))))))))))
258
 
259
 
260
#|
261
(sexp-to-memory
262
  (nil t if)
263
  (define read (lambda (str) #\b t)))
264
|#

powered by: WebSVN 2.1.0

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