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

Base class for all Defs. More...

#include <mim/def.h>

Inheritance diagram for mim::Def:
[legend]

Public Member Functions

Getters
Worldworld () const
 
flags_t flags () const
 
u32 gid () const
 
hash_t hash () const
 
node_t node () const
 
std::string_view node_name () const
 
type
const Deftype () const
 
const Defunfold_type () const
 Yields the type of this Def and builds a new Type (UInc n) if necessary.
 
bool is_term () const
 Yields true if this:T and T:(Type 0).
 
arity
Ref arity () const
 
std::optional< nat_tisa_lit_arity () const
 
nat_t as_lit_arity () const
 
ops
template<size_t N = std::dynamic_extent>
auto ops () const
 
const Defop (size_t i) const
 
size_t num_ops () const
 
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:

  1. If Def::is_set() is ...
    1. ... false, set the operands from
      • left (i == 0) to
      • right (i == num_ops() - 1).
    2. ... true, reset the operands from left to right as in 1a.
  2. In addition, you can invoke Def::unset() at any time to start over with 1a:
    mut->unset()->set({a, b, c}); // This will always work, but should be your last resort.

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

Defset (size_t i, const Def *def)
 Successively set from left to right.
 
Defreset (size_t i, const Def *def)
 Successively reset from left to right.
 
Defset (Defs ops)
 Def::set ops all at once.
 
Defreset (Defs ops)
 Def::reset ops all at once.
 
Defunset ()
 Unsets all Def::ops; works even, if not set at all or partially.
 
Defset_type (const Def *)
 
void unset_type ()
 
void update ()
 Resolves Infers of this Def's type.
 
bool is_set () const
 Yields true if empty or the last op is set.
 
extended_ops

Includes Def::type() (if not nullptr) and then the other Def::ops() in this order.

Def::ops() is only included, if Def::is_set.

Defs extended_ops () const
 
const Defextended_op (size_t i) const
 
size_t num_extended_ops () const
 
partial_ops

Includes Def::type() and then the other Def::ops() in this order.

Also works with partially set Defs and doesn't assert. Unset operands are nullptr.

Defs partial_ops () const
 
const Defpartial_op (size_t i) const
 
size_t num_partial_ops () const
 
uses
const Usesuses () const
 
size_t num_uses () const
 
dep
unsigned dep () const
 
bool has_dep (Dep d) const
 
bool has_dep (unsigned u) const
 
bool dep_const () const
 
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); });
Array<const Def*> projs1 = def->projs(); // "projs1" has def->num_projs() many elements
Array<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
Array<const Lit*> lits1 = def->projs( [](auto def) { return Lit::as(def); });
Array<const Lit*> lits2 = def->projs(n, [](auto def) { return Lit::as(def); });
static T as(Ref def)
Definition def.h:768
nat_t num_projs () const
 
nat_t num_tprojs () const
 As above but yields 1, if Flags::scalarize_threshold is exceeded.
 
