Skip to documentation
SLOP

tiny.choir.backends.target

Reference tiny.choir backends target

Defined in backends.

API (16)

Actions

Public operations.

Types and contracts

Public types and contracts.

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

Source

Called byCallsNo direct callsbackends.TargetSpecapplyLegalitybackends.ConversionLegalitySpecapply
Static calls · unresolved targets: 0 · external targets: 6.
Called byCallsNo direct callersprivate sourcelib.choir.src.backends.targetcontainsNamebackends.ConversionLegalitySpecisIllegalDialectName
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsbackends.TargetSpecmarksIllegalOpprivate sourcelib.choir.src.backends.targetcontainsNamebackends.ConversionLegalitySpecisIllegalOpName
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsbackends.TargetSpeclegalizesDialectprivate sourcelib.choir.src.backends.targetcontainsNamebackends.ConversionLegalitySpecisLegalDialectName
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.choir.src.backends.targetcontainsNamebackends.ConversionLegalitySpecisLegalOpName
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.choir.src.backends.targetcontainsNamebackends.ConversionLegalitySpecisRecursivelyLegalDialectName
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.choir.src.backends.targetcontainsNamebackends.ConversionLegalitySpecisRecursivelyLegalOpName
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersbackends.ConversionLegalitySpecapplybackends.TargetSpecapplyLegality
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersbackends.ConversionLegalitySpecisLegalDialectNamebackends.TargetSpeclegalizesDialect
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersbackends.ConversionLegalitySpecisIllegalOpNamebackends.TargetSpecmarksIllegalOp
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/choir/src/backends/root.zig:14

zig
pub const target = @import("target.zig");

Source: lib/choir/src/backends/target.zig

zig
const std = @import("std");const ir = @import("../core/root.zig");const rewrite = ir.rewrite;const passes = @import("../passes/root.zig");pub const ConversionRewriteFn = *const fn (*ir.Operation, *rewrite.PatternRewriter) rewrite.PatternResult;pub const ConversionPatternEntry = struct {    spec: rewrite.RewritePatternSpec,    rewrite: ConversionRewriteFn,};pub const ConversionLegalitySpec = struct {    legal_ops: []const []const u8 = &.{},    recursively_legal_ops: []const []const u8 = &.{},    illegal_ops: []const []const u8 = &.{},    legal_dialects: []const []const u8 = &.{},    recursively_legal_dialects: []const []const u8 = &.{},    illegal_dialects: []const []const u8 = &.{},    pub fn apply(self: ConversionLegalitySpec, target: *passes.ConversionTarget) !void {        for (self.legal_ops) |op_name| try target.addLegalOp(op_name);        for (self.recursively_legal_ops) |op_name| try target.addRecursivelyLegalOp(op_name);        for (self.illegal_ops) |op_name| try target.addIllegalOp(op_name);        for (self.legal_dialects) |dialect_name| try target.addLegalDialect(dialect_name);        for (self.recursively_legal_dialects) |dialect_name| try target.addRecursivelyLegalDialect(dialect_name);        for (self.illegal_dialects) |dialect_name| try target.addIllegalDialect(dialect_name);    }    pub fn isLegalOpName(self: ConversionLegalitySpec, op_name: []const u8) bool {        return containsName(self.legal_ops, op_name);    }    pub fn isRecursivelyLegalOpName(self: ConversionLegalitySpec, op_name: []const u8) bool {        return containsName(self.recursively_legal_ops, op_name);    }    pub fn isIllegalOpName(self: ConversionLegalitySpec, op_name: []const u8) bool {        return containsName(self.illegal_ops, op_name);    }    pub fn isLegalDialectName(self: ConversionLegalitySpec, dialect_name: []const u8) bool {        return containsName(self.legal_dialects, dialect_name);    }    pub fn isRecursivelyLegalDialectName(self: ConversionLegalitySpec, dialect_name: []const u8) bool {        return containsName(self.recursively_legal_dialects, dialect_name);    }    pub fn isIllegalDialectName(self: ConversionLegalitySpec, dialect_name: []const u8) bool {        return containsName(self.illegal_dialects, dialect_name);    }};pub const TargetSpec = struct {    name: []const u8,    description: []const u8 = "",    target_dialect_name: []const u8,    legality: ConversionLegalitySpec = .{},    conversion_patterns: []const rewrite.RewritePatternSpec = &.{},    pass_name: []const u8 = "",    pass_description: []const u8 = "",    pipeline_name: []const u8 = "",    pipeline_description: []const u8 = "",    pub fn applyLegality(self: TargetSpec, target: *passes.ConversionTarget) !void {        try self.legality.apply(target);    }    pub fn conversionPatternRootCount(self: TargetSpec) usize {        return self.conversion_patterns.len;    }    pub fn hasConversionPatternRoot(self: TargetSpec, root_op_name: []const u8) bool {        for (self.conversion_patterns) |pattern| {            if (std.mem.eql(u8, pattern.root_op_name, root_op_name)) return true;        }        return false;    }    pub fn marksIllegalOp(self: TargetSpec, op_name: []const u8) bool {        return self.legality.isIllegalOpName(op_name);    }    pub fn legalizesDialect(self: TargetSpec, dialect_name: []const u8) bool {        return self.legality.isLegalDialectName(dialect_name);    }};fn containsName(names: []const []const u8, needle: []const u8) bool {    for (names) |name| {        if (std.mem.eql(u8, name, needle)) return true;    }    return false;}test "conversion legality spec applies target facts" {    const testing = std.testing;    const legal_dialects = [_][]const u8{ "builtin", "func" };    const illegal_ops = [_][]const u8{ "gpu.thread_id", "gpu.block_id" };    const spec = ConversionLegalitySpec{        .legal_dialects = legal_dialects[0..],        .illegal_ops = illegal_ops[0..],    };    var target = passes.ConversionTarget.init(testing.allocator);    defer target.deinit();    try spec.apply(&target);    try testing.expect(target.legal_dialects.contains("builtin"));    try testing.expect(target.legal_dialects.contains("func"));    try testing.expect(target.illegal_ops.contains("gpu.thread_id"));    try testing.expect(spec.isLegalDialectName("builtin"));    try testing.expect(spec.isIllegalOpName("gpu.block_id"));    try testing.expect(!spec.isIllegalOpName("gpu.grid_id"));}test "target spec exposes conversion pattern roots" {    const testing = std.testing;    const patterns = [_]rewrite.RewritePatternSpec{        .{ .name = "gpu.thread_id", .root_op_name = "gpu.thread_id" },        .{ .name = "gpu.block_id", .root_op_name = "gpu.block_id" },    };    const spec = TargetSpec{        .name = "test-target",        .target_dialect_name = "test",        .conversion_patterns = patterns[0..],    };    try testing.expectEqual(@as(usize, 2), spec.conversionPatternRootCount());    try testing.expect(spec.hasConversionPatternRoot("gpu.thread_id"));    try testing.expect(!spec.hasConversionPatternRoot("gpu.grid_id"));}

Audit

Definitions17
Public names33
Members17
Version26.7.0
Revisiondaab053ee433