Skip to documentation
SLOP

tiny.choir.dialects.tile.TileDialect

Reference tiny.choir dialects tile TileDialect

Defined in dialects.tile.

API (51)

Actions

Public operations.

Types and contracts

Public types and contracts.

Values and defaults

Public values and defaults.

No direct callersNo direct callsdialects.tileTileDialect
Static calls · unresolved targets: unknown · external targets: unknown.

Source

Source: lib/choir/src/dialects/tile.zig:28

zig
pub const TileDialect = struct {    pub const name = type_names.tile;    const op_specs = ir.dialects.opSpec.dialect(@This());    pub const spec = ir.dialects.dialectSpec(@This(), .{        .types = ir.dialects.typeNames(type_specs),    });    const type_specs = struct {        pub const tile = ir.dialects.TypeSpec{            .name = type_names.tile,            .interfaces = &.{                interfaces.TypeParamInterface.entry(&tile_type_param_vtable),            },        };        pub const barrier = type_names.barrier;    };    pub const TileTypePayload = struct {        element_type_name: []const u8,        element_type: ?ir.Type,        mem_level: TileMemLevel,        shape: []u32,    };    const tile_type_param_vtable = interfaces.TypeParamInterface.VTable{        .parse = parseTileTypeParams,    };    pub const LoadOp = struct {        op: *ir.Operation,        pub const operation_spec = op_specs.leaf(.{            .mnemonic = "load",            .operands = 2,            .results = 1,        });        pub const operation_name = operation_spec.name;        pub fn create(            ctx: *ir.Context,            loc: ir.Location,            buffer: *ir.Value,            coord: *ir.Value,            result_type: ir.Type,        ) !LoadOp {            var builder = ir.OperationBuilder.init(ctx);            var state = op_specs.state(@This(), loc);            state.addOperands(&.{ buffer, coord });            state.addTypes(&.{result_type});            const op = try builder.create(state);            return .{ .op = op };        }        pub fn getResult(self: *const LoadOp) *ir.Value {            return self.op.getResult(0).?;        }        pub fn getBuffer(self: LoadOp) *ir.Value {            return self.op.operands.items[0].value;        }        pub fn getCoord(self: LoadOp) *ir.Value {            return self.op.operands.items[1].value;        }    };    pub const StoreOp = struct {        op: *ir.Operation,        pub const operation_spec = op_specs.leaf(.{            .mnemonic = "store",            .operands = 3,            .results = 0,        });        pub const operation_name = operation_spec.name;        pub fn create(            ctx: *ir.Context,            loc: ir.Location,            tile: *ir.Value,            buffer: *ir.Value,            coord: *ir.Value,        ) !StoreOp {            var builder = ir.OperationBuilder.init(ctx);            var state = op_specs.state(@This(), loc);            state.addOperands(&.{ tile, buffer, coord });            const op = try builder.create(state);            return .{ .op = op };        }        pub fn getTile(self: StoreOp) *ir.Value {            return self.op.operands.items[0].value;        }        pub fn getBuffer(self: StoreOp) *ir.Value {            return self.op.operands.items[1].value;        }        pub fn getCoord(self: StoreOp) *ir.Value {            return self.op.operands.items[2].value;        }    };    pub const MmaOp = struct {        op: *ir.Operation,        pub const operation_spec = op_specs.leaf(.{            .mnemonic = "mma",            .operands = 3,            .results = 1,        });        pub const operation_name = operation_spec.name;        pub fn create(            ctx: *ir.Context,            loc: ir.Location,            a: *ir.Value,            b: *ir.Value,            c: *ir.Value,            result_type: ir.Type,        ) !MmaOp {            var builder = ir.OperationBuilder.init(ctx);            var state = op_specs.state(@This(), loc);            state.addOperands(&.{ a, b, c });            state.addTypes(&.{result_type});            const op = try builder.create(state);            return .{ .op = op };        }        pub fn getResult(self: *const MmaOp) *ir.Value {            return self.op.getResult(0).?;        }        pub fn getA(self: MmaOp) *ir.Value {            return self.op.operands.items[0].value;        }        pub fn getB(self: MmaOp) *ir.Value {            return self.op.operands.items[1].value;        }        pub fn getC(self: MmaOp) *ir.Value {            return self.op.operands.items[2].value;        }    };    pub const CopyOp = struct {        op: *ir.Operation,        pub const operation_spec = op_specs.leaf(.{            .mnemonic = "copy",            .operands = 2,            .results = 0,        });        pub const operation_name = operation_spec.name;        pub fn create(            ctx: *ir.Context,            loc: ir.Location,            src: *ir.Value,            dst: *ir.Value,        ) !CopyOp {            var builder = ir.OperationBuilder.init(ctx);            var state = op_specs.state(@This(), loc);            state.addOperands(&.{ src, dst });            const op = try builder.create(state);            return .{ .op = op };        }        pub fn getSrc(self: CopyOp) *ir.Value {            return self.op.operands.items[0].value;        }        pub fn getDst(self: CopyOp) *ir.Value {            return self.op.operands.items[1].value;        }    };    pub const BarrierOp = struct {        op: *ir.Operation,        pub const operation_spec = op_specs.leaf(.{            .mnemonic = "barrier",            .operands = 0,            .results = 0,        });        pub const operation_name = operation_spec.name;        pub fn create(ctx: *ir.Context, loc: ir.Location) !BarrierOp {            var builder = ir.OperationBuilder.init(ctx);            const state = op_specs.state(@This(), loc);            const op = try builder.create(state);            return .{ .op = op };        }    };    pub const ArriveOp = struct {        op: *ir.Operation,        pub const operation_spec = op_specs.leaf(.{            .mnemonic = "arrive",            .operands = 1,            .results = 0,        });        pub const operation_name = operation_spec.name;        pub fn create(ctx: *ir.Context, loc: ir.Location, barrier: *ir.Value) !ArriveOp {            var builder = ir.OperationBuilder.init(ctx);            var state = op_specs.state(@This(), loc);            state.addOperands(&.{barrier});            const op = try builder.create(state);            return .{ .op = op };        }        pub fn getBarrier(self: ArriveOp) *ir.Value {            return self.op.operands.items[0].value;        }    };    pub const WaitOp = struct {        op: *ir.Operation,        pub const operation_spec = op_specs.leaf(.{            .mnemonic = "wait",            .operands = 2,            .results = 0,        });        pub const operation_name = operation_spec.name;        pub fn create(ctx: *ir.Context, loc: ir.Location, barrier: *ir.Value, phase: *ir.Value) !WaitOp {            var builder = ir.OperationBuilder.init(ctx);            var state = op_specs.state(@This(), loc);            state.addOperands(&.{ barrier, phase });            const op = try builder.create(state);            return .{ .op = op };        }        pub fn getBarrier(self: WaitOp) *ir.Value {            return self.op.operands.items[0].value;        }        pub fn getPhase(self: WaitOp) *ir.Value {            return self.op.operands.items[1].value;        }    };    fn deinitTilePayload(allocator: std.mem.Allocator, ptr: *anyopaque) void {        const payload: *TileTypePayload = @ptrCast(@alignCast(ptr));        if (payload.shape.len > 0) {            allocator.free(payload.shape);        }        allocator.destroy(payload);    }    fn parseShape(allocator: std.mem.Allocator, shape_str: []const u8) ![]u32 {        if (shape_str.len == 0) return error.InvalidTileShape;        var dims = std.ArrayListUnmanaged(u32).empty;        errdefer dims.deinit(allocator);        var iter = std.mem.splitScalar(u8, shape_str, 'x');        while (iter.next()) |part| {            if (part.len == 0) return error.InvalidTileShape;            const value = std.fmt.parseInt(u32, part, 10) catch return error.InvalidTileShape;            try dims.append(allocator, value);        }        if (dims.items.len == 0) return error.InvalidTileShape;        return dims.toOwnedSlice(allocator);    }    fn parseTileTypeParams(        type_ptr: *const anyopaque,        ctx_opaque: *const interfaces.ContextOpaque,    ) anyerror!?interfaces.TypeParamPayload {        const ctx = interfaces.castContext(ir.Context, ctx_opaque);        const storage: *const ir.Type.DialectTypeStorage = @ptrCast(@alignCast(type_ptr));        if (storage.param_key.len == 0) return null;        var iter = std.mem.splitScalar(u8, storage.param_key, ',');        const elem_name = iter.next() orelse return null;        const mem_level_str = iter.next() orelse return null;        const shape_str = iter.next() orelse return null;        if (iter.next() != null) return null;        const mem_level = TileMemLevel.fromString(mem_level_str) orelse return null;        const allocator = ir.context.typePayloadAllocator(ctx);        const shape = parseShape(allocator, shape_str) catch return null;        errdefer allocator.free(shape);        const payload = try allocator.create(TileTypePayload);        payload.* = .{            .element_type_name = elem_name,            .element_type = ctx.getDialectTypeFromName(elem_name) catch null,            .mem_level = mem_level,            .shape = shape,        };        return .{ .ptr = payload, .deinit = deinitTilePayload };    }    fn loadSpec(ctx: *ir.Context) !void {        ir.dialects.loadDialectSpec(ctx, spec) catch |err| switch (err) {            error.ContextFrozen => {},            else => return err,        };    }    fn payloadFromType(ctx: *ir.Context, typ: ir.Type) ?*const TileTypePayload {        loadSpec(ctx) catch return null;        return ctx.getTypeParamPayload(typ, TileTypePayload) catch null;    }    pub fn getTileType(        ctx: *ir.Context,        element_type: ir.Type,        mem_level: TileMemLevel,        shape: []const u32,    ) !ir.Type {        try loadSpec(ctx);        if (shape.len == 0) return error.InvalidTileShape;        var buf: [128]u8 = undefined;        const elem_name = element_type.getDialectTypeName() orelse "unknown";        var pos: usize = 0;        pos = try ir.format.appendFmt(buf[0..], pos, "{s},{s},", .{ elem_name, mem_level.toString() });        for (shape, 0..) |dim, idx| {            if (idx > 0) {                pos = try ir.format.appendFmt(buf[0..], pos, "x", .{});            }            pos = try ir.format.appendFmt(buf[0..], pos, "{d}", .{dim});        }        return ctx.getDialectTypeFromNameWithKey(type_names.tile, buf[0..pos]);    }    pub fn getTileElementType(ctx: *ir.Context, typ: ir.Type) ?ir.Type {        const payload = payloadFromType(ctx, typ) orelse return null;        return payload.element_type;    }    pub fn getTileMemLevel(ctx: *ir.Context, typ: ir.Type) ?TileMemLevel {        const payload = payloadFromType(ctx, typ) orelse return null;        return payload.mem_level;    }    pub fn getTileShape(ctx: *ir.Context, typ: ir.Type) ?[]const u32 {        const payload = payloadFromType(ctx, typ) orelse return null;        return payload.shape;    }    pub fn getBarrierType(ctx: *ir.Context) !ir.Type {        try loadSpec(ctx);        return ctx.getDialectTypeFromName(type_names.barrier);    }};
Called byCallsNo direct callstest sourcelib.choir.src.dialects.tiletest: TileDialect ops capture operand...dialects.TileDialect.ArriveOpcreate
Static calls · unresolved targets: 0 · external targets: 4.
Called byCallsNo direct callstest sourcelib.choir.src.dialects.tiletest: TileDialect ops capture operand...dialects.TileDialect.BarrierOpcreate
Static calls · unresolved targets: 0 · external targets: 3.
Called byCallsNo direct callstest sourcelib.choir.src.dialects.tiletest: TileDialect ops capture operand...dialects.TileDialect.CopyOpcreate
Static calls · unresolved targets: 0 · external targets: 4.
Called byCallsNo direct callstest sourcelib.choir.src.dialects.tiletest: TileDialect ops capture operand...dialects.TileDialect.LoadOpcreate
Static calls · unresolved targets: 0 · external targets: 5.
Called byCallsNo direct callstest sourcelib.choir.src.dialects.tiletest: TileDialect ops capture operand...dialects.TileDialect.MmaOpcreate
Static calls · unresolved targets: 0 · external targets: 5.
Called byCallsNo direct callstest sourcelib.choir.src.dialects.tiletest: TileDialect ops capture operand...dialects.TileDialect.StoreOpcreate
Static calls · unresolved targets: 0 · external targets: 4.
Called byCallsNo direct callstest sourcelib.choir.src.dialects.tiletest: TileDialect ops capture operand...dialects.TileDialect.WaitOpcreate
Static calls · unresolved targets: 0 · external targets: 4.
Called byCallstest sourcelib.choir.src.dialects.tiletest: TileDialect ops capture operand...private sourcelib.choir.src.dialects.tile.TileDialectloadSpecdialects.TileDialectgetBarrierType
Static calls · unresolved targets: 0 · external targets: 1.
Called byCallstest sourcelib.choir.src.dialects.tile.test_TileDialectTileType roundtripprivate sourcelib.choir.src.dialects.tile.TileDialectpayloadFromTypedialects.TileDialectgetTileElementType
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.choir.src.dialects.tile.test_TileDialectTileType roundtripprivate sourcelib.choir.src.dialects.tile.TileDialectpayloadFromTypedialects.TileDialectgetTileMemLevel
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.choir.src.dialects.tile.test_TileDialectTileType roundtripprivate sourcelib.choir.src.dialects.tile.TileDialectpayloadFromTypedialects.TileDialectgetTileShape
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.choir.src.dialects.tile.test_TileDialectTileType roundtriptest sourcelib.choir.src.dialects.tiletest: TileDialect ops capture operand...test sourcelib.choir.src.dialects.tiletest: TileDialect verifier rejects ma...private sourcelib.choir.src.dialects.tile.TileDialectloadSpecdialects.TileDialectgetTileType
Static calls · unresolved targets: 0 · external targets: 4.

Also reachable as

dialects.TileDialect.

Audit

Definitions52
Public names104
Members11
Version26.7.0
Revisiondaab053ee433