MimIR
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches
mim::Def Class Reference

Base class for all Defs. More...

#include <mim/def.h>

Inheritance diagram for mim::Def:
[legend]

Public Member Functions

bool has_hole () const noexcept
 Is this a Hole or does it reach one through Def::deps() up to (and excluding) the next mutable?
Getters
World & world () const noexcept
Driver & driver () const noexcept
constexpr flags_t flags () const noexcept
constexpr u32 gid () const noexcept
 Global id - unique number for this Def.
constexpr u32 mark () const noexcept
 Used internally by free_vars().
constexpr size_t hash () const noexcept
constexpr Node node () const noexcept
constexpr MutNode mut_node () const noexcept
 node() of a Def whose Node may be mutable, whether this one is or not; see MutNode.
std::string_view node_name () const
Diagnostics
fe::Error & error () const noexcept
Loc err_loc () const
 Returns a blame Loc from World::get_loc, this Def, or its nearest located dependency, in that order.
template<class... Args>
fe::Error & blame (fe::cite_string< Args... > s, Args &&... args) const
 Reports an error that blames this; chain Error::n for Notes and Error::bail to throw.
void bail_expected (fe::Cite what) const
 Blames this for not being what and bails; where Def::expect and friends funnel their diagnostic.
Judgement

What kind of Judgement represents this Def?

Judge judge () const noexcept
 Def must never become polymorphic: a vptr costs 8 bytes on every node in the World and would shift Def::type_.
bool is_form () const noexcept
bool is_intro () const noexcept
bool is_elim () const noexcept
bool is_meta () const noexcept
type
const Def * type () const noexcept
 Yields the "raw" type of this Def (maybe nullptr).
const Def * unfold_type () const
 Yields the type of this Def and builds a new Type (LSucc n) if necessary.
template<class T>
const T * isa_type () const
 Is Def::unfold_type a T? Yields nullptr for Level, which has no type at all.
bool is_term () const
 Is this Def a term, i.e. is its type() a Type?
const Def * arity () const
 Number of elements available to Extract / Insert (may be dynamic).
ops
template<size_t N = std::dynamic_extent>
constexpr auto ops () const noexcept
const Def * op (size_t i) const noexcept
constexpr size_t num_ops () const noexcept
Setting Ops (Mutables Only)

You can set and change the Def::ops of a mutable after construction.

However, you have to obey the following rules: If Def::is_set() is ...

MimIR assumes that a mutable is final, when its last operand is set. Then, Def::check() will be invoked.

bool is_set () const
Def * set (size_t i, const Def *)
 Successively set from left to right.
Def * set (Defs ops)
 Set ops all at once (no Def::unset necessary beforehand).
Def * unset ()
 Unsets all Def::ops; works even, if not set at all or only partially set.
Def * set_type (const Def *)
 Update type.
deps

All dependencies of a Def and includes:

Defs deps () const noexcept
const Def * dep (size_t i) const noexcept
size_t num_deps () const noexcept
proj

Splits this Def via Extracts or directly accessing the Def::ops in the case of Sigmas or Arrays.

std::array<const Def*, 2> ab = def->projs<2>();
std::array<u64, 2> xy = def->projs<2>([](auto def) { return Lit::as(def); });
auto [a, b] = def->projs<2>();
auto [x, y] = def->projs<2>([](auto def) { return Lit::as(def); });
fe::Vector<const Def*> projs1 = def->projs(); // "projs1" has def->num_projs() many elements
fe::Vector<const Def*> projs2 = def->projs(n);// "projs2" has n elements - asserts if incorrect
// same as above but applies Lit::as<nat_t>(def) to each element
fe::Vector<const Lit*> lits1 = def->projs( [](auto def) { return Lit::as(def); });
fe::Vector<const Lit*> lits2 = def->projs(n, [](auto def) { return Lit::as(def); });
static T as(const Def *def)
Definition def.h:982
nat_t num_projs () const
 Yields Def::arity(), if it is a Lit, or 1 otherwise.
nat_t num_tprojs () const
 As above but yields 1, if an Arr/Pack exceeds Flags::scalarize_threshold.
const Def * proj (nat_t a, nat_t i) const
 Similar to World::extract while assuming an arity of a, but also works on Sigmas and Arrays.
const Def * tproj (nat_t i) const
 As above but takes Def::num_tprojs.
template<nat_t A = std::dynamic_extent>
auto projs (Projector auto f) const
 Splits this Def via Def::projections into an Array (if A == std::dynamic_extent) or std::array (otherwise).
auto tprojs (Projector auto f) const
auto projs (nat_t a, Projector auto f) const
template<nat_t A = std::dynamic_extent>
auto projs () const
auto tprojs () const
auto projs (nat_t a) const
var

Retrieve Var for mutables.

See also
proj
nat_t num_vars () noexcept
nat_t num_tvars () noexcept
const Def * var (nat_t a, nat_t i) noexcept
const Def * tvar (nat_t i) noexcept
template<nat_t A = std::dynamic_extent>
auto vars (Projector auto f) noexcept
auto tvars (Projector auto f) noexcept
template<nat_t A = std::dynamic_extent>
auto vars () noexcept
auto tvars () noexcept
auto vars (nat_t a, Projector auto f) noexcept
auto vars (nat_t a) noexcept
const Def * var ()
 Not necessarily a Var: E.g., if the return type is [], this will yield ().
const Def * var_type ()
 If this is a binder, compute the type of its Variable.
const Var * has_var ()
 Only returns not nullptr, if Var of this mutable has ever been created.
const Var * has_var () const
 As above if this is a mutable.
template<class D = Def>
std::pair< D *, const Var * > isa_binder () const
 Is this a mutable that introduces a Var?
Free Vars and Muts

MimIR splits the free-variable analysis into a local and a global layer:

  • local_muts() / local_vars() only look at the immutable fan-out and are cheap, cached, and hash-consed.
  • free_vars() close over the mutable boundary as well and are the actual set of free Vars. They are computed on demand via a fixed-point iteration and cached in mutables. Mutating a mutable transitively invalidates these caches by following users().
Muts local_muts () const
 Mutables reachable by following immutable deps(); mut->local_muts() is by definition the set { mut }.
Vars local_vars () const
 Vars reachable by following immutable deps().
Vars free_vars () const
 Global set of free Vars: extends local_vars() by transitively following mutables as well.
Vars free_vars ()
 As above but drives (and caches) the fixed-point iteration for mutables.
Muts users ()
 Set of mutables where this mutable is locally referenced.
bool is_open () const
 Same as has_free_vars().
bool is_closed () const
 Same as !has_free_vars().
bool is_ground () const
 Immutable that contains neither mutables nor Vars.
Def * outermost_binder () const
 Transitively walks up free_vars() till the outermoust binder has been found.
bool nests (Def *mut)
 Does this nest mut?
bool nests (const Def *def)
 Does this nest def?
