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

SCM Repository

[diderot] Diff of /branches/vis12/src/compiler/c-util/output-util.sml
ViewVC logotype

Diff of /branches/vis12/src/compiler/c-util/output-util.sml

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

revision 2718, Tue Sep 23 17:51:35 2014 UTC revision 2719, Tue Sep 23 17:51:53 2014 UTC
# Line 8  Line 8 
8    
9  structure OutputUtil : sig  structure OutputUtil : sig
10    
11      (* return information about the output type.  This is a tuple
12       *
13       *    (c-type, nrrd-type, nrrd-axis-kind, # elements)
14       *)
15        val infoOf : Properties.props * TreeIL.Ty.ty -> (CLang.ty * NrrdEnums.ty * NrrdEnums.axis_kind * int)
16    
17      (* code fragment to allocate nrrd data and check for errors
18            if (nrrdMaybeAlloc_nva(<nrrdVar>, <nrrdType>, <nDims>, sizes) != 0) {
19                char *msg = biffGetDone(NRRD);
20                biffMsgAdd (wrld->errors, msg);
21                FREE (msg);
22                return true;
23            }
24       *)
25        val maybeAlloc : CLang.exp * CLang.var * int -> CLang.stm
26    
27      val genOutput : Properties.props * (TreeIL.Ty.ty * string) list -> CLang.decl list      val genOutput : Properties.props * (TreeIL.Ty.ty * string) list -> CLang.decl list
28    
29    end = struct    end = struct
# Line 15  Line 31 
31      structure Ty = TreeIL.Ty      structure Ty = TreeIL.Ty
32      structure CL = CLang      structure CL = CLang
33      structure N = CNames      structure N = CNames
34        structure Nrrd = NrrdEnums
35    
36      val nrrdPtrTy = CL.T_Ptr(CL.T_Named "Nrrd")      val nrrdPtrTy = CL.T_Ptr(CL.T_Named "Nrrd")
37      val filePtrTy = CL.T_Ptr(CL.T_Named "FILE")      val filePtrTy = CL.T_Ptr(CL.T_Named "FILE")
38    
39    (* variables in the generated code *)    (* variables in the generated code *)
40      val wrldV = CL.mkVar "wrld"      val wrldV = CL.mkVar "wrld"
41        val sizesV = CL.mkVar "sizes"
42      val nDataV = CL.mkVar "nData"      val nDataV = CL.mkVar "nData"
43      val nLengthsV = CL.mkVar "nLengths"      val nLengthsV = CL.mkVar "nLengths"
44      val NRRD = CL.mkVar "NRRD"      val NRRD = CL.mkVar "NRRD"
45        val msgV = CL.mkVar "msg"
46    
47      fun wrldPtr tgt = CL.T_Ptr(CL.T_Named(N.worldTy tgt))      fun wrldPtr tgt = CL.T_Ptr(CL.T_Named(N.worldTy tgt))
48    
49        fun infoOf (tgt : Properties.props, ty) = (case ty
50               of Ty.IntTy => if #longint tgt
51                    then (CL.int64, Nrrd.TypeLLong, Nrrd.KindScalar, 1)
52                    else (CL.int32, Nrrd.TypeInt, Nrrd.KindScalar, 1)
53                | Ty.TensorTy [] => if #double tgt
54                    then (CL.double, Nrrd.TypeDouble, Nrrd.KindScalar, 1)
55                    else (CL.float, Nrrd.TypeFloat, Nrrd.KindScalar, 1)
56                | Ty.TensorTy dims => let
57                    val (axisKind, nElems) = (case dims
58                           of [2] => (Nrrd.Kind2Vector, 2)
59                            | [3] => (Nrrd.Kind3Vector, 3)
60                            | [4] => (Nrrd.Kind4Vector, 4)
61                            | [2,2] => (Nrrd.Kind2DMatrix, 4)
62                            | [3,3] => (Nrrd.Kind3DMatrix, 9)
63                            | _ => (Nrrd.KindList, List.foldl Int.* 1 dims)
64                          (* end case *))
65                    in
66                      if #double tgt
67                        then (CL.double, Nrrd.TypeDouble, axisKind, nElems)
68                        else (CL.float, Nrrd.TypeFloat, axisKind, nElems)
69                    end
70                | Ty.SeqTy(ty, n) => raise Fail "FIXME" (*let
71                    val (elemTy, nrrdTy, dims) = infoOf (tgt, ty)
72                    in
73                      (elemTy, nrrdTy, n::dims)
74                    end*)
75                | _ => raise Fail(concat["GetOutput.infoOf(", Ty.toString ty, ")"])
76              (* end case *))
77    
78      (* code fragment to allocate nrrd data and check for errors
79            if (nrrdMaybeAlloc_nva(<nrrdVar>, <nrrdType>, <nDims>, sizes) != 0) {
80                char *msg = biffGetDone(NRRD);
81                biffMsgAdd (wrld->errors, msg);
82                FREE (msg);
83                return true;
84            }
85       *)
86        fun maybeAlloc (nrrdVar, nrrdType, nDims) =
87              CL.mkIfThen(
88                CL.mkBinOp(
89                  CL.mkApply("nrrdMaybeAlloc_nva", [
90                      nrrdVar, CL.mkVar nrrdType, CL.mkInt(IntInf.fromInt nDims), sizesV
91                    ]),
92                  CL.#!=,
93                  CL.mkInt 0),
94              (* then *)
95                CL.mkBlock[
96                    CL.mkDeclInit(CL.charPtr, "msg", CL.mkApply("biffGetDone", [NRRD])),
97                    World.errorMsgAdd msgV,
98                    CL.mkCall("FREE", [msgV]),
99                    CL.mkReturn(SOME(CL.mkVar "true"))
100                  ]
101              (* endif*))
102    
103    (* generate the nrrd-file output and print functions used by standalone executables *)    (* generate the nrrd-file output and print functions used by standalone executables *)
104      fun genOutput (tgt : Properties.props, outputs) = let      fun genOutput (tgt : Properties.props, outputs) = let
105            fun isDyn ty = (case ty of Ty.DynSeqTy _ => true | _ => false)            fun isDyn ty = (case ty of Ty.DynSeqTy _ => true | _ => false)

Legend:
Removed from v.2718  
changed lines
  Added in v.2719

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