| ... | @@ -1,6 +1,5 @@ | ... | @@ -1,6 +1,5 @@ |
| 1 | const std = @import("std"); | 1 | const std = @import("std"); |
| 2 | const g = @import("spirv/grammar.zig"); | 2 | const g = @import("spirv/grammar.zig"); |
| 3 | const Writer = std.ArrayList(u8).Writer; | | |
| 4 | | 3 | |
| 5 | pub fn main() !void { | 4 | pub 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}); |
| 20 | | 19 | |
| 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); |
| 23 | | 22 | 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 | } |
| 30 | | 24 | |
| 31 | fn render(writer: Writer, registry: g.Registry) !void { | 25 | fn 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 | } |
| 61 | | 55 | |
| 62 | fn renderOpcodes(writer: Writer, instructions: []const g.Instruction) !void { | 56 | fn 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 | } |
| 69 | | 63 | |
| 70 | fn renderOperandKinds(writer: Writer, kinds: []const g.OperandKind) !void { | 64 | fn 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 | } |
| 79 | | 73 | |
| 80 | fn renderValueEnum(writer: Writer, enumeration: g.OperandKind) !void { | 74 | fn 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 }); |
| 82 | | 76 | |
| 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; |
| 86 | | 80 | |
| 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 | } |
| 89 | | 83 | |
| 90 | try writer.writeAll("_,\n};\n"); | 84 | try writer.writeAll(" _,\n};\n"); |
| 91 | } | 85 | } |
| 92 | | 86 | |
| 93 | fn renderBitEnum(writer: Writer, enumeration: g.OperandKind) !void { | 87 | fn 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 }); |
| 95 | | 89 | |
| 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 | } |
| 114 | | 108 | |
| 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 boundaries | 118 | 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 | } |
| 128 | | 123 | |
| 129 | try writer.writeAll("};\n"); | 124 | try writer.writeAll("};\n"); |