bool in_scope (Def *mut) const
 Is every free Var of this bound by mut or by a mutable that nests mut?
free_vars predicates

free_vars() of an immutable is not cached: it merges free_vars() of every local_muts() entry on every call, and each merge allocates, hashes, and probes the pool.

Since free_vars() is a union, any predicate over it distributes over that union - so these answer the question without ever materializing the merged set. Prefer them over free_vars().contains(...) / .empty() / has_intersection(...).

bool has_free_var (const Var *) const
 Same as free_vars().contains(var).
bool has_free_vars () const
 Same as !free_vars().empty().
bool has_free_vars_in (Vars) const
 Same as vars.has_intersection(free_vars()).
external
bool is_external () const noexcept
void externalize ()
void internalize ()
void transfer_external (Def *to)
bool is_annex () const noexcept
Casts
bool is_mutable () const noexcept
template<class T = Def>
const T * isa_imm () const
template<class T = Def>
const T * as_imm () const
template<class T = Def, bool invert = false>
T * isa_mut () const
 If this is mutable, it will cast constness away and perform a dynamic_cast to T.
template<class T = Def, bool invert = false>
T * as_mut () const
 Asserts that this is a mutable, casts constness away and performs a static_cast to T.
template<class T, class... Args>
T * expect (fe::cite_string< Args... > fmt, Args &&... args)
 Like Def::as but - instead of merely asserting in Debug builds - bails via Def::bail_expected when the cast fails; hides fe::RuntimeCast::expect, as a Def can blame itself with a Loc.
template<class T, class... Args>
const T * expect (fe::cite_string< Args... > fmt, Args &&... args) const
 const version.
template<class T = Def, class... Args>
T * expect_mut (fe::cite_string< Args... > fmt, Args &&... args) const
 The mutable counterpart of Def::expect.
Dbg Getters
Dbg dbg () const
 Looks up Def::dbg_ in Driver::dbg.
DbgKey dbg_key () const
 Cheap handle for other->set(this->dbg_key()).
Loc loc () const
Sym sym () const
std::string unique_name () const
 name + "_" + Def::gid
Dbg Setters

Every subclass S of Def has the same setters that return S*/const S* via the mixin Setters.

template<bool Ow = false>
const Def * set (Loc l) const
template<bool Ow = false>
Def * set (Loc l)
template<bool Ow = false>
const Def * set (Sym s) const
template<bool Ow = false>
Def * set (Sym s)
template<bool Ow = false>
const Def * set (std::string s) const
template<bool Ow = false>
Def * set (std::string s)
template<bool Ow = false>
const Def * set (Loc l, Sym s) const
template<bool Ow = false>
Def * set (Loc l, Sym s)
template<bool Ow = false>
const Def * set (Loc l, std::string s) const
template<bool Ow = false>
Def * set (Loc l, std::string s)
template<bool Ow = false>
const Def * set (Dbg d) const
template<bool Ow = false>
Def * set (Dbg d)
template<bool Ow = false>
const Def * set (DbgKey key) const
 Adopts the Dbg behind key - just copies the interned index, so nothing is re-interned.
template<bool Ow = false>
Def * set (DbgKey key)
debug_prefix/suffix

Prepends/Appends a prefix/suffix to Def::name - but only in Debug build.

const Def * debug_prefix (std::string) const
const Def * debug_suffix (std::string) const
Rebuild
const Def * immutabilize ()
bool is_immutabilizable ()
template<size_t N = std::dynamic_extent>
constexpr auto reduce (const Def *arg) const
size_t reduction_offset () const noexcept
 First Def::op that needs to be dealt with during reduction; e.g.
Type Checking
const Def * check (size_t i, const Def *def)
 Checks whether the ith operand can be set to def.
const Def * check ()
 After all Def::ops have been Def::set, this method will be invoked to check the type of this mutable.
bool needs_zonk () const
 Yields true, if Def::local_muts() contain a Hole that is set.
const Def * zonk () const
 If Holes have been filled, reconstruct the program without them.
const Def * zonk_mut () const
 If mutable, zonk()s all ops and tries to immutabilize it; otherwise just zonk.
dot

Streams dot to os, configured via cfg (see DotConfig).

void dot (std::ostream &os, DotConfig cfg={}) const
void dot (const char *file=nullptr, DotConfig cfg={}) const
 Same as above but write to file or std::cout if file is nullptr.
void dot (const std::string &file, DotConfig cfg={}) const

Static Public Member Functions

static DefVec zonk (Defs defs)
 zonks all defs and returns a new DefVec.
Concatenation
static DefVec cat (Defs a, Defs b)
static DefVec cat (const Def *a, Defs bs)
static DefVec cat (Defs as, const Def *b)

Protected Member Functions

void collect_locals ()
 Fills in an immutable's local Vars and Muts once it is in the sea.
C'tors and D'tors
 Def (World *, Node, const Def *type, Defs ops, flags_t flags)
 Constructor for an immutable Def.
 Def (Node, const Def *type, Defs ops, flags_t flags)
 As above but World retrieved from type.
 Def (Node, const Def *type, size_t num_ops, flags_t flags)
 Constructor for a mutable Def.
 Def (Node, Def *binder)
 Constructor for a Var; stores its binder.
Wrappers for World::sym

These are here to have Def::setters inline without including mim/world.h.

Sym sym (const char *) const
Sym sym (std::string_view) const
Sym sym (std::string) const
void set_dbg (Dbg) const
 Interns dbg via Driver::dbg and stores the key in Def::dbg_.
void set_dbg_ (Dbg, bool ow) const
 Backs Def::set(Dbg).
void set_dbg_key_ (DbgKey, bool ow) const
 Backs Def::set(DbgKey).

Protected Attributes

union mim::Def:: { ... }  
flags_t flags_
u8 curry_ = 0
u8 trip_ = 0

Friends

struct DefKey
class World
void swap (World &, World &) noexcept
std::ostream & operator<< (std::ostream &os, const Def *def)
 Def::Dump::Expr: one Def, one line, no analysis - and the backend of std::formatter for every Def pointer.

dump

The output uses Mim syntax and - decls aside - reads back again.

enum class  Dump {
  Expr ,
  Scope ,
  All
}
void dump () const
 Dump::Expr - one line, no analysis.
void dump (Dump) const
void write (Dump) const
void write (Dump, const char *file) const
std::ostream & stream (std::ostream &, Dump) const

Syntactic Comparison

Establishes an arbitrary but deterministic total order on Defs that is stable across runs.

enum class  Cmp {
  L ,
  G ,
  E ,
  U
}
static Cmp cmp (const Def *a, const Def *b)
static bool less (const Def *a, const Def *b)
static bool greater (const Def *a, const Def *b)

Detailed Description

Base class for all Defs.

These are the most important subclasses:

