SCM Repository
Annotation of /branches/vis12/src/compiler/high-il/check-high-il.sml
Parent Directory
|
Revision Log
Revision 1925 - (view) (download)
1 : | jhr | 411 | (* check-high-il.sml |
2 : | jhr | 404 | * |
3 : | jhr | 435 | * COPYRIGHT (c) 2010 The Diderot Project (http://diderot-language.cs.uchicago.edu) |
4 : | jhr | 404 | * All rights reserved. |
5 : | *) | ||
6 : | |||
7 : | jhr | 405 | structure CheckOps : OPERATOR_TY = struct |
8 : | jhr | 404 | |
9 : | structure Op = HighOps | ||
10 : | structure Ty = HighILTypes | ||
11 : | |||
12 : | jhr | 405 | type rator = Op.rator |
13 : | type ty = Ty.ty | ||
14 : | |||
15 : | jhr | 1640 | (* utility function for synthesizing eigenvector/eigenvalue signature *) |
16 : | fun eigenSig dim = let | ||
17 : | val tplTy = Ty.TupleTy[ | ||
18 : | Ty.SeqTy(Ty.realTy, dim), | ||
19 : | Ty.SeqTy(Ty.vecTy dim, dim) | ||
20 : | ] | ||
21 : | in | ||
22 : | (tplTy, [Ty.TensorTy[dim, dim]]) | ||
23 : | end | ||
24 : | |||
25 : | jhr | 420 | (* Return the signature of a HighIL operator. *) |
26 : | jhr | 412 | fun sigOf rator = (case rator |
27 : | jhr | 404 | of Op.Add ty => (ty, [ty, ty]) |
28 : | | Op.Sub ty => (ty, [ty, ty]) | ||
29 : | | Op.Mul ty => (ty, [ty, ty]) | ||
30 : | | Op.Div ty => (ty, [ty, ty]) | ||
31 : | | Op.Neg ty => (ty, [ty]) | ||
32 : | jhr | 1116 | | Op.Abs ty => (ty, [ty]) |
33 : | jhr | 404 | | Op.LT ty => (Ty.BoolTy, [ty, ty]) |
34 : | | Op.LTE ty => (Ty.BoolTy, [ty, ty]) | ||
35 : | | Op.EQ ty => (Ty.BoolTy, [ty, ty]) | ||
36 : | | Op.NEQ ty => (Ty.BoolTy, [ty, ty]) | ||
37 : | | Op.GT ty => (Ty.BoolTy, [ty, ty]) | ||
38 : | | Op.GTE ty => (Ty.BoolTy, [ty, ty]) | ||
39 : | jhr | 1116 | | Op.Power => (Ty.realTy, [Ty.realTy, Ty.IntTy]) |
40 : | | Op.Not => (Ty.BoolTy, [Ty.BoolTy]) | ||
41 : | jhr | 404 | | Op.Max => (Ty.realTy, [Ty.realTy, Ty.realTy]) |
42 : | | Op.Min => (Ty.realTy, [Ty.realTy, Ty.realTy]) | ||
43 : | jhr | 1295 | | Op.Clamp ty => (ty, [ty, ty, ty]) |
44 : | jhr | 1116 | | Op.Lerp ty => (ty, [ty, ty, Ty.realTy]) |
45 : | jhr | 404 | | Op.Dot ty => (Ty.realTy, [ty, ty]) |
46 : | jhr | 1116 | | Op.MulVecMat(ty as Ty.TensorTy[d1, d2]) => (Ty.TensorTy[d2], [Ty.TensorTy[d1], ty]) |
47 : | | Op.MulMatVec(ty as Ty.TensorTy[d1, d2]) => (Ty.TensorTy[d1], [ty, Ty.TensorTy[d2]]) | ||
48 : | | Op.MulMatMat(ty1 as Ty.TensorTy[d1, d2], ty2 as Ty.TensorTy[d2', d3]) => | ||
49 : | (Ty.TensorTy[d1, d3], [ty1, ty2]) | ||
50 : | jhr | 404 | | Op.Cross => (Ty.vec3Ty, [Ty.vec3Ty, Ty.vec3Ty]) |
51 : | jhr | 1116 | | Op.Outer(ty as Ty.TensorTy[d1, d2]) => (ty, [Ty.TensorTy[d1], Ty.TensorTy[d2]]) |
52 : | jhr | 412 | | Op.Norm ty => (Ty.realTy, [ty]) |
53 : | jhr | 1116 | | Op.Normalize ty => (ty, [ty]) |
54 : | jhr | 404 | | Op.Scale ty => (ty, [Ty.realTy, ty]) |
55 : | jhr | 407 | | Op.PrincipleEvec(resTy as Ty.TensorTy[d]) => (resTy, [Ty.TensorTy[d,d]]) |
56 : | jhr | 1640 | | Op.Eigen2x2 => eigenSig 2 |
57 : | | Op.Eigen3x3 => eigenSig 3 | ||
58 : | jhr | 1116 | | Op.Identity d => (Ty.TensorTy[d,d], []) |
59 : | | Op.Zero ty => (ty, []) | ||
60 : | | Op.Trace ty => (Ty.realTy, [ty]) | ||
61 : | jhr | 407 | | Op.Slice(ty as Ty.TensorTy dd, m) => let |
62 : | jhr | 404 | val (resDims, idxDims) = let |
63 : | fun f (d, false, (rds, ids)) = (d::rds, ids) | ||
64 : | | f (_, true, (rds, ids)) = (rds, Ty.IntTy::ids) | ||
65 : | in | ||
66 : | jhr | 412 | ListPair.foldr f ([], []) (dd, m) |
67 : | jhr | 404 | end |
68 : | in | ||
69 : | jhr | 412 | (Ty.TensorTy resDims, ty::idxDims) |
70 : | jhr | 404 | end |
71 : | jhr | 1640 | | Op.TensorSub(ty as Ty.TensorTy dd) => |
72 : | jhr | 404 | (Ty.realTy, ty :: List.map (fn _ => Ty.IntTy) dd) |
73 : | jhr | 1640 | | Op.Select(ty as Ty.TupleTy tys, i) => |
74 : | if (1 <= i) andalso (i <= length tys) | ||
75 : | then (List.nth(tys, i-1), [ty]) | ||
76 : | else raise Fail("sigOf: invalid operator " ^ Op.toString rator) | ||
77 : | | Op.SeqSub(ty as Ty.SeqTy(elemTy, _)) => (elemTy, [ty, Ty.IntTy]) | ||
78 : | jhr | 1688 | | Op.MkDynamic(ty, n) => (Ty.DynSeqTy ty, [Ty.SeqTy(ty, n)]) |
79 : | jhr | 1687 | | Op.Prepend ty => (Ty.DynSeqTy ty, [ty, Ty.DynSeqTy ty]) |
80 : | | Op.Append ty => (Ty.DynSeqTy ty, [Ty.DynSeqTy ty, ty]) | ||
81 : | | Op.Concat ty => (Ty.DynSeqTy ty, [Ty.DynSeqTy ty, Ty.DynSeqTy ty]) | ||
82 : | jhr | 1925 | | Op.Length ty => (Ty.intTy, [Ty.DynSeqTy ty]) |
83 : | jhr | 404 | | Op.IntToReal => (Ty.realTy, [Ty.IntTy]) |
84 : | | Op.TruncToInt => (Ty.IntTy, [Ty.realTy]) | ||
85 : | | Op.RoundToInt => (Ty.IntTy, [Ty.realTy]) | ||
86 : | | Op.CeilToInt => (Ty.IntTy, [Ty.realTy]) | ||
87 : | | Op.FloorToInt => (Ty.IntTy, [Ty.realTy]) | ||
88 : | | Op.Kernel _ => (Ty.KernelTy, []) | ||
89 : | jhr | 1116 | | Op.LoadImage info => (Ty.ImageTy(ImageInfo.dim info), [Ty.StringTy]) |
90 : | | Op.Field dim => (Ty.FieldTy, [Ty.ImageTy dim, Ty.KernelTy]) | ||
91 : | | Op.Inside dim => (Ty.BoolTy, [Ty.TensorTy[dim], Ty.FieldTy]) | ||
92 : | jhr | 404 | | Op.AddField => (Ty.FieldTy, [Ty.FieldTy, Ty.FieldTy]) |
93 : | jhr | 1116 | | Op.SubField => (Ty.FieldTy, [Ty.FieldTy, Ty.FieldTy]) |
94 : | jhr | 404 | | Op.ScaleField => (Ty.FieldTy, [Ty.realTy, Ty.FieldTy]) |
95 : | | Op.NegField => (Ty.FieldTy, [Ty.FieldTy]) | ||
96 : | | Op.DiffField => (Ty.FieldTy, [Ty.FieldTy]) | ||
97 : | jhr | 1116 | | Op.Probe(domTy, rngTy) => (rngTy, [Ty.FieldTy, domTy]) |
98 : | jhr | 1301 | | Op.Input(ty, _, _) => (ty, []) |
99 : | | Op.InputWithDefault(ty, _, _) => (ty, [ty]) | ||
100 : | jhr | 1640 | | Op.Print tys => (Ty.TupleTy[], tys) |
101 : | jhr | 412 | | _ => raise Fail("sigOf: invalid operator " ^ Op.toString rator) |
102 : | jhr | 404 | (* end case *)) |
103 : | |||
104 : | jhr | 1116 | fun typeOfCons (Ty.TensorTy dd', (ty1 as Ty.TensorTy dd)::r) = |
105 : | jhr | 412 | if List.all (fn ty => Ty.same(ty1, ty)) r |
106 : | jhr | 1116 | then (dd' = (List.length r + 1)::dd) |
107 : | else false | ||
108 : | jhr | 1688 | | typeOfCons (Ty.SeqTy(ty, n), tys) = |
109 : | List.all (fn ty' => Ty.same(ty, ty')) tys andalso (List.length tys = n) | ||
110 : | jhr | 1116 | | typeOfCons _ = false |
111 : | jhr | 412 | |
112 : | jhr | 404 | end |
113 : | jhr | 405 | |
114 : | structure CheckHighIL = CheckILFn ( | ||
115 : | structure IL = HighIL | ||
116 : | structure OpTy = CheckOps) | ||
117 : | jhr | 1116 | |
118 : | structure HighPP = SSAPPFn (HighIL) | ||
119 : |
root@smlnj-gforge.cs.uchicago.edu | ViewVC Help |
Powered by ViewVC 1.0.0 |