Skip to documentation
SLOP

tiny.accy.preparation.bufferization

Reference tiny.accy preparation bufferization

Defined in preparation.

API (17)

Actions

Public operations.

Types and contracts

Public types and contracts.

Values and defaults

Public values and defaults.

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

Source

Source: lib/accy/src/preparation/bufferization/pass.zig:83

zig
pub const BufferPlanAnalysis = struct {    allocator: std.mem.Allocator,    slots: std.ArrayListUnmanaged(BufferSlot),    elisions: std.ArrayListUnmanaged(FusionElision),    value_to_slot: std.AutoHashMap(*ir.Value, usize),    value_to_elision: std.AutoHashMap(*ir.Value, usize),    input_slot_count: usize = 0,    output_slot_count: usize = 0,    temporary_slot_count: usize = 0,    constant_slot_count: usize = 0,    dynamic_slot_count: usize = 0,    total_static_bytes: u64 = 0,    pub fn init(allocator: std.mem.Allocator) BufferPlanAnalysis {        return .{            .allocator = allocator,            .slots = .empty,            .elisions = .empty,            .value_to_slot = std.AutoHashMap(*ir.Value, usize).init(allocator),            .value_to_elision = std.AutoHashMap(*ir.Value, usize).init(allocator),        };    }    pub fn deinit(self: *BufferPlanAnalysis) void {        for (self.slots.items) |*slot| {            slot.deinit(self.allocator);        }        self.slots.deinit(self.allocator);        self.elisions.deinit(self.allocator);        self.value_to_slot.deinit();        self.value_to_elision.deinit();        self.* = undefined;    }    pub fn slotCount(self: BufferPlanAnalysis) usize {        return self.slots.items.len;    }    pub fn elisionCount(self: BufferPlanAnalysis) usize {        return self.elisions.items.len;    }    pub fn getSlot(self: *const BufferPlanAnalysis, value: *ir.Value) ?*const BufferSlot {        const index = self.value_to_slot.get(value) orelse return null;        return &self.slots.items[index];    }    pub fn getElision(self: *const BufferPlanAnalysis, value: *ir.Value) ?*const FusionElision {        const index = self.value_to_elision.get(value) orelse return null;        return &self.elisions.items[index];    }    fn addSlot(        self: *BufferPlanAnalysis,        value: *ir.Value,        producer: ?*ir.Operation,        function: ?*ir.Operation,        role: BufferRole,        info: shape_analysis.TensorInfo,    ) !usize {        if (self.value_to_slot.get(value)) |existing| return existing;        const total_bytes = try accounting.add(self.total_static_bytes, byteSize(info) orelse 0);        const id = self.slots.items.len;        var slot = try BufferSlot.init(            self.allocator,            id,            value,            producer,            function,            role,            info,        );        errdefer slot.deinit(self.allocator);        try self.value_to_slot.put(value, id);        errdefer _ = self.value_to_slot.remove(value);        try self.slots.append(self.allocator, slot);        if (role.input) self.input_slot_count += 1;        if (role.output) self.output_slot_count += 1;        if (role.temporary) self.temporary_slot_count += 1;        if (role.constant) self.constant_slot_count += 1;        self.total_static_bytes = total_bytes;        if (slot.byte_size == null) self.dynamic_slot_count += 1;        return id;    }    fn addAlias(        self: *BufferPlanAnalysis,        value: *ir.Value,        source: *ir.Value,        role: BufferRole,    ) !usize {        if (self.value_to_slot.get(value)) |existing| return existing;        const id = self.value_to_slot.get(source) orelse return error.MissingAliasedBufferSlot;        try self.value_to_slot.put(value, id);        self.mergeSlotRole(id, role);        return id;    }    fn mergeSlotRole(self: *BufferPlanAnalysis, id: usize, role: BufferRole) void {        var slot = &self.slots.items[id];        if (role.input and !slot.role.input) {            slot.role.input = true;            self.input_slot_count += 1;        }        if (role.output and !slot.role.output) {            slot.role.output = true;            self.output_slot_count += 1;        }        if (role.constant and !slot.role.constant) {            slot.role.constant = true;            self.constant_slot_count += 1;        }        if (role.temporary and !slot.role.temporary and !slot.role.input and !slot.role.output and !slot.role.constant) {            slot.role.temporary = true;            self.temporary_slot_count += 1;        }        if ((slot.role.input or slot.role.output or slot.role.constant) and slot.role.temporary) {            slot.role.temporary = false;            self.temporary_slot_count -= 1;        }    }    fn addElision(self: *BufferPlanAnalysis, elision: FusionElision) !void {        if (self.value_to_elision.contains(elision.value)) return;        const index = self.elisions.items.len;        try self.value_to_elision.put(elision.value, index);        errdefer _ = self.value_to_elision.remove(elision.value);        try self.elisions.append(self.allocator, elision);    }};

Source: lib/accy/src/preparation/bufferization/pass.zig:21

zig
pub const BufferSlot = struct {    id: usize,    value: *ir.Value,    producer: ?*ir.Operation,    function: ?*ir.Operation,    role: BufferRole,    dtype: choir_abi.DType,    dims: []i64,    element_count: ?u64,    row_major_strides: ?[]u64,    byte_size: ?u64,    fn init(        allocator: std.mem.Allocator,        id: usize,        value: *ir.Value,        producer: ?*ir.Operation,        function: ?*ir.Operation,        role: BufferRole,        info: shape_analysis.TensorInfo,    ) !BufferSlot {        const dims = try allocator.dupe(i64, info.dims);        errdefer allocator.free(dims);        var strides: ?[]u64 = null;        if (info.row_major_strides) |existing| {            strides = try allocator.dupe(u64, existing);            errdefer if (strides) |owned| allocator.free(owned);        }        return .{            .id = id,            .value = value,            .producer = producer,            .function = function,            .role = role,            .dtype = info.dtype,            .dims = dims,            .element_count = info.element_count,            .row_major_strides = strides,            .byte_size = byteSize(info),        };    }    pub fn hasStaticSize(self: BufferSlot) bool {        return self.byte_size != null;    }    fn deinit(self: *BufferSlot, allocator: std.mem.Allocator) void {        allocator.free(self.dims);        if (self.row_major_strides) |strides| allocator.free(strides);        self.* = undefined;    }};