Type Formation Term Introduction Term Elimination
Pi Lam App
Sigma / Arr Tuple / Pack Extract
Insert Insert
Single Wrap
Nom Name Struc
Join Inj Match
Variant Inj Match
Reform Rule
Nat Lit
Idx Lit

In addition there is:

  • Var: A variable. Currently the following Defs may be binders:
  • Axm: To introduce new entities.
  • Proxy: Used for intermediate values during optimizations.
  • Hole: A metavariable filled in by the type inference (always mutable as holes are filled in later).
  • Type, Level, LMax, LSucc: To keep track of type levels.

The data layout (see World::alloc and Def::deps) looks like this:

Def| type | op(0) ... op(num_ops-1) |
|-----------ops-----------|
|--------------------------------| if type() != nullptr && is_set()
|-------------------------| if type() == nullptr && is_set()
|------| if type() != nullptr && !is_set()
|| if type() == nullptr && !is_set()
bool is_set() const
Definition def.h:396
Defs deps() const noexcept
Definition def.cpp:486
constexpr auto ops() const noexcept
Definition def.h:374
const Def * op(size_t i) const noexcept
Definition def.h:377
const Def * type() const noexcept
Yields the "raw" type of this Def (maybe nullptr).
Definition def.h:1119
constexpr size_t num_ops() const noexcept
Definition def.h:378
Attention
This means that any subclass of Def must not introduce additional members.
See also
Immutables vs. Mutables

Definition at line 289 of file def.h.

Member Enumeration Documentation

◆ Cmp

enum class mim::Def::Cmp
strong
Enumerator
L 

Less.

G 

Greater.

E 

Equal.

U 

Unknown.

Definition at line 747 of file def.h.

◆ Dump

enum class mim::Def::Dump
strong

How much of a Def's context a dump reproduces. Only Dump::Expr asks no analysis, so that is the one to reach for while a Nest would choke.

Enumerator
Expr 

Only this Def; whatever does not inline is referenced by its name.

Scope 

Plus its operands as lets and the mutables that live in its scope.

All 

Plus everything else that is reachable.

Definition at line 731 of file def.h.

Constructor & Destructor Documentation

◆ Def() [1/4]

mim::Def::Def ( World * world,
Node node,
const Def * type,
Defs ops,
flags_t flags )
protected

Constructor for an immutable Def.

Definition at line 29 of file def.cpp.

References flags(), flags_, gid(), has_hole(), mim::Level, mim::Proxy::Muts_Bit, node(), op(), ops(), mim::Proxy, type(), mim::Proxy::Vars_Bit, World, and world().

◆ Def() [2/4]

mim::Def::Def ( Node n,
const Def * type,
Defs ops,
flags_t flags )
protected

As above but World retrieved from type.

Definition at line 91 of file def.cpp.

References flags(), ops(), and type().

◆ Def() [3/4]

mim::Def::Def ( Node node,
const Def * type,
size_t num_ops,
flags_t flags )
protected

Constructor for a mutable Def.

Definition at line 94 of file def.cpp.

References flags(), flags_, node(), num_ops(), and type().

◆ Def() [4/4]

mim::Def::Def ( Node node,
Def * binder )
protected

Constructor for a Var; stores its binder.

Definition at line 107 of file def.cpp.

References flags_, gid(), node(), and mim::Var.

Member Function Documentation

◆ arity()

◆ as_imm()

template<class T = Def>
const T * mim::Def::as_imm ( ) const
inline

Definition at line 583 of file def.h.

References as_mut().

◆ as_mut()

◆ bail_expected()

void mim::Def::bail_expected ( fe::Cite what) const

Blames this for not being what and bails; where Def::expect and friends funnel their diagnostic.

Definition at line 413 of file def.cpp.

References err_loc(), error(), and loc().

Referenced by mim::Axm::expect(), expect(), mim::Lit::expect(), and expect_mut().

◆ blame()

◆ cat() [1/3]

DefVec mim::Def::cat ( const Def * a,
Defs bs )
inlinestatic

Definition at line 722 of file def.h.

References cat(), and cat().

Referenced by cat().

◆ cat() [2/3]

DefVec mim::Def::cat ( Defs a,
Defs b )
static

◆ cat() [3/3]

DefVec mim::Def::cat ( Defs as,
const Def * b )
inlinestatic

Definition at line 723 of file def.h.

References cat().

Referenced by cat().

◆ check() [1/2]

const Def * mim::Def::check ( )

After all Def::ops have been Def::set, this method will be invoked to check the type of this mutable.

The method returns a possibly updated version of its type (e.g. where Holes have been resolved). If different from Def::type, it will update its Def::type to a Def::zonked version of that.

Definition at line 524 of file check.cpp.

References mim::Check::alpha(), mim::Arr, mim::Check::coerce(), mim::Hole, mim::Pi::infer(), mim::Sigma::infer(), mim::Variant::infer(), mim::Lam, mut_node(), ops(), mim::Pack, mim::Pi, mim::Rule, mim::Sigma, type(), mim::type_of(), mim::Variant, and world().

◆ check() [2/2]

const Def * mim::Def::check ( size_t i,
const Def * def )

Checks whether the ith operand can be set to def.

The method returns a possibly updated version of def (e.g. where Holes have been resolved). This is the actual def that will be set as the ith operand.

Definition at line 507 of file check.cpp.

References blame(), mim::Check::coerce(), mim::type_of(), and world().

Referenced by set(), and set().

◆ cmp()

Def::Cmp mim::Def::cmp ( const Def * a,
const Def * b )
staticnodiscard

Definition at line 514 of file def.cpp.

References mim::Var::binder(), cmp(), E, flags(), free_vars(), G, is_mutable(), is_set(), L, node(), num_ops(), op(), type(), and U.

Referenced by cmp().

◆ collect_locals()

void mim::Def::collect_locals ( )
protected

Fills in an immutable's local Vars and Muts once it is in the sea.

Definition at line 65 of file def.cpp.

References flags_, mim::World::muts(), mim::Proxy::Muts_Bit, node(), op(), ops(), mim::Proxy, type(), vars(), mim::World::vars(), mim::Proxy::Vars_Bit, and world().

◆ dbg()

Dbg mim::Def::dbg ( ) const

Looks up Def::dbg_ in Driver::dbg.

Definition at line 448 of file def.cpp.

References mim::World::driver(), and world().

Referenced by debug_prefix(), debug_suffix(), mim::ast::emit_ctor(), loc(), set(), set(), set(), set(), set_dbg_(), set_dbg_key_(), and sym().

◆ dbg_key()

DbgKey mim::Def::dbg_key ( ) const
inline

◆ debug_prefix()

const Def * mim::Def::debug_prefix ( std::string prefix) const

Definition at line 506 of file def.cpp.

References dbg(), set(), set_dbg(), and sym().

◆ debug_suffix()

const Def * mim::Def::debug_suffix ( std::string suffix) const

Definition at line 507 of file def.cpp.

