SCM Repository
[diderot] / branches / charisee / src / compiler / mid-to-low / mid-to-low.sml |
View of /branches/charisee/src/compiler/mid-to-low/mid-to-low.sml
Parent Directory
|
Revision Log
Revision 3268 -
(download)
(annotate)
Fri Oct 9 00:50:13 2015 UTC (5 years, 4 months ago) by cchiw
File size: 7711 byte(s)
Fri Oct 9 00:50:13 2015 UTC (5 years, 4 months ago) by cchiw
File size: 7711 byte(s)
clean up print statements
(* mid-to-low.sml * * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu) * All rights reserved. * * Translation from MidIL to LowIL representations. *) structure MidToLow : sig val translate : MidIL.program -> LowIL.program end = struct structure SrcIL = MidIL structure SrcOp = MidOps structure SrcSV = SrcIL.StateVar structure SrcTy = MidILTypes structure VTbl = SrcIL.Var.Tbl structure DstIL = LowIL structure DstTy = LowILTypes structure DstOp = LowOps structure E = Ein structure P = Printer structure EtLow = EinToLow structure LowToS = LowToString val testing = 0 (* instantiate the translation environment *) local type var_env = DstIL.var VTbl.hash_table type state_var_env = DstIL.state_var SrcSV.Tbl.hash_table fun rename (env : var_env, x) = (case VTbl.find env x of SOME x' => x' | NONE => let val x' = DstIL.Var.new (SrcIL.Var.name x, SrcIL.Var.ty x) in VTbl.insert env (x, x'); x' end (* end case *)) fun renameSV (env : state_var_env, x) = (case SrcSV.Tbl.find env x of SOME x' => x' | NONE => let val x' = DstIL.StateVar.new (SrcSV.isOutput x, SrcSV.name x, SrcSV.ty x) in SrcSV.Tbl.insert env (x, x'); x' end (* end case *)) in structure Env = TranslateEnvFn ( struct structure SrcIL = SrcIL structure DstIL = DstIL type var_env = var_env type state_var_env = state_var_env val rename = rename val renameSV = renameSV end) end (* local *) fun expandOp (env, y, rator, args) = let val args' = Env.renameList (env, args) fun assign rator' = [(y, DstIL.OP(rator', args'))] fun dummy () = [(y, DstIL.LIT(Literal.Int 0))] in case rator of SrcOp.IAdd => assign (DstOp.IAdd ) | SrcOp.ISub => assign (DstOp.ISub ) | SrcOp.IMul => assign (DstOp.IMul ) | SrcOp.IDiv => assign (DstOp.IDiv ) | SrcOp.INeg => assign (DstOp.INeg ) | SrcOp.Abs ty => assign (DstOp.Abs ty) | SrcOp.LT ty => assign (DstOp.LT ty) | SrcOp.LTE ty => assign (DstOp.LTE ty) | SrcOp.EQ ty => assign (DstOp.EQ ty) | SrcOp.NEQ ty => assign (DstOp.NEQ ty) | SrcOp.GT ty => assign (DstOp.GT ty) | SrcOp.GTE ty => assign (DstOp.GTE ty) | SrcOp.Not => assign (DstOp.Not) | SrcOp.Max => assign (DstOp.Max) | SrcOp.Min => assign (DstOp.Min) | SrcOp.Clamp ty => assign (DstOp.Clamp ty) | SrcOp.Lerp ty => assign (DstOp.Lerp ty) | SrcOp.Sqrt=>assign DstOp.Sqrt | SrcOp.Zero ty => assign (DstOp.Zero ty) | SrcOp.PrincipleEvec ty => assign (DstOp.PrincipleEvec ty) | SrcOp.EigenVals2x2 => assign (DstOp.EigenVals2x2) | SrcOp.EigenVals3x3 => assign (DstOp.EigenVals3x3) | SrcOp.Select(ty as SrcTy.TupleTy tys, i) => assign (DstOp.Select(ty, i)) | SrcOp.Index(ty, i) => assign (DstOp.Index(ty, i)) | SrcOp.Subscript ty => assign (DstOp.Subscript ty) | SrcOp.Ceiling d => assign (DstOp.Ceiling d) | SrcOp.Floor d => assign (DstOp.Floor d) | SrcOp.Round d => assign (DstOp.Round d) | SrcOp.Trunc d => assign (DstOp.Trunc d) | SrcOp.sumVec d=>assign (DstOp.sumVec d) | SrcOp.IntToReal => assign (DstOp.IntToReal) | SrcOp.RealToInt d => assign (DstOp.RealToInt d) | SrcOp.LoadVoxels(rty, d) => assign (DstOp.LoadVoxels(rty, d)) | SrcOp.Kernel h => assign(DstOp.Kernel h) | SrcOp.Inside info => assign (DstOp.Inside info) | SrcOp.LoadImage(ty, nrrd, info) => assign (DstOp.LoadImage(ty, nrrd, info)) | SrcOp.Input inp => assign (DstOp.Input inp) (*| SrcOp.Norm ty => assign (DstOp.Norm ty)*) | SrcOp.Normalize d => assign (DstOp.Normalize d) | SrcOp.Transform V=> assign (DstOp.Transform V) | SrcOp.Translate V=> assign(DstOp.Translate V) | rator => raise Fail("bogus operator " ^ SrcOp.toString rator) (* end case *) end fun testp c=(case testing of 0 => 1 | _ => (print(String.concat(c));1) (*end case*)) fun expandEinOp (env, y, e, args) = let val einargs=Env.renameList(env, args) val _ = testp((["**** start\n",DstTy.toString(DstIL.Var.ty y), "-",DstIL.Var.toString(y),"=",P.printerE(e)] @(List.map (fn e=> (DstIL.Var.toString(e)^",")) einargs))) (*val _=checkEin.checkEIN e*) val _ = (String.concat["\n",DstIL.Var.toString(y),"=",P.printerE e]) val code = EtLow.scan(y,e,einargs) val tbl0= lowSet.LowSet.empty fun getSet([],done,_,cnt)=(done,cnt) | getSet( DstIL.ASSGN(lhs,rhs)::es,done,opset,cnt)=let val (opset,var) = lowSet.filter(opset,(lhs,rhs)) in (case var of NONE => getSet(es,done@[DstIL.ASSGN(lhs,rhs)], opset,cnt) | SOME v=> getSet(es,done@[DstIL.ASSGN(lhs,DstIL.VAR v)], opset,cnt+1) (*end case*)) end | getSet (e1::es, done, opset,cnt)=getSet(es,done@[e1],opset,cnt) val (code,cnt)=getSet(code, [],tbl0,0) val _ = if (cnt> 500) then (String.concat["\n",DstIL.Var.toString(y),"=",P.printerE e,"\n\t previous: ",Int.toString(length(code))," replaced: ", Int.toString cnt]) else "" in code end handle ex => (print(concat["error converting \n",P.printerE(e)]); raise ex) (* expand a SrcIL assignment to a DstIL CFG *) fun expand (env, (y, rhs)) = let (*val _=testp["\nAttempting var",SrcIL.Var.toString y,"\n"]*) val y' = Env.rename (env, y) fun assign rhs = [DstIL.ASSGN(y', rhs)] in (case rhs of SrcIL.STATE x => (assign (DstIL.STATE(Env.renameSV(env, x)))) | SrcIL.VAR x => assign (DstIL.VAR(Env.rename(env, x))) | SrcIL.LIT lit => (assign (DstIL.LIT lit)) | SrcIL.OP(rator, args) => (List.map DstIL.ASSGN (expandOp (env, y', rator, args))) | SrcIL.APPLY(f, args) => assign (DstIL.APPLY(f, Env.renameList(env, args))) | SrcIL.CONS(ty, args) => assign (DstIL.CONS(ty, Env.renameList(env, args))) | SrcIL.EINAPP(rator, args) => (testp["\n *************** \nNew Ein\n srcvar:",SrcIL.Var.toString y];expandEinOp (env, Env.rename (env, y), rator, args)) (* end case *)) end (* expand a SrcIL multi-assignment to a DstIL CFG *) fun mexpand (env, (ys, rator, xs)) = let val ys' = Env.renameList(env, ys) val rator' = (case rator of SrcOp.EigenVecs2x2 => DstOp.EigenVecs2x2 | SrcOp.EigenVecs3x3 => DstOp.EigenVecs3x3 | SrcOp.Print tys => DstOp.Print tys | _ => raise Fail("bogus operator " ^ SrcOp.toString rator) (* end case *)) val xs' = Env.renameList(env, xs) val nd = DstIL.Node.mkMASSIGN(ys', rator', xs') in DstIL.CFG{entry=nd, exit=nd} end structure Trans = TranslateFn ( struct open Env val expand = DstIL.CFG.mkBlock o expand val mexpand = mexpand end) fun translate prog = let val prog = Trans.translate prog in LowILCensus.init prog; prog end end
root@smlnj-gforge.cs.uchicago.edu | ViewVC Help |
Powered by ViewVC 1.0.0 |