Exemple #1
0
        public static void DoGenerate()
        {
            var edsl_base = @"..\..\..\..\Libptx.Edsl\Libptx.Edsl\";
            var dir_sregs = edsl_base + @"Expressions\Sregs\";
            Func<String, String> dir2ns = dir => dir.Replace(@"..\..\..\..\Libptx.Edsl\", String.Empty).Replace(@"\", ".").Slice(0, -1);

            foreach (var t in Sregs.All)
            {
                var buf = new StringBuilder();
                var w = new StringWriter(buf).Indented();
                w.WriteLine("using Libptx.Edsl.Common.Types.Scalar;");
                w.WriteLine("using Libptx.Edsl.Common.Types.Vector;");
                w.WriteLineNoTabs(String.Empty);
                w.WriteLine("namespace {0}", dir2ns(dir_sregs));
                w.WriteLine("{");
                w.Indent++;
                w.WriteLine("public class {0} : {1}, sreg", t.Name, t.FullName);
                w.WriteLine("{");
                w.Indent++;

                var xid = t.Name == "tid" || t.Name == "ntid" || t.Name == "ctaid" || t.Name == "nctaid";
                if (xid)
                {
                    var post_20 = Context.Current.Version >= SoftwareIsa.PTX_20;
                    if (post_20)
                    {
                        w.EmitTypeSpec(t.Name, new Type { Name = TypeName.U16, Mod = TypeMod.V4 }, Space.Other);
                        w.EmitTypeSpec(t.Name, new Type { Name = TypeName.U32, Mod = TypeMod.V4 }, Space.Other);
                    }
                    else
                    {
                        w.EmitTypeSpec(t.Name, new Type { Name = TypeName.U16, Mod = TypeMod.V4 }, Space.Other);
                    }
                }
                else
                {
                    var type = t.Attr<SregAttribute>().Type;
                    w.EmitTypeSpec(t.Name, type, Space.Other);
                }

                // todo. also emit same stuff as gets emitted for non-reg vars of appropriate type
                // e.g. .x, .y, .z accessors for grid-related special registers

                w.Indent--;
                w.WriteLine("}");
                w.Indent--;
                w.WriteLine("}");

                var fname = dir_sregs + t.Name + ".cs";
                File.WriteAllText(fname, buf.ToString());
            }
        }
Exemple #2
0
        public static void DoGenerate()
        {
            var edsl_base = @"..\..\..\..\Libptx.Edsl\Libptx.Edsl\";
            var dir_vector = edsl_base + @"Expressions\Immediate\";
            var dir_vectors = edsl_base + @"Expressions\Immediate\Vectors\";
            Func<String, String> dir2ns = dir =>
            {
                var rel = dir.Replace(@"..\..\..\..\Libptx.Edsl\", String.Empty);
                rel = (rel + @"\").Unfold(s => s.Slice(0, -1), s => s.EndsWith(@"\")).Last();
                return rel.Replace(@"\", ".").Slice(0, -1);
            };

            var shortcuts = new Dictionary<int, List<String>>();
            new []{1, 2, 4}.ForEach(i => shortcuts.Add(i, new List<String>()));

            Types.Vector.ForEach(t =>
            {
                t.is_vec().AssertTrue();
                var name = String.Format("v{0}_{1}", t.vec_rank(), t.vec_el().Name.Signature());

                var buf_vec = new StringBuilder();
                var w_vec = new StringWriter(buf_vec).Indented();
                w_vec.WriteLine("using {0};", typeof(AssertionHelper).Namespace);
                w_vec.WriteLine("using {0};", typeof(Libptx.Edsl.Expressions.Slots.var).Namespace);
                w_vec.WriteLine("using Libptx.Edsl.Common.Types.Scalar;");
                w_vec.WriteLineNoTabs(String.Empty);
                w_vec.WriteLine("namespace {0}", dir2ns(dir_vectors));
                w_vec.WriteLine("{");
                w_vec.Indent++;
                w_vec.WriteLine("public class {0} : vector", name);
                w_vec.WriteLine("{");
                w_vec.Indent++;

                Func<int, String> arg_name = i => i == 1 ? "x" : i == 2 ? "y" : i == 3 ? "z" : i == 4 ? "w" : 
                    ((Func<String>)(() => { throw AssertionHelper.Fail(); }))();
                var args = 1.UpTo(t.vec_rank()).Select(i => String.Format("reg_{0} {1}", t.vec_el().Name.Signature(), arg_name(i))).StringJoin(", ");
                w_vec.WriteLine("public {0}({1})", name, args);

                var arg_names = 1.UpTo(t.vec_rank()).Select(arg_name).StringJoin(", ");
                shortcuts[t.vec_rank()].Add(String.Format("public static {0} v{1}({2}) {{ return new {0}({3}); }}", name, t.vec_rank(), args, arg_names));

                w_vec.WriteLine("{");
                w_vec.Indent++;
                w_vec.WriteLine("ElementType = {0};", t.vec_el().Name.Signature());
                1.UpTo(t.vec_rank()).ForEach(i => w_vec.WriteLine("Elements.Add({0}.AssertCast<var>());", arg_name(i)));
                w_vec.Indent--;
                w_vec.WriteLine("}");

                w_vec.WriteLineNoTabs(String.Empty);
                w_vec.EmitTypeSpec(name, t, Space.Reg, true);
                w_vec.Indent--;

                w_vec.WriteLine("}");
                w_vec.Indent--;
                w_vec.WriteLine("}");

                var fname_reg = dir_vectors + name + ".cs";
                if (!Directory.Exists(dir_vectors)) Directory.CreateDirectory(dir_vectors);
                File.WriteAllText(fname_reg, buf_vec.ToString());
            });

            var buf = new StringBuilder();
            var w = new StringWriter(buf).Indented();
            w.WriteLine("using {0};", typeof(Vector).Namespace);
            w.WriteLine("using Libptx.Edsl.Common.Types.Scalar;");
            w.WriteLine("using {0};", dir2ns(dir_vectors));
            w.WriteLineNoTabs(String.Empty);
            w.WriteLine("namespace {0}", dir2ns(dir_vector));
            w.WriteLine("{");
            w.Indent++;
            w.WriteLine("public class vector : Vector");
            w.WriteLine("{");
            w.Indent++;

            var write_shortcuts = shortcuts.Keys.Select<int, Action>(i => () => shortcuts[i].ForEach(w.WriteLine));
            var write_empty_lines = Seq.Nats.Select<int, Action>(_ => () => w.WriteLineNoTabs(String.Empty));
            write_shortcuts.Intersperse(write_empty_lines).SkipLast(1).RunEach();

            w.Indent--;
            w.WriteLine("}");
            w.Indent--;
            w.WriteLine("}");

            var fname = dir_vector + "vector.cs";
            if (!Directory.Exists(dir_vector)) Directory.CreateDirectory(dir_vector);
            File.WriteAllText(fname, buf.ToString());
        }