SCM Repository
View of /branches/vis12/src/compiler/c-util/gen-inputs.sml
Parent Directory
|
Revision Log
Revision 1820 -
(download)
(annotate)
Wed Apr 11 10:53:15 2012 UTC (8 years, 9 months ago) by jhr
File size: 7302 byte(s)
Wed Apr 11 10:53:15 2012 UTC (8 years, 9 months ago) by jhr
File size: 7302 byte(s)
Clean up the handling of translation from TreeIL types to C types. There are two cases: translating to the external C API amd translating to the internal Diderot types.
(* gen-inputs.sml * * COPYRIGHT (c) 2012 The Diderot Project (http://diderot-language.cs.uchicago.edu) * All rights reserved. *) structure GenInputs : sig type input_desc = (TreeIL.Ty.ty * string * string * bool) val gatherInputs : TreeIL.block -> input_desc list val genRegisterInputs : TargetUtil.target_desc * input_desc list -> CLang.decl val genInputFuns : TargetUtil.target_desc * input_desc list -> CLang.decl list end = struct structure IL = TreeIL structure Ty = TreeIL.Ty structure CL = CLang structure N = CNames structure TrTy = CTyTranslate type input_desc = (Ty.ty * string * string * bool) val nrrdPtrTy = CL.T_Ptr(CL.T_Named "Nrrd") val wrldPrefixTy = CL.T_Ptr(CL.T_Named "WorldPrefix_t") type target_desc = TargetUtil.target_desc (* translate a TreeIL type to the C types used to represent it in the external API *) val trType = CTyTranslate.toCType (* an l-value expression for accessing a global variable *) fun global name = CL.mkIndirect(CL.mkIndirect(CL.mkVar "wrld", "globals"), name) (* gather the input globals from the input initialization block *) fun gatherInputs (IL.Block{body, ...}) = let fun gather (IL.S_Input(x, name, desc, NONE)) = SOME(IL.Var.ty x, name, desc, false) | gather (IL.S_Input(x, name, desc, SOME _)) = SOME(IL.Var.ty x, name, desc, true) | gather _ = NONE in List.mapPartial gather body end (* old input code from tree-to-c.sml | IL.S_Input(lhs, name, desc, optDflt) => let val lhs = VarToC.lvalueVar (env, lhs) val (initCode, hasDflt) = (case optDflt of SOME e => ([CL.mkAssign(lhs, trExp(env, e))], true) | NONE => ([], false) (* end case *)) val code = [CL.mkCall(N.input(V.ty lhs), [ CL.mkVar "opts", CL.mkStr name, CL.mkStr desc, addrOf lhs, CL.mkBool hasDflt])] in initCode end *) fun genRegisterInputs (tgt, inputs) = let (* the world pointer type *) val worldPtrTy = CL.T_Ptr(CL.T_Named(N.worldTy tgt)) in CL.D_Func( [], CL.voidTy, N.registerOpts, [CL.PARAM([], worldPtrTy, "wrld"), CL.PARAM([], CL.T_Ptr(CL.T_Named N.optionsTy), "opts")], (* FIXME: fill in the code! *) CL.mkBlock[]) end (* for each input variable we generate two or three top-level declaraions *) fun genInputFuns (tgt, inputs) = let (* the world pointer type *) val worldPtrTy = CL.T_Ptr(CL.T_Named(N.worldTy tgt)) val wrldParam = CL.PARAM([], worldPtrTy, "wrld") (* create decls for an input variable *) fun mkInputDecls (ty, name, desc, hasDflt) = let (* create a description declaration for the input variable *) val descDcl = if (desc = "") then [] else [ CL.D_Var([], CL.T_Ptr(CL.T_Named "const char"), N.inputDesc(tgt, name), SOME(CL.I_Exp(CL.mkStr desc))) ] val getDcl = if hasDflt then let val getName = N.inputGet(tgt, name) (* convert the input type to a by-reference C type *) val outTy = (case ty of Ty.BoolTy => CL.T_Ptr(trType ty) | Ty.StringTy => CL.T_Ptr(trType ty) | Ty.IntTy => CL.T_Ptr(trType ty) | Ty.TensorTy[] => CL.T_Ptr(trType ty) | Ty.TensorTy _ => trType ty | Ty.SeqTy _ => trType ty | Ty.DynSeqTy _ => CL.T_Ptr(trType ty) | Ty.ImageTy _ => CL.T_Ptr CL.charPtr | _ => raise Fail(concat["bogus input type ", Ty.toString ty]) (* end case *)) in [ CL.D_Func([], CL.voidTy, getName, [wrldParam, CL.PARAM([], outTy, "v")], CL.mkBlock( TrTy.copyToC{ty=ty, dst=CL.mkUnOp(CL.%*, CL.mkVar "v"), src=global name})) ] end else [] val setDcl = (case ty of Ty.ImageTy info => let val dim = ImageInfo.dim info in [ CL.D_Func( [], CL.boolTy, N.inputSetByName(tgt, name), [wrldParam, CL.PARAM(["const"], CL.charPtr, "s")], CL.mkBlock[ (* FIXME: we should also generate code to check that the loaded image has the right type, etc. *) CL.mkReturn(SOME( CL.mkBinOp(CL.mkVar "DIDEROT_FAIL", CL.#==, CL.mkApply(N.loadImage dim, [ CL.mkCast(wrldPrefixTy, CL.mkVar "wrld"), CL.mkVar "s", CL.mkUnOp(CL.%&, global name) ])))) ]), CL.D_Func( [], CL.boolTy, N.inputSet(tgt, name), [wrldParam, CL.PARAM([], nrrdPtrTy, "nin")], CL.mkBlock[ (* FIXME: we should also generate code to check that the loaded image has the right type, etc. *) CL.mkReturn(SOME( CL.mkBinOp(CL.mkVar "DIDEROT_FAIL", CL.#==, CL.mkApply(N.setImage dim, [ CL.mkCast(wrldPrefixTy, CL.mkVar "wrld"), CL.mkVar "nin", CL.mkUnOp(CL.%&, global name) ])))) ]) ] end | Ty.DynSeqTy _ => raise Fail "dynamic input not supported yet" | _ => [ CL.D_Func( [], CL.boolTy, N.inputSet(tgt, name), [wrldParam, CL.PARAM([], trType ty, "v")], CL.mkBlock( TrTy.copyFromC{ty=ty, dst=global name, src=CL.mkVar "v"} @ [CL.mkReturn(SOME(CL.mkVar "false"))])) ] (* end case *)) in descDcl @ getDcl @ setDcl end in List.foldr (fn (input, dcls) => mkInputDecls input @ dcls) [] inputs end end
root@smlnj-gforge.cs.uchicago.edu | ViewVC Help |
Powered by ViewVC 1.0.0 |