Skip to documentation
SLOP

tiny.smt.Context

Reference tiny.smt Context

Defined in term.

One table that owns every term and function declaration it holds.

API (57)

Actions

Public operations.

Fields and members

Public fields and members.

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

Source

Source: lib/smt/src/term.zig:336

zig
/// One table that owns every term and function declaration it holds. Every formula starts here: a/// caller makes one, builds its terms with the builders, and frees them all at once with `deinit`./// Each builder appends one term and returns its index. The builders check no sorts, except/// `function` and `apply`, and `sortOf` checks a term's sort when a caller asks. Every builder can/// fail with `error.OutOfMemory`, and a failed builder leaves the table as it was. A `Script`, a/// parser and an encoder borrow the `Context` and have to be freed before it.pub const Context = struct {    /// The allocator for every term, name, operand list and declaration. A `Script` over this table    /// and the SMT-LIB parser allocate with it too.    allocator: std.mem.Allocator,    /// Every term in the order it was built: entry i is the term whose index is i. The encoder and    /// the SMT-LIB writer read it to walk every named constant.    nodes: std.ArrayList(Expr) = .empty,    /// Every function declaration in the order it was declared: entry i is the function whose index    /// is i.    functions: std.ArrayList(FunctionDecl) = .empty,    /// Returns an empty table that allocates with `allocator`, so a caller makes one before    /// building any term. The call allocates nothing.    pub fn init(allocator: std.mem.Allocator) Context {        return .{ .allocator = allocator };    }    /// Frees every term's name and operand list, every declaration and both tables, so the owner    /// calls it once after every `Script`, parser and encoder built over the table is done with its    /// terms. Every `Term` and `Function` index from this table is invalid afterward.    pub fn deinit(self: *Context) void {        for (self.nodes.items) |node| {            switch (node) {                .symbol => |sym| self.allocator.free(sym.name),                .apply => |item| self.allocator.free(item.args),                .and_, .or_, .distinct, .add, .mul => |items| self.allocator.free(items),                else => {},            }        }        for (self.functions.items) |decl| {            self.allocator.free(decl.name);            self.allocator.free(decl.params);        }        self.functions.deinit(self.allocator);        self.nodes.deinit(self.allocator);        self.* = undefined;    }    /// Appends a named constant of the given sort and returns its term, so code declares each free    /// variable of a formula with it, as the SMT-LIB parser does for every `declare-const`. The    /// builder copies `name`, so the caller may free its own copy. The builder builds a new term on    /// every call, even for a name used before.    pub fn symbol(self: *Context, name: []const u8, sort: Sort) !Term {        const owned_name = try self.allocator.dupe(u8, name);        errdefer self.allocator.free(owned_name);        return try self.append(.{ .symbol = .{ .name = owned_name, .sort = sort } });    }    /// Declares a function by name, argument sorts and result sort, and returns its index, so code    /// declares each uninterpreted function with it, as the SMT-LIB parser does for every    /// `declare-fun`. A second call with the same name and the same sorts returns the first index.    /// A second call with the same name and other sorts returns `error.DuplicateFunction`. The    /// builder copies `name` and `params`.    pub fn function(        self: *Context,        name: []const u8,        params: []const Sort,        result: Sort,    ) !Function {        for (self.functions.items, 0..) |decl, index| {            if (!std.mem.eql(u8, decl.name, name)) continue;            if (!sortListsEqual(decl.params, params) or !decl.result.eql(result)) {                return error.DuplicateFunction;            }            return @intCast(index);        }        const owned_name = try self.allocator.dupe(u8, name);        errdefer self.allocator.free(owned_name);        const owned_params = try self.allocator.dupe(Sort, params);        errdefer self.allocator.free(owned_params);        const id: Function = @intCast(self.functions.items.len);        try self.functions.append(self.allocator, .{            .name = owned_name,            .params = owned_params,            .result = result,        });        return id;    }    /// Appends the application of the function `function_id` to `args` and returns its term, so    /// code applies a declared function to arguments with it. The call returns    /// `error.UnknownFunction` for an index past the declarations, `error.FunctionArityMismatch`    /// for the wrong number of arguments, and `error.FunctionArgumentSortMismatch` for an argument    /// of the wrong sort. The builder computes each argument's sort with `sortOf`, so the call also    /// returns the errors of `sortOf` for an argument that has no sort. The builder copies `args`.    pub fn apply(self: *Context, function_id: Function, args: []const Term) !Term {        if (function_id >= self.functions.items.len) return error.UnknownFunction;        const decl = self.functions.items[function_id];        if (decl.params.len != args.len) return error.FunctionArityMismatch;        for (args, decl.params) |arg, expected| {            if (!(try self.sortOf(arg)).eql(expected)) return error.FunctionArgumentSortMismatch;        }        const owned = try self.allocator.dupe(Term, args);        errdefer self.allocator.free(owned);        return try self.append(.{ .apply = .{ .function = function_id, .args = owned } });    }    /// Returns the sort of term `id`, checking every operand below it against the sorts its    /// operator accepts, so code checks a formula's sorts before encoding or writing, and the    /// encoder reads each function argument's sort with it. The call returns `error.TermOutOfRange`    /// for an index past the table, `error.SortMismatch` for an operand of the wrong sort,    /// `error.InvalidBitVectorRange` for a bad extract range, and the errors of `apply` for a bad    /// application. The function allocates nothing, and the call walks the whole term below `id` on    /// every call. The recursion has no depth bound, and a term that refers to itself makes the    /// call recurse without end.    pub fn sortOf(self: *const Context, id: Term) anyerror!Sort {        if (id >= self.nodes.items.len) return error.TermOutOfRange;        return switch (self.nodes.items[id]) {            .symbol => |sym| sym.sort,            .apply => |item| try self.sortOfApply(item),            .bool => .bool,            .int => .int,            .bitvec => |value| .{ .bitvec = value.width },            .not => |operand| try self.expectBoolResult(operand),            .and_, .or_ => |operands| try self.expectBoolList(operands),            .implies => |pair| try self.expectBoolPair(pair.lhs, pair.rhs),            .eq => |pair| try self.expectSameSortPair(pair.lhs, pair.rhs),            .distinct => |operands| try self.expectSameSortList(operands),            .add, .mul => |operands| try self.expectIntList(operands),            .le => |pair| try self.expectIntPair(pair.lhs, pair.rhs),            .lt => |pair| try self.expectIntPair(pair.lhs, pair.rhs),            .ge => |pair| try self.expectIntPair(pair.lhs, pair.rhs),            .gt => |pair| try self.expectIntPair(pair.lhs, pair.rhs),            .bvule => |pair| try self.expectBitVecPair(pair.lhs, pair.rhs),            .bvult => |pair| try self.expectBitVecPair(pair.lhs, pair.rhs),            .bvsle => |pair| try self.expectBitVecPair(pair.lhs, pair.rhs),            .bvslt => |pair| try self.expectBitVecPair(pair.lhs, pair.rhs),            .bvuaddo => |pair| try self.expectBitVecPair(pair.lhs, pair.rhs),            .bvsaddo => |pair| try self.expectBitVecPair(pair.lhs, pair.rhs),            .bvssubo => |pair| try self.expectBitVecPair(pair.lhs, pair.rhs),            .bvumulo => |pair| try self.expectBitVecPair(pair.lhs, pair.rhs),            .bvsmulo => |pair| try self.expectBitVecPair(pair.lhs, pair.rhs),            .bvnot => |operand| try self.expectBitVecResult(operand),            .bvand => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvor => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvxor => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvshl => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvlshr => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvashr => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvudiv => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvurem => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvsdiv => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvsrem => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvsmod => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvadd => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvsub => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .bvmul => |pair| try self.expectBitVecPairResult(pair.lhs, pair.rhs),            .array_select => |item| try self.sortOfArraySelect(item.array, item.index),            .array_store => |item| try self.sortOfArrayStore(item.array, item.index, item.value),            .bvconcat => |pair| try self.sortOfConcat(pair.lhs, pair.rhs),            .bvextract => |item| try self.sortOfExtract(item.operand, item.high, item.low),            .bvzeroext => |item| try self.sortOfExtend(item.operand, item.extra),            .bvsignext => |item| try self.sortOfExtend(item.operand, item.extra),            .bvrotl => |item| try self.expectBitVecResult(item.operand),            .bvrotr => |item| try self.expectBitVecResult(item.operand),        };    }    /// Appends the constant `value` and returns its term, so code builds the Boolean constants with    /// it.    pub fn boolValue(self: *Context, value: bool) !Term {        return try self.append(.{ .bool = value });    }    /// Appends the integer constant `value` and returns its term, so code builds integer constants    /// with it, as the SMT-LIB parser does for every numeral.    pub fn intValue(self: *Context, value: i128) !Term {        return try self.append(.{ .int = value });    }    /// Appends the constant with bits `value` and width `width` and returns its term, so code    /// builds bit-vector constants with it, as the SMT-LIB parser does for every `(_ bvV W)`. The    /// builder checks neither the value against the width nor the width. A width above 128 makes    /// the encoder panic.    pub fn bitvecValue(self: *Context, value: u128, width: u32) !Term {        return try self.append(.{ .bitvec = .{ .value = value, .width = width } });    }    /// Appends the negation of `operand` and returns its term, so code negates a Boolean term with    /// it.    pub fn not(self: *Context, operand: Term) !Term {        return try self.append(.{ .not = operand });    }    /// Appends the conjunction of `operands` and returns its term, so code calls it to join Boolean    /// terms that must all hold. The builder copies `operands`.    pub fn and_(self: *Context, operands: []const Term) !Term {        return try self.appendList(.and_, operands);    }    /// Appends the disjunction of `operands` and returns its term, so code calls it to join Boolean    /// terms of which one must hold. The builder copies `operands`.    pub fn or_(self: *Context, operands: []const Term) !Term {        return try self.appendList(.or_, operands);    }    /// Appends `lhs` implies `rhs` and returns its term, so code states that one Boolean term    /// implies another with it.    pub fn implies(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .implies = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends `lhs` equals `rhs` and returns its term, so code calls it to state that two terms    /// are equal.    pub fn eq(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .eq = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the claim that `operands` all differ and returns its term, so code states that terms    /// all differ with it. The builder copies `operands`. The bit-vector encoder refuses the term.    pub fn distinct(self: *Context, operands: []const Term) !Term {        return try self.appendList(.distinct, operands);    }    /// Appends the integer sum of `operands` and returns its term, so code adds integer terms with    /// it. The builder copies `operands`. The bit-vector encoder refuses the term.    pub fn add(self: *Context, operands: []const Term) !Term {        return try self.appendList(.add, operands);    }    /// Appends the integer product of `operands` and returns its term, so code multiplies integer    /// terms with it. The builder copies `operands`. The bit-vector encoder refuses the term.    pub fn mul(self: *Context, operands: []const Term) !Term {        return try self.appendList(.mul, operands);    }    /// Appends the two-operand term of kind `tag` over `lhs` and `rhs` and returns its term, so the    /// SMT-LIB parser calls it with the tag of each two-operand operator it reads, and one call    /// covers every such operator. The parameter `tag` names a kind whose payload is    /// `BinaryOperands`, or `.array_select`, which the builder builds with `arraySelect`. Any other    /// tag is a compile error.    pub fn binary(self: *Context, comptime tag: std.meta.Tag(Expr), lhs: Term, rhs: Term) !Term {        return switch (tag) {            .implies,            .eq,            .le,            .lt,            .ge,            .gt,            .bvule,            .bvult,            .bvsle,            .bvslt,            .bvuaddo,            .bvsaddo,            .bvssubo,            .bvumulo,            .bvsmulo,            .bvand,            .bvor,            .bvxor,            .bvshl,            .bvlshr,            .bvashr,            .bvudiv,            .bvurem,            .bvsdiv,            .bvsrem,            .bvsmod,            .bvconcat,            .bvadd,            .bvsub,            .bvmul,            => try self.appendPair(tag, lhs, rhs),            .array_select => try self.arraySelect(lhs, rhs),            else => unreachable,        };    }    /// Appends `lhs` at most `rhs`, as integers, and returns its term, so code compares integer    /// terms with it. The bit-vector encoder refuses the term.    pub fn le(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .le = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends `lhs` less than `rhs`, as integers, and returns its term, so code compares integer    /// terms with it. The bit-vector encoder refuses the term.    pub fn lt(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .lt = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends `lhs` at least `rhs`, as integers, and returns its term, so code compares integer    /// terms with it. The bit-vector encoder refuses the term.    pub fn ge(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .ge = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends `lhs` greater than `rhs`, as integers, and returns its term, so code compares    /// integer terms with it. The bit-vector encoder refuses the term.    pub fn gt(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .gt = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends `lhs` at most `rhs`, as unsigned bit-vectors, and returns its term, so code compares    /// bit-vectors as unsigned numbers with it.    pub fn bvule(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvule = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends `lhs` less than `rhs`, as unsigned bit-vectors, and returns its term, so code    /// compares bit-vectors as unsigned numbers with it, as the SMT-LIB round-trip test does.    pub fn bvult(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvult = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends `lhs` at most `rhs`, as two's-complement bit-vectors, and returns its term, so code    /// compares bit-vectors as two's-complement numbers with it.    pub fn bvsle(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvsle = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends `lhs` less than `rhs`, as two's-complement bit-vectors, and returns its term, so    /// code compares bit-vectors as two's-complement numbers with it.    pub fn bvslt(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvslt = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the claim that the unsigned sum of `lhs` and `rhs` overflows their width and returns    /// its term. Code asks with it whether an unsigned addition can overflow.    pub fn bvuaddo(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvuaddo = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the claim that the two's-complement sum of `lhs` and `rhs` overflows their width and    /// returns its term. Code asks with it whether a two's-complement addition can overflow.    pub fn bvsaddo(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvsaddo = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the claim that the two's-complement difference `lhs` minus `rhs` overflows their    /// width and returns its term. Code asks with it whether a two's-complement subtraction can    /// overflow.    pub fn bvssubo(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvssubo = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the claim that the unsigned product of `lhs` and `rhs` overflows their width and    /// returns its term. Code asks with it whether an unsigned multiplication can overflow.    pub fn bvumulo(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvumulo = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the claim that the two's-complement product of `lhs` and `rhs` overflows their width    /// and returns its term. Code asks with it whether a two's-complement multiplication can    /// overflow.    pub fn bvsmulo(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvsmulo = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the bitwise complement of `operand` and returns its term. Code complements every bit    /// of a bit-vector with it.    pub fn bvnot(self: *Context, operand: Term) !Term {        return try self.append(.{ .bvnot = operand });    }    /// Appends the bitwise and of `lhs` and `rhs` and returns its term. Code masks bit-vectors with    /// it.    pub fn bvand(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvand = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the bitwise or of `lhs` and `rhs` and returns its term. Code sets bits of a    /// bit-vector with it.    pub fn bvor(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvor = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the bitwise exclusive or of `lhs` and `rhs` and returns its term. Code flips bits of    /// a bit-vector with it.    pub fn bvxor(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvxor = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends `lhs` shifted toward its most significant bit by the value of `rhs` and returns its    /// term. Code shifts a bit-vector left with it.    pub fn bvshl(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvshl = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends `lhs` shifted toward its least significant bit by the value of `rhs`, with zeros    /// shifted in, and returns its term. Code shifts with it a bit-vector right with zero fill.    pub fn bvlshr(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvlshr = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends `lhs` shifted toward its least significant bit by the value of `rhs`, with copies of    /// its sign bit shifted in, and returns its term. Code shifts a two's-complement bit-vector    /// right with it.    pub fn bvashr(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvashr = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the unsigned quotient of `lhs` by `rhs` and returns its term. Code divides    /// bit-vectors as unsigned numbers with it.    pub fn bvudiv(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvudiv = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the unsigned remainder of `lhs` by `rhs` and returns its term. Code takes the    /// unsigned remainder of bit-vectors with it.    pub fn bvurem(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvurem = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the two's-complement quotient of `lhs` by `rhs`, rounded toward zero, and returns    /// its term. Code divides bit-vectors as two's-complement numbers with it.    pub fn bvsdiv(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvsdiv = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the remainder of `lhs` by `rhs` with the sign of `lhs` and returns its term. Code    /// takes the two's-complement remainder of bit-vectors with it.    pub fn bvsrem(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvsrem = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the modulo of `lhs` by `rhs` with the sign of `rhs` and returns its term. Code takes    /// the two's-complement modulo of bit-vectors with it.    pub fn bvsmod(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvsmod = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the element of `array` at `index` and returns its term. Code reads an array at an    /// index with it.    pub fn arraySelect(self: *Context, array: Term, index: Term) !Term {        return try self.append(.{ .array_select = .{ .array = array, .index = index } });    }    /// Appends the array equal to `array` except that `index` holds `value`, and returns its term.    /// Code writes an element into an array with it.    pub fn arrayStore(self: *Context, array: Term, index: Term, value: Term) !Term {        return try self.append(.{ .array_store = .{            .array = array,            .index = index,            .value = value,        } });    }    /// Appends the bits of `lhs` above the bits of `rhs` and returns its term. Code joins two    /// bit-vectors into a wider one with it.    pub fn bvconcat(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvconcat = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the bits from position `high` down to position `low` of `operand`, both included,    /// and returns its term. Code takes a range of bits from a bit-vector with it. It checks no    /// range: `sortOf` and the encoder report `InvalidBitVectorRange` when `low` is above `high` or    /// `high` is at or above the width.    pub fn bvextract(self: *Context, operand: Term, high: u32, low: u32) !Term {        return try self.append(.{ .bvextract = .{ .operand = operand, .high = high, .low = low } });    }    /// Appends `operand` widened by `extra` zero bits above its most significant bit and returns    /// its term. Code widens an unsigned bit-vector with it.    pub fn bvzeroext(self: *Context, operand: Term, extra: u32) !Term {        return try self.append(.{ .bvzeroext = .{ .operand = operand, .extra = extra } });    }    /// Appends `operand` widened by `extra` copies of its sign bit and returns its term. Code    /// widens a two's-complement bit-vector with it.    pub fn bvsignext(self: *Context, operand: Term, extra: u32) !Term {        return try self.append(.{ .bvsignext = .{ .operand = operand, .extra = extra } });    }    /// Appends `operand` rotated toward its most significant bit by `amount` positions and returns    /// its term. Code rotates a bit-vector left by a fixed amount with it.    pub fn bvrotl(self: *Context, operand: Term, amount: u32) !Term {        return try self.append(.{ .bvrotl = .{ .operand = operand, .amount = amount } });    }    /// Appends `operand` rotated toward its least significant bit by `amount` positions and returns    /// its term. Code rotates a bit-vector right by a fixed amount with it.    pub fn bvrotr(self: *Context, operand: Term, amount: u32) !Term {        return try self.append(.{ .bvrotr = .{ .operand = operand, .amount = amount } });    }    /// Appends the sum of `lhs` and `rhs`, modulo 2 to the power of their width, and returns its    /// term. Code adds bit-vectors with it.    pub fn bvadd(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvadd = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends `lhs` minus `rhs`, modulo 2 to the power of their width, and returns its term. Code    /// subtracts bit-vectors with it.    pub fn bvsub(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvsub = .{ .lhs = lhs, .rhs = rhs } });    }    /// Appends the product of `lhs` and `rhs`, modulo 2 to the power of their width, and returns    /// its term. Code multiplies bit-vectors with it.    pub fn bvmul(self: *Context, lhs: Term, rhs: Term) !Term {        return try self.append(.{ .bvmul = .{ .lhs = lhs, .rhs = rhs } });    }    fn sortOfApply(self: *const Context, item: ApplyExpr) !Sort {        if (item.function >= self.functions.items.len) return error.UnknownFunction;        const decl = self.functions.items[item.function];        if (decl.params.len != item.args.len) return error.FunctionArityMismatch;        for (item.args, decl.params) |arg, expected| {            if (!(try self.sortOf(arg)).eql(expected)) return error.FunctionArgumentSortMismatch;        }        return decl.result;    }    fn expectBoolResult(self: *const Context, operand: Term) !Sort {        if (!(try self.sortOf(operand)).eql(.bool)) return error.SortMismatch;        return .bool;    }    fn expectBoolPair(self: *const Context, lhs: Term, rhs: Term) !Sort {        if (!(try self.sortOf(lhs)).eql(.bool) or !(try self.sortOf(rhs)).eql(.bool)) {            return error.SortMismatch;        }        return .bool;    }    fn expectBoolList(self: *const Context, operands: []const Term) !Sort {        for (operands) |operand| {            if (!(try self.sortOf(operand)).eql(.bool)) return error.SortMismatch;        }        return .bool;    }    fn expectIntPair(self: *const Context, lhs: Term, rhs: Term) !Sort {        if (!(try self.sortOf(lhs)).eql(.int) or !(try self.sortOf(rhs)).eql(.int)) {            return error.SortMismatch;        }        return .bool;    }    fn expectIntList(self: *const Context, operands: []const Term) !Sort {        for (operands) |operand| {            if (!(try self.sortOf(operand)).eql(.int)) return error.SortMismatch;        }        return .int;    }    fn expectSameSortPair(self: *const Context, lhs: Term, rhs: Term) !Sort {        if (!(try self.sortOf(lhs)).eql(try self.sortOf(rhs))) return error.SortMismatch;        return .bool;    }    fn expectSameSortList(self: *const Context, operands: []const Term) !Sort {        if (operands.len == 0) return .bool;        const expected = try self.sortOf(operands[0]);        for (operands[1..]) |operand| {            if (!(try self.sortOf(operand)).eql(expected)) return error.SortMismatch;        }        return .bool;    }    fn expectBitVecPair(self: *const Context, lhs: Term, rhs: Term) !Sort {        _ = try self.expectBitVecPairResult(lhs, rhs);        return .bool;    }    fn expectBitVecResult(self: *const Context, operand: Term) !Sort {        return switch (try self.sortOf(operand)) {            .bitvec => |width| .{ .bitvec = width },            else => error.SortMismatch,        };    }    fn expectBitVecPairResult(self: *const Context, lhs: Term, rhs: Term) !Sort {        return switch (try self.sortOf(lhs)) {            .bitvec => |lhs_width| switch (try self.sortOf(rhs)) {                .bitvec => |rhs_width| {                    if (lhs_width != rhs_width) return error.SortMismatch;                    return .{ .bitvec = lhs_width };                },                else => error.SortMismatch,            },            else => error.SortMismatch,        };    }    fn sortOfArraySelect(self: *const Context, array: Term, index: Term) !Sort {        const array_sort = try self.sortOf(array);        const index_sort = try self.sortOf(index);        return switch (array_sort) {            .array => |shape| switch (index_sort) {                .bitvec => |width| {                    if (width != shape.index_width) return error.SortMismatch;                    return .{ .bitvec = shape.element_width };                },                else => error.SortMismatch,            },            else => error.SortMismatch,        };    }    fn sortOfArrayStore(self: *const Context, array: Term, index: Term, value: Term) !Sort {        const array_sort = try self.sortOf(array);        const index_sort = try self.sortOf(index);        const value_sort = try self.sortOf(value);        return switch (array_sort) {            .array => |shape| switch (index_sort) {                .bitvec => |index_width| switch (value_sort) {                    .bitvec => |element_width| {                        if (index_width != shape.index_width or                            element_width != shape.element_width)                        {                            return error.SortMismatch;                        }                        return array_sort;                    },                    else => error.SortMismatch,                },                else => error.SortMismatch,            },            else => error.SortMismatch,        };    }    fn sortOfConcat(self: *const Context, lhs: Term, rhs: Term) !Sort {        return switch (try self.sortOf(lhs)) {            .bitvec => |lhs_width| switch (try self.sortOf(rhs)) {                .bitvec => |rhs_width| .{ .bitvec = try std.math.add(u32, lhs_width, rhs_width) },                else => error.SortMismatch,            },            else => error.SortMismatch,        };    }    fn sortOfExtract(self: *const Context, operand: Term, high: u32, low: u32) !Sort {        return switch (try self.sortOf(operand)) {            .bitvec => |width| {                if (low > high or high >= width) return error.InvalidBitVectorRange;                return .{ .bitvec = high - low + 1 };            },            else => error.SortMismatch,        };    }    fn sortOfExtend(self: *const Context, operand: Term, extra: u32) !Sort {        return switch (try self.sortOf(operand)) {            .bitvec => |width| .{ .bitvec = try std.math.add(u32, width, extra) },            else => error.SortMismatch,        };    }    fn append(self: *Context, expr: Expr) !Term {        const id: Term = @intCast(self.nodes.items.len);        try self.nodes.append(self.allocator, expr);        return id;    }    fn appendPair(self: *Context, comptime tag: std.meta.Tag(Expr), lhs: Term, rhs: Term) !Term {        return try self.append(@unionInit(Expr, @tagName(tag), .{ .lhs = lhs, .rhs = rhs }));    }    fn appendList(self: *Context, comptime tag: std.meta.Tag(Expr), operands: []const Term) !Term {        const owned = try self.allocator.dupe(Term, operands);        errdefer self.allocator.free(owned);        return switch (tag) {            .and_ => try self.append(.{ .and_ = owned }),            .or_ => try self.append(.{ .or_ = owned }),            .distinct => try self.append(.{ .distinct = owned }),            .add => try self.append(.{ .add = owned }),            .mul => try self.append(.{ .mul = owned }),            else => unreachable,        };    }};

