Home My Page Projects Code Snippets Project Openings diderot
Summary Activity Tracker Tasks SCM

SCM Repository

[diderot] Annotation of /branches/charisee/src/compiler/tree-il/tree-il.sml
ViewVC logotype

Annotation of /branches/charisee/src/compiler/tree-il/tree-il.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1301 - (view) (download)
Original Path: trunk/src/compiler/tree-il/tree-il.sml

1 : jhr 1115 (* tree-il.sml
2 :     *
3 :     * COPYRIGHT (c) 2011 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     * All rights reserved.
5 :     *
6 :     * This representation restores the block structure and nested expression syntax
7 :     * of the source language.
8 :     *)
9 :    
10 :     structure TreeIL =
11 :     struct
12 :    
13 :     structure Op = LowOps
14 :     structure Ty = LowILTypes
15 :    
16 : jhr 1131 (* program properties *)
17 :     datatype program_prop
18 :     = StrandsMayDie (* present if strands may die *)
19 :     | NewStrands (* present if new strands may be created dynamically *)
20 :     | StrandCommunication (* present is strands read the state of other strands *)
21 :    
22 : jhr 1115 datatype program = Program of {
23 : jhr 1131 props : program_prop list,
24 : jhr 1115 globals : var list,
25 : jhr 1301 inputInit : block,
26 : jhr 1115 globalInit : block,
27 :     strands : strand list,
28 :     initially : {
29 :     isArray : bool,
30 :     iterPrefix : block,
31 :     iters : (var * exp * exp) list,
32 :     createPrefix : block,
33 :     strand : Atom.atom,
34 :     args : exp list
35 :     }
36 :     }
37 :    
38 :     and strand = Strand of {
39 :     name : Atom.atom,
40 :     params : var list,
41 :     state : strand_var list,
42 :     stateInit : block,
43 :     methods : method list
44 :     }
45 :    
46 :     and strand_var = SV of {
47 :     varying : bool, (* varies over the lifetime of the strand *)
48 :     output : bool, (* is the output value of the strand *)
49 :     var : var (* the variable itself *)
50 :     }
51 :    
52 :     and method = Method of {
53 :     name : Atom.atom,
54 :     body : block (* method body *)
55 :     }
56 :    
57 :     and block = Block of {
58 :     locals : var list,
59 :     body : stm list
60 :     }
61 :    
62 :     and stm
63 :     = S_Comment of string list
64 :     | S_Assign of var * exp
65 :     | S_IfThen of exp * block
66 :     | S_IfThenElse of exp * block * block
67 :     (* special Diderot forms *)
68 :     | S_LoadImage of var * int * exp (* load image data *)
69 : jhr 1301 | S_Input of var * string * string * exp option (* get input *)
70 : jhr 1131 | S_New of Atom.atom * exp list (* new strand creation *)
71 : jhr 1115 | S_Exit of exp list
72 :     (* return functions for methods *)
73 :     | S_Active of exp list
74 :     | S_Stabilize of exp list
75 :     | S_Die
76 :    
77 :     and exp
78 :     = E_Var of var
79 :     | E_Lit of Literal.literal
80 :     | E_Op of Op.rator * exp list
81 :     | E_Apply of ILBasis.name * exp list
82 :     | E_Cons of Ty.ty * exp list
83 :    
84 :     and var = V of {
85 :     name : string, (* name (should be unique) *)
86 :     id : Stamp.stamp, (* unique ID *)
87 :     kind : var_kind,
88 :     ty : Ty.ty (* type *)
89 :     }
90 :    
91 :     and var_kind
92 :     = VK_Global (* global variable *)
93 :     | VK_State of Atom.atom (* strand state variable; argument is strand name *)
94 :     | VK_Local (* includes strand parameters *)
95 :    
96 :     structure Var : sig
97 :    
98 :     val kind : var -> var_kind
99 :     val name : var -> string
100 :     val toString : var -> string
101 :     val ty : var -> Ty.ty
102 :    
103 :     structure Map : ORD_MAP where type Key.ord_key = var
104 :    
105 :     end = struct
106 :     fun kind (V{kind, ...}) = kind
107 :     fun name (V{name, ...}) = name
108 :     fun toString (V{name, id, ...}) = concat[name, "$", Stamp.toString id]
109 :     fun ty (V{ty, ...}) = ty
110 :     local
111 :     structure VarOrd =
112 :     struct
113 :     type ord_key = var
114 :     fun compare (V{id=a, ...}, V{id=b, ...}) = Stamp.compare(a, b)
115 :     end
116 :     in
117 :     structure Map = RedBlackMapFn (VarOrd)
118 :     end (* local *)
119 :     end
120 :    
121 : jhr 1131 (* printing utilities for debugging *)
122 :     fun propToString p = (case p
123 :     of StrandsMayDie => "StrandsMayDie"
124 :     | NewStrands => "NewStrands"
125 :     | StrandCommunication => "StrandCommunication"
126 :     (* end case *))
127 :    
128 :     fun kindToString k = (case k
129 :     of VK_Global => "Global"
130 :     | VK_State s => concat["State(", Atom.toString s, ")"]
131 :     | VK_Local => "Local"
132 :     (* end case *))
133 :    
134 : jhr 1115 end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0