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

SCM Repository

[diderot] Annotation of /branches/vis12/src/compiler/c-util/gen-load-nrrd.sml
ViewVC logotype

Annotation of /branches/vis12/src/compiler/c-util/gen-load-nrrd.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2052 - (view) (download)

1 : jhr 2051 (* gen-load-nrrd.sml
2 :     *
3 :     * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     * All rights reserved.
5 :     *)
6 :    
7 :     structure GenLoadNrrd : sig
8 :    
9 :     (* loadImage (lhs, info, name)
10 :     * returns code to load an image from a Nrrd file, where "lhs" is the l-value to hold
11 :     * the image, "info" specifies information about the image format, and "name" specifies
12 :     * the file name. The generated code check the status of the load attempt and will
13 :     * return "true" (i.e., error) if the load fails.
14 :     *)
15 :     val loadImage : CLang.exp * ImageInfo.info * CLang.exp -> CLang.stm
16 :    
17 :     (* setImage (lhs, info, nrrd)
18 :     * returns code to initialize an image from a Nrrd, where "lhs" is the l-value to hold
19 :     * the image, "info" specifies information about the image format, and "nrrd" specifies
20 :     * the nrrd. The generated code check the status of the initialization and will
21 :     * return "true" (i.e., error) if the load fails.
22 :     *)
23 :     val setImage : CLang.exp * ImageInfo.info * CLang.exp -> CLang.stm
24 :    
25 : jhr 2052 val loadSeq : CLang.exp * TreeIL.Ty.ty * CLang.exp -> CLang.stm
26 :    
27 : jhr 2051 end = struct
28 :    
29 :     structure CL = CLang
30 :     structure N = CNames
31 : jhr 2052 structure Ty = TreeIL.Ty
32 : jhr 2051
33 :     val wrldPrefixTy = CL.T_Ptr(CL.T_Named "WorldPrefix_t")
34 :    
35 :     fun doImage imageFn (lhs, info, arg) = let
36 :     val sts = "_sts"
37 :     val dim = ImageInfo.dim info
38 :     in CL.mkBlock [
39 :     CL.mkDecl(
40 :     CL.T_Named N.statusTy, sts,
41 :     SOME(CL.I_Exp(CL.E_Apply(imageFn dim, [
42 :     CL.mkCast(wrldPrefixTy, CL.mkVar "wrld"),
43 :     arg,
44 :     CL.mkUnOp(CL.%&, lhs)
45 :     ])))),
46 :     (* FIXME: we should also generate code to check that the loaded image has the right type, etc. *)
47 :     CL.mkIfThen(
48 :     CL.mkBinOp(CL.mkVar "DIDEROT_OK", CL.#!=, CL.mkVar sts),
49 :     CL.mkReturn(SOME(CL.mkVar "true")))
50 :     ] end
51 :    
52 :    
53 :     val loadImage = doImage N.loadImage
54 :     val setImage = doImage N.setImage
55 :    
56 : jhr 2052 fun loadSeq (lhs, elemTy, nrrdFile) = let
57 :     val (nDims, dimInit, dimExp, elemTy) = (case elemTy
58 :     of Ty.TensorTy(dims as _::_) => let
59 :     val nDims = List.length dims
60 :     fun lp (_, [], init) = CL.I_Array(List.rev init)
61 :     | lp (i, d::dd, init) =
62 :     lp(i+1, dd, (i, CL.I_Exp(CL.mkInt(IntInf.fromInt d)))::init)
63 :     val dimInit = CL.mkDecl(
64 :     CL.T_Ptr(CL.T_Named "unsigned int"), "_dims",
65 :     SOME(lp(0, dims, [])))
66 :     in
67 :     (nDims, [dimInit], CL.mkVar "_dims", Ty.TensorTy[])
68 :     end
69 :     | Ty.SeqTy ty' => raise Fail "loading sequences of type not supported yet"
70 :     | _ => (0, [], CL.mkInt 0, elemTy)
71 :     (* end case *))
72 :     val loadFn = N.loadDynSeqFromFile elemTy
73 :     in CL.mkBlock (
74 :     dimInit @ [
75 :     CL.mkAssign(
76 :     lhs,
77 :     CL.E_Apply(loadFn, [
78 :     CL.mkCast(CL.T_Ptr(CL.T_Named "WorldPrefix_t"), CL.mkVar "wrld"),
79 :     nrrdFile,
80 :     CL.mkInt(IntInf.fromInt nDims),
81 :     dimExp
82 :     ])),
83 :     CL.mkIfThen(
84 :     CL.mkBinOp(lhs, CL.#==, CL.mkInt 0),
85 :     CL.mkReturn(SOME(CL.mkVar "true")))
86 :     ]
87 :     ) end
88 :    
89 : jhr 2051 end
90 :    
91 :     (*
92 :     | IL.S_LoadNrrd(lhs, Ty.DynSeqTy ty, nrrd) => let
93 :     val lhs = VarToC.lvalueVar (env, lhs)
94 :     val (nDims, dimInit, dimExp, elemTy) = (case ty
95 :     of Ty.TensorTy(dims as _::_) => let
96 :     val nDims = List.length dims
97 :     fun lp (_, [], init) = CL.I_Array(List.rev init)
98 :     | lp (i, d::dd, init) =
99 :     lp(i+1, dd, (i, CL.I_Exp(CL.mkInt(IntInf.fromInt d)))::init)
100 :     val dimInit = CL.mkDecl(
101 :     CL.T_Ptr(CL.T_Named "unsigned int"), "_dims",
102 :     SOME(lp(0, dims, [])))
103 :     in
104 :     (nDims, [dimInit], CL.mkVar "_dims", Ty.TensorTy[])
105 :     end
106 :     | Ty.SeqTy ty' => raise Fail "type not supported yet"
107 :     | _ => (0, [], CL.mkInt 0, ty)
108 :     (* end case *))
109 :     val loadFn = N.loadDynSeqFromFile elemTy
110 :     in [CL.mkBlock (
111 :     dimInit @ [
112 :     CL.mkAssign(
113 :     lhs,
114 :     CL.E_Apply(loadFn, [
115 :     CL.mkCast(CL.T_Ptr(CL.T_Named "WorldPrefix_t"), CL.mkVar "wrld"),
116 :     CL.mkStr nrrd,
117 :     CL.mkInt(IntInf.fromInt nDims),
118 :     dimExp
119 :     ])),
120 :     CL.mkIfThen(
121 :     CL.mkBinOp(lhs, CL.#==, CL.mkInt 0),
122 :     CL.mkReturn(SOME(CL.mkVar "true")))
123 :     ]
124 :     )] end
125 :     *)

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