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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1820 - (view) (download)

1 : jhr 1701 (* gen-library-interface.sml
2 :     *
3 :     * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4 :     * All rights reserved.
5 :     *
6 :     * Generate the C header file for the library produced by the compiler.
7 :     *
8 :     * The format of header file is:
9 :     *
10 :     * HEAD
11 :     * decls for input variables
12 :     * BODY
13 :     * decls for output variables
14 :     * FOOT
15 :     *)
16 :    
17 :     structure GenLibraryInterface : sig
18 :    
19 :     val gen : {
20 : jhr 1706 tgt : TargetUtil.target_desc, (* target information *)
21 : jhr 1803 inputs : (TreeIL.Ty.ty * string * string * bool) list,
22 : jhr 1701 outputs : (TreeIL.Ty.ty * string) list
23 :     } -> unit
24 :    
25 :     end = struct
26 :    
27 :     structure Ty = TreeIL.Ty
28 :     structure CL = CLang
29 :     structure N = CNames
30 :     structure PrC = PrintAsC
31 :    
32 :     val nrrdPtrTy = CL.T_Ptr(CL.T_Named "Nrrd")
33 :    
34 : jhr 1820 (* translate a TreeIL type to the C types used to represent it in the external API *)
35 :     val trType = CTyTranslate.toCType
36 : jhr 1701
37 :     fun mkSymbol base = let
38 :     fun tr c = if Char.isAlpha c then Char.toUpper c
39 :     else if Char.isDigit c then c
40 :     else #"_"
41 :     in
42 :     String.concat["_", CharVector.map tr base, "_H_"]
43 :     end
44 :    
45 : jhr 1815 fun gen {tgt, inputs, outputs} = let
46 : jhr 1701 val filename = OS.Path.joinDirFile{
47 : jhr 1706 dir = #outDir tgt,
48 :     file = OS.Path.joinBaseExt{base = #outBase tgt, ext = SOME "h"}
49 : jhr 1701 }
50 :     (* the world pointer type *)
51 : jhr 1815 val worldPtrTy = CL.T_Ptr(CL.T_Named(N.worldTy tgt))
52 : jhr 1803 (* create decls for an input variable *)
53 :     fun mkInputDecls (ty, name, desc, hasDflt) = let
54 :     val wrldParam = CL.PARAM([], worldPtrTy, "wrld")
55 :     (* create a description declaration for the input variable *)
56 :     val descDcl = if (desc = "")
57 :     then []
58 :     else [
59 :     CL.D_Var(["extern"], CL.T_Ptr(CL.T_Named "const char"),
60 : jhr 1815 N.inputDesc(tgt, name), NONE)
61 : jhr 1803 ]
62 :     val getDcl = if hasDflt
63 :     then let
64 : jhr 1815 val name = N.inputGet(tgt, name)
65 : jhr 1803 (* convert the input type to a by-reference C type *)
66 :     val outTy = (case ty
67 :     of Ty.BoolTy => CL.T_Ptr(trType ty)
68 :     | Ty.StringTy => CL.T_Ptr(trType ty)
69 :     | Ty.IntTy => CL.T_Ptr(trType ty)
70 :     | Ty.TensorTy[] => CL.T_Ptr(trType ty)
71 :     | Ty.TensorTy _=> trType ty
72 :     | Ty.SeqTy _ => trType ty
73 :     | Ty.DynSeqTy _ => CL.T_Ptr(trType ty)
74 :     | Ty.ImageTy _ => CL.T_Ptr CL.charPtr
75 :     | _ => raise Fail(concat["bogus input type ", Ty.toString ty])
76 :     (* end case *))
77 :     in [
78 :     CL.D_Proto([], CL.voidTy, name, [wrldParam, CL.PARAM([], outTy, "v")])
79 :     ] end
80 :     else []
81 :     val setDcl = (case ty
82 :     of Ty.ImageTy _ => [
83 :     CL.D_Proto(
84 : jhr 1815 [], CL.boolTy, N.inputSetByName(tgt, name),
85 : jhr 1803 [wrldParam, CL.PARAM(["const"], CL.charPtr, "s")]),
86 :     CL.D_Proto(
87 : jhr 1815 [], CL.boolTy, N.inputSet(tgt, name),
88 : jhr 1803 [wrldParam, CL.PARAM([], nrrdPtrTy, "data")])
89 :     ]
90 :     | Ty.DynSeqTy _ => raise Fail "dynamic input not supported yet"
91 :     | _ => [
92 :     CL.D_Proto(
93 : jhr 1815 [], CL.boolTy, N.inputSet(tgt, name),
94 : jhr 1803 [wrldParam, CL.PARAM([], trType ty, "v")])
95 :     ]
96 :     (* end case *))
97 :     in
98 :     descDcl @ getDcl @ setDcl
99 :     end
100 : jhr 1701 (* create a decl for an output variable *)
101 :     fun mkGetDecl (Ty.DynSeqTy _, name) = [
102 :     CL.D_Proto(
103 : jhr 1815 [], CL.boolTy, N.outputGet(tgt, name),
104 : jhr 1701 [CL.PARAM([], worldPtrTy, "wrld"), CL.PARAM([], nrrdPtrTy, "lengths"), CL.PARAM([], nrrdPtrTy, "data")])
105 :     ]
106 :     | mkGetDecl (_, name) = [
107 :     CL.D_Proto(
108 : jhr 1815 [], CL.boolTy, N.outputGet(tgt, name),
109 : jhr 1701 [CL.PARAM([], worldPtrTy, "wrld"), CL.PARAM([], nrrdPtrTy, "data")])
110 :     ]
111 :     val placeholders = [
112 : jhr 1706 ("DIDEROT_FLOAT_PRECISION", TargetUtil.floatPrecisionDef tgt),
113 :     ("DIDEROT_INT_PRECISION", TargetUtil.intPrecisionDef tgt),
114 :     ("DIDEROT_TARGET", TargetUtil.targetDef tgt),
115 : jhr 1701 ("HDRFILE", filename),
116 : jhr 1706 ("HDR_DEFINE", mkSymbol(#outBase tgt)),
117 : jhr 1815 ("PREFIX", #namespace tgt),
118 : jhr 1706 ("SRCFILE", #srcFile tgt)
119 : jhr 1701 ]
120 :     val outStrm = TextIO.openOut filename
121 :     val outS = PrC.new outStrm
122 :     in
123 :     PrC.output (outS, CL.verbatim [LibInterfaceHeadFrag.text] placeholders);
124 : jhr 1812 PrC.output (outS, CL.D_Verbatim ["\n/**** Functions etc. for input variables ****/\n"]);
125 : jhr 1803 List.app (fn input => List.app (fn dcl => PrC.output(outS, dcl)) (mkInputDecls input)) inputs;
126 : jhr 1701 PrC.output (outS, CL.verbatim [LibInterfaceBodyFrag.text] placeholders);
127 : jhr 1706 PrC.output (outS, CL.D_Verbatim ["\n/**** Getters for output values ****/\n"]);
128 : jhr 1701 List.app (fn output => List.app (fn dcl => PrC.output(outS, dcl)) (mkGetDecl output)) outputs;
129 :     PrC.output (outS, CL.verbatim [LibInterfaceFootFrag.text] placeholders);
130 :     PrC.close outS;
131 :     TextIO.closeOut outStrm
132 :     end
133 :    
134 :     end

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