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 435, Tue Oct 19 13:14:20 2010 UTC
# Line 1  Line 1 
1  (* eval.sml  (* eval.sml
2   *   *
3   * COPYRIGHT (c) 2010 The Diderot Project (http://diderot.cs.uchicago.edu)   * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4   * All rights reserved.   * All rights reserved.
5   *   *
6   * Evaluation of "static" expressions.   * Evaluation of "static" expressions.
# 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 105  Line 106 
106  *)  *)
107                  (BV.op_not,             fn [BV b] => BV(not b)),                  (BV.op_not,             fn [BV b] => BV(not b)),
108  (*  (*
                 (BV.op_subscript,       fn (y, [SK, NK], xs) => ??),  
109                  (BV.fn_CL,              fn (y, _, xs) => assign(y, Op.CL, xs)),                  (BV.fn_CL,              fn (y, _, xs) => assign(y, Op.CL, xs)),
110  *)  *)
111                  (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))),
112                    (BV.fn_convolve,        fn [KV h, Img info] => FV(FieldDef.CONV(0, info, h))),
113                  (BV.fn_cos,             realUnOp Math.cos),                  (BV.fn_cos,             realUnOp Math.cos),
114  (*  (*
115                  (BV.fn_dot,             vectorOp Op.Dot),                  (BV.fn_dot,             vectorOp Op.Dot),
# Line 150  Line 151 
151              | NONE => raise Fail("undefined variable " ^ Var.uniqueNameOf x)              | NONE => raise Fail("undefined variable " ^ Var.uniqueNameOf x)
152            (* end case *))            (* end case *))
153    
154      fun evalExp (env, e) = (case e      fun apply (env, f, mvs, xs) =
155             of S.E_Var x => evalVar env x            if List.all (fn x => VMap.inDomain(env, x)) xs
156              | 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 *)(  
157                  if Var.same(f, BV.fn_load)                  if Var.same(f, BV.fn_load)
158                    then loadImage(mvs, List.map (evalVar env) xs)                    then SOME(loadImage(mvs, List.map (evalVar env) xs))
159                    else (case VTbl.find tbl f                    else (case VTbl.find tbl f
160                       of SOME evalFn => evalFn (List.map (evalVar env) xs)                       of SOME evalFn => SOME(evalFn (List.map (evalVar env) xs))
161                        | NONE => raise Fail("Eval.exvalExp: unknown function " ^ Var.nameOf f)                        | NONE => NONE
162                      (* end case *))                      (* end case *))
163                  ) handle ex => (                  ) handle ex => (
164                    TextIO.output (TextIO.stdErr, concat [                    TextIO.output (TextIO.stdErr, concat [
# Line 171  Line 166 
166                        String.concatWith "," (List.map Var.uniqueNameOf xs),                        String.concatWith "," (List.map Var.uniqueNameOf xs),
167                        ") fails with exception ", exnName ex, "\n"                        ") fails with exception ", exnName ex, "\n"
168                      ]);                      ]);
169                    raise ex))                raise ex)
170                else NONE
171    
172        fun evalExp (env, e) = (case e
173               of S.E_Var x => VMap.find (env, x)
174                | S.E_Lit(Literal.Int i) => SOME(IV i)
175                | S.E_Lit(Literal.Float f) => SOME(RV(FloatLit.toReal f))
176                | S.E_Lit(Literal.String s) => SOME(SV s)
177                | S.E_Lit(Literal.Bool b) => SOME(BV b)
178                | S.E_Tuple _ => raise Fail "E_Tuple"
179                | S.E_Apply(f, mvs, xs, _) => apply(env, f, mvs, xs)
180              | S.E_Cons xs => raise Fail "TODO: E_Cons"              | S.E_Cons xs => raise Fail "TODO: E_Cons"
181              | S.E_Input(ty, name, optDefault) => let              | S.E_Slice(e, indices, _) => raise Fail "TODO: E_Slice"
182                | 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    (Log.msg(concat["eval assignment: ", 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.435

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