authorgravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-05-14 19:46:38+02:00
committergravatar for robin@voetter.nlRobin Voetter <robin@voetter.nl> 2021-05-14 19:49:32+02:00
log00428ac11b4d5b71ded1f9e572652ff52814f7b7
treee4bc1b33d6d0d6ba354270da2cb478aead71f8a8
parent98dc8eb7d97bd05ced6908c4da3c5e0a55e2c41b

SPIR-V: Don't parse/render in gen_spirv_spec.zig, just emit in the right format


1 files changed, 16 insertions(+), 21 deletions(-)

tools/gen_spirv_spec.zig+16-21
......@@ -1,6 +1,5 @@
11const std = @import("std");
22const g = @import("spirv/grammar.zig");
3const Writer = std.ArrayList(u8).Writer;
43
54pub fn main() !void {
65 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
......@@ -18,17 +17,12 @@ pub fn main() !void {
1817 var tokens = std.json.TokenStream.init(spec);
1918 var registry = try std.json.parse(g.Registry, &tokens, .{.allocator = allocator});
2019
21 var buf = std.ArrayList(u8).init(allocator);
22 defer buf.deinit();
23
24 try render(buf.writer(), registry);
25
26 const tree = try std.zig.parse(allocator, buf.items);
27 const formatted = try tree.render(allocator);
28 try std.io.getStdOut().writeAll(formatted);
20 var bw = std.io.bufferedWriter(std.io.getStdOut().writer());
21 try render(bw.writer(), registry);
22 try bw.flush();
2923}
3024
31fn render(writer: Writer, registry: g.Registry) !void {
25fn render(writer: anytype, registry: g.Registry) !void {
3226 try writer.writeAll(
3327 \\//! This file is auto-generated by tools/gen_spirv_spec.zig.
3428 \\
......@@ -39,7 +33,7 @@ fn render(writer: Writer, registry: g.Registry) !void {
3933 switch (registry) {
4034 .core => |core_reg| {
4135 try writer.print(
42 \\pub const version = Version{{.major = {}, .minor = {}, .patch = {}}};
36 \\pub const version = Version{{ .major = {}, .minor = {}, .patch = {} }};
4337 \\pub const magic_number: u32 = {s};
4438 \\
4539 , .{ core_reg.major_version, core_reg.minor_version, core_reg.revision, core_reg.magic_number },
......@@ -49,7 +43,7 @@ fn render(writer: Writer, registry: g.Registry) !void {
4943 },
5044 .extension => |ext_reg| {
5145 try writer.print(
52 \\pub const version = Version{{.major = {}, .minor = 0, .patch = {}}};
46 \\pub const version = Version{{ .major = {}, .minor = 0, .patch = {} }};
5347 \\
5448 , .{ ext_reg.version, ext_reg.revision },
5549 );
......@@ -59,15 +53,15 @@ fn render(writer: Writer, registry: g.Registry) !void {
5953 }
6054}
6155
62fn renderOpcodes(writer: Writer, instructions: []const g.Instruction) !void {
56fn renderOpcodes(writer: anytype, instructions: []const g.Instruction) !void {
6357 try writer.writeAll("pub const Opcode = extern enum(u16) {\n");
6458 for (instructions) |instr| {
65 try writer.print("{} = {},\n", .{ std.zig.fmtId(instr.opname), instr.opcode });
59 try writer.print(" {} = {},\n", .{ std.zig.fmtId(instr.opname), instr.opcode });
6660 }
67 try writer.writeAll("_,\n};\n");
61 try writer.writeAll(" _,\n};\n");
6862}
6963
70fn renderOperandKinds(writer: Writer, kinds: []const g.OperandKind) !void {
64fn renderOperandKinds(writer: anytype, kinds: []const g.OperandKind) !void {
7165 for (kinds) |kind| {
7266 switch (kind.category) {
7367 .ValueEnum => try renderValueEnum(writer, kind),
......@@ -77,20 +71,20 @@ fn renderOperandKinds(writer: Writer, kinds: []const g.OperandKind) !void {
7771 }
7872}
7973
80fn renderValueEnum(writer: Writer, enumeration: g.OperandKind) !void {
74fn renderValueEnum(writer: anytype, enumeration: g.OperandKind) !void {
8175 try writer.print("pub const {s} = extern enum(u32) {{\n", .{ enumeration.kind });
8276
8377 const enumerants = enumeration.enumerants orelse return error.InvalidRegistry;
8478 for (enumerants) |enumerant| {
8579 if (enumerant.value != .int) return error.InvalidRegistry;
8680
87 try writer.print("{} = {},\n", .{ std.zig.fmtId(enumerant.enumerant), enumerant.value.int });
81 try writer.print(" {} = {},\n", .{ std.zig.fmtId(enumerant.enumerant), enumerant.value.int });
8882 }
8983
90 try writer.writeAll("_,\n};\n");
84 try writer.writeAll(" _,\n};\n");
9185}
9286
93fn renderBitEnum(writer: Writer, enumeration: g.OperandKind) !void {
87fn renderBitEnum(writer: anytype, enumeration: g.OperandKind) !void {
9488 try writer.print("pub const {s} = packed struct {{\n", .{ enumeration.kind });
9589
9690 var flags_by_bitpos = [_]?[]const u8{null} ** 32;
......@@ -113,6 +107,7 @@ fn renderBitEnum(writer: Writer, enumeration: g.OperandKind) !void {
113107 }
114108
115109 for (flags_by_bitpos) |maybe_flag_name, bitpos| {
110 try writer.writeAll(" ");
116111 if (maybe_flag_name) |flag_name| {
117112 try writer.writeAll(flag_name);
118113 } else {
......@@ -123,7 +118,7 @@ fn renderBitEnum(writer: Writer, enumeration: g.OperandKind) !void {
123118 if (bitpos == 0) { // Force alignment to integer boundaries
124119 try writer.writeAll("align(@alignOf(u32)) ");
125120 }
126 try writer.writeAll("= false, ");
121 try writer.writeAll("= false,\n");
127122 }
128123
129124 try writer.writeAll("};\n");