References dbg(), set(), set_dbg(), and sym().

◆ dep()

const Def * mim::Def::dep ( size_t i) const
inlinenoexcept

Definition at line 419 of file def.h.

References dep(), and deps().

Referenced by dep(), and err_loc().

◆ deps()

◆ dot() [1/3]

void mim::Def::dot ( const char * file = nullptr,
DotConfig cfg = {} ) const

Same as above but write to file or std::cout if file is nullptr.

Definition at line 263 of file dot.cpp.

◆ dot() [2/3]

void mim::Def::dot ( const std::string & file,
DotConfig cfg = {} ) const
inline

Definition at line 764 of file def.h.

◆ dot() [3/3]

void mim::Def::dot ( std::ostream & os,
DotConfig cfg = {} ) const

Definition at line 261 of file dot.cpp.

References mim::DotConfig::max.

◆ driver()

Driver & mim::Def::driver ( ) const
noexcept

Definition at line 410 of file def.cpp.

References mim::World::driver(), and world().

Referenced by error(), and set_dbg_key_().

◆ dump() [1/2]

void mim::Def::dump ( ) const

Dump::Expr - one line, no analysis.

Definition at line 1453 of file dump.cpp.

References dump().

Referenced by dump(), and dump().

◆ dump() [2/2]

void mim::Def::dump ( Dump mode) const

Definition at line 1454 of file dump.cpp.

References dump(), and stream().

◆ err_loc()

Loc mim::Def::err_loc ( ) const

Returns a blame Loc from World::get_loc, this Def, or its nearest located dependency, in that order.

Definition at line 420 of file def.cpp.

References dep(), deps(), loc(), and world().

Referenced by bail_expected(), and blame().

◆ error()

fe::Error & mim::Def::error ( ) const
noexcept

Definition at line 411 of file def.cpp.

References driver().

Referenced by bail_expected(), and blame().

◆ expect() [1/2]

template<class T, class... Args>
T * mim::Def::expect ( fe::cite_string< Args... > fmt,
Args &&... args )
inline

Like Def::as but - instead of merely asserting in Debug builds - bails via Def::bail_expected when the cast fails; hides fe::RuntimeCast::expect, as a Def can blame itself with a Loc.

fmt / args describe what was expected; a plain string works, as does a fe::cite_string plus arguments.

Definition at line 609 of file def.h.

References bail_expected().

Referenced by expect().

◆ expect() [2/2]

template<class T, class... Args>
const T * mim::Def::expect ( fe::cite_string< Args... > fmt,
Args &&... args ) const
inline

const version.

Definition at line 616 of file def.h.

References expect().

◆ expect_mut()

template<class T = Def, class... Args>
T * mim::Def::expect_mut ( fe::cite_string< Args... > fmt,
Args &&... args ) const
inline

The mutable counterpart of Def::expect.

Definition at line 622 of file def.h.

References bail_expected(), and isa_mut().

◆ externalize()

void mim::Def::externalize ( )

◆ flags()

◆ free_vars() [1/2]

Vars mim::Def::free_vars ( )

As above but drives (and caches) the fixed-point iteration for mutables.

Definition at line 289 of file def.cpp.

References free_vars(), and world().

◆ free_vars() [2/2]

Vars mim::Def::free_vars ( ) const

Global set of free Vars: extends local_vars() by transitively following mutables as well.

Note
On a mutable this simply forwards to the caching non-const overload below.

Definition at line 254 of file def.cpp.

References isa_mut(), local_muts(), local_vars(), vars(), mim::World::vars(), and world().

Referenced by cmp(), mim::Prod::Def(), free_vars(), in_scope(), mim::Rule::is_in_rule(), nests(), and outermost_binder().

◆ gid()

u32 mim::Def::gid ( ) const
inlineconstexprnoexcept

Global id - unique number for this Def.

Definition at line 312 of file def.h.

Referenced by mim::plug::regex::compare_re(), Def(), Def(), mim::plug::refly::normalize_gid(), mim::UseHash::operator()(), and unique_name().

◆ greater()

bool mim::Def::greater ( const Def * a,
const Def * b )
staticnodiscard

◆ has_free_var()

bool mim::Def::has_free_var ( const Var * var) const

Same as free_vars().contains(var).

Definition at line 277 of file def.cpp.

References mim::any_free_vars(), and var().

Referenced by mim::World::fuse(), is_immutabilizable(), and mim::is_trivial().

◆ has_free_vars()

bool mim::Def::has_free_vars ( ) const

Same as !free_vars().empty().

Definition at line 281 of file def.cpp.

References mim::any_free_vars().

Referenced by is_closed(), and is_open().

◆ has_free_vars_in()

bool mim::Def::has_free_vars_in ( Vars vars) const

Same as vars.has_intersection(free_vars()).

Definition at line 285 of file def.cpp.

References mim::any_free_vars(), and vars().

Referenced by mim::Nest::contains(), mim::Rewriter::has_intersection(), and mim::Rewriter::map().

◆ has_hole()

bool mim::Def::has_hole ( ) const
inlinenoexcept

Is this a Hole or does it reach one through Def::deps() up to (and excluding) the next mutable?

E.g., (?, lam (x: Nat) = ?) has a Hole, while (0, lam (x: Nat) = ?) doesn't.

Definition at line 425 of file def.h.

Referenced by Def(), and needs_zonk().

◆ has_var() [1/2]

◆ has_var() [2/2]

const Var * mim::Def::has_var ( ) const
inline

As above if this is a mutable.

Definition at line 498 of file def.h.

◆ hash()

size_t mim::Def::hash ( ) const
inlineconstexprnoexcept

Definition at line 314 of file def.h.

◆ immutabilize()

const Def * mim::Def::immutabilize ( )

Tries to make an immutable from a mutable. This usually works if the mutable isn't recursive and its var isn't used.

Definition at line 567 of file def.cpp.

References mim::Arr, mim::Hole, is_immutabilizable(), mim::Lit::isa(), mim::Lam, mut_node(), node(), ops(), mim::Pack, mim::Pi, mim::Rule, mim::Sigma, mim::Variant, and world().

Referenced by mim::ast::TuplePtrn::emit_body(), mim::Zonker::rewire_mut(), and mim::Rewriter::seal().

◆ in_scope()

bool mim::Def::in_scope ( Def * mut) const

Is every free Var of this bound by mut or by a mutable that nests mut?

I.e., may mut use this?

Definition at line 399 of file def.cpp.

References mim::Var::binder(), free_vars(), and nests().

◆ internalize()

void mim::Def::internalize ( )

Definition at line 626 of file def.cpp.

References mim::World::externals(), mim::World::Externals::internalize(), and world().

Referenced by mim::optimize(), and transfer_external().

◆ is_annex()

bool mim::Def::is_annex ( ) const
inlinenoexcept

Definition at line 573 of file def.h.

