1 | |
---|
2 | open Mlpost;; |
---|
3 | open Box;; |
---|
4 | open Arrow;; |
---|
5 | open Path;; |
---|
6 | open Command;; |
---|
7 | open Num;; |
---|
8 | open Dash;; |
---|
9 | open Color;; |
---|
10 | open Pen;; |
---|
11 | open Point;; |
---|
12 | open Picture;; |
---|
13 | |
---|
14 | |
---|
15 | let box = Box.box ~stroke:None ~dx:zero ~dy:zero |
---|
16 | let path = Box.path ~stroke:None ~dx:zero ~dy:zero |
---|
17 | let pic = Box.pic ~stroke:None ~dx:zero ~dy:zero |
---|
18 | |
---|
19 | (* Helpers *) |
---|
20 | |
---|
21 | let string_of_list sep f = |
---|
22 | let rec aux = function |
---|
23 | | [] -> "" |
---|
24 | | [e] -> f e |
---|
25 | | e :: l -> (f e) ^ sep ^ (aux l) |
---|
26 | in |
---|
27 | aux |
---|
28 | |
---|
29 | let mapi f = |
---|
30 | let rec aux i = function |
---|
31 | | [] -> [] |
---|
32 | | e :: l -> (f i e) :: (aux (i+1) l) |
---|
33 | in |
---|
34 | aux 0 |
---|
35 | |
---|
36 | let cell = Box.rect ~stroke:None |
---|
37 | |
---|
38 | |
---|
39 | (* Text *) |
---|
40 | |
---|
41 | let color_text color text = "\\textcolor{" ^ color ^ "}{" ^ text ^ "}" |
---|
42 | let color_bftext color text = "\\textcolor{" ^ color ^ "}{\\bf " ^ text ^ "}" |
---|
43 | let texttt text = "\\texttt{" ^ text ^ "}" |
---|
44 | |
---|
45 | let line lexs = |
---|
46 | Box.tex (texttt (string_of_list " " (fun s -> s) lexs)) |
---|
47 | |
---|
48 | let code lines = |
---|
49 | let f (b_prev, b_res) b_line = |
---|
50 | let b_line = Box.place `Southwest ~pos:`Northwest b_prev b_line in |
---|
51 | (b_line, b_res @ [b_line]) |
---|
52 | in |
---|
53 | let (_, b_res) = List.fold_left f (Box.empty (), []) (List.map line lines) in |
---|
54 | Box.group b_res |
---|
55 | |
---|
56 | let typ = color_text "black" |
---|
57 | let op = color_text "black" |
---|
58 | let keyword = color_bftext "black" |
---|
59 | let comment s = [color_text "red" s] |
---|
60 | let label lab = [color_bftext "black" (lab ^ ":")] |
---|
61 | (* let emit_label lab = [keyword "emit"; color_text "magenta" lab] *) |
---|
62 | let emit_label lab = [ "\\textcolor{lightgray}{\\textbf{emit} {" ^ lab ^ "}}" ] |
---|
63 | let reg i = color_text "black" ("\\%" ^ (string_of_int i)) |
---|
64 | let hreg s = color_text "black" ("\\$" ^ s) |
---|
65 | let string_id s = color_text "black" ("\"" ^ s ^ "\"") |
---|
66 | let special = op |
---|
67 | |
---|
68 | let kif = keyword "if" |
---|
69 | let kreturn = keyword "return" |
---|
70 | let kcall f = [special "call" ; string_id f] |
---|
71 | |
---|
72 | let typ_int = typ "int" |
---|
73 | |
---|
74 | let assigns = op "$\\leftarrow$" |
---|
75 | let line_assigns x y = [x ; assigns ; y] |
---|
76 | let nop = [special "nop"] |
---|
77 | let newframe = [special "newframe"] |
---|
78 | let delframe = [special "delframe"] |
---|
79 | |
---|
80 | let preamble = |
---|
81 | code [comment "\\# begin preamble" ; [".data"] ; label "globals" ; |
---|
82 | ["\\ \\ .space" ; "0"] ; [".text"] ; label "main" ; |
---|
83 | line_assigns (hreg "gp") (keyword "globals") ; |
---|
84 | [special "j" ; keyword "main14"] ; comment "\\# end preamble"] |
---|
85 | |
---|
86 | let summul = |
---|
87 | code [ |
---|
88 | (* comment "\\# begin summul" ; label "summul34" ; *) |
---|
89 | emit_label "\\_cost2" ; |
---|
90 | line_assigns (hreg "v0") "1" ; line_assigns (hreg "a1") "1" ; |
---|
91 | label "summul10" ; line_assigns (hreg "a3") "0" ; |
---|
92 | [hreg "a2" ; assigns ; hreg "a0" ; "$\\ge$" ; hreg "a1"] ; |
---|
93 | [hreg "a2" ; assigns ; hreg "a2" ; "==" ; hreg "zero"] ; |
---|
94 | [hreg "a2" ; op "==" ; hreg "a3" ; "$\\Rightarrow$" ; |
---|
95 | keyword "summul6"] ; |
---|
96 | emit_label "\\_cost4" ; [special "jr" ; hreg "ra"] ; |
---|
97 | label "summul6" ; |
---|
98 | emit_label "\\_cost3" ; |
---|
99 | [hreg "a2" ; assigns ; hreg "v0" ; "$\\times$" ; hreg "a0"] ; |
---|
100 | [hreg "v0" ; assigns ; hreg "v0" ; "+" ; hreg "a2"] ; |
---|
101 | line_assigns (hreg "a2") "1" ; |
---|
102 | [hreg "a0" ; assigns ; hreg "a0" ; "$-$" ; hreg "a2"] ; |
---|
103 | [special "j" ; keyword "summul10"] ; |
---|
104 | (* comment "\\# end summul" *)] |
---|
105 | |
---|
106 | let main = |
---|
107 | code [comment "\\# begin main" ; label "main14" ; |
---|
108 | [hreg "sp" ; assigns ; hreg "sp" ; "$-$" ; "4"] ; |
---|
109 | line_assigns ((hreg "sp") ^ "[0]") (hreg "ra") ; |
---|
110 | label "\\_cost1" ; |
---|
111 | line_assigns (hreg "a0") "5" ; |
---|
112 | [special "jal" ; keyword "summul34"] ; |
---|
113 | line_assigns (hreg "ra") ((hreg "sp") ^ "[0]") ; |
---|
114 | [hreg "sp" ; assigns ; hreg "sp" ; "$+$" ; "4"] ; |
---|
115 | [special "jr" ; hreg "ra"] ; |
---|
116 | comment "\\# end main"] |
---|
117 | |
---|
118 | |
---|
119 | (* Place Text *) |
---|
120 | |
---|
121 | |
---|
122 | (* Strokes and arrows *) |
---|
123 | |
---|
124 | |
---|
125 | (* Main *) |
---|
126 | |
---|
127 | let summul_result_mips = Box.hbox ~padding:(cm 1.5) ~pos:`Top |
---|
128 | [summul ] |
---|
129 | |
---|
130 | let summul_result_mips = Box.draw summul_result_mips |
---|
131 | |
---|
132 | let _ = Metapost.emit "summul_result_erased_mips" summul_result_mips |
---|