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 @@...@@ -1,6 +1,5 @@
1const std = @import("std");1const std = @import("std");
2const g = @import("spirv/grammar.zig");2const g = @import("spirv/grammar.zig");
3const Writer = std.ArrayList(u8).Writer;
43
5pub fn main() !void {4pub fn main() !void {
6 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);5 var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
...@@ -18,17 +17,12 @@ pub fn main() !void {...@@ -18,17 +17,12 @@ pub fn main() !void {
18 var tokens = std.json.TokenStream.init(spec);17 var tokens = std.json.TokenStream.init(spec);
19 var registry = try std.json.parse(g.Registry, &tokens, .{.allocator = allocator});18 var registry = try std.json.parse(g.Registry, &tokens, .{.allocator = allocator});
2019
21 var buf = std.ArrayList(u8).init(allocator);20 var bw = std.io.bufferedWriter(std.io.getStdOut().writer());
22 defer buf.deinit();21 try render(bw.writer(), registry);
2322 try bw.flush();
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);
29}23}
3024
31fn render(writer: Writer, registry: g.Registry) !void {25fn render(writer: anytype, registry: g.Registry) !void {
32 try writer.writeAll(26 try writer.writeAll(
33 \\//! This file is auto-generated by tools/gen_spirv_spec.zig.27 \\//! This file is auto-generated by tools/gen_spirv_spec.zig.
34 \\28 \\
...@@ -39,7 +33,7 @@ fn render(writer: Writer, registry: g.Registry) !void {...@@ -39,7 +33,7 @@ fn render(writer: Writer, registry: g.Registry) !void {
39 switch (registry) {33 switch (registry) {
40 .core => |core_reg| {34 .core => |core_reg| {
41 try writer.print(35 try writer.print(
42 \\pub const version = Version{{.major = {}, .minor = {}, .patch = {}}};36 \\pub const version = Version{{ .major = {}, .minor = {}, .patch = {} }};
43 \\pub const magic_number: u32 = {s};37 \\pub const magic_number: u32 = {s};
44 \\38 \\
45 , .{ core_reg.major_version, core_reg.minor_version, core_reg.revision, core_reg.magic_number },39 , .{ 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 {...@@ -49,7 +43,7 @@ fn render(writer: Writer, registry: g.Registry) !void {
49 },43 },
50 .extension => |ext_reg| {44 .extension => |ext_reg| {
51 try writer.print(45 try writer.print(
52 \\pub const version = Version{{.major = {}, .minor = 0, .patch = {}}};46 \\pub const version = Version{{ .major = {}, .minor = 0, .patch = {} }};
53 \\47 \\
54 , .{ ext_reg.version, ext_reg.revision },48 , .{ ext_reg.version, ext_reg.revision },
55 );49 );
...@@ -59,15 +53,15 @@ fn render(writer: Writer, registry: g.Registry) !void {...@@ -59,15 +53,15 @@ fn render(writer: Writer, registry: g.Registry) !void {
59 }53 }
60}54}
6155
62fn renderOpcodes(writer: Writer, instructions: []const g.Instruction) !void {56fn renderOpcodes(writer: anytype, instructions: []const g.Instruction) !void {
63 try writer.writeAll("pub const Opcode = extern enum(u16) {\n");57 try writer.writeAll("pub const Opcode = extern enum(u16) {\n");
64 for (instructions) |instr| {58 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 });
66 }60 }
67 try writer.writeAll("_,\n};\n");61 try writer.writeAll(" _,\n};\n");
68}62}
6963
70fn renderOperandKinds(writer: Writer, kinds: []const g.OperandKind) !void {64fn renderOperandKinds(writer: anytype, kinds: []const g.OperandKind) !void {
71 for (kinds) |kind| {65 for (kinds) |kind| {
72 switch (kind.category) {66 switch (kind.category) {
73 .ValueEnum => try renderValueEnum(writer, kind),67 .ValueEnum => try renderValueEnum(writer, kind),
...@@ -77,20 +71,20 @@ fn renderOperandKinds(writer: Writer, kinds: []const g.OperandKind) !void {...@@ -77,20 +71,20 @@ fn renderOperandKinds(writer: Writer, kinds: []const g.OperandKind) !void {
77 }71 }
78}72}
7973
80fn renderValueEnum(writer: Writer, enumeration: g.OperandKind) !void {74fn renderValueEnum(writer: anytype, enumeration: g.OperandKind) !void {
81 try writer.print("pub const {s} = extern enum(u32) {{\n", .{ enumeration.kind });75 try writer.print("pub const {s} = extern enum(u32) {{\n", .{ enumeration.kind });
8276
83 const enumerants = enumeration.enumerants orelse return error.InvalidRegistry;77 const enumerants = enumeration.enumerants orelse return error.InvalidRegistry;
84 for (enumerants) |enumerant| {78 for (enumerants) |enumerant| {
85 if (enumerant.value != .int) return error.InvalidRegistry;79 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 });
88 }82 }
8983
90 try writer.writeAll("_,\n};\n");84 try writer.writeAll(" _,\n};\n");
91}85}
9286
93fn renderBitEnum(writer: Writer, enumeration: g.OperandKind) !void {87fn renderBitEnum(writer: anytype, enumeration: g.OperandKind) !void {
94 try writer.print("pub const {s} = packed struct {{\n", .{ enumeration.kind });88 try writer.print("pub const {s} = packed struct {{\n", .{ enumeration.kind });
9589
96 var flags_by_bitpos = [_]?[]const u8{null} ** 32;90 var flags_by_bitpos = [_]?[]const u8{null} ** 32;
...@@ -113,6 +107,7 @@ fn renderBitEnum(writer: Writer, enumeration: g.OperandKind) !void {...@@ -113,6 +107,7 @@ fn renderBitEnum(writer: Writer, enumeration: g.OperandKind) !void {
113 }107 }
114108
115 for (flags_by_bitpos) |maybe_flag_name, bitpos| {109 for (flags_by_bitpos) |maybe_flag_name, bitpos| {
110 try writer.writeAll(" ");
116 if (maybe_flag_name) |flag_name| {111 if (maybe_flag_name) |flag_name| {
117 try writer.writeAll(flag_name);112 try writer.writeAll(flag_name);
118 } else {113 } else {
...@@ -123,7 +118,7 @@ fn renderBitEnum(writer: Writer, enumeration: g.OperandKind) !void {...@@ -123,7 +118,7 @@ fn renderBitEnum(writer: Writer, enumeration: g.OperandKind) !void {
123 if (bitpos == 0) { // Force alignment to integer boundaries118 if (bitpos == 0) { // Force alignment to integer boundaries
124 try writer.writeAll("align(@alignOf(u32)) ");119 try writer.writeAll("align(@alignOf(u32)) ");
125 }120 }
126 try writer.writeAll("= false, ");121 try writer.writeAll("= false,\n");
127 }122 }
128123
129 try writer.writeAll("};\n");124 try writer.writeAll("};\n");