Referenced by mim::plug::cps::convertible(), and mim::Lam::is_rewritable().

◆ is_closed()

bool mim::Def::is_closed ( ) const

◆ is_elim()

bool mim::Def::is_elim ( ) const
inlinenoexcept

Definition at line 348 of file def.h.

References mim::Elim, and judge().

◆ is_external()

◆ is_form()

bool mim::Def::is_form ( ) const
inlinenoexcept

Definition at line 346 of file def.h.

References mim::Form, is_form(), and judge().

Referenced by is_form().

◆ is_ground()

bool mim::Def::is_ground ( ) const
inline

Immutable that contains neither mutables nor Vars.

Definition at line 538 of file def.h.

References local_muts(), and local_vars().

◆ is_immutabilizable()

bool mim::Def::is_immutabilizable ( )

Definition at line 131 of file def.cpp.

References deps(), has_free_var(), has_var(), is_set(), local_muts(), and op().

Referenced by immutabilize(), and mim::Rewriter::seal().

◆ is_intro()

bool mim::Def::is_intro ( ) const
inlinenoexcept

◆ is_meta()

bool mim::Def::is_meta ( ) const
inlinenoexcept

Definition at line 349 of file def.h.

References judge(), and mim::Meta.

◆ is_mutable()

bool mim::Def::is_mutable ( ) const
inlinenoexcept

Definition at line 579 of file def.h.

Referenced by cmp().

◆ is_open()

bool mim::Def::is_open ( ) const
inline

Same as has_free_vars().

Definition at line 534 of file def.h.

References has_free_vars().

Referenced by mim::plug::vec::normalize_zip().

◆ is_set()

◆ is_term()

bool mim::Def::is_term ( ) const

Is this Def a term, i.e. is its type() a Type?

Definition at line 498 of file def.cpp.

References mim::Lit::isa(), and type().

◆ isa_binder()

template<class D = Def>
std::pair< D *, const Var * > mim::Def::isa_binder ( ) const
inline

Is this a mutable that introduces a Var?

Returns
{nullptr, nullptr} otherwise.

Definition at line 503 of file def.h.

References has_var(), isa_mut(), and var().

Referenced by mim::is_value_telescope(), and mim::Hole::tuplefy().

◆ isa_imm()

template<class T = Def>
const T * mim::Def::isa_imm ( ) const
inline

◆ isa_mut()

◆ isa_type()

template<class T>
const T * mim::Def::isa_type ( ) const
inline

◆ judge()

Judge mim::Def::judge ( ) const
inlinenoexcept

Def must never become polymorphic: a vptr costs 8 bytes on every node in the World and would shift Def::type_.

Def dispatches on its own Def::node() tag instead - see the dispatch section in def.cpp.

Note
A subclass growing a virtual is caught by the sizeof(Def) == sizeof(T) assert in World::allocate. Table-driven and defined here instead of in def.cpp, so that Def::is_form & friends stay inlinable: libmim is a shared object, so an out-of-line judge() would be an opaque PLT call from every other TU.

Definition at line 843 of file def.h.

References CODE, MIM_NODE, and mim::Num_Nodes.

Referenced by is_elim(), is_form(), is_intro(), and is_meta().

◆ less()

bool mim::Def::less ( const Def * a,
const Def * b )
staticnodiscard

Definition at line 554 of file def.cpp.

◆ loc()

Loc mim::Def::loc ( ) const
inline

Definition at line 632 of file def.h.

References dbg().

Referenced by mim::World::app(), bail_expected(), mim::ast::check_nom_scope(), and err_loc().

◆ local_muts()

Muts mim::Def::local_muts ( ) const
inline

Mutables reachable by following immutable deps(); mut->local_muts() is by definition the set { mut }.

Definition at line 520 of file def.h.

References isa_mut().

Referenced by mim::any_free_vars(), free_vars(), is_ground(), is_immutabilizable(), needs_zonk(), and mim::VarRewriter::rewrite().

◆ local_vars()

Vars mim::Def::local_vars ( ) const
inline

Vars reachable by following immutable deps().

Note
var->local_vars() is by definition the set { var }.

Definition at line 527 of file def.h.

Referenced by mim::any_free_vars(), free_vars(), is_ground(), and mim::VarRewriter::rewrite().

◆ mark()

u32 mim::Def::mark ( ) const
inlineconstexprnoexcept

Used internally by free_vars().

Definition at line 313 of file def.h.

◆ mut_node()

MutNode mim::Def::mut_node ( ) const
inlineconstexprnoexcept

node() of a Def whose Node may be mutable, whether this one is or not; see MutNode.

Definition at line 317 of file def.h.

References mim::is_mut_node().

Referenced by check(), immutabilize(), reduction_offset(), and var_type().

◆ needs_zonk()

bool mim::Def::needs_zonk ( ) const

Yields true, if Def::local_muts() contain a Hole that is set.

Rewriting (Def::zonking) will resolve the Hole to its operand.

Definition at line 11 of file check.cpp.

References has_hole(), mim::Hole::isa_set(), and local_muts().

Referenced by mim::Zonker::rewrite(), and zonk().

◆ nests() [1/2]

bool mim::Def::nests ( const Def * def)

Does this nest def?

Also strict: a def that only uses this's own Var sits at this's level and is not nested.

Definition at line 388 of file def.cpp.

References free_vars(), has_var(), isa_mut(), and nests().

◆ nests() [2/2]

bool mim::Def::nests ( Def * mut)

Does this nest mut?

The relation is strict: f->nests(f) is false.

Definition at line 382 of file def.cpp.

References has_var(), and nests().

Referenced by mim::plug::mem::phase::FreeLocals::analyze(), in_scope(), nests(), and nests().

◆ node()

◆ node_name()

std::string_view mim::Def::node_name ( ) const

Definition at line 477 of file def.cpp.

References CODE, MIM_NODE, and node().

Referenced by mim::plug::autodiff::phase::Eval::augment_().

◆ num_deps()

size_t mim::Def::num_deps ( ) const
inlinenoexcept

Definition at line 420 of file def.h.

References deps().

◆ num_ops()

◆ num_projs()

◆ num_tprojs()

nat_t mim::Def::num_tprojs ( ) const

◆ num_tvars()

nat_t mim::Def::num_tvars ( )
inlinenoexcept

Definition at line 492 of file def.h.

References MIM_PROJ, var(), and var_type().

Referenced by mim::plug::ll::Emitter::emit_phi_args().

◆ num_vars()

nat_t mim::Def::num_vars ( )
inlinenoexcept

◆ op()

◆ ops()

◆ outermost_binder()

Def * mim::Def::outermost_binder ( ) const

Transitively walks up free_vars() till the outermoust binder has been found.

Returns
nullptr, if is_closed() and not a mutable.

Definition at line 363 of file def.cpp.

References free_vars(), and isa_mut().

◆ proj()

◆ projs() [1/4]