const Defproj (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 Defproj (nat_t i) const
 As above but takes Def::num_projs as arity.
 
const Deftproj (nat_t i) const
 As above but takes Def::num_tprojs.
 
template<nat_t A = -1_n, class F >
auto projs (F f) const
 Splits this Def via Def::projections into an Array (if A == -1_n) 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 = -1_n>
auto projs () const
 
auto tprojs () const
 
auto projs (nat_t a) const
 
var

Retrieve Var for mutables.

See also
proj
nat_t num_vars ()
 
nat_t num_tvars ()
 
Ref var (nat_t a, nat_t i)
 
Ref var (nat_t i)
 
Ref tvar (nat_t i)
 
template<nat_t A = std::dynamic_extent, class F >
auto vars (F f)
 
template<class F >
auto tvars (F f)
 
template<nat_t A = std::dynamic_extent>
auto vars ()
 
auto tvars ()
 
template<class F >
auto vars (nat_t a, F f)
 
auto vars (nat_t a)
 
Ref var ()
 Not necessarily a Var: E.g., if the return type is [], this will yield ().
 
const Varhas_var ()
 Only returns not nullptr, if Var of this mutable has ever been created.
 
const Varhas_var () const
 As above if this is a mutable.
 
Free Vars and Muts
Muts local_muts () const
 
Vars local_vars () const
 
Vars free_vars () const
 
Vars free_vars ()
 
bool is_open () const
 Has free_vars()?
 
bool is_closed () const
 Has no free_vars()?
 
Muts fv_consumers ()
 
external
bool is_external () const
 
void make_external ()
 
void make_internal ()
 
void transfer_external (Def *to)
 
Casts
template<class T = Def>
const T * isa_imm () const
 
template<class T = Def>
const T * as_imm () const
 
template<class T = Def, class R >
const T * isa_imm (R(T::*f)() const) const
 
template<class T = Def, bool invert = false>
T * isa_mut () const
 If this is *mut*able, 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.
 
Dbg Getters
Dbg dbg () const
 
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 Defset (Loc l) const
 
template<bool Ow = false>
Defset (Loc l)
 
template<bool Ow = false>
const Defset (Sym s) const
 
template<bool Ow = false>
Defset (Sym s)
 
template<bool Ow = false>
const Defset (std::string s) const
 
template<bool Ow = false>
Defset (std::string s)
 
template<bool Ow = false>
const Defset (Loc l, Sym s) const
 
template<bool Ow = false>
Defset (Loc l, Sym s)
 
template<bool Ow = false>
const Defset (Loc l, std::string s) const
 
template<bool Ow = false>
Defset (Loc l, std::string s)
 
template<bool Ow = false>
const Defset (Dbg d) const
 
template<bool Ow = false>
Defset (Dbg d)
 
debug_prefix/suffix

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

const Defdebug_prefix (std::string) const
 
const Defdebug_suffix (std::string) const
 
Rebuild
Defstub (World &w, Ref type)
 
Defstub (Ref type)
 
Ref rebuild (World &w, Ref type, Defs ops) const
 Def::rebuilds this Def while using new_op as substitute for its i'th Def::op.
 
Ref rebuild (Ref type, Defs ops) const
 
virtual const Defimmutabilize ()
 Tries to make an immutable from a mutable.
 
const Defrefine (size_t i, const Def *new_op) const
 
DefVec reduce (const Def *arg) const
 Rewrites Def::ops by substituting this mutable's Var with arg.
 
DefVec reduce (const Def *arg)
 
Type Checking
virtual void check ()
 
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

Dumps DOT to os while obeying maximum recursion depth of max.

If types is true, Def::type() dependencies will be followed as well.

void dot (std::ostream &os, uint32_t max=0xFFFFFF, bool types=false) const
 
void dot (const char *file=nullptr, uint32_t max=0xFFFFFF, bool types=false) const
 Same as above but write to file or std::cout if file is nullptr.
 
void dot (const std::string &file, uint32_t max=0xFFFFFF, bool types=false) const
 

Protected Member Functions

 Def (World *, node_t, const Def *type, Defs ops, flags_t flags)
 Constructor for an immutable Def.
 
 Def (node_t n, const Def *type, Defs ops, flags_t flags)
 As above but World retrieved from type.
 
 Def (node_t, const Def *type, size_t num_ops, flags_t flags)
 Constructor for a mutable Def.
 
virtual ~Def ()=default
 
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
 

Protected Attributes

Dbg dbg_
 
union { 
 
NormalizeFn normalizer_
 Axiom only: Axioms use this member to store their normalizer.
 
const Axiomaxiom_
 App only: Curried Apps of Axioms use this member to propagate the Axiom.
 
const Varvar_
 Mutable only: Var of a mutable.
 
Worldworld_
 
};  
 
flags_t flags_
 
u8 curry_
 
u8 trip_
 

Private Member Functions

virtual Defstub_ (World &, Ref)
 
virtual Ref rebuild_ (World &w, Ref type, Defs ops) const =0
 

Friends

class World
 
void swap (World &, World &) noexcept
 

Detailed Description

Base class for all Defs.

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

Def| type | op(0) ... op(num_ops-1) |
|-----------ops-----------|
|----------partial_ops-----------|
|--------------------------------| if type() != nullptr && is_set()
|-------------------------| if type() == nullptr && is_set()
|------| if type() != nullptr && !is_set()
|| if type() == nullptr && !is_set()
Base class for all Defs.
Definition def.h:223
bool is_set() const
Yields true if empty or the last op is set.
Definition def.cpp:309
size_t num_ops() const
Definition def.h:270
const Def * op(size_t i) const
Definition def.h:269
Defs extended_ops() const
Definition def.cpp:441
auto ops() const
Definition def.h:268
const Def * type() const
Definition def.h:248
Defs partial_ops() const
Definition def.h:321
Attention
This means that any subclass of Def must not introduce additional members.
See also
Immutables vs. Mutables

Definition at line 223 of file def.h.

Constructor & Destructor Documentation

◆ Def() [1/3]

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

◆ Def() [2/3]

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

As above but World retrieved from type.

Definition at line 57 of file def.cpp.

◆ Def() [3/3]

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

Constructor for a mutable Def.

Definition at line 60 of file def.cpp.

References dep_const(), gid(), mim::murmur3(), mim::World::next_gid(), num_ops(), mim::Use::Type, type(), and world().

◆ ~Def()

virtual mim::Def::~Def ( )
protectedvirtualdefault

Member Function Documentation

◆ arity()

◆ as_imm()

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

Definition at line 442 of file def.h.

References as_mut().

◆ as_lit_arity()

nat_t mim::Def::as_lit_arity ( ) const
inline

◆ as_mut()

template<class T = Def, bool invert = false>
T * mim::Def::as_mut ( ) const
inline

◆ check()

virtual void mim::Def::check ( )
inlinevirtual

Reimplemented in mim::Arr, mim::Lam, mim::Pi, and mim::Sigma.

Definition at line 528 of file def.h.

Referenced by set().

◆ dbg()

◆ debug_prefix()

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

Definition at line 448 of file def.cpp.

References dbg_, mim::Dbg::set(), sym(), and world().

◆ debug_suffix()

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

Definition at line 449 of file def.cpp.

References dbg_, mim::Dbg::set(), sym(), and world().

◆ dep()

unsigned mim::Def::dep ( ) const
inline
See also
Dep.

Definition at line 335 of file def.h.

Referenced by has_dep().

◆ dep_const()

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

◆ dot() [1/3]

void mim::Def::dot ( const char * file = nullptr,
uint32_t max = 0xFFFFFF,
bool types = false ) const

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

Definition at line 122 of file dot.cpp.

References dot().

◆ dot() [2/3]

void mim::Def::dot ( const std::string & file,
uint32_t max = 0xFFFFFF,
bool types = false ) const
inline

Definition at line 547 of file def.h.

References dot().

◆ dot() [3/3]

void mim::Def::dot ( std::ostream & os,
uint32_t max = 0xFFFFFF,
bool types = false ) const

Definition at line 120 of file dot.cpp.

Referenced by dot(), and dot().

◆ dump() [1/2]

void mim::Def::dump ( ) const

Definition at line 450 of file dump.cpp.

◆ dump() [2/2]

void mim::Def::dump ( int max) const

Definition at line 451 of file dump.cpp.

◆ extended_op()

const Def * mim::Def::extended_op ( size_t i) const
inline

Definition at line 312 of file def.h.

References extended_ops().

◆ extended_ops()

Defs mim::Def::extended_ops ( ) const

◆ flags()

◆ free_vars() [1/2]

Vars mim::Def::free_vars ( )

Definition at line 334 of file def.cpp.

References free_vars(), is_set(), and isa_mut().

◆ free_vars() [2/2]

◆ fv_consumers()

Muts mim::Def::fv_consumers ( )
inline

Definition at line 426 of file def.h.

◆ gid()

◆ has_dep() [1/2]

bool mim::Def::has_dep ( Dep d) const
inline

Definition at line 336 of file def.h.

References has_dep().

Referenced by dep_const(), has_dep(), and mim::Infer::should_eliminate().

◆ has_dep() [2/2]

bool mim::Def::has_dep ( unsigned u) const
inline

Definition at line 337 of file def.h.

References dep().

◆ has_var() [1/2]

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

Only returns not nullptr, if Var of this mutable has ever been created.

Definition at line 405 of file def.h.

Referenced by has_var(), mim::Arr::immutabilize(), mim::Pack::immutabilize(), mim::Pi::immutabilize(), mim::Sigma::immutabilize(), and mim::VarRewriter::rewrite_mut().

◆ has_var() [2/2]

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

As above if this is a mutable.

Definition at line 407 of file def.h.

References has_var(), and isa_mut().

◆ hash()

hash_t mim::Def::hash ( ) const
inline

Definition at line 240 of file def.h.

◆ immutabilize()

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

Tries to make an immutable from a mutable.

This usually works if the mutable isn't recursive and its var isn't used.

Reimplemented in mim::Arr, mim::Pack, mim::Pi, and mim::Sigma.

Definition at line 517 of file def.h.

◆ is_closed()

bool mim::Def::is_closed ( ) const

◆ is_external()

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

◆ is_open()

bool mim::Def::is_open ( ) const

Has free_vars()?

Definition at line 403 of file def.cpp.

References mim::PooledSet< T >::empty(), free_vars(), local_muts(), and local_vars().

◆ is_set()

bool mim::Def::is_set ( ) const

◆ is_term()

bool mim::Def::is_term ( ) const

Yields true if this:T and T:(Type 0).

Definition at line 470 of file def.cpp.

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

Referenced by mim::flatten().

◆ isa_imm() [1/2]

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

◆ isa_imm() [2/2]

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

Definition at line 443 of file def.h.

References isa_mut().

◆ isa_lit_arity()

std::optional< nat_t > mim::Def::isa_lit_arity ( ) const

Definition at line 488 of file def.cpp.

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

Referenced by as_lit_arity(), mim::flatten(), mim::World::insert(), num_projs(), and num_tprojs().

◆ isa_mut()

◆ loc()

◆ local_muts()

Muts mim::Def::local_muts ( ) const

◆ local_vars()

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

Definition at line 421 of file def.h.

Referenced by Def(), free_vars(), is_closed(), is_open(), and mim::VarRewriter::rewrite_imm().

◆ make_external()

void mim::Def::make_external ( )

Definition at line 508 of file def.cpp.

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

Referenced by transfer_external().

◆ make_internal()

void mim::Def::make_internal ( )

◆ node()

node_t mim::Def::node ( ) const
inline

Definition at line 241 of file def.h.

Referenced by Def(), mim::Pi::isa_cn(), and node_name().

◆ node_name()

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

◆ num_extended_ops()

size_t mim::Def::num_extended_ops ( ) const
inline

Definition at line 313 of file def.h.

References extended_ops().

◆ num_ops()

◆ num_partial_ops()

size_t mim::Def::num_partial_ops ( ) const
inline

Definition at line 323 of file def.h.

References partial_ops().

◆ num_projs()

nat_t mim::Def::num_projs ( ) const
inline

Yields Def::as_lit_arity(), if it is in fact a Lit, or 1 otherwise.

Definition at line 357 of file def.h.

References isa_lit_arity().

Referenced by mim::plug::clos::clos_insert_env(), mim::plug::clos::clos_remove_env(), mim::plug::mem::mem_def(), proj(), projs(), and mim::plug::mem::replace_mem().

◆ num_tprojs()

nat_t mim::Def::num_tprojs ( ) const

As above but yields 1, if Flags::scalarize_threshold is exceeded.

Definition at line 513 of file def.cpp.

References mim::World::flags(), isa_lit_arity(), mim::Flags::scalarize_threshold, and world().

Referenced by tproj(), and tprojs().

◆ num_tvars()

nat_t mim::Def::num_tvars ( )
inline

Definition at line 401 of file def.h.

◆ num_uses()

size_t mim::Def::num_uses ( ) const
inline

Definition at line 329 of file def.h.

References uses().

◆ num_vars()

nat_t mim::Def::num_vars ( )
inline

Definition at line 401 of file def.h.

Referenced by mim::ll::Emitter::emit_epilogue(), and mim::Lam::ret_var().

◆ op()

◆ ops()

◆ partial_op()

const Def * mim::Def::partial_op ( size_t i) const
inline

Definition at line 322 of file def.h.

References partial_ops().

◆ partial_ops()

Defs mim::Def::partial_ops ( ) const
inline

Definition at line 321 of file def.h.

Referenced by num_partial_ops(), and partial_op().

◆ proj() [1/2]

const Def * mim::Def::proj ( nat_t a,
nat_t i ) const

◆ proj() [2/2]

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

As above but takes Def::num_projs as arity.

Definition at line 362 of file def.h.

References num_projs(), and proj().

Referenced by proj().

◆ projs() [1/4]

template<nat_t A = -1_n>
auto mim::Def::projs ( ) const
inline

Definition at line 385 of file def.h.

References projs().

Referenced by projs(), projs(), projs(), and tprojs().

◆ projs() [2/4]

template<nat_t A = -1_n, class F >
auto mim::Def::projs ( F f) const
inline

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

Applies f to each element.

Definition at line 367 of file def.h.

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

Referenced by mim::plug::autodiff::AutoDiffEval::augment_tuple(), mim::ll::Emitter::emit_bb(), mim::plug::clos::Clos2SJLJ::enter(), mim::plug::regex::flatten_in_arg(), mim::plug::mem::mem_def(), mim_get_plugin(), mim::plug::core::normalize_abs(), mim::plug::autodiff::normalize_add(), mim::plug::math::normalize_arith(), mim::plug::core::normalize_bit2(), mim::plug::math::normalize_cmp(), mim::plug::compile::normalize_combine_pass_list(), mim::plug::refly::normalize_dbg(), mim::plug::core::normalize_div(), mim::plug::core::normalize_extrema(), mim::plug::math::normalize_extrema(), mim::plug::core::normalize_icmp(), mim::plug::mem::normalize_lea(), mim::plug::mem::normalize_load(), mim::plug::core::normalize_nat(), mim::plug::core::normalize_ncmp(), mim::plug::math::normalize_pow(), mim::plug::regex::normalize_range(), mim::plug::matrix::normalize_read(), mim::plug::refly::normalize_refine(), mim::plug::matrix::normalize_shape(), mim::plug::core::normalize_shr(), mim::plug::mem::normalize_store(), mim::plug::autodiff::normalize_sum(), mim::plug::core::normalize_wrap(), mim::plug::core::normalize_zip(), mim::plug::matrix::LowerMatrixMediumLevel::rewrite_(), mim::plug::matrix::LowerMatrixLowLevel::rewrite_imm(), mim::plug::mem::strip_mem(), mim::tuple2str(), and mim::unflatten().

◆ projs() [3/4]

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

Definition at line 391 of file def.h.

References projs().

◆ projs() [4/4]

template<class F >
auto mim::Def::projs ( nat_t a,
F f ) const
inline

Definition at line 381 of file def.h.

References proj(), and mim::Vector().

◆ rebuild() [1/2]

Ref mim::Def::rebuild ( Ref type,
Defs ops ) const
inline

Definition at line 513 of file def.h.

References ops(), rebuild(), type(), and world().

Referenced by rebuild().

◆ rebuild() [2/2]

Ref mim::Def::rebuild ( World & w,
Ref type,
Defs ops ) const
inline

Def::rebuilds this Def while using new_op as substitute for its i'th Def::op.

Definition at line 509 of file def.h.

References dbg(), isa_imm(), ops(), rebuild_(), set(), and type().

Referenced by refine(), mim::EtaExp::rewrite(), and mim::Rewriter::rewrite_imm().

◆ rebuild_()

◆ reduce() [1/2]

DefVec mim::Def::reduce ( const Def * arg)

Definition at line 211 of file def.cpp.

References mim::rewrite(), and world().

◆ reduce() [2/2]

DefVec mim::Def::reduce ( const Def * arg) const

Rewrites Def::ops by substituting this mutable's Var with arg.

Definition at line 206 of file def.cpp.

References isa_mut(), and ops().

Referenced by mim::World::app(), mim::World::extract(), and mim::plug::compile::handle_optimization_part().

◆ refine()

◆ reset() [1/2]

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

Def::reset ops all at once.

Definition at line 243 of file def.cpp.

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

◆ reset() [2/2]

Def * mim::Def::reset ( size_t i,
const Def * def )
inline

Successively reset from left to right.

Definition at line 291 of file def.h.

References set(), and unset().

Referenced by mim::plug::clos::Clos2SJLJ::enter(), mim::RetWrap::enter(), mim::Infer::find(), reset(), mim::Infer::reset(), and mim::PassMan::run().

◆ set() [1/14]

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

Definition at line 487 of file def.h.

References set().

Referenced by set().

◆ set() [2/14]

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

Definition at line 486 of file def.h.

References set().

Referenced by set().

◆ set() [3/14]

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

Def::set ops all at once.

Definition at line 242 of file def.cpp.

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

◆ set() [4/14]

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

Definition at line 477 of file def.h.

References dbg_, mim::Dbg::loc(), and mim::Dbg::set().

◆ set() [5/14]

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

Definition at line 476 of file def.h.

References dbg_, mim::Dbg::loc(), and mim::Dbg::set().

◆ set() [6/14]

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

Definition at line 485 of file def.h.

References set(), and sym().

Referenced by set().

◆ set() [7/14]

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

Definition at line 484 of file def.h.

References set(), and sym().

Referenced by set().

◆ set() [8/14]

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

Definition at line 483 of file def.h.

References set().

Referenced by set().

◆ set() [9/14]

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

Definition at line 482 of file def.h.

References set().

Referenced by set().

◆ set() [10/14]

◆ set() [11/14]

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

Definition at line 481 of file def.h.

References set(), and sym().

Referenced by set().

◆ set() [12/14]

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

Definition at line 480 of file def.h.

References set(), and sym().

Referenced by set().

◆ set() [13/14]

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

Definition at line 479 of file def.h.

References dbg_, mim::Dbg::set(), and mim::Dbg::sym().

◆ set() [14/14]

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

Definition at line 478 of file def.h.

References dbg_, mim::Dbg::set(), and mim::Dbg::sym().

◆ set_type()

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

Definition at line 288 of file def.cpp.

References mim::Use::Type, type(), and unset_type().

Referenced by mim::Arr::check(), mim::Pi::check(), mim::Sigma::check(), and update().

◆ stream()

std::ostream & mim::Def::stream ( std::ostream & os,
int max ) const

Definition at line 431 of file dump.cpp.

◆ stub() [1/2]

Def * mim::Def::stub ( Ref type)
inline

Definition at line 506 of file def.h.

References stub(), type(), and world().

Referenced by stub().

◆ stub() [2/2]

Def * mim::Def::stub ( World & w,
Ref type )
inline

Definition at line 505 of file def.h.

References dbg(), set(), stub_(), and type().

Referenced by mim::LamSpec::rewrite(), and mim::Rewriter::rewrite_mut().

◆ stub_()

virtual Def * mim::Def::stub_ ( World & ,
Ref  )
inlineprivatevirtual

Reimplemented in mim::Arr, mim::Global, mim::Infer, mim::Lam, mim::Pack, mim::Pi, mim::Sigma, mim::TBound< Up >, and mim::TExt< Up >.

Definition at line 562 of file def.h.

Referenced by stub().

◆ sym() [1/4]

◆ sym() [2/4]

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

Definition at line 411 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 413 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 412 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.

Definition at line 363 of file def.h.

References num_tprojs(), and proj().

◆ tprojs() [1/2]

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

Definition at line 388 of file def.h.

References tprojs().

Referenced by tprojs().

◆ tprojs() [2/2]

template<class F >
auto mim::Def::tprojs ( F f) const
inline

Definition at line 379 of file def.h.

References num_tprojs(), and projs().

◆ transfer_external()

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

Definition at line 434 of file def.h.

References make_external(), and make_internal().

◆ tvar()

Ref mim::Def::tvar ( nat_t i)
inline

Definition at line 401 of file def.h.

◆ tvars() [1/2]

auto mim::Def::tvars ( )
inline

Definition at line 401 of file def.h.

◆ tvars() [2/2]

template<class F >
auto mim::Def::tvars ( F f)
inline

Definition at line 401 of file def.h.

◆ type()

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

Yields the raw type of this Def, i.e. maybe nullptr.

See also
Def::unfold_type.

Definition at line 248 of file def.h.

Referenced by mim::World::app(), arity(), mim::plug::autodiff::AutoDiffEval::augment_(), mim::plug::autodiff::AutoDiffEval::augment_app(), mim::plug::autodiff::AutoDiffEval::augment_extract(), mim::plug::autodiff::AutoDiffEval::augment_pack(), mim::plug::autodiff::AutoDiffEval::augment_tuple(), mim::App::callee_type(), mim::Arr::check(), mim::Pi::check(), mim::Sigma::check(), mim::plug::clos::clos_pack(), mim::plug::matrix::counting_for(), Def(), Def(), mim::plug::autodiff::AutoDiffEval::derive_(), mim::ll::Emitter::emit_bb(), mim::plug::clos::ClosLit::env_type(), mim::plug::clos::ClosConvPrep::eta_wrap(), extended_ops(), mim::World::extract(), mim::Bound::find(), mim::flatten(), mim::plug::clos::ClosLit::fnc_type(), mim::Bound::get(), mim::plug::compile::handle_optimization_part(), mim::World::iapp(), mim::World::iinfer(), mim::World::insert(), is_term(), mim::is_unit(), isa_lit_arity(), mim::plug::mem::mem_def(), mim::merge_tuple(), mim::plug::core::normalize_bitcast(), mim::plug::core::normalize_conv(), mim::plug::math::normalize_conv(), mim::plug::core::normalize_shr(), mim::plug::core::op(), mim::plug::mem::op_lea(), mim::plug::mem::op_lea_unsafe(), mim::plug::matrix::op_read(), mim::optimize(), mim::World::pack(), proj(), rebuild(), rebuild(), refine(), mim::plug::mem::replace_mem(), mim::EtaExp::rewrite(), mim::plug::matrix::LowerMatrixHighLevelMapRed::rewrite_(), mim::plug::clos::ClosConvPrep::rewrite_callee(), mim::plug::matrix::LowerMatrixLowLevel::rewrite_imm(), mim::Rewriter::rewrite_imm(), mim::Rewriter::rewrite_mut(), mim::PassMan::run(), mim::Scheduler::Scheduler(), set_type(), mim::Pack::shape(), mim::plug::mem::strip_mem(), mim::Arr::stub(), stub(), stub(), mim::Infer::stub(), mim::Pack::stub(), mim::Pi::stub(), mim::Sigma::stub(), mim::TBound< Up >::stub(), mim::TExt< Up >::stub(), mim::World::test(), mim::World::tuple(), mim::Global::type(), mim::Lam::type(), mim::plug::clos::ClosLit::type(), mim::World::type(), mim::World::uinc(), update(), and world().

◆ 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 421 of file def.cpp.

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

Referenced by mim::World::arr(), mim::Arr::check(), and mim::Pi::infer().

◆ unique_name()

std::string mim::Def::unique_name ( ) const

name + "_" + Def::gid

Definition at line 511 of file def.cpp.

References gid(), and sym().

◆ unset()

Def * mim::Def::unset ( )

Unsets all Def::ops; works even, if not set at all or partially.

Definition at line 264 of file def.cpp.

References num_ops(), op(), and unset().

Referenced by reset(), mim::Arr::unset(), unset(), mim::Infer::unset(), mim::Lam::unset(), mim::Pack::unset(), mim::Pi::unset(), and mim::Sigma::unset().

◆ unset_type()

void mim::Def::unset_type ( )

Definition at line 298 of file def.cpp.

References dep_const(), and mim::Use::Type.

Referenced by set_type().

◆ update()

void mim::Def::update ( )
inline

Resolves Infers of this Def's type.

Definition at line 299 of file def.h.

References mim::Ref::refer(), set_type(), and type().

Referenced by mim::Infer::find(), and set().

◆ uses()

const Uses & mim::Def::uses ( ) const
inline

Definition at line 328 of file def.h.

Referenced by num_uses(), and proj().

◆ var() [1/3]

Ref mim::Def::var ( )

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

Definition at line 454 of file def.cpp.

References world().

Referenced by Def(), mim::Arr::immutabilize(), mim::Pack::immutabilize(), mim::Pi::immutabilize(), and mim::Lam::ret_var().

◆ var() [2/3]

◆ var() [3/3]

Ref mim::Def::var ( nat_t i)
inline

Definition at line 401 of file def.h.

◆ vars() [1/4]

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

Definition at line 401 of file def.h.

Referenced by free_vars().

◆ vars() [2/4]

template<nat_t A = std::dynamic_extent, class F >
auto mim::Def::vars ( F f)
inline

◆ vars() [3/4]

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

Definition at line 401 of file def.h.

◆ vars() [4/4]

template<class F >
auto mim::Def::vars ( nat_t a,
F f )
inline

Definition at line 401 of file def.h.

◆ world()

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

Definition at line 415 of file def.cpp.

References type(), and world().

Referenced by mim::Check::alpha(), mim::Lam::app(), mim::Lam::app(), mim::plug::clos::apply_closure(), arity(), mim::Check::assignable(), mim::plug::autodiff::AutoDiffEval::augment_(), mim::plug::autodiff::AutoDiffEval::augment_app(), mim::plug::autodiff::AutoDiffEval::augment_extract(), mim::plug::autodiff::AutoDiffEval::augment_lam(), mim::plug::autodiff::AutoDiffEval::augment_pack(), mim::plug::autodiff::AutoDiffEval::augment_tuple(), mim::plug::autodiff::autodiff_type_fun(), mim::plug::autodiff::autodiff_type_fun_pi(), mim::Lam::branch(), mim::Lam::check(), mim::Sigma::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_type(), mim::plug::clos::clos_type_to_pi(), mim::plug::core::convert(), mim::plug::matrix::counting_for(), debug_prefix(), debug_suffix(), Def(), Def(), mim::PipelineBuilder::def2pass(), mim::plug::autodiff::AutoDiffEval::derive_(), mim::Infer::eliminate(), mim::flatten(), free_vars(), mim::plug::autodiff::id_pullback(), mim::Arr::immutabilize(), mim::Pack::immutabilize(), mim::Pi::immutabilize(), mim::Sigma::immutabilize(), mim::Pi::infer(), mim::is_unit(), mim::plug::clos::isa_clos_type(), local_muts(), make_external(), make_internal(), mim::merge_sigma(), mim::merge_tuple(), mim::plug::mem::mut_con(), mim::plug::core::normalize_abs(), mim::plug::math::normalize_abs(), mim::plug::autodiff::normalize_AD(), mim::plug::autodiff::normalize_ad(), mim::plug::autodiff::normalize_add(), mim::plug::math::normalize_arith(), mim::plug::core::normalize_bit1(), mim::plug::core::normalize_bit2(), mim::plug::core::normalize_bitcast(), mim::plug::clos::normalize_clos(), mim::plug::math::normalize_cmp(), mim::plug::compile::normalize_combine_pass_list(), mim::plug::compile::normalize_combined_phase(), mim::plug::regex::normalize_conj(), mim::plug::demo::normalize_const(), mim::plug::core::normalize_conv(), mim::plug::math::normalize_conv(), mim::plug::refly::normalize_dbg(), mim::plug::regex::normalize_disj(), mim::plug::core::normalize_div(), mim::plug::math::normalize_er(), mim::plug::math::normalize_exp(), mim::plug::core::normalize_extrema(), mim::plug::math::normalize_extrema(), mim::plug::math::normalize_gamma(), mim::plug::refly::normalize_gid(), mim::plug::core::normalize_icmp(), mim::plug::core::normalize_idx(), mim::plug::matrix::normalize_insert(), mim::plug::mem::normalize_lea(), mim::plug::mem::normalize_load(), mim::plug::matrix::normalize_map_reduce(), mim::plug::core::normalize_nat(), mim::plug::core::normalize_ncmp(), mim::plug::regex::normalize_not(), mim::plug::compile::normalize_pass_phase(), mim::plug::core::normalize_pe(), mim::plug::math::normalize_pow(), mim::plug::matrix::normalize_prod(), mim::plug::regex::normalize_quant(), mim::plug::regex::normalize_range(), mim::plug::matrix::normalize_read(), mim::plug::refly::normalize_refine(), mim::plug::mem::normalize_remem(), mim::plug::math::normalize_round(), mim::plug::math::normalize_rt(), mim::plug::matrix::normalize_shape(), mim::plug::core::normalize_shr(), mim::plug::compile::normalize_single_pass_phase(), mim::plug::mem::normalize_store(), mim::plug::autodiff::normalize_sum(), mim::plug::core::normalize_trait(), mim::plug::matrix::normalize_transpose(), mim::plug::math::normalize_tri(), mim::plug::core::normalize_wrap(), mim::plug::autodiff::normalize_zero(), mim::plug::core::normalize_zip(), num_tprojs(), mim::plug::core::op(), mim::plug::core::op(), mim::plug::mem::op_alloc(), mim::plug::mem::op_lea(), mim::plug::mem::op_lea_unsafe(), mim::plug::mem::op_lea_unsafe(), mim::plug::mem::op_malloc(), mim::plug::mem::op_mslot(), mim::plug::matrix::op_read(), mim::plug::mem::op_slot(), mim::plug::autodiff::op_sum(), mim::operator<<(), proj(), mim::plug::autodiff::pullback_type(), rebuild(), reduce(), mim::plug::direct::DS2CPS::rewrite(), mim::plug::regex::LowerRegex::rewrite(), mim::plug::matrix::LowerMatrixMediumLevel::rewrite_(), mim::PassMan::run(), mim::Pi::set_dom(), mim::Lam::set_filter(), mim::Pack::shape(), mim::plug::mem::strip_mem(), mim::plug::mem::strip_mem_ty(), mim::Arr::stub(), stub(), mim::Global::stub(), mim::Infer::stub(), mim::Lam::stub(), mim::Pack::stub(), mim::Pi::stub(), mim::Sigma::stub(), mim::TBound< Up >::stub(), mim::TExt< Up >::stub(), sym(), sym(), sym(), mim::Lam::test(), unfold_type(), var(), world(), mim::plug::autodiff::zero_def(), and mim::plug::autodiff::zero_pullback().

◆ write() [1/2]

void mim::Def::write ( int max) const

Definition at line 458 of file dump.cpp.

◆ write() [2/2]

void mim::Def::write ( int max,
const char * file ) const

Definition at line 453 of file dump.cpp.

Friends And Related Symbol Documentation

◆ swap

void swap ( World & ,
World &  )
friend

◆ World

friend class World
friend

Definition at line 619 of file def.h.

Member Data Documentation

◆ [union]

union { ... } mim::Def

◆ curry_

u8 mim::Def::curry_
protected

Definition at line 589 of file def.h.

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

◆ dbg_

Dbg mim::Def::dbg_
mutableprotected

Definition at line 581 of file def.h.

Referenced by dbg(), debug_prefix(), debug_suffix(), loc(), set(), set(), set(), set(), and sym().

◆ flags_

flags_t mim::Def::flags_
protected

Definition at line 588 of file def.h.

Referenced by Def(), flags(), mim::Lit::get(), mim::Pi::make_explicit(), and mim::Pi::make_implicit().

◆ trip_

u8 mim::Def::trip_
protected

Definition at line 590 of file def.h.

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


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