|
|
1.1 root 1: (setq SCCS-fpMeasures.l "@(#)fpMeasures.l 1.1 4/27/83")
2: ; FP interpreter/compiler
3: ; Copyright (c) 1982 Scott B. Baden
4: ; Berkeley, California
5: ; Dynamics Statistics by Dorab Patel (UCLA)
6:
7: ; Initialize and update the 'Measures' plist with
8: ; the run-time measurement data
9: ;
10: ; Special symbol 'TracedFns' also manipulated
11: ; It contains the list of currently traced user defined functions.
12: ; The attributes for each functional form and function are:
13:
14: ; times: the total number of times it has been called
15: ; size: the sum of the top-level sizes of the arguments given to it
16: ; funargno: the number of functional arguments to this form
17: ; (in general this is only for construct)
18: ; funargtype: the type and total number of functions of that type
19: ; supplied to this functional form.
20: ; This is an alist ((fntype.times) ...)
21:
22:
23:
24: (include specials.l)
25: (declare (special statport dummy))
26: (declare (localf InitSize InitFunArgTyp
27: InitFunArgNo trace1
28: extractName goodStats
29: untrace1 SendMeasures))
30:
31:
32: ; The following functions are global. i.e. used externally
33: ; startDynStats clrDynStats IncrTimes IncrSize
34: ; IncrFunArgNo IncrFunArgTyp size Trace
35: ; PrintMeasures IncrUDF Untrace stopDynStats
36:
37: ; This is called by the main routine to initialize all the
38: ; measurement stuff
39:
40:
41: (defun clrDynStats nil
42: (dontLoseStats)
43: (initStats))
44:
45:
46: (defun dontLoseStats nil
47: (cond ((goodStats) ; check to see if there are stats to report
48: (patom "output dynamic statistics? ")
49: (let ((response (car (explodec (ratom)))))
50: (If ptport then (msg (P ptport) response))
51:
52: (Tyi)
53: (cond ((eq response 'y)
54: (patom "File: ")
55: (let ((statFile
56: (cond ((eq (tyipeek) #.CR) nil)
57: (t
58: (let ((fl (ratom)))
59: (If ptport then (msg (P ptport) fl))
60: fl)))))
61: (Tyi)
62: (PrintMeasures statFile))))))))
63:
64: (defun initStats nil
65:
66: (InitMeasures
67: `(,@#.dyadFns
68: ,@#.miscFns
69: ,@#.multiAdicFns
70: ,@#.libFns
71: ,@#.funcForms))
72:
73: (InitSize #.multiAdicFns)
74: (InitSize #.funcForms)
75: (InitFunArgNo '(constr$fp))
76:
77: ; included here even though it's not a functional form
78: (InitFunArgTyp '(select$fp))
79:
80: (InitFunArgTyp #.funcForms))
81:
82:
83: ; Makes the symbol 'Measures' have the property indicators
84: ; corresponding to the function names in 'ListOfFns' and the values
85: ; to be ((times.0)).
86:
87: (defun InitMeasures (ListOfFns)
88: (setplist 'Measures
89: (apply 'append
90: (mapcar '(lambda (x) (list x (list (cons 'times 0))))
91: ListOfFns))))
92:
93: (defun goodStats nil
94: (do ((M (plist 'Measures) (cddr M)))
95: ((null M) nil)
96: (cond ((not (zerop (cdr (assoc 'times (cadr M)))))
97: (return t)))))
98:
99:
100: ; This is used to stop the collection of dynamic statistics
101: ; needs to untrace functions if they still are. i.e. do the traced-expr stuff
102: ; note that rds which calls this, also calls PrintMeasures, though
103: ; this may change.
104:
105: (defun stopDynStats nil
106: (cond (TracedFns ; if any fns still being traced
107: (Untrace TracedFns))) ; untrace them
108: (setq DynTraceFlg nil))
109:
110: (defun extractName (fnName)
111: (patom
112: (implode (reverse (cons "'" (cdddr (reverse (explodec (concat "'" fnName)))))))))
113:
114: ; this is the function called by the system function trace to
115: ; enable the tracing of the User Defined Functions specified
116: ; NOTE: successive calls will add to the UDFs to be traced.
117:
118: (defun Trace (arglist)
119: (setq traceport poport)
120: (mapc '(lambda (x)
121: (cond ((memq x TracedFns) ; if already traced
122: (setq arglist
123: (delq x arglist 1)) ; delete from arglist
124: (extractName x) ; and tell the user
125: (patom " is already being traced")
126: (terpr))))
127: arglist)
128: (mapc 'trace1 arglist)) ; set up traced-expr stuff
129:
130: ; This is called by the system function untrace to disable the tracing
131: ; of user defined functions.
132: ; This removes the named user defined function from the list
133: ; of traced functions
134:
135: (defun Untrace (arglist)
136: (mapc '(lambda (x)
137: (cond ((memq x TracedFns) ; if being traced
138: (setq TracedFns (delq x TracedFns)) ; remove
139: (untrace1 x)) ; restore stuff
140: (t (extractName x) ; else complain
141: (patom " is not being traced")
142: (terpr))))
143: arglist))
144:
145: ; This is called by Trace on each individual function that is to
146: ; be traced. It does the manipulation of the traced-expr property
147:
148: (defun trace1 (name)
149: ; actually you should check for getd name returning something decent
150: (let ((zExpr (getd name)))
151: (cond ((null zExpr)
152: (patom "Can't trace the undefined fn ")
153: (extractName name)
154: (patom ".")
155: (terpr))
156:
157: (t
158: (putprop name zExpr 'traced-expr) ; put fn def on traced-expr
159: (setq TracedFns (append1 TracedFns name)) ; update TracedFns
160: (InitUDF name) ; set up the measurement stuff
161: (putd name ; make a new function def
162: `(lambda (x)
163: (prog (tmp)
164: (setq level (1+ level)) ; increment level counter
165: (printLevel)
166: (patom " >Enter> " traceport)
167: (patom (extName ',name) traceport)
168: (patom " [" traceport)
169: (d_isplay x traceport)
170: (patom "]" traceport)
171: (terpri traceport)
172: ; now call the actual function
173: (setq tmp (funcall (get ',name 'traced-expr) x))
174: (printLevel)
175: (patom " <EXIT< " traceport) ; now print epilog
176: (patom (extName ',name) traceport)
177: (patom " " traceport)
178: (d_isplay tmp traceport)
179: (terpri traceport)
180: (return tmp)))))))) ; return the return value
181:
182:
183:
184: (defun extName (fnName)
185: (let ((zzName (reverse (explodec fnName))))
186: (cond ((memq '$ zzName) (implode (reverse (cdr (memq '$ zzName)))))
187: (t (implode (reverse (cdr (memq '_ zzName))))))))
188:
189:
190: (defun printLevel nil
191: (do ((counter 1 (1+ counter)))
192: ((eq counter level) (patom level traceport))
193: (cond ((oddp counter) (patom "|" traceport))
194: (t (patom " " traceport)))))
195:
196: ; This is called by Untrace for each individaul function to be untraced.
197: ; It handles the traced-expr property hassles.
198:
199: (defun untrace1 (name)
200: (let ((tmp (get name 'traced-expr)))
201: (cond ((null tmp) ; if the traced-expr property is unreasonable
202: ; a better check for unreasonableness is needed
203: (extractName name) ; complain
204: (patom " was not traced properly - cant restore")
205: (terpr))
206: (t (putd name tmp) ; else restore and remove the traced-expr
207: (remprop name 'traced-expr)))))
208:
209: ; sz is a function that returns the total number of atoms in its argument
210:
211: (defun sz (x)
212: (cond ((null x) 0)
213: ((atom x) 1)
214: (t (add (size (car x))
215: (size (cdr x))))))
216:
217: ; inc is a macro used by the increment functions
218:
219: (defmacro inc (x)
220: `(rplacd ,x (1+ (cdr ,x))))
221:
222: ; inctimes is a macro used by IncrFunArgNo
223:
224: (defmacro inctimes (x times)
225: `(rplacd ,x (add times (cdr ,x))))
226:
227: ; increment the 'funargno' attribute of the functional form
228:
229: (defun IncrFunArgNo (fform times)
230: (inctimes (sassq 'funargno
231: (get 'Measures fform)
232: '(lambda ()
233: (cprintf "error: %s has no funargno"
234: fform)
235: (terpr)
236: (break)))
237: times))
238:
239: ; increment the 'funargtyp' information of the functional form
240: ; if the particular function/form has never yet been used with his
241: ; functional form, create the entry
242:
243: (defun IncrFunArgTyp (fform funct)
244: (inc (sassoc funct ; get (fn.#oftimes). This has to be sassoc NOT sassq.
245: (cadr (sassq 'funargtyp ; get (funargtyp ...)
246: (get 'Measures fform)
247: '(lambda ()
248: (cprintf "error: %s has no funargtyp"
249: fform)
250: (terpr)
251: (break))))
252: ; 'funargtyp' was there but not the funct
253: ; should return (fn.#oftimes)
254: '(lambda ()
255: (cond ((setq dummy (cadr (assq 'funargtyp
256: (get 'Measures fform))))
257: ; the alist is not empty and we
258: ; know that funct was not there
259: (assq funct
260: (nconc dummy
261: (list (cons funct 0)))))
262: ; the alist is empty, so add the element
263: (t (assq funct
264: (cadr (nconc (assq 'funargtyp
265: (get 'Measures fform))
266: (list (list (cons funct 0))))))))))))
267: ; increment the 'times' attribute of the function
268:
269: (defun IncrTimes (funct)
270: (inc (assq 'times (get 'Measures funct))))
271:
272: ; update the 'avg arg size' attribute of the function
273: ; actually it is the total size. it should be divided by the 'times'
274: ; attribute to get the avg size.
275:
276: (defun IncrSize (funct size)
277: (rplacd (assq 'size (get 'Measures funct))
278: (add (cdr (assq 'size (get 'Measures funct)))
279: size)))
280:
281: ; This adds the given function as a property of Measures and
282: ; initializes it to have the 'times' and 'size' attributes.
283:
284: (defun InitUDF (UDF)
285: (putprop 'Measures '((times . 0) (size . 0)) UDF))
286:
287:
288: ; This increments the times and the size atribute of a UDF, if it exists
289: ; Otherwise, it does nothing.
290:
291: (defun IncrUDF (UDF seq)
292: (cond
293: ((and (memq UDF TracedFns) (get 'Measures UDF)) ;if the UDF is traceable
294: (IncrTimes UDF)
295: (IncrSize UDF (size seq)))))
296:
297: ; This adds the 'size' attribute to the alist corresponding to each
298: ; function in 'FnList' and initializes the value to 0.
299:
300: (defun InitSize (FnList)
301: (mapcar '(lambda (funct) (nconc (get 'Measures funct) (list (cons 'size 0))))
302: FnList))
303:
304: ; This adds the 'funargtyp' (functional argument type) attribute to
305: ; the alist corresponding to each functional form in 'FnFormList' and
306: ; initializes the value to nil.
307:
308: (defun InitFunArgTyp (FnFormList)
309: (mapcar '(lambda (fform)
310: (nconc (get 'Measures fform)
311: (list (list 'funargtyp))))
312: FnFormList))
313:
314: ; This adds the 'funargno' (number of functional args) attribute to
315: ; the alist correphsponding to each functional form in 'FnFormList'
316: ; and initializes the value to 0.
317:
318: (defun InitFunArgNo (FnFormList)
319: (mapcar '(lambda (fform)
320: (nconc (get 'Measures fform)
321: (list (cons 'funargno 0))))
322: FnFormList))
323:
324: ; Prints out the stats to a file
325:
326: (defun PrintMeasures (sFileName)
327: (cond (sFileName
328: (let ((statPort nil))
329: (cond ((setq statPort (outfile sFileName 'append))
330: (SendMeasures statPort) ; write the stuff
331: (terpri statPort)
332: (close statPort))
333: (t (terpr)
334: (patom "Cannot open statFile")
335: (terpr)))))
336: (t (SendMeasures nil))))
337:
338:
339: ; Traverses the Measures structure and prints out the
340: ; info onto 'port'.
341: ; Also removes the attributes from Measures (during traversal)
342:
343: (defun SendMeasures (port)
344: (do ((functlist (plist 'Measures)
345: (cddr functlist)));for each alternate elem in functlist
346: ((null functlist)) ; end when all done
347: (let ((fnStats (cadr functlist)))
348: (cond ((and fnStats (not (zerop (cdr (assoc 'times fnStats)))))
349: (cprintf "%s:" (printName (car functlist)) port)
350: (do ((proplist fnStats (cdr proplist)))
351: ((null proplist))
352: (let ((prop (car proplist))) ; for each prop in proplist
353: (cond ((eq (car prop) 'funargtyp) ; if it is funargtyp
354: (doFuncArg port prop))
355: (t (cprintf " %s" (car prop) port);if not funargtyp
356: (cprintf " %d" (cdr prop) port)))))
357: ; end of function
358: (terpri port)
359: (terpri port)))))); a newline separates functions
360:
361: (defun doFuncArg (port prop)
362: (terpri port)
363: (terpri port)
364: (cprintf " Functional Args" nil port)
365: (terpri port)
366: (cprintf " Name Times" nil port)
367: (terpri port)
368: (do ((funclist (cadr prop) (cdr funclist)))
369: ((null funclist))
370: (cprintf " " nil port)
371: (patom (printName (caar funclist)) port)
372: (cprintf " %d" (cdar funclist) port)
373: (terpri port)))
374:
375: (defun printName (fnName)
376: (let ((zzName (reverse (explodec fnName)))
377: (tName nil))
378: (setq tName (memq '$ zzName))
379: (cond (tName (implode (reverse (cdr tName))))
380: (t
381: (setq tName (memq '_ zzName))
382: (cond (tName (implode (reverse (cdr tName))))
383: ((stringp fnName) (concat '|"| fnName '|"|))
384: (t (put_obj fnName)))))))
385:
386: ; this is the same as the function in fp_main.l except that it takes
387: ; an extra argument which is the port name. it is used for printing
388: ; out a lisp object in the FP form
389:
390: (defun d_isplay (obj port)
391: (cond ((null obj) (patom "<>" port))
392: ((atom obj) (patom obj port))
393: ((listp obj)
394: (patom "<" port)
395: (maplist
396: '(lambda (x)
397: (d_isplay (car x) port)
398: (cond ((not (onep (length x))) (patom " " port)))) obj)
399: (patom ">" port))))
400:
401:
402: (defun measAlph (al seq)
403: (IncrFunArgTyp 'alpha$fp al)
404: (IncrTimes 'alpha$fp)
405: (IncrSize 'alpha$fp (size seq)))
406:
407: (defun measIns (ins seq)
408: (IncrFunArgTyp 'insert$fp ins)
409: (IncrTimes 'insert$fp)
410: (IncrSize 'insert$fp (size seq)))
411:
412: (defun measTi (ains seq)
413: (IncrFunArgTyp 'ti$fp ains)
414: (IncrTimes 'ti$fp)
415: (IncrSize 'ti$fp (size seq)))
416:
417: (defun measSel (sel seq)
418: (IncrFunArgTyp 'select$fp sel)
419: (IncrTimes 'select$fp)
420: (IncrSize 'select$fp (size seq)))
421:
422: (defun measCons (cons seq)
423: (IncrFunArgTyp 'constant$fp cons)
424: (IncrTimes 'constant$fp)
425: (IncrSize 'constant$fp (size seq)))
426:
427: (defun measCond (c1 c2 c3 seq)
428: (IncrFunArgTyp 'condit$fp c1)
429: (IncrFunArgTyp 'condit$fp c2)
430: (IncrFunArgTyp 'condit$fp c3)
431: (IncrTimes 'condit$fp)
432: (IncrSize 'condit$fp (size seq)))
433:
434: (defun measWhile (w1 w2 seq)
435: (IncrFunArgTyp 'while$fp w1)
436: (IncrFunArgTyp 'while$fp w2)
437: (IncrTimes 'while$fp)
438: (IncrSize 'while$fp (size seq)))
439:
440: (defun measComp (cm1 cm2 seq)
441: (IncrFunArgTyp 'compos$fp cm1)
442: (IncrFunArgTyp 'compos$fp cm2)
443: (IncrTimes 'compos$fp)
444: (IncrSize 'compos$fp (size seq)))
445:
446: (defun measConstr (fns seq)
447: (mapcar '(lambda (x) (IncrFunArgTyp 'constr$fp x)) fns)
448: (IncrFunArgNo 'constr$fp (length fns))
449: (IncrTimes 'constr$fp)
450: (IncrSize 'constr$fp (size seq)))
451:
452: ; get the corect name of the functional form
453:
454: (defmacro getFform (xx)
455: `(implode (nreverse `(p f ,@(cdr (nreverse (explodec (cxr 0 ,xx))))))))
456:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.