Source: lib/smt/src/root.zig:114

zig
pub const Context = term.Context;
Called byCallstest sourcelib.smt.src.termtest: term context stores structured ...private sourcelib.smt.src.term.ContextappendListContextadd
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder proves bound...test sourcelib.smt.src.bitvectest: bit-vector encoder proves bound...private sourcelib.smt.src.term.ContextappendListContextand
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder enforces boo...test sourcelib.smt.src.bitvectest: bit-vector encoder enforces uni...test sourcelib.smt.src.bitvectest: bit-vector encoder permits dist...test sourcelib.smt.src.bitvectest: bit-vector model skips unused u...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads uninterp...test sourcelib.smt.src.termtest: term context stores function ap...private sourcelib.smt.src.term.ContextappendContextsortOfContextapply
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder compares fin...test sourcelib.smt.src.bitvectest: bit-vector encoder rejects over...test sourcelib.smt.src.bitvectest: bit-vector encoder solves finit...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...Contextbinary+2 moreprivate sourcelib.smt.src.term.ContextappendContextarraySelect
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder rejects over...test sourcelib.smt.src.bitvectest: bit-vector encoder solves finit...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores finite bit-...private sourcelib.smt.src.term.ContextappendContextarrayStore
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.smt.src.term.ContextappendPairContextarraySelectContextbinary
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder compares fin...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects unsi...+35 moreprivate sourcelib.smt.src.term.ContextappendContextbitvecValue
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.smt.src.term.ContextappendContextboolValue
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder extracts nam...test sourcelib.smt.src.bitvectest: bit-vector encoder finds wrappe...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads emitted ...private sourcelib.smt.src.term.ContextappendContextbvadd
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder solves bitwi...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bitwise ...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvand
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder solves arith...test sourcelib.smt.src.bitvectest: bit-vector encoder treats large...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvashr
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder solves conca...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context infers composite s...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvconcat
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder rejects inva...test sourcelib.smt.src.bitvectest: bit-vector encoder solves conca...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context infers composite s...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvextract
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder solves arith...test sourcelib.smt.src.bitvectest: bit-vector encoder solves symbo...test sourcelib.smt.src.bitvectest: bit-vector encoder treats large...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvlshr
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder multiplies e...private sourcelib.smt.src.term.ContextappendContextbvmul
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder solves bitwi...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bitwise ...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvnot
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder solves bitwi...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bitwise ...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvor
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder rejects impo...test sourcelib.smt.src.bitvectest: bit-vector encoder solves fixed...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvrotl
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder solves fixed...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvrotr
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder proves signe...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads overflow...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvsaddo
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder follows sign...test sourcelib.smt.src.bitvectest: bit-vector encoder solves signe...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvsdiv
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder rejects impo...test sourcelib.smt.src.bitvectest: bit-vector encoder solves symbo...test sourcelib.smt.src.bitvectest: bit-vector encoder treats large...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvshl
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder solves zero ...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvsignext
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder solves signe...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads signed b...test sourcelib.smt.src.termtest: term context stores signed bit-...private sourcelib.smt.src.term.ContextappendContextbvsle
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder proves signe...test sourcelib.smt.src.bitvectest: bit-vector encoder solves signe...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads signed b...test sourcelib.smt.src.termtest: term context stores signed bit-...private sourcelib.smt.src.term.ContextappendContextbvslt
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder follows sign...test sourcelib.smt.src.bitvectest: bit-vector encoder solves signe...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvsmod
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder proves signe...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads overflow...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvsmulo
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder follows sign...test sourcelib.smt.src.bitvectest: bit-vector encoder solves signe...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvsrem
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder proves signe...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads overflow...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvssubo
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder solves subtr...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores signed bit-...private sourcelib.smt.src.term.ContextappendContextbvsub
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder detects unsi...test sourcelib.smt.src.bitvectest: bit-vector encoder proves bound...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads overflow...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvuaddo
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder follows unsi...test sourcelib.smt.src.bitvectest: bit-vector encoder rejects wrap...test sourcelib.smt.src.bitvectest: bit-vector encoder solves unsig...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvudiv
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.smt.src.term.ContextappendContextbvule
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder proves bound...test sourcelib.smt.src.bitvectest: bit-vector encoder proves unsig...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads emitted ...private sourcelib.smt.src.term.ContextappendContextbvult
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder detects unsi...test sourcelib.smt.src.bitvectest: bit-vector encoder proves bound...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads overflow...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvumulo
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder follows unsi...test sourcelib.smt.src.bitvectest: bit-vector encoder solves unsig...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvurem
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder proves xor s...test sourcelib.smt.src.bitvectest: bit-vector encoder solves bitwi...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bitwise ...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvxor
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder solves zero ...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads bit-vect...test sourcelib.smt.src.termtest: term context stores bit-vector ...private sourcelib.smt.src.term.ContextappendContextbvzeroext
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callstest sourcelib.smt.src.bitvectest: bit-vector encoder compares fin...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects unsi...+61 moreContextdeinit
Static calls · unresolved targets: 0 · external targets: 2.
Called byCallsNo direct callersprivate sourcelib.smt.src.term.ContextappendListContextdistinct
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder compares fin...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects unsi...+41 moreprivate sourcelib.smt.src.term.ContextappendContexteq
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder enforces boo...test sourcelib.smt.src.bitvectest: bit-vector encoder enforces uni...test sourcelib.smt.src.bitvectest: bit-vector encoder permits dist...test sourcelib.smt.src.bitvectest: bit-vector model skips unused u...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads uninterp...test sourcelib.smt.src.termtest: term context stores function ap...private sourcelib.smt.src.termsortListsEqualContextfunction
Static calls · unresolved targets: 1 · external targets: 3.
Called byCallstest sourcelib.smt.src.smtlib.writetest: SMT-LIB writer emits declaratio...private sourcelib.smt.src.term.ContextappendContextge
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.termtest: term context stores structured ...private sourcelib.smt.src.term.ContextappendContextgt
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.smt.src.term.ContextappendContextimplies
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callstest sourcelib.smt.src.bitvectest: bit-vector encoder compares fin...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects unsi...+61 moreContextinit
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.smtlib.writetest: SMT-LIB writer emits declaratio...test sourcelib.smt.src.termtest: term context stores structured ...private sourcelib.smt.src.term.ContextappendContextintValue
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.smt.src.term.ContextappendContextle
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.smt.src.term.ContextappendContextlt
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsNo direct callersprivate sourcelib.smt.src.term.ContextappendListContextmul
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder compares fin...test sourcelib.smt.src.bitvectest: bit-vector encoder enforces boo...test sourcelib.smt.src.bitvectest: bit-vector encoder enforces uni...test sourcelib.smt.src.bitvectest: bit-vector encoder solves signe...test sourcelib.smt.src.bitvectest: bit-vector encoder solves with ...test sourcelib.smt.src.smtlib.testtest: SMT-LIB parser rereads overflow...private sourcelib.smt.src.term.ContextappendContextnot
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder solves with ...private sourcelib.smt.src.term.ContextappendListContextor
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallsprivate sourcelib.smt.src.bitvec.EncodermodelArgumentsContextapplyprivate sourcelib.smt.src.term.ContextexpectBitVecPairResultprivate sourcelib.smt.src.term.ContextexpectBitVecResultprivate sourcelib.smt.src.term.ContextexpectBoolList+15 moreprivate sourcelib.smt.src.term.ContextexpectBitVecPairprivate sourcelib.smt.src.term.ContextexpectBitVecPairResultprivate sourcelib.smt.src.term.ContextexpectBitVecResultprivate sourcelib.smt.src.term.ContextexpectBoolListprivate sourcelib.smt.src.term.ContextexpectBoolPair+11 moreContextsortOf
Static calls · unresolved targets: 0 · external targets: 0.
Called byCallstest sourcelib.smt.src.bitvectest: bit-vector encoder compares fin...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects sign...test sourcelib.smt.src.bitvectest: bit-vector encoder detects unsi...+53 moreprivate sourcelib.smt.src.term.ContextappendContextsymbol
Static calls · unresolved targets: 0 · external targets: 2.

Complete caller list for Context.arraySelect

7 direct callers.

Complete caller list for Context.bitvecValue

40 direct callers.

Complete caller list for Context.deinit

66 direct callers.

Complete caller list for Context.eq

46 direct callers.

Complete caller list for Context.init

66 direct callers.

Complete caller list for Context.sortOf

20 direct callers.

Complete call list for Context.sortOf

16 direct calls.

Complete caller list for Context.symbol

58 direct callers.

Audit

Definitions55
Public names110
Members3
Version26.7.0
Revisiondaab053ee433