| ... | ... | @@ -1,6 +1,5 @@ |
| 1 | 1 | const std = @import("std"); |
| 2 | 2 | const g = @import("spirv/grammar.zig"); |
| 3 | | const Writer = std.ArrayList(u8).Writer; |
| 4 | 3 | |
| 5 | 4 | pub fn main() !void { |
| 6 | 5 | var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator); |
| ... | ... | @@ -18,17 +17,12 @@ pub fn main() !void { |
| 18 | 17 | var tokens = std.json.TokenStream.init(spec); |
| 19 | 18 | var registry = try std.json.parse(g.Registry, &tokens, .{.allocator = allocator}); |
| 20 | 19 | |
| 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(); |
| 29 | 23 | } |
| 30 | 24 | |
| 31 | | fn render(writer: Writer, registry: g.Registry) !void { |
| 25 | fn render(writer: anytype, registry: g.Registry) !void { |
| 32 | 26 | try writer.writeAll( |
| 33 | 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 | 33 | switch (registry) { |
| 40 | 34 | .core => |core_reg| { |
| 41 | 35 | try writer.print( |
| 42 | | \\pub const version = Version{{.major = {}, .minor = {}, .patch = {}}}; |
| 36 | \\pub const version = Version{{ .major = {}, .minor = {}, .patch = {} }}; |
| 43 | 37 | \\pub const magic_number: u32 = {s}; |
| 44 | 38 | \\ |
| 45 | 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 | 43 | }, |
| 50 | 44 | .extension => |ext_reg| { |
| 51 | 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 | 48 | , .{ ext_reg.version, ext_reg.revision }, |
| 55 | 49 | ); |
| ... | ... | @@ -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 | 57 | try writer.writeAll("pub const Opcode = extern enum(u16) {\n"); |
| 64 | 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 | 65 | for (kinds) |kind| { |
| 72 | 66 | switch (kind.category) { |
| 73 | 67 | .ValueEnum => try renderValueEnum(writer, kind), |
| ... | ... | @@ -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 | 75 | try writer.print("pub const {s} = extern enum(u32) {{\n", .{ enumeration.kind }); |
| 82 | 76 | |
| 83 | 77 | const enumerants = enumeration.enumerants orelse return error.InvalidRegistry; |
| 84 | 78 | for (enumerants) |enumerant| { |
| 85 | 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 | 88 | try writer.print("pub const {s} = packed struct {{\n", .{ enumeration.kind }); |
| 95 | 89 | |
| 96 | 90 | var flags_by_bitpos = [_]?[]const u8{null} ** 32; |
| ... | ... | @@ -113,6 +107,7 @@ fn renderBitEnum(writer: Writer, enumeration: g.OperandKind) !void { |
| 113 | 107 | } |
| 114 | 108 | |
| 115 | 109 | for (flags_by_bitpos) |maybe_flag_name, bitpos| { |
| 110 | try writer.writeAll(" "); |
| 116 | 111 | if (maybe_flag_name) |flag_name| { |
| 117 | 112 | try writer.writeAll(flag_name); |
| 118 | 113 | } else { |
| ... | ... | @@ -123,7 +118,7 @@ fn renderBitEnum(writer: Writer, enumeration: g.OperandKind) !void { |
| 123 | 118 | if (bitpos == 0) { // Force alignment to integer boundaries |
| 124 | 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 | 124 | try writer.writeAll("};\n"); |