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

SCM Repository

[diderot] Diff of /branches/staging/src/compiler/c-util/gen-inputs.sml
ViewVC logotype

Diff of /branches/staging/src/compiler/c-util/gen-inputs.sml

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

revision 2151, Sun Feb 17 19:07:20 2013 UTC revision 2152, Sun Feb 17 19:39:37 2013 UTC
# Line 84  Line 84 
84              CL.D_StructDef(NONE, List.map mkField inputs, SOME(N.inputsTy tgt))              CL.D_StructDef(NONE, List.map mkField inputs, SOME(N.inputsTy tgt))
85            end            end
86    
87        local
88          fun subscript (e, i) = CL.mkSubscript(e, CL.mkInt(IntInf.fromInt i))
89    
90        (* initialize an external C representation from constant expressions *)
91          fun initC {ty, dst, src} = let
92                fun cvtExp e = TreeToC.trExp (TreeIL.Var.Map.empty, e)
93                fun simpleInit () = [CL.mkAssign(dst, cvtExp src)]
94                in
95                  case (ty, src)
96                   of (Ty.BoolTy, _) => simpleInit ()
97                    | (Ty.StringTy, _) => simpleInit ()
98                    | (Ty.IntTy, _) => simpleInit ()
99                    | (Ty.TensorTy[], _) => simpleInit ()
100                    | (Ty.TensorTy[n], TreeIL.E_Cons(_, es)) => let
101                        fun lp (_, []) = []
102                          | lp (i, e::es) = CL.mkAssign(subscript(dst, i), cvtExp e) :: lp(i+1, es)
103                        in
104                          lp(0, es)
105                        end
106                    | _ => raise Fail(concat["CTyTranslate.initC(", Ty.toString ty, ") not supported yet"])
107                  (* end case *)
108                end
109        in
110    (* generate code to initialize the default input values *)    (* generate code to initialize the default input values *)
111      fun genInitDefaults (tgt, inputs) = let      fun genInitDefaults (tgt, inputs) = let
112          (* the inputs pointer type *)          (* the inputs pointer type *)
# Line 91  Line 114 
114          (* some common variables *)          (* some common variables *)
115            val inpV = CL.mkVar "inp"            val inpV = CL.mkVar "inp"
116          (* initialize a given input *)          (* initialize a given input *)
117            fun initInput (ty, name, _, SOME dflt) = let            fun initInput ((ty, name, _, SOME dflt), stms) = let
118                  val lhs = CL.mkIndirect(inpV, name)                  val lhs = CL.mkIndirect(inpV, name)
                 val rhs = TreeToC.trExp (TreeIL.Var.Map.empty, dflt)  
119                  in                  in
120                    SOME(CL.mkAssign(lhs, rhs))                    initC {ty=ty, dst=lhs, src=dflt} @ stms
121                  end                  end
122              | initInput _ = NONE              | initInput (_, stms) = stms
123            in            in
124              CL.D_Func(              CL.D_Func(
125                ["static"], CL.voidTy, N.initDefaults,                ["static"], CL.voidTy, N.initDefaults,
126                [CL.PARAM([], inputPtrTy, "inp")],                [CL.PARAM([], inputPtrTy, "inp")],
127                CL.mkBlock(List.mapPartial initInput inputs))                CL.mkBlock(List.foldr initInput [] inputs))
128            end            end
129        end (* local *)
130    
131    (* generate code to register command-line options for setting the input variables *)    (* generate code to register command-line options for setting the input variables *)
132      fun genRegisterInputs (tgt, inputs) = let      fun genRegisterInputs (tgt, inputs) = let
# Line 115  Line 138 
138          (* register a given input *)          (* register a given input *)
139            fun registerInput (ty, name, desc, optDflt) = CL.mkCall(N.input ty, [            fun registerInput (ty, name, desc, optDflt) = CL.mkCall(N.input ty, [
140                    optsV, CL.mkStr name, CL.mkStr(Option.getOpt(desc, "")),                    optsV, CL.mkStr name, CL.mkStr(Option.getOpt(desc, "")),
141                    CL.mkUnOp(CL.%&, CL.mkIndirect(inpV, name)),                    if TrTy.isCArrayTy ty
142                        then CL.mkIndirect(inpV, name)
143                        else CL.mkUnOp(CL.%&, CL.mkIndirect(inpV, name)),
144                    CL.mkBool(Option.isSome optDflt)                    CL.mkBool(Option.isSome optDflt)
145                  ])                  ])
146            in            in

Legend:
Removed from v.2151  
changed lines
  Added in v.2152

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