SCM Repository
View of /trunk/src/compiler/high-il/check-ops.sml
Parent Directory
|
Revision Log
Revision 407 -
(download)
(annotate)
Fri Oct 15 12:27:09 2010 UTC (10 years, 4 months ago) by jhr
File size: 2789 byte(s)
Fri Oct 15 12:27:09 2010 UTC (10 years, 4 months ago) by jhr
File size: 2789 byte(s)
Added more type info to HighIL operators to aid checking.
(* check-ops.sml * * COPYRIGHT (c) 2010 The Diderot Project (http://diderot.cs.uchicago.edu) * All rights reserved. * * Return the signature of a HighIL operator. *) structure CheckOps : OPERATOR_TY = struct structure Op = HighOps structure Ty = HighILTypes type rator = Op.rator type ty = Ty.ty fun sign rator = (case rator of Op.Add ty => (ty, [ty, ty]) | Op.Sub ty => (ty, [ty, ty]) | Op.Mul ty => (ty, [ty, ty]) | Op.Div ty => (ty, [ty, ty]) | Op.Neg ty => (ty, [ty]) | Op.LT ty => (Ty.BoolTy, [ty, ty]) | Op.LTE ty => (Ty.BoolTy, [ty, ty]) | Op.EQ ty => (Ty.BoolTy, [ty, ty]) | Op.NEQ ty => (Ty.BoolTy, [ty, ty]) | Op.GT ty => (Ty.BoolTy, [ty, ty]) | Op.GTE ty => (Ty.BoolTy, [ty, ty]) | Op.Max => (Ty.realTy, [Ty.realTy, Ty.realTy]) | Op.Min => (Ty.realTy, [Ty.realTy, Ty.realTy]) | Op.Sin => (Ty.realTy, [Ty.realTy]) | Op.Cos => (Ty.realTy, [Ty.realTy]) | Op.Pow => (Ty.realTy, [Ty.realTy, Ty.realTy]) | Op.Not => (Ty.BoolTy, [Ty.BoolTy]) | Op.Dot ty => (Ty.realTy, [ty, ty]) | Op.Cross => (Ty.vec3Ty, [Ty.vec3Ty, Ty.vec3Ty]) | Op.Norm => (Ty.realTy, [ty]) | Op.Scale ty => (ty, [Ty.realTy, ty]) | Op.InvScale ty => (ty, [ty, Ty.realTy]) | Op.CL => (Ty.realTy, [Ty.TensorTy[3, 3]]) | Op.PrincipleEvec(resTy as Ty.TensorTy[d]) => (resTy, [Ty.TensorTy[d,d]]) | Op.Slice(ty as Ty.TensorTy dd, m) => let val (resDims, idxDims) = let fun f (d, false, (rds, ids)) = (d::rds, ids) | f (_, true, (rds, ids)) = (rds, Ty.IntTy::ids) in ListPair.foldr f ([], []) (dd, mask) end in (Ty.Tensor rds, ty::idxDims) end | Op.Subscript(ty as Ty.TensorTy dd) => (Ty.realTy, ty :: List.map (fn _ => Ty.IntTy) dd) | Op.IntToReal => (Ty.realTy, [Ty.IntTy]) | Op.TruncToInt => (Ty.IntTy, [Ty.realTy]) | Op.RoundToInt => (Ty.IntTy, [Ty.realTy]) | Op.CeilToInt => (Ty.IntTy, [Ty.realTy]) | Op.FloorToInt => (Ty.IntTy, [Ty.realTy]) | Op.Kernel _ => (Ty.KernelTy, []) | Op.LoadImage _ => (Ty.ImageTy, []) | Op.Convolve => (Ty.FieldTy, [Ty.ImageTy, Ty.KernelTy]) (* FIXME: need dimension of vector *) | Op.Inside => (Ty.BoolTy, ??) | Op.Field _ => (Ty.FieldTy, []) | Op.AddField => (Ty.FieldTy, [Ty.FieldTy, Ty.FieldTy]) | Op.ScaleField => (Ty.FieldTy, [Ty.realTy, Ty.FieldTy]) | Op.NegField => (Ty.FieldTy, [Ty.FieldTy]) | Op.DiffField => (Ty.FieldTy, [Ty.FieldTy]) (* FIXME: need dimension of position vector and shape of range *) | Op.Probe => ?? | Op.Input of string | Op.InputWithDefault of string (* end case *)) end structure CheckHighIL = CheckILFn ( structure IL = HighIL structure OpTy = CheckOps)
root@smlnj-gforge.cs.uchicago.edu | ViewVC Help |
Powered by ViewVC 1.0.0 |