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

SCM Repository

[diderot] Diff of /branches/vis12/src/compiler/simplify/eval.sml
ViewVC logotype

Diff of /branches/vis12/src/compiler/simplify/eval.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 245, Fri Aug 6 15:31:55 2010 UTC revision 269, Wed Aug 11 04:42:30 2010 UTC
# Line 17  Line 17 
17        | Img of ImageInfo.info        | Img of ImageInfo.info
18        | KV of Kernel.kernel        | KV of Kernel.kernel
19    
20      val evalStatics : Simple.block -> value Var.Map.map      val evalStatics : Var.Set.set * Simple.block -> value Var.Map.map
21    
22    end = struct    end = struct
23    
# Line 25  Line 25 
25      structure BV = BasisVars      structure BV = BasisVars
26      structure S = Simple      structure S = Simple
27      structure VMap = Var.Map      structure VMap = Var.Map
28        structure VSet = Var.Set
29      structure VTbl = Var.Tbl      structure VTbl = Var.Tbl
30    
31      datatype value      datatype value
# Line 108  Line 109 
109                  (BV.op_subscript,       fn (y, [SK, NK], xs) => ??),                  (BV.op_subscript,       fn (y, [SK, NK], xs) => ??),
110                  (BV.fn_CL,              fn (y, _, xs) => assign(y, Op.CL, xs)),                  (BV.fn_CL,              fn (y, _, xs) => assign(y, Op.CL, xs)),
111  *)  *)
112                  (BV.fn_convolve,        fn [KV h, Img info] => FV(FieldDef.CONV(info, h))),                  (BV.op_convolve,        fn [Img info, KV h] => FV(FieldDef.CONV(0, info, h))),
113                    (BV.fn_convolve,        fn [KV h, Img info] => FV(FieldDef.CONV(0, info, h))),
114                  (BV.fn_cos,             realUnOp Math.cos),                  (BV.fn_cos,             realUnOp Math.cos),
115  (*  (*
116                  (BV.fn_dot,             vectorOp Op.Dot),                  (BV.fn_dot,             vectorOp Op.Dot),
# Line 150  Line 152 
152              | NONE => raise Fail("undefined variable " ^ Var.uniqueNameOf x)              | NONE => raise Fail("undefined variable " ^ Var.uniqueNameOf x)
153            (* end case *))            (* end case *))
154    
155      fun evalExp (env, e) = (case e      fun apply (env, f, mvs, xs) =
156             of S.E_Var x => evalVar env x            if List.all (fn x => VMap.inDomain(env, x)) xs
157              | S.E_Lit(Literal.Int i) => IV i              then (* try *)(
             | S.E_Lit(Literal.Float f) => RV(FloatLit.toReal f)  
             | S.E_Lit(Literal.String s) => SV s  
             | S.E_Lit(Literal.Bool b) => BV b  
             | S.E_Tuple _ => raise Fail "E_Tuple"  
             | S.E_Apply(f, mvs, xs, _) => (  
                 (* try *)(  
158                  if Var.same(f, BV.fn_load)                  if Var.same(f, BV.fn_load)
159                    then loadImage(mvs, List.map (evalVar env) xs)                    then SOME(loadImage(mvs, List.map (evalVar env) xs))
160                    else (case VTbl.find tbl f                    else (case VTbl.find tbl f
161                       of SOME evalFn => evalFn (List.map (evalVar env) xs)                       of SOME evalFn => SOME(evalFn (List.map (evalVar env) xs))
162                        | NONE => raise Fail("Eval.exvalExp: unknown function " ^ Var.nameOf f)                        | NONE => NONE
163                      (* end case *))                      (* end case *))
164                  ) handle ex => (                  ) handle ex => (
165                    TextIO.output (TextIO.stdErr, concat [                    TextIO.output (TextIO.stdErr, concat [
# Line 171  Line 167 
167                        String.concatWith "," (List.map Var.uniqueNameOf xs),                        String.concatWith "," (List.map Var.uniqueNameOf xs),
168                        ") fails with exception ", exnName ex, "\n"                        ") fails with exception ", exnName ex, "\n"
169                      ]);                      ]);
170                    raise ex))                raise ex)
171                else NONE
172    
173        fun evalExp (env, e) = (case e
174               of S.E_Var x => VMap.find (env, x)
175                | S.E_Lit(Literal.Int i) => SOME(IV i)
176                | S.E_Lit(Literal.Float f) => SOME(RV(FloatLit.toReal f))
177                | S.E_Lit(Literal.String s) => SOME(SV s)
178                | S.E_Lit(Literal.Bool b) => SOME(BV b)
179                | S.E_Tuple _ => raise Fail "E_Tuple"
180                | S.E_Apply(f, mvs, xs, _) => apply(env, f, mvs, xs)
181              | S.E_Cons xs => raise Fail "TODO: E_Cons"              | S.E_Cons xs => raise Fail "TODO: E_Cons"
182              | S.E_Input(ty, name, optDefault) => let              | S.E_Input(ty, name, optDefault) => raise Fail "impossible"
183                | S.E_Field fld => SOME(FV fld)
184                | S.E_LoadImage info => SOME(Img info)
185              (* end case *))
186    
187        fun evalStatics (statics, blk) = let
188              fun evalBlock (env, S.Block stms) = let
189                    exception Done of value VMap.map
190                    fun evalStm (stm, env) = (case stm
191                           of S.S_Assign(x, S.E_Input(ty, name, optDefault)) =>
192                                if VSet.member(statics, x)
193                                  then let
194                  val optDefault = Option.map (evalVar env) optDefault                  val optDefault = Option.map (evalVar env) optDefault
195                  val SOME value = (case ty                                  val input = (case ty
196                         of Ty.T_Bool =>                         of Ty.T_Bool =>
197                              Inputs.getInput(name, (Option.map BV) o Bool.fromString, optDefault)                              Inputs.getInput(name, (Option.map BV) o Bool.fromString, optDefault)
198                          | Ty.T_Int =>                          | Ty.T_Int =>
# Line 189  Line 206 
206                              ])                              ])
207                        (* end case *))                        (* end case *))
208                  in                  in
209                    value                                    case input
210                                       of SOME v => VMap.insert(env, x, v)
211                                        | NONE => raise Fail("error getting required input " ^ name)
212                                      (* end case *)
213                  end                  end
214              | S.E_Field fld => FV fld                                else env
215              | S.E_LoadImage info => Img info                          | S.S_Assign(x, e) => (case evalExp(env, e)
216            (* end case *))                               of SOME v =>
217    (print(concat[Var.uniqueNameOf x, " = ", toString v, "\n"]);
218      fun evalBlock (env, S.Block stms) = let                                  VMap.insert(env, x, v)
219            fun evalStm (stm, env) = (case stm  )
220                   of S.S_Assign(x, e) => VMap.insert(env, x, evalExp(env, e))                                | NONE => env
221                    | S.S_IfThenElse(x, b1, b2) => (case evalVar env x                              (* end case *))
222                         of BV true => evalBlock(env, b1)                          | S.S_IfThenElse(x, b1, b2) => (case VMap.find(env, x)
223                          | BV false => evalBlock(env, b2)                               of SOME(BV true) => evalBlock(env, b1)
224                          | _ => raise Fail "type error"                                | SOME(BV false) => evalBlock(env, b2)
225                                  | SOME _ => raise Fail "type error"
226                                  | NONE => raise (Done env)
227                        (* end case *))                        (* end case *))
228                    | S.S_New _ => raise Fail "unexpected new actor"                    | S.S_New _ => raise Fail "unexpected new actor"
229                    | S.S_Die => raise Fail "unexpected die"                    | S.S_Die => raise Fail "unexpected die"
230                    | S.S_Stabilize => raise Fail "unexpected stabilize"                    | S.S_Stabilize => raise Fail "unexpected stabilize"
231                  (* end case *))                  (* end case *))
232            in            in
233              List.foldl evalStm env stms                    (List.foldl evalStm env stms) handle Done env => env
234                    end
235              in
236                evalBlock (VMap.empty, blk)
237            end            end
   
     fun evalStatics staticInit = evalBlock (VMap.empty, staticInit)  
238    
239    end    end

Legend:
Removed from v.245  
changed lines
  Added in v.269

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