template<nat_t A = std::dynamic_extent>
auto mim::Def::projs ( ) const
inline

Definition at line 476 of file def.h.

References projs().

◆ projs() [2/4]

auto mim::Def::projs ( nat_t a) const
inline

Definition at line 482 of file def.h.

References projs().

◆ projs() [3/4]

auto mim::Def::projs ( nat_t a,
Projector auto f ) const
inline

Definition at line 471 of file def.h.

References proj().

◆ projs() [4/4]

template<nat_t A = std::dynamic_extent>
auto mim::Def::projs ( Projector auto f) const
inline

Splits this Def via Def::projections into an Array (if A == std::dynamic_extent) or std::array (otherwise).

Applies f to each element.

Definition at line 457 of file def.h.

References num_projs(), proj(), and projs().

Referenced by mim::plug::autodiff::phase::Eval::augment_tuple(), mim::plug::btensor::build_pointwise(), mim::plug::mem::mem_def(), mim::plug::core::normalize_abs(), mim::plug::autodiff::normalize_add(), mim::plug::refly::normalize_alpha(), mim::plug::math::normalize_arith(), mim::plug::core::normalize_bit2(), mim::plug::tensor::normalize_broadcast(), mim::plug::buffer::normalize_Buf(), mim::plug::tuple::normalize_cat(), mim::plug::vec::normalize_cat(), mim::plug::refly::normalize_check(), mim::plug::math::normalize_cmp(), mim::plug::ord::normalize_contains(), mim::plug::tuple::normalize_contains(), mim::plug::refly::normalize_dbg(), mim::plug::vec::normalize_diff(), mim::plug::core::normalize_div(), mim::plug::core::normalize_extrema(), mim::plug::math::normalize_extrema(), mim::plug::tensor::normalize_fastest_axis(), mim::plug::vec::normalize_fold(), mim::plug::ord::normalize_get(), mim::plug::core::normalize_icmp(), mim::plug::tensor::normalize_if_static(), mim::plug::ord::normalize_init(), mim::plug::ord::normalize_insert(), mim::plug::mem::normalize_lea(), mim::plug::mem::normalize_load(), mim::plug::btensor::normalize_map_reduce(), mim::plug::core::normalize_nat(), mim::plug::core::normalize_ncmp(), mim::plug::math::normalize_pow(), mim::plug::regex::normalize_range(), mim::plug::buffer::normalize_read(), mim::plug::core::normalize_shr(), mim::plug::mem::normalize_store(), mim::plug::refly::normalize_struc(), mim::plug::autodiff::normalize_sum(), mim::plug::core::normalize_wrap(), mim::plug::tuple::normalize_zip(), mim::plug::btensor::MapRedPost::of(), projs(), projs(), projs(), mim::plug::clos::phase::LowerTypedClos::rewrite(), mim::plug::affine::phase::LowerIndex::rewrite_imm_App(), mim::plug::buffer::LowerPtr::rewrite_imm_App(), mim::plug::tensor::phase::LowerToMem::rewrite_imm_Insert(), and tprojs().

◆ reduce()

template<size_t N = std::dynamic_extent>
auto mim::Def::reduce ( const Def * arg) const
inlineconstexpr

◆ reduction_offset()

size_t mim::Def::reduction_offset ( ) const
noexcept

First Def::op that needs to be dealt with during reduction; e.g.

for a Pi we don't reduce the Pi::dom.

See also
World::reduce

Definition at line 597 of file def.cpp.

References mim::Arr, mim::Hole, mim::is_mut_node(), mim::Lam, mut_node(), node(), mim::Pack, mim::Pi, mim::Rule, mim::Sigma, and mim::Variant.

Referenced by mim::World::reduce(), and mim::World::reduce().

◆ set() [1/16]

template<bool Ow = false>
Def * mim::Def::set ( Dbg d)
inline

Definition at line 652 of file def.h.

References set_dbg_().

◆ set() [2/16]

template<bool Ow = false>
const Def * mim::Def::set ( Dbg d) const
inline

Definition at line 651 of file def.h.

References set_dbg_().

◆ set() [3/16]

template<bool Ow = false>
Def * mim::Def::set ( DbgKey key)
inline

Definition at line 656 of file def.h.

References set_dbg_key_().

◆ set() [4/16]

template<bool Ow = false>
const Def * mim::Def::set ( DbgKey key) const
inline

Adopts the Dbg behind key - just copies the interned index, so nothing is re-interned.

Prefer a->set(b->dbg_key()) over a->set(b->dbg()).

Definition at line 655 of file def.h.

References set_dbg_key_().

◆ set() [5/16]

Def * mim::Def::set ( Defs ops)

Set ops all at once (no Def::unset necessary beforehand).

Definition at line 169 of file def.cpp.

References check(), num_ops(), and ops().

◆ set() [6/16]

template<bool Ow = false>
Def * mim::Def::set ( Loc l)
inline

Definition at line 642 of file def.h.

References dbg(), and set_dbg().

◆ set() [7/16]

template<bool Ow = false>
const Def * mim::Def::set ( Loc l) const
inline

Definition at line 641 of file def.h.

References dbg(), and set_dbg().

◆ set() [8/16]

template<bool Ow = false>
Def * mim::Def::set ( Loc l,
std::string s )
inline

Definition at line 650 of file def.h.

References set(), and sym().

◆ set() [9/16]

template<bool Ow = false>
const Def * mim::Def::set ( Loc l,
std::string s ) const
inline

Definition at line 649 of file def.h.

References set(), and sym().

◆ set() [10/16]

template<bool Ow = false>
Def * mim::Def::set ( Loc l,
Sym s )
inline

Definition at line 648 of file def.h.

References set().

◆ set() [11/16]

template<bool Ow = false>
const Def * mim::Def::set ( Loc l,
Sym s ) const
inline

Definition at line 647 of file def.h.

References set().

◆ set() [12/16]

◆ set() [13/16]

template<bool Ow = false>
Def * mim::Def::set ( std::string s)
inline

Definition at line 646 of file def.h.

References set(), and sym().

◆ set() [14/16]

template<bool Ow = false>
const Def * mim::Def::set ( std::string s) const
inline

Definition at line 645 of file def.h.

References set(), and sym().

◆ set() [15/16]

template<bool Ow = false>
Def * mim::Def::set ( Sym s)
inline

Definition at line 644 of file def.h.

References dbg(), and set_dbg().

◆ set() [16/16]

template<bool Ow = false>
const Def * mim::Def::set ( Sym s) const
inline

Definition at line 643 of file def.h.

References dbg(), and set_dbg().

◆ set_dbg()

void mim::Def::set_dbg ( Dbg d) const
protected

Interns dbg via Driver::dbg and stores the key in Def::dbg_.

Definition at line 449 of file def.cpp.

References mim::World::driver(), and world().

Referenced by debug_prefix(), debug_suffix(), set(), set(), set(), set(), and set_dbg_().

