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/c-ty-translate.sml
ViewVC logotype

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

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

branches/vis12/src/compiler/c-target/c-ty-translate.sml revision 1818, Tue Apr 10 22:18:20 2012 UTC branches/vis12/src/compiler/c-util/c-ty-translate.sml revision 1820, Wed Apr 11 10:53:15 2012 UTC
# Line 2  Line 2 
2   *   *
3   * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)   * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu)
4   * All rights reserved.   * All rights reserved.
5     *
6     * Functions to support the translation between the external C API and the internal (host-side)
7     * Diderot representation.
8     *)
9    
10    signature TY_TRANSLATE =
11      sig
12    
13      (* translate a type to its internal Diderot represenation *)
14        val toType : TreeIL.Ty.ty -> CLang.ty
15    
16      (* translate a TreeIL type to the C types used to represent it in the external API *)
17        val toCType : TreeIL.Ty.ty -> CLang.ty
18    
19      (* generate code to copy values from their internal Diderot representation to the external
20       * C representation.
21   *)   *)
22        val copyToC : {ty : TreeIL.Ty.ty, dst : CLang.exp, src : CLang.exp} -> CLang.stm list
23    
24      (* generate code to copy values from their external C representation to the internal
25       * Diderot representation.
26       *)
27        val copyFromC : {ty : TreeIL.Ty.ty, dst : CLang.exp, src : CLang.exp} -> CLang.stm list
28    
29      end
30    
31  structure CTyTranslate : TY_TRANSLATE =  structure CTyTranslate : TY_TRANSLATE =
32    struct    struct
# Line 11  Line 35 
35      structure CL = CLang      structure CL = CLang
36      structure N = CNames      structure N = CNames
37    
38    (* translate TreeIL types to CLang types *)    (* translate a type to its internal Diderot represenation *)
39      fun trType ty = (case ty      fun toType ty = (case ty
40             of Ty.BoolTy => CL.T_Named "bool"             of Ty.BoolTy => CL.T_Named "bool"
41              | Ty.StringTy => CL.charPtr              | Ty.StringTy => CL.T_Named "Diderot_string_t"
42              | Ty.IntTy => !N.gIntTy              | Ty.IntTy => CL.T_Named "Diderot_int_t"
43              | Ty.TensorTy[] => !N.gRealTy              | Ty.TensorTy[] => CL.T_Named "Diderot_real_t"
44              | Ty.TensorTy[n] => CL.T_Named(N.vecTy n)              | Ty.TensorTy[n] => CL.T_Named(N.vecTy n)
45              | Ty.TensorTy[n, m] => CL.T_Named(N.matTy(n,m))              | Ty.TensorTy[n, m] => CL.T_Named(N.matTy(n,m))
46              | Ty.TensorTy[n, m, l] => CL.T_Named(N.ten3Ty(n,m,l))              | Ty.TensorTy[n, m, l] => CL.T_Named(N.ten3Ty(n,m,l))
47              | Ty.SeqTy(Ty.IntTy, n) => CL.T_Named(N.ivecTy n)              | Ty.SeqTy(Ty.IntTy, n) => CL.T_Named(N.ivecTy n)
48              | Ty.SeqTy(ty, n) => CL.T_Array(trType ty, SOME n)              | Ty.SeqTy(ty, n) => CL.T_Array(toType ty, SOME n)
49  (* do we make the following types externally visible? *)  (* do we make the following types externally visible? *)
50              | Ty.DynSeqTy _ => CL.T_Ptr(CL.T_Named N.dynSeqTy)              | Ty.DynSeqTy _ => CL.T_Ptr(CL.T_Named N.dynSeqTy)
51              | Ty.AddrTy info => CL.T_Ptr(CL.T_Num(ImageInfo.sampleTy info))              | Ty.AddrTy info => CL.T_Ptr(CL.T_Num(ImageInfo.sampleTy info))
52              | Ty.ImageTy info => CL.T_Ptr(CL.T_Named(N.imageTy(ImageInfo.dim info)))              | Ty.ImageTy info => CL.T_Ptr(CL.T_Named(N.imageTy(ImageInfo.dim info)))
53              | _ => raise Fail(concat["CTyTranslate.trType(", Ty.toString ty, ")"])              | _ => raise Fail(concat["CTyTranslate.toType(", Ty.toString ty, ")"])
54              (* end case *))
55    
56      (* translate a TreeIL type to the C types used to represent it in the external API *)
57        fun toCType ty = (case ty
58               of Ty.BoolTy => CL.T_Named "bool"
59                | Ty.StringTy => CL.charPtr
60                | Ty.IntTy => !N.gIntTy
61                | Ty.TensorTy[] => !N.gRealTy
62                | Ty.TensorTy[n] => CL.T_Array(!N.gRealTy, SOME n)
63                | Ty.TensorTy[n, m] => CL.T_Array(CL.T_Array(!N.gRealTy, SOME n), SOME m)
64                | Ty.TensorTy[n, m, l] => CL.T_Array(CL.T_Array(CL.T_Array(!N.gRealTy, SOME n), SOME m), SOME l)
65                | Ty.SeqTy(Ty.IntTy, n) => CL.T_Array(!N.gIntTy, SOME n)
66                | Ty.SeqTy(ty, n) => CL.T_Array(toCType ty, SOME n)
67                | Ty.DynSeqTy _ => CL.T_Ptr(CL.T_Named N.dynSeqTy)
68                | Ty.AddrTy info => CL.T_Ptr(CL.T_Num(ImageInfo.sampleTy info))
69                | Ty.ImageTy info => CL.T_Ptr(CL.T_Named(N.imageTy(ImageInfo.dim info)))
70                | _ => raise Fail(concat["CTyTranslate.toCType(", Ty.toString ty, ")"])
71            (* end case *))            (* end case *))
72    
73      fun subscript (e, i) = CL.mkSubscript(e, CL.mkInt(IntInf.fromInt i))      fun subscript (e, i) = CL.mkSubscript(e, CL.mkInt(IntInf.fromInt i))
74    
75    (* we might want to use memcpy in some cases
76        fun copy (ty, dst, src) = let
77              fun assign () = CL.mkAssign(dst, src)
78              fun addrOf (CL.E_UnOp(CL.%*, x)) = x
79                | addrOf x = CL.mkUnOp(CL.%&, x)
80              fun memcpy () = CL.mkCall("memcpy", [addrOf dst, addrOf src, CL.mkSizeof(trType ty)])
81              in
82                case ty
83                 of Ty.BoolTy => assign()
84                  | Ty.StringTy => CL.mkCall("strcpy", [addrOf dst, addrOf src])
85                  | Ty.IntTy => assign()
86                  | Ty.TensorTy[] => assign()
87                  | Ty.TensorTy _ => memcpy()
88                  | Ty.SeqTy _ => memcpy()
89                  | Ty.DynSeqTy _ => raise Fail "dynamic sequence"
90                  | Ty.ImageTy _ => raise Fail "unexpected image copy"
91                  | _ => raise Fail(concat["bogus input type ", Ty.toString ty])
92                (* end case *)
93              end
94    *)
95    
96    (* generate code to copy values from their internal Diderot representation to the external    (* generate code to copy values from their internal Diderot representation to the external
97     * C representation.  If the representations are identical, then the empty list is returned.     * C representation.
98     *)     *)
99      fun copyToC {ty, dst, src} = (case ty      fun copyToC {ty, dst, src} = (case ty
100             of Ty.BoolTy => []             of Ty.BoolTy => [CL.mkAssign(dst, src)]
101              | Ty.StringTy => []              | Ty.StringTy => [CL.mkAssign(dst, src)]
102              | Ty.IntTy => []              | Ty.IntTy => [CL.mkAssign(dst, src)]
103              | Ty.TensorTy[] => []              | Ty.TensorTy[] => [CL.mkAssign(dst, src)]
104              | Ty.TensorTy[n] => List.tabulate (n,              | Ty.TensorTy[n] => List.tabulate (n,
105                  fn i => CL.mkAssign(                  fn i => CL.mkAssign(
106                    subscript (dst, i),                    subscript (dst, i),
107                    subscript (CL.mkSelect(src, "r"), i)))                    subscript (CL.mkSelect(src, "r"), i)))
108              | Ty.TensorTy[n, m] => List.tabulate(n,              | Ty.TensorTy[n, m] => List.concat(List.tabulate(n,
109                  fn i => List.tabulate (m,                  fn i => List.tabulate (m,
110                    fn j => CL.mkAssign(                    fn j => CL.mkAssign(
111                      subscript (dst, i*m + j),                      subscript (dst, i*m + j),
112                      subscript(CL.mkSelect(subscript (src, i), "r"), j))))                      subscript(CL.mkSelect(subscript (src, i), "r"), j)))))
113              | Ty.TensorTy[n, m, l] => List.tabulate(n,              | Ty.TensorTy[n, m, l] => List.concat(List.tabulate(n,
114                  fn i => List.tabulate (m,                  fn i => List.concat(List.tabulate (m,
115                    fn j => List.tabulate (l,                    fn j => List.tabulate (l,
116                      fn k => CL.mkAssign(                      fn k => CL.mkAssign(
117                        subscript(dst, i*m*l + j*l + k),                        subscript(dst, i*m*l + j*l + k),
118                        subscript(CL.mkSelect(subscript(subscript(src, i), j), "r"), j)))))                        subscript(CL.mkSelect(subscript(subscript(src, i), j), "r"), j)))))))
119              | Ty.SeqTy(Ty.IntTy, n) => List.tabulate (n,              | Ty.SeqTy(Ty.IntTy, n) => List.tabulate (n,
120                  fn i => CL.mkAssign(                  fn i => CL.mkAssign(
121                    subscript (dst, i),                    subscript (dst, i),
122                    subscript (CL.mkSelect(src, "i"), i)))                    subscript (CL.mkSelect(src, "i"), i)))
123    (* do we make the following types externally visible?
124              | Ty.SeqTy(ty, n) =>              | Ty.SeqTy(ty, n) =>
125              | Ty.DynSeqTy _ =>              | Ty.DynSeqTy _ =>
126              | Ty.AddrTy info =>              | Ty.AddrTy info =>
127              | Ty.ImageTy info =>              | Ty.ImageTy info =>
128    *)
129              | _ => raise Fail(concat["CTyTranslate.copyToC(", Ty.toString ty, ")"])              | _ => raise Fail(concat["CTyTranslate.copyToC(", Ty.toString ty, ")"])
130            (* end case *))            (* end case *))
131    
132    (* generate code to copy values from their external C representation to the internal    (* generate code to copy values from their external C representation to the internal
133     * Diderot representation.  If the representations are identical, then the empty list     * Diderot representation.
    * is returned.  
134     *)     *)
135      fun copyFromC {ty, dst, src} = (case ty      fun copyFromC {ty, dst, src} = (case ty
136             of Ty.BoolTy => []             of Ty.BoolTy => [CL.mkAssign(dst, src)]
137              | Ty.StringTy => []              | Ty.StringTy => [CL.mkAssign(dst, src)]
138              | Ty.IntTy => []              | Ty.IntTy => [CL.mkAssign(dst, src)]
139              | Ty.TensorTy[n] => CL.mkAssign(              | Ty.TensorTy[n] => [CL.mkAssign(
140                  CL.mkSelect(dst, "v"),                  CL.mkSelect(dst, "v"),
141                  CL.mkApply(N.mkVec n, List.tabulate(n, fn i => subscript(src, i))))                  CL.mkApply(N.mkVec n, List.tabulate(n, fn i => subscript(src, i))))]
142              | Ty.TensorTy[n, m] => List.tabulate(n,              | Ty.TensorTy[n, m] => List.tabulate(n,
143                  fn i => CL.mkAssign(                  fn i => CL.mkAssign(
144                    CL.mkSelect(subscript(dst, i), "v"),                    CL.mkSelect(subscript(dst, i), "v"),
145                    CL.mkApply(N.mkVec n, List.tabulate(n, fn j => subscript(src, i*m + j)))))                    CL.mkApply(N.mkVec n, List.tabulate(n, fn j => subscript(src, i*m + j)))))
146              | Ty.TensorTy[n, m, l] => List.tabulate(n,              | Ty.TensorTy[n, m, l] => List.concat(List.tabulate(n,
147                  fn i => List.tabulate (m,                  fn i => List.tabulate (m,
148                    fn j => (                    fn j => CL.mkAssign(
149                      CL.mkSelect(subscript(subscript(dst, i), j), "v"),                      CL.mkSelect(subscript(subscript(dst, i), j), "v"),
150                      CL.mkApply(N.mkVec n,                      CL.mkApply(N.mkVec n,
151                        List.tabulate(n, fn k => subscript(src, i*m*l + j*l + k))))))                        List.tabulate(n, fn k => subscript(src, i*m*l + j*l + k)))))))
152              | Ty.SeqTy(Ty.IntTy, n) => CL.mkAssign(              | Ty.SeqTy(Ty.IntTy, n) => [
153                      CL.mkAssign(
154                  CL.mkSelect(dst, "v"),                  CL.mkSelect(dst, "v"),
155                  CL.mkApply(N.mkIVec n, List.tabulate(n, fn i => subscript(src, i))))                  CL.mkApply(N.mkIVec n, List.tabulate(n, fn i => subscript(src, i))))
156                    ]
157    (* do we make the following types externally visible?
158              | Ty.SeqTy(ty, n) =>              | Ty.SeqTy(ty, n) =>
159              | Ty.DynSeqTy _ =>              | Ty.DynSeqTy _ =>
160              | Ty.AddrTy info =>              | Ty.AddrTy info =>
161              | Ty.ImageTy info =>              | Ty.ImageTy info =>
162    *)
163              | _ => raise Fail(concat["CTyTranslate.copyToC(", Ty.toString ty, ")"])              | _ => raise Fail(concat["CTyTranslate.copyToC(", Ty.toString ty, ")"])
164            (* end case *))            (* end case *))
165    

Legend:
Removed from v.1818  
changed lines
  Added in v.1820

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