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

SCM Repository

[diderot] Diff of /branches/vis15/src/compiler/cxx-util/gen-tys-and-ops.sml
ViewVC logotype

Diff of /branches/vis15/src/compiler/cxx-util/gen-tys-and-ops.sml

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

revision 4027, Wed Jun 22 17:38:35 2016 UTC revision 4028, Wed Jun 22 21:15:36 2016 UTC
# Line 22  Line 22 
22    
23      fun mkReturn exp = CL.mkReturn(SOME exp)      fun mkReturn exp = CL.mkReturn(SOME exp)
24      fun mkInt i = CL.mkInt(IntInf.fromInt i)      fun mkInt i = CL.mkInt(IntInf.fromInt i)
25      fun mkFunc (ty, name, params, body) = CL.D_Func(["inline"], ty, name, params, body)      fun mkFunc (ty, name, params, body) = CL.D_Func(["inline"], ty, [], name, params, body)
26        fun mkConstr (cls, params, inits) = CL.D_Constr(
27              [], [], cls, params,
28              SOME([CL.mkApply("_data", [CL.mkVar "src"])], CL.mkBlock[]))
29    
30      fun genTyDecl env = let      fun genTyDecl env = let
31            val (realTy, realTyName, realTySz) = if #double(Env.target env)            val (realTy, realTyName, realTySz) = if #double(Env.target env)
# Line 44  Line 47 
47                        val name = RN.tensorRefStruct shape                        val name = RN.tensorRefStruct shape
48                        val thisData = CL.mkIndirect(CL.mkVar "this", "_data")                        val thisData = CL.mkIndirect(CL.mkVar "this", "_data")
49                      (* constructor from float/double pointer *)                      (* constructor from float/double pointer *)
50                        val constrDcl1 = CL.D_Constr([], NONE, name,                        val constrDcl1 = mkConstr (name,
51                              [CL.PARAM([], CL.constPtrTy realTy, "src")],                              [CL.PARAM([], CL.constPtrTy realTy, "src")],
52                              [CL.mkApply("_data", [CL.mkVar "src"])],                              [CL.mkApply("_data", [CL.mkVar "src"])])
                             SOME(CL.mkBlock[]))  
53  (* QUESTION: do we want the following?  It will have to be declared out-of-line.  (* QUESTION: do we want the following?  It will have to be declared out-of-line.
54                      (* constructor from tensor struct *)                      (* constructor from tensor struct *)
55                        val constrDcl2 = CL.D_Constr([], NONE, name,                        val constrDcl2 = CL.D_Constr([], NONE, name,
# Line 59  Line 61 
61                              SOME(CL.mkBlock[]))                              SOME(CL.mkBlock[]))
62  *)  *)
63                      (* copy constructor *)                      (* copy constructor *)
64                        val constrDcl2 = CL.D_Constr([], NONE, name,                        val constrDcl2 = mkConstr (name,
65                              [CL.PARAM([], CL.T_Named(name ^ " const &"), "ten")],                              [CL.PARAM([], CL.T_Named(name ^ " const &"), "ten")],
66                              [CL.mkApply("_data", [CL.mkSelect(CL.mkVar "ten", "_data")])],                              [CL.mkApply("_data", [CL.mkSelect(CL.mkVar "ten", "_data")])])
                             SOME(CL.mkBlock[]))  