◆ set_dbg_()

void mim::Def::set_dbg_ ( Dbg d,
bool ow ) const
protected

Backs Def::set(Dbg).

Definition at line 453 of file def.cpp.

References dbg(), and set_dbg().

Referenced by set(), set(), and set_dbg_key_().

◆ set_dbg_key_()

void mim::Def::set_dbg_key_ ( DbgKey key,
bool ow ) const
protected

Backs Def::set(DbgKey).

Definition at line 462 of file def.cpp.

References dbg(), driver(), set_dbg_(), and world().

Referenced by set(), and set().

◆ set_type()

Def * mim::Def::set_type ( const Def * type)

Update type.

Warning
Only make type-preserving updates such as removing Holes. Do this even before updating all other ops()!

Definition at line 199 of file def.cpp.

References type().

Referenced by mim::Zonker::rewire_mut().

◆ stream()

std::ostream & mim::Def::stream ( std::ostream & os,
Dump mode ) const

Definition at line 1446 of file dump.cpp.

References Expr, flags(), stream(), and world().

Referenced by dump(), stream(), and write().

◆ sym() [1/4]

◆ sym() [2/4]

Sym mim::Def::sym ( const char * s) const
protected

Definition at line 444 of file def.cpp.

References mim::World::sym(), and world().

◆ sym() [3/4]

Sym mim::Def::sym ( std::string s) const
protected

Definition at line 446 of file def.cpp.

References mim::World::sym(), and world().

◆ sym() [4/4]

Sym mim::Def::sym ( std::string_view s) const
protected

Definition at line 445 of file def.cpp.

References mim::World::sym(), and world().

◆ tproj()

const Def * mim::Def::tproj ( nat_t i) const
inline

As above but takes Def::num_tprojs.

Note
Keeps the one-arg form Def::proj lost: it only ever indexes a Pi domain, an App argument or a Lam var, where peeling a 1-tuple is the calling convention (Cn [X] ≡ Cn X) rather than an accident.

Definition at line 452 of file def.h.

References num_tprojs(), and proj().

◆ tprojs() [1/2]

auto mim::Def::tprojs ( ) const
inline

Definition at line 479 of file def.h.

References tprojs().

◆ tprojs() [2/2]

auto mim::Def::tprojs ( Projector auto f) const
inline

Definition at line 469 of file def.h.

References num_tprojs(), and projs().

Referenced by tprojs().

◆ transfer_external()

void mim::Def::transfer_external ( Def * to)

Definition at line 628 of file def.cpp.

References externalize(), internalize(), and sym().

◆ tvar()

const Def * mim::Def::tvar ( nat_t i)
inlinenoexcept

Definition at line 492 of file def.h.

Referenced by mim::StaticArgOpt::rewrite_imm_App().

◆ tvars() [1/2]

auto mim::Def::tvars ( )
inlinenoexcept

Definition at line 492 of file def.h.

◆ tvars() [2/2]

auto mim::Def::tvars ( Projector auto f)
inlinenoexcept

Definition at line 492 of file def.h.

◆ type()

const Def * mim::Def::type ( ) const
inlinenoexcept

Yields the "raw" type of this Def (maybe nullptr).

See also
Def::unfold_type.

Definition at line 1119 of file def.h.

References var(), and var_type().

Referenced by arity(), mim::plug::autodiff::phase::Eval::augment_(), mim::plug::autodiff::phase::Eval::augment_app(), mim::plug::autodiff::phase::Eval::augment_extract(), mim::plug::autodiff::phase::Eval::augment_pack(), mim::plug::autodiff::phase::Eval::augment_tuple(), mim::App::callee_type(), mim::Match::cases(), check(), mim::plug::clos::clos_pack(), cmp(), mim::Check::coerce(), mim::RWPhase::coerce(), collect_locals(), mim::plug::tensor::phase::compose_map(), mim::plug::affine::counting_for(), Def(), Def(), Def(), mim::plug::btensor::ds_splice(), mim::ast::TuplePtrn::emit_value(), mim::plug::clos::ClosLit::env_type(), mim::Idx::expect_bitwidth(), mim::Ext::Ext(), mim::plug::clos::ClosLit::fnc_type(), mim::has_inferred_type(), mim::Axm::infer_curry_and_trip(), mim::is_polymorphic_arg(), mim::is_seq_arity(), mim::Analysis::is_singleton(), is_term(), mim::is_unit(), mim::plug::clos::ClosLit::isa_clos_lit, mim::plug::mem::isa_mem(), mim::plug::nvptx::HostEmitter::isa_targetspecific_intrinsic(), mim::plug::mem::mem_def(), mim::Name::nom(), mim::plug::core::normalize_bitcast(), mim::plug::core::normalize_conv(), mim::plug::math::normalize_conv(), mim::plug::core::normalize_idx2nat(), mim::plug::tensor::normalize_repeat(), mim::plug::tensor::normalize_reshape(), mim::plug::tensor::normalize_shape(), mim::plug::refly::normalize_type(), mim::plug::core::op(), mim::plug::buffer::op_copy(), mim::plug::cps::op_cps2ds_dep(), mim::plug::mem::op_lea(), mim::optimize(), mim::Pi::Pi(), mim::Pi::Pi(), mim::plug::mem::pointee(), mim::plug::nvptx::DeviceEmitter::prepare(), proj(), mim::plug::autodiff::phase::Eval::pullback(), mim::plug::tensor::phase::read_through(), mim::Reform::Reform(), mim::Zonker::rewire_mut(), mim::plug::clos::phase::LowerTypedClos::rewrite(), mim::plug::mem::phase::AddMem::rewrite(), mim::plug::tensor::phase::LowerToMem::rewrite(), mim::plug::clos::phase::LowerTypedClos::rewrite_imm(), mim::plug::mem::EscapeAnalysis::rewrite_imm(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), mim::plug::mem::phase::AddMem::rewrite_imm_App(), mim::plug::tensor::phase::LowerToMem::rewrite_imm_App(), mim::Scalarize::rewrite_imm_App(), mim::plug::tensor::phase::LowerToMem::rewrite_imm_Extract(), mim::SingleErasure::rewrite_imm_Extract(), mim::SingleErasure::rewrite_imm_Inj(), mim::SingleErasure::rewrite_imm_Seq(), mim::RWPhase::rewrite_imm_Tuple(), mim::SingleErasure::rewrite_imm_Tuple(), mim::Rewriter::rewrite_mut_Seq(), mim::SingleErasure::rewrite_mut_Seq(), mim::SingleErasure::rewrite_mut_Sigma(), mim::Scheduler::Scheduler(), set_type(), mim::Switch::Switch(), mim::Hole::tuplefy(), mim::Lam::type(), mim::plug::clos::ClosLit::type(), mim::Rule::type(), and unfold_type().

◆ unfold_type()

