Base class for all Defs. More...
#include <mim/def.h>
Public Member Functions | |
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 |
| 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. | |
Judgement | |
| Judge | judge () const noexcept |
| Def must never become polymorphic: a vptr costs 8 bytes on every node in the World, and Def::ops_ptr hands out the operands at this + 1, so the vptr would also shift them. | |
| 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 (UInc n) if necessary. | |
| template<class T> | |
| const T * | isa_type () const |
Is Def::unfold_type a T? Yields nullptr for Univ, 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 |
has_dep | |
Checks whether one Def::deps() contains specific elements defined in Dep. This works up to the next mutable. For example, consider the Tuple tup: (?, lam (x: Nat) = y): const Var * has_var() Only returns not nullptr, if Var of this mutable has ever been created. Definition def.h:483 | |
| Dep | dep () const noexcept |
| bool | has_dep () const noexcept |
| bool | has_dep (Dep d) 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>();
auto [a, b] = def->projs<2>();
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
| |
| 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 Flags::scalarize_threshold is exceeded. | |
| 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 * | proj (nat_t i) const |
| As above but takes Def::num_projs as arity. | |
| const Def * | tproj (nat_t i) const |
| As above but takes Def::num_tprojs. | |
| template<nat_t A = std::dynamic_extent, class F> | |
| auto | projs (F f) const |
| Splits this Def via Def::projections into an Array (if A == std::dynamic_extent) or std::array (otherwise). | |
| template<class F> | |
| auto | tprojs (F f) const |
| template<class F> | |
| auto | projs (nat_t a, F f) const |
| template<nat_t A = std::dynamic_extent> | |
| auto | projs () const |
| auto | tprojs () const |
| auto | projs (nat_t a) const |
var | |
| nat_t | num_vars () noexcept |
| nat_t | num_tvars () noexcept |
| const Def * | var (nat_t a, nat_t i) noexcept |
| const Def * | var (nat_t i) noexcept |
| const Def * | tvar (nat_t i) noexcept |
| template<nat_t A = std::dynamic_extent, class F> | |
| auto | vars (F f) noexcept |
| template<class F> | |
| auto | tvars (F f) noexcept |
| template<nat_t A = std::dynamic_extent> | |
| auto | vars () noexcept |
| auto | tvars () noexcept |
| template<class F> | |
| auto | vars (nat_t a, F 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:
| |
| 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? | |
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 |
dirty | |
Scratch bit for Phases to mark muts that need re-examination.
| |
| bool | is_dirty () const noexcept |
| void | dirty (bool dirty=true) 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 = Def, class... Args> | |
| T * | expect_mut (std::format_string< Args... > fmt, Args &&... args) const |
| Like Def::as_mut but - instead of merely asserting in Debug builds - throws via fe::throwf when the cast fails; the mutable counterpart of fe::RuntimeCast::expect (which Def inherits for the general case). | |
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 | |
| 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. | |
dump | |
| |
| void | dump () const |
| void | dump (int max) const |
| void | write (int max) const |
| void | write (int max, const char *file) const |
| std::ostream & | stream (std::ostream &, int max) const |
dot | |
Streams dot to | |
| 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. | |
Protected Member Functions | |
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) |
This will stream def as an operand. | |
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) |
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 | |
| Uniq | ||
| Join | Inj | Match |
| Meet | Merge | Split |
| Reform | Rule | |
| Nat | Lit | |
| Idx | Lit |
In addition there is:
The data layout (see World::alloc and Def::deps) looks like this:
|
strong |
Constructor for an immutable Def.
Definition at line 42 of file def.cpp.
References flags(), flags_, gid(), local_muts(), local_vars(), mim::World::muts(), mim::World::next_gid(), node(), mim::node2dep(), op(), ops(), mim::Proxy, type(), mim::Univ, vars(), mim::World::vars(), World, and world().
|
protected |
| const Def * mim::Def::arity | ( | ) | const |
Number of elements available to Extract / Insert (may be dynamic).
Definition at line 592 of file def.cpp.
References arity(), mim::Arr, isa_mut(), mim::World::lit_nat(), mim::World::lit_nat_0(), mim::World::lit_nat_1(), node(), num_ops(), op(), mim::Pack, mim::Sigma, mim::World::sigma(), type(), and world().
Referenced by arity(), mim::plug::autodiff::phase::Eval::augment_pack(), mim::Dispatch::Dispatch(), mim::World::ext(), mim::World::extract(), mim::World::insert(), mim::isa_dim(), mim::plug::regex::normalize_conj(), mim::plug::regex::normalize_disj(), mim::plug::tensor::normalize_fastest_axis(), mim::plug::mem::normalize_lea(), num_projs(), num_tprojs(), mim::Rewriter::rewrite_imm_Seq(), mim::Rewriter::rewrite_mut_Seq(), mim::Select::Select(), mim::Arr::set(), mim::Seq::set(), mim::Arr::set_arity(), mim::tuple2str(), and var_type().
|
inline |
|
inline |
Asserts that this is a mutable, casts constness away and performs a static_cast to T.
Definition at line 589 of file def.h.
Referenced by as_imm(), mim::plug::clos::clos_type(), mim::plug::autodiff::phase::Eval::derive_(), mim::ast::TuplePtrn::emit_body(), mim::sexpr::Emitter::finalize(), mim::plug::tensor::is_copy_comb(), mim::plug::tensor::is_identity_post(), mim::RWPhase::rewrite_external(), mim::LamSpec::rewrite_imm_App(), mim::plug::affine::phase::LowerIndex::rewrite_imm_App(), mim::plug::mem::phase::SEO::rewrite_imm_App(), and mim::plug::gpu::phase::SplitOffKernels::rewrite_mut_Lam().
|
inline |
Reports an error that blames this; chain Error::n for Notes and Error::bail to throw.
Definition at line 310 of file def.h.
References blame(), err_loc(), and error().
Referenced by mim::World::app(), blame(), check(), mim::World::extract(), mim::World::insert(), mim::World::match(), mim::plug::refly::normalize_equiv(), mim::plug::regex::normalize_not(), mim::World::seq(), mim::World::type(), and mim::World::uniq().
| 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 454 of file check.cpp.
References mim::Checker::alpha(), mim::Arr, mim::Checker::assignable(), mim::Pi::infer(), mim::Reform::infer(), mim::Sigma::infer(), node(), ops(), mim::Pi, mim::Reform, mim::Rule, mim::Sigma, type(), mim::type_of(), and world().
| 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 438 of file check.cpp.
References mim::Checker::assignable(), blame(), mim::type_of(), and world().
|
staticnodiscard |
| Dbg mim::Def::dbg | ( | ) | const |
Looks up Def::dbg_ in Driver::dbg.
Definition at line 430 of file def.cpp.
References mim::World::driver(), and world().
Referenced by debug_prefix(), debug_suffix(), loc(), set(), set(), set(), set(), set_dbg_(), set_dbg_key_(), and sym().
|
inline |
Cheap handle for other->set(this->dbg_key()).
Definition at line 610 of file def.h.
Referenced by mim::plug::mem::phase::mk_phi(), mim::Rewriter::rewrite(), mim::VarRewriter::rewrite(), mim::plug::mem::phase::AddMem::rewrite_mut_Lam(), mim::Scalarize::rewrite_mut_Lam(), and mim::StaticArgOpt::rewrite_mut_Lam().
| const Def * mim::Def::debug_prefix | ( | std::string | prefix | ) | const |
| const Def * mim::Def::debug_suffix | ( | std::string | suffix | ) | const |
|
inlinenoexcept |
|
noexcept |
Definition at line 468 of file def.cpp.
References set().
Referenced by mim::collect(), dep(), mim::Scheduler::early(), err_loc(), mim::plug::ll_nvptx::HostEmitter::find_kernels(), is_immutabilizable(), mim::sexpr::Emitter::next_lams(), num_deps(), mim::post_order(), and zonk_mut().
|
inlinenoexcept |
| void mim::Def::dot | ( | const char * | file = nullptr, |
| DotConfig | cfg = {} ) const |
|
inline |
| void mim::Def::dot | ( | std::ostream & | os, |
| DotConfig | cfg = {} ) const |
|
noexcept |
Definition at line 399 of file def.cpp.
References mim::World::driver(), and world().
Referenced by error(), and set_dbg_key_().
| Loc mim::Def::err_loc | ( | ) | const |
|
noexcept |
|
inline |
Like Def::as_mut but - instead of merely asserting in Debug builds - throws via fe::throwf when the cast fails; the mutable counterpart of fe::RuntimeCast::expect (which Def inherits for the general case).
fmt / args describe what was expected; a plain string works, as does a format string plus arguments.
Definition at line 601 of file def.h.
References isa_mut().
| void mim::Def::externalize | ( | ) |
Definition at line 607 of file def.cpp.
References mim::World::Externals::externalize(), mim::World::externals(), and world().
Referenced by mim::plug::gpu::phase::SplitOffKernels::rewrite_mut_Lam(), and transfer_external().
|
inlineconstexprnoexcept |
Definition at line 293 of file def.h.
References flags_.
Referenced by mim::Axm::base(), cmp(), Def(), Def(), Def(), mim::Axm::IsA< mem::M, mim::App >::id(), mim::Pi::is_implicit(), mim::Global::is_mutable(), mim::UInc::offset(), mim::Axm::plugin(), mim::Axm::sub(), and mim::Axm::tag().
| Vars mim::Def::free_vars | ( | ) |
| Vars mim::Def::free_vars | ( | ) | const |
Global set of free Vars: extends local_vars() by transitively following mutables as well.
Definition at line 249 of file def.cpp.
References isa_mut(), local_muts(), local_vars(), vars(), mim::World::vars(), and world().
Referenced by cmp(), mim::Prod::Def(), mim::Rule::is_in_rule(), nests(), and outermost_binder().
|
inlineconstexprnoexcept |
Global id - unique number for this Def.
Definition at line 294 of file def.h.
Referenced by mim::plug::regex::compare_re(), Def(), Def(), Def(), mim::plug::refly::normalize_gid(), mim::UseHash::operator()(), and unique_name().
|
staticnodiscard |
Definition at line 543 of file def.cpp.
Referenced by mim::plug::core::normalize_bit2(), mim::plug::core::normalize_nat(), and mim::plug::core::normalize_ncmp().
|
inlinenoexcept |
Definition at line 408 of file def.h.
Referenced by needs_zonk().
|
inlinenoexcept |
| bool mim::Def::has_free_var | ( | const Var * | var | ) | const |
Same as free_vars().contains(var).
Definition at line 273 of file def.cpp.
References mim::any_free_vars(), and var().
Referenced by mim::Lam::eta_reduce(), and is_immutabilizable().
| bool mim::Def::has_free_vars | ( | ) | const |
Same as !free_vars().empty().
Definition at line 277 of file def.cpp.
References mim::any_free_vars().
Referenced by is_closed(), and is_open().
| bool mim::Def::has_free_vars_in | ( | Vars | vars | ) | const |
Same as vars.has_intersection(free_vars()).
Definition at line 281 of file def.cpp.
References vars().
Referenced by mim::Nest::contains(), and mim::plug::cps::Conv::map().
|
inline |
Only returns not nullptr, if Var of this mutable has ever been created.
Definition at line 483 of file def.h.
References has_var().
Referenced by mim::World::app(), mim::Lam::eta_reduce(), mim::World::extract(), has_var(), is_immutabilizable(), isa_binder(), nests(), nests(), mim::VarRewriter::rewrite_mut(), and mim::Rewriter::rewrite_mut_Seq().
|
inline |
| 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 555 of file def.cpp.
References mim::Arr, is_immutabilizable(), mim::Lit::isa(), node(), ops(), mim::Pack, mim::Pi, mim::Rule, mim::Sigma, and world().
Referenced by mim::ast::TuplePtrn::emit_body(), mim::Zonker::rewire_mut(), and mim::Rewriter::rewrite_stub().
| void mim::Def::internalize | ( | ) |
Definition at line 608 of file def.cpp.
References mim::World::externals(), mim::World::Externals::internalize(), and world().
Referenced by mim::optimize(), mim::InplaceRWPhase::rewrite_external(), and transfer_external().
|
inlinenoexcept |
Definition at line 557 of file def.h.
Referenced by mim::plug::cps::convertible(), and mim::isa_optimizable().
| bool mim::Def::is_closed | ( | ) | const |
Same as !has_free_vars().
Definition at line 353 of file def.cpp.
References has_free_vars(), and is_external().
Referenced by mim::Scheduler::early(), mim::World::Externals::externalize(), mim::World::for_each(), mim::Scheduler::late(), mim::plug::vec::normalize_diff(), and mim::plug::core::normalize_pe().
|
inlinenoexcept |
|
inlinenoexcept |
Definition at line 553 of file def.h.
Referenced by mim::plug::cps::convertible(), mim::sexpr::Emitter::emit_head(), mim::sexpr::Emitter::emit_imported(), mim::World::Externals::externalize(), mim::World::Externals::internalize(), is_closed(), mim::isa_optimizable(), mim::plug::ll::Emitter::prepare(), mim::plug::clos::phase::ClosConv::rewrite_external(), mim::plug::clos::phase::LowerTypedClos::rewrite_external(), mim::RWPhase::rewrite_external(), and mim::plug::gpu::phase::RemoveDoubleSyncs::rewrite_imm_App().
|
inlinenoexcept |
|
inline |
Immutable that contains neither mutables nor Vars.
Definition at line 525 of file def.h.
References local_muts(), and local_vars().
Referenced by mim::EtaConv::rewrite().
| bool mim::Def::is_immutabilizable | ( | ) |
Definition at line 140 of file def.cpp.
References deps(), has_free_var(), has_var(), is_set(), local_muts(), and op().
Referenced by immutabilize(), mim::Rewriter::rewrite_mut_Seq(), and mim::Rewriter::rewrite_stub().
|
inlinenoexcept |
Definition at line 321 of file def.h.
References mim::Intro, and judge().
Referenced by mim::Rewriter::rewrite_imm_Seq(), and mim::Rewriter::rewrite_mut_Seq().
|
inlinenoexcept |
|
inlinenoexcept |
|
inline |
Same as has_free_vars().
Definition at line 521 of file def.h.
References has_free_vars().
Referenced by mim::plug::vec::normalize_zip().
|
inline |
Yields true if empty or the last op is set.
Definition at line 370 of file def.h.
References num_ops(), op(), and ops().
Referenced by mim::World::app(), cmp(), mim::plug::cps::convertible(), mim::World::for_each(), is_immutabilizable(), mim::isa_optimizable(), mim::Hole::isa_set(), mim::BetaRed::rewrite_imm_App(), mim::InplaceRWPhase::rewrite_mut(), mim::BranchNormalize::rewrite_mut_Lam(), mim::plug::cps::Conv::rewrite_mut_Lam(), mim::plug::mem::phase::AddMem::rewrite_mut_Lam(), mim::Rewriter::rewrite_mut_Seq(), mim::Rewriter::rewrite_stub(), mim::Scheduler::Scheduler(), mim::Hole::tuplefy(), and zonk_mut().
| bool mim::Def::is_term | ( | ) | const |
|
inline |
|
inline |
Definition at line 574 of file def.h.
References isa_mut().
Referenced by mim::World::app(), mim::sexpr::Emitter::emit_bb(), mim::sexpr::Emitter::emit_decl(), mim::World::extract(), mim::isa_flex_rank(), and mim::plug::mem::phase::AddMem::rewrite().
|
inline |
If this is mutable, it will cast constness away and perform a dynamic_cast to T.
Definition at line 580 of file def.h.
Referenced by mim::plug::clos::phase::LowerTypedClosPrep::analyze(), mim::any_free_vars(), mim::World::app(), arity(), mim::plug::autodiff::phase::Eval::augment_(), mim::collect(), mim::sexpr::Emitter::emit_bb(), mim::sexpr::Emitter::emit_decl(), expect_mut(), mim::World::extract(), mim::Bound::find(), mim::Hole::find(), free_vars(), mim::plug::ll::Emitter::id(), mim::plug::mem::phase::is_dependent(), isa_binder(), mim::plug::clos::isa_clos_type(), isa_imm(), mim::plug::ll_nvptx::HostEmitter::isa_targetspecific_intrinsic(), mim::Hole::isa_unset(), mim::Scheduler::late(), local_muts(), nests(), outermost_binder(), proj(), mim::Analysis::rewrite(), mim::plug::clos::phase::LowerTypedClos::rewrite(), mim::plug::mem::phase::AddMem::rewrite(), mim::Rewriter::rewrite(), mim::VarRewriter::rewrite(), mim::Zonker::rewrite(), mim::BetaRed::rewrite_imm_App(), mim::LamSpec::rewrite_imm_App(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), mim::plug::mem::phase::SEO::rewrite_imm_App(), mim::plug::tensor::phase::LowerToMem::rewrite_imm_App(), mim::Scalarize::rewrite_imm_App(), mim::StaticArgOpt::rewrite_imm_App(), mim::plug::mem::phase::SEO::rewrite_imm_Var(), mim::Scheduler::Scheduler(), zonk(), and zonk_mut().
|
inline |
Is Def::unfold_type a T? Yields nullptr for Univ, which has no type at all.
Definition at line 337 of file def.h.
References isa_type(), and unfold_type().
Referenced by mim::World::app(), isa_type(), mim::World::match(), and mim::World::type().
|
inlinenoexcept |
Def must never become polymorphic: a vptr costs 8 bytes on every node in the World, and Def::ops_ptr hands out the operands at this + 1, so the vptr would also shift them.
Def carries its own Def::node() tag and dispatches on it instead - see the dispatch section in def.cpp.
Definition at line 811 of file def.h.
References CODE, MIM_NODE, and mim::Num_Nodes.
Referenced by is_elim(), is_form(), is_intro(), and is_meta().
|
staticnodiscard |
|
inline |
Definition at line 611 of file def.h.
References dbg().
Referenced by mim::World::app(), and err_loc().
|
inline |
Mutables reachable by following immutable deps(); mut->local_muts() is by definition the set { mut }.
Definition at line 507 of file def.h.
References isa_mut().
Referenced by mim::any_free_vars(), Def(), free_vars(), is_ground(), is_immutabilizable(), needs_zonk(), and mim::VarRewriter::rewrite().
|
inline |
Vars reachable by following immutable deps().
Definition at line 514 of file def.h.
Referenced by mim::any_free_vars(), Def(), free_vars(), is_ground(), and mim::VarRewriter::rewrite().
|
inlineconstexprnoexcept |
Used internally by free_vars().
| 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 12 of file check.cpp.
References has_dep(), mim::Hole, mim::Hole::isa_set(), and local_muts().
Referenced by mim::Zonker::rewrite(), and zonk().
| bool mim::Def::nests | ( | const Def * | def | ) |
| bool mim::Def::nests | ( | Def * | mut | ) |
|
inlineconstexprnoexcept |
Definition at line 297 of file def.h.
Referenced by arity(), mim::Bound::Bound(), check(), cmp(), Def(), Def(), Def(), mim::Ext::Ext(), immutabilize(), mim::is_flex(), mim::Pi::isa_cn(), node_name(), reduction_offset(), mim::plug::clos::phase::LowerTypedClos::rewrite_imm(), mim::Rewriter::rewrite_imm(), mim::Rewriter::rewrite_mut(), mim::Seq::set(), and var_type().
| std::string_view mim::Def::node_name | ( | ) | const |
|
inlinenoexcept |
|
inlineconstexprnoexcept |
Definition at line 352 of file def.h.
Referenced by arity(), cmp(), mim::plug::core::convert(), Def(), mim::World::extract(), mim::plug::mem::has_leading_mem(), is_set(), mim::World::match(), mim::plug::mem::normalize_load(), mim::plug::ll::Emitter::prepare(), mim::World::reduce(), mim::Zonker::rewire_mut(), mim::Rewriter::rewrite_stub(), mim::Scheduler::Scheduler(), set(), set(), and unset().
|
inline |
Yields Def::arity(), if it is a Lit, or 1 otherwise.
Definition at line 1132 of file def.h.
References arity(), and mim::Lit::isa().
Referenced by mim::plug::clos::clos_insert_env(), mim::plug::clos::clos_remove_env(), mim::plug::clos::clos_sub_env(), mim::plug::mem::mem_def(), proj(), projs(), and mim::plug::clos::phase::ClosConvPrep::rewrite_imm_App().
| nat_t mim::Def::num_tprojs | ( | ) | const |
As above but yields 1, if Flags::scalarize_threshold is exceeded.
Definition at line 618 of file def.cpp.
References arity(), mim::World::flags(), mim::Lit::isa(), mim::Flags::scalarize_threshold, and world().
|
inlinenoexcept |
Definition at line 479 of file def.h.
References MIM_PROJ, var(), and var_type().
Referenced by mim::plug::ll::Emitter::emit_phi_args(), mim::plug::mem::phase::SEO::rewrite_imm_App(), and mim::Scalarize::rewrite_mut_Lam().
|
inlinenoexcept |
Definition at line 479 of file def.h.
Referenced by mim::Lam::ret_var(), mim::plug::affine::phase::LowerIndex::rewrite_imm_App(), and mim::plug::mem::phase::AddMem::rewrite_mut_Lam().
|
inlinenoexcept |
Definition at line 351 of file def.h.
References ops().
Referenced by mim::App::arg(), arity(), mim::Lam::body(), mim::App::callee(), mim::plug::clos::clos_type_to_pi(), cmp(), mim::Pi::codom(), Def(), mim::Pi::dom(), mim::Reform::dom(), mim::World::extract(), mim::Lam::filter(), mim::Hole::find(), mim::Bound::get(), mim::Rule::guard(), mim::Extract::index(), mim::Insert::index(), mim::Sigma::infer(), mim::Tuple::infer(), mim::Global::init(), is_immutabilizable(), is_set(), mim::plug::clos::isa_clos_type(), mim::Hole::isa_set(), mim::Type::level(), mim::Rule::lhs(), mim::World::match(), mim::plug::mem::normalize_load(), mim::plug::option::normalize_unwrap_unsafe(), mim::Hole::op(), mim::UInc::op(), mim::Uniq::op(), proj(), mim::Rewriter::rewrite_stub(), mim::Rule::rhs(), mim::Scheduler::Scheduler(), mim::Match::scrutinee(), set(), mim::Extract::tuple(), mim::Insert::tuple(), mim::Inj::value(), mim::Insert::value(), mim::Split::value(), and zonk_mut().
|
inlineconstexprnoexcept |
Definition at line 348 of file def.h.
Referenced by mim::Match::arms(), mim::Seq::body(), mim::Bound::Bound(), check(), mim::plug::core::convert(), Def(), Def(), mim::sexpr::Emitter::emit_node(), mim::World::ext(), mim::World::extract(), mim::Bound::find(), immutabilize(), mim::Sigma::infer(), mim::Tuple::infer(), is_set(), op(), mim::Zonker::rewire_mut(), mim::InplaceRWPhase::rewrite_mut(), set(), mim::Lam::set(), mim::Reform::set(), and mim::Sigma::set().
| Def * mim::Def::outermost_binder | ( | ) | const |
Transitively walks up free_vars() till the outermoust binder has been found.
Definition at line 359 of file def.cpp.
References free_vars(), and isa_mut().
Similar to World::extract while assuming an arity of a, but also works on Sigmas and Arrays.
Definition at line 623 of file def.cpp.
References mim::World::extract(), isa_mut(), op(), type(), and world().
Referenced by mim::cat(), mim::plug::tensor::phase::check_gather_shape_constraints(), mim::plug::tensor::phase::check_scatter_shape_constraints(), mim::plug::clos::clos_remove_env(), mim::ast::Ptrn::emit_proj(), mim::Select::ff(), mim::plug::tensor::fold_shape_and_index(), mim::World::insert(), mim::plug::tensor::is_copy_comb(), mim::plug::tensor::is_identity_post(), mim::plug::ll_nvptx::HostEmitter::isa_targetspecific_intrinsic(), mim::plug::tensor::normalize_get(), mim::plug::tensor::normalize_pad(), mim::plug::vec::normalize_zip(), projs(), projs(), mim::plug::affine::phase::LowerIndex::rewrite_imm_App(), mim::plug::tensor::phase::Lower::rewrite_imm_App(), mim::World::seq(), mim::Dispatch::target(), tproj(), mim::Select::tt(), mim::tuple2str(), and mim::Hole::tuplefy().
|
inline |
As above but takes Def::num_projs as arity.
Definition at line 434 of file def.h.
References num_projs(), and proj().
Referenced by proj().
|
inline |
|
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 440 of file def.h.
References num_projs(), proj(), and projs().
Referenced by mim::plug::autodiff::phase::Eval::augment_tuple(), mim::sexpr::Emitter::emit_var(), mim::plug::tensor::is_pure_read(), mim::plug::mem::mem_def(), mim::plug::core::normalize_abs(), mim::plug::autodiff::normalize_add(), 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::refly::normalize_equiv(), 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::tensor::normalize_get(), mim::plug::core::normalize_icmp(), mim::plug::tensor::normalize_if_static(), 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::tensor::normalize_set(), mim::plug::buffer::normalize_shape(), mim::plug::core::normalize_shr(), mim::plug::mem::normalize_store(), mim::plug::autodiff::normalize_sum(), mim::plug::core::normalize_wrap(), mim::plug::tuple::normalize_zip(), projs(), projs(), projs(), mim::plug::clos::phase::LowerTypedClos::rewrite(), mim::plug::affine::phase::LowerIndex::rewrite_imm_App(), mim::plug::buffer::LowerPtr::rewrite_imm_App(), and tprojs().
|
inline |
|
inline |
|
inlineconstexpr |
Definition at line 660 of file def.h.
Referenced by mim::World::extract(), mim::Lam::reduce(), mim::Pi::reduce(), mim::Rule::reduce(), and mim::Seq::reduce().
|
noexcept |
First Def::op that needs to be dealt with during reduction; e.g.
for a Pi we don't reduce the Pi::dom.
Definition at line 578 of file def.cpp.
References mim::Arr, mim::Join, mim::Lam, mim::Meet, node(), mim::Pack, mim::Pi, mim::Rule, and mim::Sigma.
Referenced by mim::World::reduce().
|
inline |
Definition at line 631 of file def.h.
References set_dbg_().
|
inline |
Definition at line 630 of file def.h.
References set_dbg_().
|
inline |
Definition at line 635 of file def.h.
References set_dbg_key_().
|
inline |
| Def * mim::Def::set | ( | Defs | ops | ) |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
| Def * mim::Def::set | ( | size_t | i, |
| const Def * | def ) |
Successively set from left to right.
Definition at line 196 of file def.cpp.
References check(), num_ops(), and op().
Referenced by mim::Lam::app(), debug_prefix(), debug_suffix(), deps(), mim::plug::autodiff::phase::Eval::derive_(), mim::ast::MatchExpr::Arm::emit(), mim::ast::AliasPtrn::emit_value(), mim::ast::GrpPtrn::emit_value(), mim::ast::IdPtrn::emit_value(), mim::Zonker::rewire_mut(), mim::VarRewriter::rewrite(), mim::LamSpec::rewrite_imm_App(), mim::InplaceRWPhase::rewrite_mut(), mim::plug::mem::phase::AddMem::rewrite_mut_Lam(), mim::Rewriter::rewrite_stub(), set(), set(), set(), set(), set(), set(), mim::Global::set(), mim::Hole::set(), mim::Lam::set(), mim::Lam::set(), mim::Pack::set(), mim::Pi::set(), mim::Reform::set(), mim::Reform::set(), mim::Rule::set(), mim::Seq::set(), mim::Sigma::set(), mim::Sigma::set(), mim::Arr::set_arity(), mim::Arr::set_body(), mim::Lam::set_body(), mim::Pi::set_codom(), mim::Pi::set_dom(), mim::Pi::set_dom(), mim::Lam::set_filter(), mim::Rule::set_guard(), mim::Rule::set_lhs(), and mim::Rule::set_rhs().
|
inline |
|
inline |
|
inline |
|
inline |
|
protected |
Interns dbg via Driver::dbg and stores the key in Def::dbg_.
Definition at line 431 of file def.cpp.
References mim::World::driver(), and world().
Referenced by debug_prefix(), debug_suffix(), set(), set(), set(), set(), and set_dbg_().
|
protected |
Backs Def::set(Dbg).
Definition at line 435 of file def.cpp.
References dbg(), and set_dbg().
Referenced by set(), set(), and set_dbg_key_().
|
protected |
Backs Def::set(DbgKey).
Definition at line 444 of file def.cpp.
References dbg(), driver(), set_dbg_(), and world().
| Def * mim::Def::set_type | ( | const Def * | type | ) |
| std::ostream & mim::Def::stream | ( | std::ostream & | os, |
| int | max ) const |
|
inline |
Definition at line 612 of file def.h.
References dbg().
Referenced by mim::plug::autodiff::phase::Eval::augment_lam(), debug_prefix(), debug_suffix(), mim::World::Externals::externalize(), mim::World::Externals::internalize(), mim::plug::gpu::phase::SplitOffKernels::rewrite_mut_Lam(), set(), set(), set(), set(), transfer_external(), and unique_name().
|
protected |
Definition at line 426 of file def.cpp.
References mim::World::sym(), and world().
|
protected |
Definition at line 428 of file def.cpp.
References mim::World::sym(), and world().
|
protected |
Definition at line 427 of file def.cpp.
References mim::World::sym(), and world().
|
inline |
As above but takes Def::num_tprojs.
Definition at line 435 of file def.h.
References num_tprojs(), and proj().
|
inline |
| void mim::Def::transfer_external | ( | Def * | to | ) |
Definition at line 610 of file def.cpp.
References externalize(), internalize(), and sym().
|
inlinenoexcept |
Definition at line 479 of file def.h.
Referenced by mim::Scalarize::rewrite_mut_Lam().
|
inlinenoexcept |
Yields the "raw" type of this Def (maybe nullptr).
Definition at line 1111 of file def.h.
References var(), and var_type().
Referenced by arity(), mim::Checker::assignable(), 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::Bound::Bound(), mim::App::callee_type(), check(), mim::plug::clos::clos_pack(), cmp(), mim::plug::tensor::phase::compose_map(), Def(), Def(), Def(), mim::sexpr::Emitter::emit_bb(), mim::sexpr::Emitter::emit_node(), mim::plug::clos::ClosLit::env_type(), mim::Idx::expect_bitwidth(), mim::Ext::Ext(), mim::Bound::find(), mim::plug::ll::find_common_simd_src(), mim::plug::clos::ClosLit::fnc_type(), mim::Bound::get(), mim::Axm::infer_curry_and_trip(), is_term(), mim::is_unit(), mim::plug::clos::ClosLit::isa_clos_lit, mim::plug::mem::isa_mem(), mim::plug::ll_nvptx::HostEmitter::isa_targetspecific_intrinsic(), mim::plug::mem::mem_def(), mim::plug::core::normalize_bitcast(), mim::plug::core::normalize_conv(), mim::plug::math::normalize_conv(), mim::plug::tensor::normalize_set(), mim::plug::tensor::normalize_shape(), mim::plug::refly::normalize_type(), mim::plug::core::op(), mim::plug::cps::op_cps2ds_dep(), mim::plug::mem::op_lea(), mim::plug::mem::op_lea_unsafe(), mim::optimize(), mim::Pi::Pi(), mim::Pi::Pi(), mim::plug::mem::pointee(), mim::plug::ll_nvptx::DeviceEmitter::prepare(), proj(), mim::plug::tensor::phase::read_through(), mim::Reform::Reform(), mim::Zonker::rewire_mut(), mim::plug::clos::phase::LowerTypedClos::rewrite(), mim::plug::clos::phase::LowerTypedClos::rewrite_imm(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), mim::plug::clos::phase::ClosConvPrep::rewrite_imm_App(), mim::plug::mem::phase::AddMem::rewrite_imm_App(), mim::plug::tensor::phase::LowerToMem::rewrite_imm_App(), mim::InplaceRWPhase::rewrite_mut(), mim::Scalarize::rewrite_mut_Lam(), mim::Rewriter::rewrite_mut_Seq(), mim::Scheduler::Scheduler(), set_type(), mim::plug::mem::strip_mem(), mim::Hole::tuplefy(), mim::Global::type(), mim::Lam::type(), mim::plug::clos::ClosLit::type(), mim::Rule::type(), and unfold_type().
| const Def * mim::Def::unfold_type | ( | ) | const |
Yields the type of this Def and builds a new Type (UInc n) if necessary.
Definition at line 451 of file def.cpp.
References type(), and world().
Referenced by mim::World::extract(), mim::World::implicit_app(), mim::Pi::infer(), mim::Reform::infer(), mim::World::insert(), mim::isa_dim(), isa_type(), mim::World::match(), mim::World::seq(), mim::type_of(), and mim::World::uniq().
| std::string mim::Def::unique_name | ( | ) | const |
name + "_" + Def::gid
Definition at line 616 of file def.cpp.
Referenced by mim::plug::ll::Emitter::emit_slot(), mim::plug::ll_nvptx::DeviceEmitter::emit_slot(), mim::plug::ll::Emitter::id(), mim::Nest::Node::name(), mim::plug::ll::Emitter::prepare(), mim::sexpr::Emitter::prepare(), and mim::plug::gpu::phase::SplitOffKernels::rewrite_mut_Lam().
| Def * mim::Def::unset | ( | ) |
Unsets all Def::ops; works even, if not set at all or only partially set.
Definition at line 213 of file def.cpp.
References num_ops().
Referenced by mim::Zonker::rewire_mut(), mim::InplaceRWPhase::rewrite_mut(), mim::Arr::unset(), mim::Hole::unset(), mim::Lam::unset(), mim::Pack::unset(), mim::Pi::unset(), mim::Reform::unset(), mim::Rule::unset(), mim::Seq::unset(), and mim::Sigma::unset().
|
inline |
| const Def * mim::Def::var | ( | ) |
Not necessarily a Var: E.g., if the return type is [], this will yield ().
Definition at line 226 of file def.cpp.
References mim::World::var(), and world().
Definition at line 479 of file def.h.
Referenced by mim::plug::autodiff::phase::Eval::augment_app(), mim::plug::autodiff::phase::Eval::augment_lam(), mim::plug::tensor::phase::compose_map(), mim::plug::autodiff::phase::Eval::derive_(), mim::ast::TuplePtrn::emit_body(), mim::sexpr::Emitter::emit_head(), mim::sexpr::Emitter::emit_imported(), mim::plug::ll::Emitter::emit_phi_args(), mim::Lam::eta_reduce(), has_free_var(), mim::Rule::is_in_rule(), isa_binder(), mim::plug::clos::isa_clos_type(), mim::plug::mem::mem_var(), num_tvars(), mim::plug::tensor::phase::reads_injectively(), mim::Rule::replace(), mim::Lam::ret_var(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), mim::plug::affine::phase::LowerIndex::rewrite_imm_App(), mim::plug::mem::phase::AddMem::rewrite_mut_Lam(), mim::RetWrap::rewrite_mut_Lam(), mim::Scalarize::rewrite_mut_Lam(), mim::StaticArgOpt::rewrite_mut_Lam(), mim::Hole::tuplefy(), and type().
| const Def * mim::Def::var_type | ( | ) |
If this is a binder, compute the type of its Variable.
Definition at line 232 of file def.cpp.
References arity(), mim::Arr, mim::Global, mim::Hole, mim::Join, mim::Lam, mim::Meet, node(), mim::Pack, mim::Pi, mim::Rule, mim::Sigma, mim::World::type_idx(), and world().
Referenced by num_tvars(), type(), mim::Var::type(), and mim::World::var().
|
inlinenoexcept |
|
inlinenoexcept |
Definition at line 479 of file def.h.
Referenced by Def(), mim::Prod::Def(), free_vars(), has_free_vars_in(), mim::plug::ll::Emitter::prepare(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), and mim::RetWrap::rewrite_mut_Lam().
|
inlinenoexcept |
|
inlinenoexcept |
Definition at line 1097 of file def.h.
References mim::Type, mim::Univ, mim::Var, and World.
Referenced by mim::Checker::alpha(), mim::Lam::app(), mim::Lam::app(), mim::plug::clos::apply_closure(), arity(), mim::plug::autodiff::autodiff_type_fun(), mim::plug::autodiff::autodiff_type_fun_pi(), mim::Lam::branch(), mim::cat_sigma(), mim::cat_tuple(), check(), check(), 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(), mim::plug::core::convert(), mim::Phase::create(), dbg(), Def(), Def(), Def(), mim::Prod::Def(), driver(), mim::drop_self(), err_loc(), externalize(), free_vars(), mim::plug::autodiff::id_pullback(), immutabilize(), mim::Pi::infer(), internalize(), mim::is_unit(), mim::plug::clos::isa_clos_type(), 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::core::normalize_idx_unsafe(), mim::plug::compile::normalize_is_loaded(), num_tprojs(), mim::plug::core::op(), mim::plug::cps::op_cps2ds_dep(), mim::plug::tensor::op_get(), mim::plug::mem::op_lea(), mim::plug::mem::op_lea_unsafe(), mim::plug::mem::op_lea_unsafe(), mim::plug::tensor::op_set(), mim::plug::autodiff::op_sum(), operator<<, 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(), mim::plug::mem::strip_mem_ty(), sym(), sym(), sym(), mim::tuple2str(), mim::Hole::tuplefy(), unfold_type(), var(), var_type(), mim::plug::autodiff::zero_def(), mim::plug::autodiff::zero_pullback(), zonk(), and zonk_mut().
| void mim::Def::write | ( | int | max | ) | const |
| void mim::Def::write | ( | int | max, |
| const char * | file ) const |
| const Def * mim::Def::zonk | ( | ) | const |
If Holes have been filled, reconstruct the program without them.
Only goes up to but excluding other mutables.
Definition at line 21 of file check.cpp.
References isa_mut(), needs_zonk(), mim::Zonker::rewrite(), world(), zonk_mut(), and mim::World::zonker().
Referenced by mim::World::app(), mim::World::extract(), mim::World::inj(), mim::World::insert(), mim::World::match(), mim::World::merge(), mim::World::merge(), mim::World::raw_app(), mim::Rewriter::rewrite_mut_Seq(), mim::World::seq(), mim::World::sigma(), mim::World::split(), mim::World::tuple(), mim::World::tuple(), mim::World::type(), mim::World::uniq(), zonk(), and 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 27 of file check.cpp.
References deps(), is_set(), isa_mut(), op(), mim::Zonker::rewire_mut(), world(), zonk(), and mim::World::zonker().
Referenced by mim::isa_dim(), and zonk().
|
friend |
|
friend |
This will stream def as an operand.
This is usually id(def) unless it can be displayed Inline.
Definition at line 548 of file dump.cpp.
References mim::World::freeze(), operator<<, and world().
Referenced by operator<<, and swap.
References operator<<, and World.
|
friend |
| union { ... } mim::Def |
|
protected |
Definition at line 771 of file def.h.
Referenced by mim::App::curry(), and mim::Axm::curry().
|
protected |
Definition at line 770 of file def.h.
Referenced by Def(), Def(), Def(), flags(), mim::Lit::get(), mim::Pi::make_explicit(), mim::Pi::make_implicit(), and mim::Proxy::tag().
|
protected |
Definition at line 772 of file def.h.
Referenced by mim::App::trip(), and mim::Axm::trip().