67                      (* subscript operator *)                      (* subscript operator *)
68                        val subscriptDcl = CL.D_Func([], CL.T_Named(realTyName ^ " const &"),                        val subscriptDcl = CL.D_Func([], CL.T_Named(realTyName ^ " const &"),
69                              "operator[]",                              [], "operator[]",
70                              [CL.PARAM([], CL.uint32, "i")],                              [CL.PARAM([], CL.uint32, "i")],
71                              CL.mkReturn(SOME(CL.mkSubscript(thisData, CL.mkVar "i"))))                              CL.mkReturn(SOME(CL.mkSubscript(thisData, CL.mkVar "i"))))
72                      (* address at function *)                      (* address at function *)
73                        val addrAtDcl = CL.D_Func([], CL.constPtrTy(realTy), "addr",                        val addrAtDcl = CL.D_Func([], CL.constPtrTy(realTy), [], "addr",
74                              [CL.PARAM([], CL.uint32, "i")],                              [CL.PARAM([], CL.uint32, "i")],
75                              CL.mkReturn(SOME(CL.mkAddrOf(CL.mkSubscript(thisData, CL.mkVar "i")))))                              CL.mkReturn(SOME(CL.mkAddrOf(CL.mkSubscript(thisData, CL.mkVar "i")))))
76                        val structDcl = CL.D_ClassDef{                        val structDcl = CL.D_ClassDef{
# Line 77  Line 78 
78                                args = NONE,                                args = NONE,
79                                from = NONE,                                from = NONE,
80                                public = [                                public = [
81                                    CL.D_Var([], CL.constPtrTy realTy, "_data", NONE),                                    CL.mkVarDcl(CL.constPtrTy realTy, "_data"),
82                                    constrDcl1, constrDcl2,                                    constrDcl1, constrDcl2,
83                                    subscriptDcl,                                    subscriptDcl,
84                                    addrAtDcl                                    addrAtDcl
# Line 118  Line 119 
119                                    CL.mkUnOp(CL.%*, CL.mkVar "it")))                                    CL.mkUnOp(CL.%*, CL.mkVar "it")))
120                              ]                              ]
121                      (* default constructor *)                      (* default constructor *)
122                        val constrDcl1 = CL.D_Constr([], NONE, name, [], [], SOME(CL.mkBlock[]))                        val constrDcl1 = mkConstr (name, [], [])
123                      (* constructor from initializer list *)                      (* constructor from initializer list *)
124                        val constrDcl2 = CL.D_Constr([], NONE, name,                        val constrDcl2 = CL.D_Constr([], [], name,
125                              [CL.PARAM([], CL.T_Template("std::initializer_list", [realTy]), "il")],                              [CL.PARAM([], CL.T_Template("std::initializer_list", [realTy]), "il")],
126                              [],                              SOME([], CL.mkBlock copyFromInitializerList))
                             SOME(CL.mkBlock copyFromInitializerList))  
127                      (* constructor from float/double pointer *)                      (* constructor from float/double pointer *)
128                        val constrDcl3 = CL.D_Constr([], NONE, name,                        val constrDcl3 = CL.D_Constr([], [], name,
129                              [CL.PARAM([], CL.constPtrTy realTy, "src")],                              [CL.PARAM([], CL.constPtrTy realTy, "src")],
130                              [],                              SOME([], copyFromArray (CL.mkVar "src")))
                             SOME(copyFromArray (CL.mkVar "src")))  
131                      (* copy constructor *)                      (* copy constructor *)
132                        val constrDcl4 = CL.D_Constr([], NONE, name,                        val constrDcl4 = CL.D_Constr([], [], name,
133                              [CL.PARAM([], CL.T_Named(name ^ " const &"), "ten")],                              [CL.PARAM([], CL.T_Named(name ^ " const &"), "ten")],
134                              [],                              SOME([], copyFromArray (CL.mkSelect(CL.mkVar "ten", "_data"))))
                             SOME(copyFromArray (CL.mkSelect(CL.mkVar "ten", "_data"))))  
135                      (* destructor *)                      (* destructor *)
136                        val destrDcl = CL.D_Destr([], NONE, name, SOME(CL.mkBlock[]))                        val destrDcl = CL.D_Destr([], [], name, SOME(CL.mkBlock[]))
137                      (* assignment operator *)                      (* assignment operator *)
138                        val assignDcl = CL.D_Func([], CL.T_Named(name ^ " &"), "operator=",                        val assignDcl = CL.D_Func([], CL.T_Named(name ^ " &"), [], "operator=",
139                              [CL.PARAM([], CL.T_Template("std::initializer_list", [realTy]), "il")],                              [CL.PARAM([], CL.T_Template("std::initializer_list", [realTy]), "il")],
140                              CL.mkBlock(                              CL.mkBlock(
141                                copyFromInitializerList @                                copyFromInitializerList @
142                                  [CL.mkReturn(SOME(CL.mkUnOp(CL.%*, CL.mkVar "this")))]))                                  [CL.mkReturn(SOME(CL.mkUnOp(CL.%*, CL.mkVar "this")))]))
143                      (* subscript operator *)                      (* subscript operator *)
144                        val subscriptDcl = CL.D_Func([], CL.T_Named(realTyName ^ " &"), "operator[]",                        val subscriptDcl = CL.D_Func([], CL.T_Named(realTyName ^ " &"), [], "operator[]",
145                              [CL.PARAM([], CL.uint32, "i")],                              [CL.PARAM([], CL.uint32, "i")],
146                              CL.mkReturn(SOME(CL.mkSubscript(thisData, CL.mkVar "i"))))                              CL.mkReturn(SOME(CL.mkSubscript(thisData, CL.mkVar "i"))))
147                      (* address at function *)                      (* address at function *)
148                        val addrAtDcl = CL.D_Func([], CL.constPtrTy(realTy), "addr",                        val addrAtDcl = CL.D_Func([], CL.constPtrTy realTy, [], "addr",
149                              [CL.PARAM([], CL.uint32, "i")],                              [CL.PARAM([], CL.uint32, "i")],
150                              CL.mkReturn(SOME(CL.mkAddrOf(CL.mkSubscript(thisData, CL.mkVar "i")))))                              CL.mkReturn(SOME(CL.mkAddrOf(CL.mkSubscript(thisData, CL.mkVar "i")))))
151                        val structDcl = CL.D_ClassDef{                        val structDcl = CL.D_ClassDef{
# Line 155  Line 153 
153                                args = NONE,                                args = NONE,
154                                from = NONE,                                from = NONE,
155                                public = [                                public = [
156                                    CL.D_Var([], CL.T_Array(realTy, SOME len), "_data", NONE),                                    CL.mkVarDcl(CL.T_Array(realTy, SOME len), "_data"),
157                                    constrDcl1, constrDcl2, constrDcl3, constrDcl4,                                    constrDcl1, constrDcl2, constrDcl3, constrDcl4,
158                                    destrDcl,                                    destrDcl,
159                                    assignDcl,                                    assignDcl,
# Line 197  Line 195 
195      fun genSeqTrait env = let      fun genSeqTrait env = let
196            val realTy = Env.realTy env            val realTy = Env.realTy env
197            fun trType ty = TypeToCxx.trType(env, ty)            fun trType ty = TypeToCxx.trType(env, ty)
198            fun trait {argTy, baseTy, elemTy} = CL.D_Template([], CL.D_ClassDef{            fun trait ({argTy, baseTy, elemTy, ndims, dims}, dcls) = let
199                  (* the name of the teem function table for the given base type *)
200                    val loadTbl = (case baseTy
201                           of Ty.BoolTy => "nrrdILoad"
202                            | Ty.IntTy => "nrrdILoad"
203                            | Ty.VecTy(1, 1) => if #double(Env.target env)
204                                then "nrrdDLoad"
205                                else "nrrdFLoad"
206                            | ty => raise Fail("genSeqTrait.loadFn: unexpected type " ^ Ty.toString ty)
207                          (* end case *))
208                    in
209                      CL.D_Template([], CL.D_ClassDef{
210                    name = "dynseq_traits",                    name = "dynseq_traits",
211                    args = SOME[argTy],                    args = SOME[argTy],
212                    from = NONE,                    from = NONE,
213                    public = [                    public = [
214                        CL.D_Typedef("value_type", elemTy),                        CL.D_Typedef("value_type", elemTy),
215                        CL.D_Typedef("base_type", baseTy)                            CL.D_Typedef("base_type", trType baseTy),
216                              CL.D_Var(
217                                ["static", "const"],
218                                CL.constPtrTy(CL.T_Named "__details::load_fn_ptr<base_type>"),
219                                [], "load_fn_tbl", NONE),
220                              CL.D_Var(
221                                ["static", "const"], CL.uint32, [], "dims", SOME(CL.I_Exp(mkInt ndims))),
222                              CL.D_Var(
223                                ["static", "const"], CL.T_Array(CL.uint32, SOME ndims), [], "dims", NONE)
224                      ],                      ],
225                    protected = [],                    protected = [],
226                    private = []                    private = []
227                  })                      }) ::
228                      CL.D_Var(
229                        ["const"], CL.uint32,
230                        [CL.SC_Type(CL.T_Template("dynseq_traits", [argTy]))], "load_fn_tbl",
231                        SOME(CL.I_Exp(CL.mkVar loadTbl))) ::
232                      dcls
233                    end
234            fun genTrait (ty, dcls) = (case ty            fun genTrait (ty, dcls) = (case ty
235                   of Ty.SeqTy(elemTy, NONE) => let                   of Ty.SeqTy(argTy, NONE) => let
236                        fun baseTy (Ty.SeqTy(ty, _)) = baseTy ty                        fun baseTy (Ty.SeqTy(ty, _)) = baseTy ty
237                            | baseTy (Ty.TensorTy[]) = Ty.realTy
238                          | baseTy ty = ty                          | baseTy ty = ty
239                        val elemTy = trType elemTy                        val argTy = trType argTy
240                        in                        in
241                          case baseTy ty                          case baseTy ty
242                           of Ty.TensorTy(shp as _::_) =>                           of Ty.TensorTy(shp as _::_) => trait ({
243                                trait{argTy = elemTy, baseTy = realTy, elemTy = RN.tensorTy shp} :: dcls                                    argTy = argTy, baseTy = Ty.realTy,
244                            | ty as Ty.TupleTy _ =>                                    elemTy = RN.tensorTy shp, ndims = List.length shp,
245                                trait{argTy = elemTy, baseTy = trType ty, elemTy = elemTy} :: dcls                                    dims = shp
246                            | ty =>                                  },
247                                trait{argTy = elemTy, baseTy = trType ty, elemTy = elemTy} :: dcls                                dcls)
248                              | ty => trait ({
249                                      argTy = argTy, baseTy = ty, elemTy = argTy,
250                                      ndims = 1, dims = [1]
251                                    },
252                                  dcls)
253                          (* end case *)                          (* end case *)
254                        end                        end
255                    | _ => dcls                    | _ => dcls
# Line 268  Line 297 
297                  ]                  ]
298            val (_, exp) = lp (true, CL.mkVar "outs", 0, shape)            val (_, exp) = lp (true, CL.mkVar "outs", 0, shape)
299            in            in
300              CL.D_Func(["static"], ostreamRef, "operator<<", params, mkReturn exp)              CL.D_Func(["static"], ostreamRef, [], "operator<<", params, mkReturn exp)
301            end            end
302    
303    (* builds AST for the statememt "return (x <= lo) ? lo : (hi < x) ? hi : x;" *)    (* builds AST for the statememt "return (x <= lo) ? lo : (hi < x) ? hi : x;" *)
# Line 477  Line 506 
506            val genTyDecl = genTyDecl env            val genTyDecl = genTyDecl env
507            val dcls = List.foldl (doOp env) [] (CollectInfo.listOps info)            val dcls = List.foldl (doOp env) [] (CollectInfo.listOps info)
508            val tys = CollectInfo.listTypes info            val tys = CollectInfo.listTypes info
           val traitDcls = List.foldr genTrait [] tys  
509            val dcls = List.foldr genTyDecl dcls tys            val dcls = List.foldr genTyDecl dcls tys
510              val traitDcls = List.foldl genTrait [] tys
511            in            in
512              if List.null dcls andalso List.null traitDcls              if List.null dcls andalso List.null traitDcls
513                then [noDcls]                then [noDcls]

Legend:
Removed from v.4027  
changed lines
  Added in v.4028

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