const Def * mim::Def::unfold_type ( ) const

◆ unique_name()

◆ unset()

Def * mim::Def::unset ( )

◆ users()

Muts mim::Def::users ( )
inline

Set of mutables where this mutable is locally referenced.

Definition at line 533 of file def.h.

Referenced by mim::Rewriter::seal().

◆ var() [1/2]

const Def * mim::Def::var ( )

Not necessarily a Var: E.g., if the return type is [], this will yield ().

Definition at line 218 of file def.cpp.

References mim::World::var(), and world().

◆ var() [2/2]

◆ var_type()

const Def * mim::Def::var_type ( )

If this is a binder, compute the type of its Variable.

Definition at line 239 of file def.cpp.

References mim::Arr, mim::Hole, mim::Lam, mut_node(), mim::Pack, mim::Pi, mim::Rule, mim::Sigma, mim::World::type_indices(), mim::Variant, and world().

Referenced by num_tvars(), type(), mim::Var::type(), and mim::World::var().

◆ vars() [1/4]

template<nat_t A = std::dynamic_extent>
auto mim::Def::vars ( )
inlinenoexcept

Definition at line 492 of file def.h.

◆ vars() [2/4]

auto mim::Def::vars ( nat_t a)
inlinenoexcept

Definition at line 492 of file def.h.

◆ vars() [3/4]

auto mim::Def::vars ( nat_t a,
Projector auto f )
inlinenoexcept

Definition at line 492 of file def.h.

◆ vars() [4/4]

template<nat_t A = std::dynamic_extent>
auto mim::Def::vars ( Projector auto f)
inlinenoexcept

◆ world()

World & mim::Def::world ( ) const
inlinenoexcept

Definition at line 1105 of file def.h.

References mim::Level, mim::Type, mim::Var, and World.

Referenced by mim::Check::alpha(), mim::Lam::app(), mim::Lam::app(), mim::plug::btensor::app_cps(), mim::plug::clos::apply_closure(), arity(), mim::plug::autodiff::autodiff_type_fun(), mim::plug::autodiff::autodiff_type_fun_pi(), mim::Rewriter::bind_new(), mim::Rewriter::bind_old(), mim::Lam::branch(), check(), check(), mim::plug::btensor::clamp(), mim::plug::clos::clos_apply(), mim::plug::clos::clos_insert_env(), mim::plug::clos::clos_pack(), mim::plug::clos::clos_remove_env(), mim::plug::clos::clos_sub_env(), mim::plug::clos::clos_type(), mim::plug::clos::clos_type_to_pi(), collect_locals(), mim::plug::btensor::concat_select(), mim::plug::affine::counting_for(), mim::plug::affine::counting_nest(), mim::Phase::create(), dbg(), Def(), driver(), mim::drop_self(), mim::plug::btensor::ds_splice(), mim::Seq::elem(), err_loc(), mim::eta_callee(), externalize(), free_vars(), free_vars(), mim::has_inferred_type(), mim::plug::autodiff::id_pullback(), immutabilize(), mim::Pi::infer(), internalize(), mim::Analysis::is_singleton(), mim::is_unit(), mim::plug::clos::isa_clos_type(), mim::Rewriter::map(), mim::plug::mem::mut_con(), mim::plug::compile::normalize_aggr(), mim::plug::core::normalize_bitcast(), mim::plug::buffer::normalize_Buf(), mim::plug::compile::normalize_cond(), mim::plug::ord::normalize_contains(), mim::plug::core::normalize_conv(), mim::plug::math::normalize_conv(), mim::plug::core::normalize_div(), mim::plug::tensor::normalize_fastest_axis(), mim::plug::ord::normalize_get(), mim::plug::refly::normalize_gid(), mim::plug::compile::normalize_is_loaded(), mim::plug::tensor::normalize_vec_width(), num_tprojs(), mim::plug::core::op(), mim::plug::cps::op_cps2ds_dep(), mim::plug::mem::op_lea(), mim::plug::autodiff::op_sum(), operator<<, mim::plug::btensor::pad_coords(), proj(), mim::plug::autodiff::pullback_type(), mim::Lam::reduce(), mim::Rule::replace(), mim::plug::clos::phase::Clos2SJLJ::rewrite(), mim::Lam::set(), set_dbg(), set_dbg_key_(), mim::Pi::set_dom(), mim::Lam::set_filter(), stream(), mim::plug::mem::strip_mem_ty(), sym(), sym(), sym(), mim::tuple2str(), mim::Hole::tuplefy(), unfold_type(), var(), var_type(), mim::ast::Emitter::variant_str(), mim::plug::autodiff::zero_def(), mim::plug::autodiff::zero_pullback(), zonk(), and zonk_mut().

◆ write() [1/2]

void mim::Def::write ( Dump mode) const

Definition at line 1461 of file dump.cpp.

References write().

Referenced by write(), and write().

◆ write() [2/2]

void mim::Def::write ( Dump mode,
const char * file ) const

Definition at line 1456 of file dump.cpp.

References stream(), and write().

◆ zonk() [1/2]

◆ zonk() [2/2]

DefVec mim::Def::zonk ( Defs defs)
static

zonks all defs and returns a new DefVec.

Definition at line 50 of file check.cpp.

References zonk().

◆ zonk_mut()

const Def * mim::Def::zonk_mut ( ) const

If mutable, zonk()s all ops and tries to immutabilize it; otherwise just zonk.

Definition at line 26 of file check.cpp.

References deps(), is_set(), isa_mut(), op(), mim::Zonker::rewire_mut(), world(), zonk(), and mim::World::zonker().

Referenced by mim::World::fuse(), mim::known_rank(), mim::World::type_indices(), and zonk().

◆ DefKey

friend struct DefKey
friend

Definition at line 828 of file def.h.

References DefKey.

Referenced by DefKey.

◆ operator<<

std::ostream & operator<< ( std::ostream & os,
const Def * def )
friend

Def::Dump::Expr: one Def, one line, no analysis - and the backend of std::formatter for every Def pointer.

Definition at line 1440 of file dump.cpp.

References mim::World::freeze(), operator<<, and world().

Referenced by operator<<, and swap.

◆ swap

void swap ( World & ,
World &  )
friend

References operator<<, and World.

◆ World

friend class World
friend

Definition at line 829 of file def.h.

References World.

Referenced by Def(), swap, World, and world().

Member Data Documentation

◆ @243221335266362140133133112245024260072253327200

union { ... } mim::Def

◆ curry_

u8 mim::Def::curry_ = 0
protected

Definition at line 804 of file def.h.

Referenced by mim::App::curry(), and mim::Axm::curry().

◆ flags_

flags_t mim::Def::flags_
protected

◆ trip_

u8 mim::Def::trip_ = 0
protected

Definition at line 805 of file def.h.

Referenced by mim::App::trip(), and mim::Axm::trip().


The documentation for this class was generated from the following files: