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/gen-library-interface.sml
ViewVC logotype

Diff of /branches/vis12/src/compiler/c-util/gen-library-interface.sml

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

revision 1793, Thu Apr 5 09:53:28 2012 UTC revision 1803, Fri Apr 6 13:46:37 2012 UTC
# Line 18  Line 18 
18    
19      val gen : {      val gen : {
20              tgt : TargetUtil.target_desc,       (* target information *)              tgt : TargetUtil.target_desc,       (* target information *)
21              inputs : (TreeIL.Ty.ty * string) list,              inputs : (TreeIL.Ty.ty * string * string * bool) list,
22              outputs : (TreeIL.Ty.ty * string) list              outputs : (TreeIL.Ty.ty * string) list
23            } -> unit            } -> unit
24    
# Line 31  Line 31 
31    
32      val nrrdPtrTy = CL.T_Ptr(CL.T_Named "Nrrd")      val nrrdPtrTy = CL.T_Ptr(CL.T_Named "Nrrd")
33    
 (* FIXME: we will need this function elsewhere *)  
34    (* translate TreeIL types to CLang types *)    (* translate TreeIL types to CLang types *)
35      fun trType ty = (case ty      val trType = TreeTyToC.trType
            of Ty.BoolTy => CL.T_Named "bool"  
             | Ty.StringTy => CL.charPtr  
             | Ty.IntTy => !N.gIntTy  
             | Ty.TensorTy[] => !N.gRealTy  
             | Ty.TensorTy[n] => CL.T_Array(!N.gRealTy, SOME n)  
             | Ty.TensorTy[n, m] => CL.T_Array(CL.T_Array(!N.gRealTy, SOME n), SOME m)  
             | Ty.TensorTy[n, m, l] => CL.T_Array(CL.T_Array(CL.T_Array(!N.gRealTy, SOME n), SOME m), SOME l)  
             | Ty.SeqTy(Ty.IntTy, n) => CL.T_Array(!N.gIntTy, SOME n)  
             | Ty.SeqTy(ty, n) => CL.T_Array(trType ty, SOME n)  
             | Ty.DynSeqTy _ => CL.T_Ptr(CL.T_Named N.dynSeqTy)  
             | Ty.AddrTy info => CL.T_Ptr(CL.T_Num(ImageInfo.sampleTy info))  
             | Ty.ImageTy info => CL.T_Ptr(CL.T_Named(N.imageTy(ImageInfo.dim info)))  
             | _ => raise Fail(concat["GenLibraryInterface.trType(", Ty.toString ty, ")"])  
           (* end case *))  
36    
37      fun mkSymbol base = let      fun mkSymbol base = let
38            fun tr c = if Char.isAlpha c then Char.toUpper c            fun tr c = if Char.isAlpha c then Char.toUpper c
# Line 65  Line 50 
50            val prefix = #namespace tgt            val prefix = #namespace tgt
51          (* the world pointer type *)          (* the world pointer type *)
52            val worldPtrTy = CL.T_Ptr(CL.T_Named(prefix ^ "World_t"))            val worldPtrTy = CL.T_Ptr(CL.T_Named(prefix ^ "World_t"))
53          (* create a decl for an input variable *)          (* create decls for an input variable *)
54            fun mkSetDecl (Ty.ImageTy _, name) = [            fun mkInputDecls (ty, name, desc, hasDflt) = let
55                    val wrldParam = CL.PARAM([], worldPtrTy, "wrld")
56                  (* create a description declaration for the input variable *)
57                    val descDcl = if (desc = "")
58                            then []
59                            else [
60                                CL.D_Var(["extern"], CL.T_Ptr(CL.T_Named "const char"),
61                                  concat[prefix, "Desc_", name], NONE)
62                              ]
63                    val getDcl = if hasDflt
64                            then let
65                              val name = concat[prefix, name]
66                            (* convert the input type to a by-reference C type *)
67                              val outTy = (case ty
68                                     of Ty.BoolTy => CL.T_Ptr(trType ty)
69                                      | Ty.StringTy => CL.T_Ptr(trType ty)
70                                      | Ty.IntTy => CL.T_Ptr(trType ty)
71                                      | Ty.TensorTy[] => CL.T_Ptr(trType ty)
72                                      | Ty.TensorTy _=> trType ty
73                                      | Ty.SeqTy _ => trType ty
74                                      | Ty.DynSeqTy _ => CL.T_Ptr(trType ty)
75                                      | Ty.ImageTy _ => CL.T_Ptr CL.charPtr
76                                      | _ => raise Fail(concat["bogus input type ", Ty.toString ty])
77                                    (* end case *))
78                              in [
79                                CL.D_Proto([], CL.voidTy, name, [wrldParam, CL.PARAM([], outTy, "v")])
80                              ] end
81                            else []
82                    val setDcl = (case ty
83                           of Ty.ImageTy _ => [
84                    CL.D_Proto(                    CL.D_Proto(
85                      [], CL.voidTy, concat[prefix, "Set_", name, "_ByName"],                      [], CL.voidTy, concat[prefix, "Set_", name, "_ByName"],
86                      [CL.PARAM([], worldPtrTy, "wrld"), CL.PARAM(["const"], CL.charPtr, "s")]),                                  [wrldParam, CL.PARAM(["const"], CL.charPtr, "s")]),
87                    CL.D_Proto(                    CL.D_Proto(
88                      [], CL.voidTy, concat[prefix, "Set_", name],                      [], CL.voidTy, concat[prefix, "Set_", name],
89                      [CL.PARAM([], worldPtrTy, "wrld"), CL.PARAM([], nrrdPtrTy, "data")])                                  [wrldParam, CL.PARAM([], nrrdPtrTy, "data")])
90                  ]                  ]
91              | mkSetDecl (ty as Ty.DynSeqTy _, name) = raise Fail "dynamic input not supported yet"                          | Ty.DynSeqTy _ => raise Fail "dynamic input not supported yet"
92              | mkSetDecl (ty, name) = [                          | _ => [
93                    CL.D_Proto(                    CL.D_Proto(
94                      [], CL.voidTy, concat[prefix, "Set_", name],                      [], CL.voidTy, concat[prefix, "Set_", name],
95                      [CL.PARAM([], worldPtrTy, "wrld"), CL.PARAM([], trType ty, "v")])                                  [wrldParam, CL.PARAM([], trType ty, "v")])
96                  ]                  ]
97                          (* end case *))
98                    in
99                      descDcl @ getDcl @ setDcl
100                    end
101          (* create a decl for an output variable *)          (* create a decl for an output variable *)
102            fun mkGetDecl (Ty.DynSeqTy _, name) = [            fun mkGetDecl (Ty.DynSeqTy _, name) = [
103                    CL.D_Proto(                    CL.D_Proto(
# Line 104  Line 122 
122            val outS = PrC.new outStrm            val outS = PrC.new outStrm
123            in            in
124              PrC.output (outS, CL.verbatim [LibInterfaceHeadFrag.text] placeholders);              PrC.output (outS, CL.verbatim [LibInterfaceHeadFrag.text] placeholders);
125              PrC.output (outS, CL.D_Verbatim ["\n/**** Setters for input values ****/\n"]);              PrC.output (outS, CL.D_Verbatim ["\n/**** Input functions, etc. ****/\n"]);
126              List.app (fn input => List.app (fn dcl => PrC.output(outS, dcl)) (mkSetDecl input)) inputs;              List.app (fn input => List.app (fn dcl => PrC.output(outS, dcl)) (mkInputDecls input)) inputs;
127              PrC.output (outS, CL.verbatim [LibInterfaceBodyFrag.text] placeholders);              PrC.output (outS, CL.verbatim [LibInterfaceBodyFrag.text] placeholders);
128              PrC.output (outS, CL.D_Verbatim ["\n/**** Getters for output values ****/\n"]);              PrC.output (outS, CL.D_Verbatim ["\n/**** Getters for output values ****/\n"]);
129              List.app (fn output => List.app (fn dcl => PrC.output(outS, dcl)) (mkGetDecl output)) outputs;              List.app (fn output => List.app (fn dcl => PrC.output(outS, dcl)) (mkGetDecl output)) outputs;

Legend:
Removed from v.1793  
changed lines
  Added in v.1803

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