Source: lib/accy/src/preparation/bufferization/pass.zig:76

zig
pub const FusionElision = struct {    value: *ir.Value,    producer: *ir.Operation,    root: *ir.Operation,    cluster_index: usize,};
Called byCallsNo direct callsprivate sourcelib.accy.src.preparation.bufferization.passcleanupBufferPlanAnalysispreparation.bufferization.BufferPlanAnalysisdeinit
Static calls · unresolved targets: 0 · external targets: 3.
Called byCallsNo direct callsprivate sourcelib.accy.src.preparation.bufferization.passcheckBufferStoragepreparation.bufferization.BufferPlanAnalysiselisionCount
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsprivate sourcelib.accy.src.preparation.bufferization.passcheckBufferStoragepreparation.bufferization.BufferPlanAnalysisgetSlot
Static calls · unresolved targets: 1 · external targets: 0.
Called byCallsNo direct callsprivate sourcelib.accy.src.preparation.bufferization.passcomputeBufferPlanAnalysispreparation.bufferization.BufferPlanAnalysisinit
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callsprivate sourcelib.accy.src.preparation.bufferization.passcheckBufferStoragepreparation.bufferization.BufferPlanAnalysisslotCount
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/accy/src/preparation/bufferization/pass.zig:277

zig
pub const buffer_plan_analysis_descriptor = passes.AnalysisDescriptor{    .id = passes.analysisId(buffer_plan_analysis_name),    .name = buffer_plan_analysis_name,    .work_contract = .{        .identity = .{ .name = buffer_plan_analysis_name, .version = 1 },        .estimate = bufferAnalysisWork,    },};

Source: lib/accy/src/preparation/bufferization/pass.zig:14

zig
pub const buffer_plan_analysis_name = "accy-choir-buffer-plan";

Source: lib/accy/src/preparation/bufferization/pass.zig:299

zig
pub fn bufferizationPlanningPass() passes.Pass {    return .{        .name = bufferization_planning_pass_name,        .description = bufferization_planning_pass_description,        .run_fn = runBufferizationPlanningPass,        .work_contract = .{            .identity = .{ .name = bufferization_planning_pass_name, .version = 1 },            .estimate = bufferPassWork,        },    };}
Called byCallsNo direct callsprivate sourcelib.accy.src.preparation.bufferization.passcheckBufferAdmissiontest sourcelib.accy.src.preparation.bufferization.passtest: bufferization planning pass pre...preparation.bufferizationbufferizationPlanningPass
Static calls · unresolved targets: 0 · external targets: 0.

Source: lib/accy/src/preparation/bufferization/pass.zig:16

zig
pub const bufferization_planning_pass_description =    "Plan Accy Choir tensor buffer slots before lowering";

Source: lib/accy/src/preparation/bufferization/pass.zig:15

zig
pub const bufferization_planning_pass_name = "accy-choir-plan-buffers";

Source: lib/accy/src/preparation/bufferization/pass.zig:286

zig
pub fn getBufferPlanAnalysis(    pass_ctx: *passes.PassContext,    op: *ir.Operation,) !*BufferPlanAnalysis {    const ptr = try pass_ctx.getAnalysis(        op,        &buffer_plan_analysis_descriptor,        computeBufferPlanAnalysis,        cleanupBufferPlanAnalysis,    );    return @ptrCast(@alignCast(ptr));}
Called byCallsNo direct callsprivate sourcelib.accy.src.preparation.bufferization.passcheckBufferBoundaryprivate sourcelib.accy.src.preparation.bufferization.passcheckBufferChainprivate sourcelib.accy.src.preparation.bufferization.passrunBufferizationPlanningPasstest sourcelib.accy.src.preparation.bufferization.passtest: bufferization planning coalesce...test sourcelib.accy.src.preparation.bufferization.passtest: bufferization planning elides f...+4 morepreparation.bufferizationgetBufferPlanAnalysis
Static calls · unresolved targets: 0 · external targets: 1.

Source: lib/accy/src/preparation/bufferization/pass.zig:19

zig
pub const BufferRole = accy_choir.record.memory.BufferRole;

Source: lib/accy/src/preparation/bufferization/root.zig

zig
const pass = @import("pass.zig");pub const buffer_plan_analysis_name = pass.buffer_plan_analysis_name;pub const bufferization_planning_pass_name = pass.bufferization_planning_pass_name;pub const bufferization_planning_pass_description = pass.bufferization_planning_pass_description;pub const BufferRole = pass.BufferRole;pub const BufferSlot = pass.BufferSlot;pub const FusionElision = pass.FusionElision;pub const BufferPlanAnalysis = pass.BufferPlanAnalysis;pub const buffer_plan_analysis_descriptor = pass.buffer_plan_analysis_descriptor;pub const getBufferPlanAnalysis = pass.getBufferPlanAnalysis;pub const bufferizationPlanningPass = pass.bufferizationPlanningPass;

Source: lib/accy/src/preparation/root.zig:2

zig
pub const bufferization = @import("bufferization/root.zig");

Complete caller list for preparation.bufferization.getBufferPlanAnalysis

9 direct callers.

Audit

Definitions18
Public names20
Members25
Version26.7.0
Revisiondaab053ee433