MimIR 0.1
MimIR is my Intermediate Representation
Loading...
Searching...
No Matches

#include <mim/lam.h>

Inheritance diagram for mim::App:
[legend]

Public Member Functions

callee
const Def * callee () const
const App * decurry () const
 Returns App::callee again as App.
const Picallee_type () const
arg

See also
proj
const Def * arg () const
Get axm, current curry counter and trip count
const Axmaxm () const
u8 curry () const
u8 trip () const
Public Member Functions inherited from mim::Def
Worldworld () const noexcept
constexpr flags_t flags () const noexcept
constexpr u32 gid () const noexcept
 Global id - unique number for this Def.
constexpr u32 tid () const noexcept
 Trie id - only used in Trie.
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
u32 judge () const noexcept
bool is_form () const noexcept
bool is_intro () const noexcept
bool is_elim () const noexcept
bool is_meta () const noexcept
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.
bool is_term () const
virtual const Def * arity () const
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
bool is_set () const
 Yields true if empty or the last op is set.
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.
Defs deps () const noexcept
const Def * dep (size_t i) const noexcept
size_t num_deps () const noexcept
bool has_dep () const
bool has_dep (Dep d) const
bool has_dep (unsigned u) const
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
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 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.
template<class D = Def>
std::pair< D *, const Var * > isa_binder () const
 Is this a mutable that introduces a Var?
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
 Compute a global solution by transitively following mutables as well.
Vars free_vars ()
Muts users ()
 Set of mutables where this mutable is locally referenced.
bool is_open () const
 Has free_vars()?
bool is_closed () const
 Has no free_vars()?
Def * outermost_binder () const
 Transitively walks up free_vars() till the outermoust binder has been found.
bool is_external () const noexcept
void externalize ()
void internalize ()
void transfer_external (Def *to)
bool is_annex () const noexcept
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.
Dbg dbg () const
Loc loc () const
Sym sym () const
std::string unique_name () const
 name + "_" + Def::gid
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)
const Def * debug_prefix (std::string) const
const Def * debug_suffix (std::string) const
Def * stub (World &w, const Def *type)
Def * stub (const Def *type)
const Def * rebuild (World &w, const Def *type, Defs ops) const
 Def::rebuilds this Def while using new_op as substitute for its i'th Def::op.
const Def * rebuild (const Def *type, Defs ops) const
virtual const Def * immutabilize ()
 Tries to make an immutable from a mutable.
bool is_immutabilizable ()
const Def * refine (size_t i, const Def *new_op) const
template<size_t N = std::dynamic_extent>
constexpr auto reduce (const Def *arg) const
virtual constexpr size_t reduction_offset () const noexcept
 First Def::op that needs to be dealt with during reduction; e.g.
virtual const Def * check (size_t i, const Def *def)
 Checks whether the ith operand can be set to def.
virtual 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.
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
void dot (std::ostream &os, int max=std::numeric_limits< int >::max(), bool types=false) const
void dot (const char *file=nullptr, int max=std::numeric_limits< int >::max(), bool types=false) const
 Same as above but write to file or std::cout if file is nullptr.
void dot (const std::string &file, int max=std::numeric_limits< int >::max(), bool types=false) const
Public Member Functions inherited from mim::Setters< App >
const Appset (Loc l) const

Static Public Attributes

static constexpr auto Node = mim::Node::App
static constexpr size_t Num_Ops = 2

Private Member Functions

const Def * rebuild_ (World &, const Def *, Defs) const final

Friends

class World

Uncurry

Retrieve all App::args of a curried App.

Use like this:

// 1. Variant:
auto [abc, de] = app->uncurry<2>();
auto [a, b, c] = abc->projs<3>();
auto [d, e] = de->projs<2>();
// 2. Variant:
auto [callee, args] = App::uncurry(def);
auto uncurry() const
Definition lam.h:324
const Def * callee() const
Definition lam.h:276
Returns
  1. Variant:
    only the arguments in a std::array<const Def*, N>. You will not retrieve the initial callee because if you know the number of curried Apps, you probably also know the callee anyway. Also, if you "overshoot" the number of curried Apps, the superflous args on the left will be set to nullptr.
  2. Variant:
    A pair that contains:
    1. The initial callee.
    2. A DefVec of all curried App::args. You can enforce variant 1 / variant 2 by with the template argument Callee.
template<size_t N = std::dynamic_extent>
auto uncurry () const
const Def * uncurry_callee () const
template<size_t N = std::dynamic_extent>
auto uncurry_args () const
template<size_t N = std::dynamic_extent>
static auto uncurry (const Def *def)
static const Def * uncurry_callee (const Def *def)
template<size_t N = std::dynamic_extent>
static auto uncurry_args (const Def *def)

Additional Inherited Members

enum class  Cmp {
  L ,
  G ,
  E ,
  U
}
Static Public Member Functions inherited from mim::Def
static DefVec zonk (Defs defs)
 zonks all defs and returns a new DefVec.
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)
Protected Member Functions inherited from mim::Def
 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.
virtual ~Def ()=default
Sym sym (const char *) const
Sym sym (std::string_view) const
Sym sym (std::string) const
Protected Attributes inherited from mim::Def
Dbg dbg_
union { 
NormalizeFn normalizer_
 Axm only: Axms use this member to store their normalizer.
const Axmaxm_
 App only: Curried Apps of Axms use this member to propagate the Axm.
const Varvar_
 Mutable only: Var of a mutable.
Worldworld_
}; 
flags_t flags_
u8 curry_ = 0
u8 trip_ = 0

Detailed Description

Definition at line 224 of file lam.h.

Member Function Documentation

◆ arg()

◆ axm()

const Axm * mim::App::axm ( ) const
inline

Definition at line 291 of file lam.h.

References axm().

Referenced by axm().

◆ callee()

◆ callee_type()

const Pi * mim::App::callee_type ( ) const
inline

Definition at line 278 of file lam.h.

References callee(), and mim::Def::type().

Referenced by mim::plug::clos::ClosConvPrep::rewrite_callee().

◆ curry()

u8 mim::App::curry ( ) const
inline

Definition at line 292 of file lam.h.

References mim::Def::curry_.

◆ decurry()

const App * mim::App::decurry ( ) const
inline

Returns App::callee again as App.

Definition at line 277 of file lam.h.

References callee().

Referenced by mim::plug::core::normalize_bit1().

◆ rebuild_()

const Def * mim::App::rebuild_ ( World & w,
const Def * ,
Defs o ) const
finalprivatevirtual

Implements mim::Def.

Definition at line 114 of file def.cpp.

References World.

◆ trip()

u8 mim::App::trip ( ) const
inline

Definition at line 293 of file lam.h.

References mim::Def::trip_.

◆ uncurry() [1/2]

template<size_t N = std::dynamic_extent>
auto mim::App::uncurry ( ) const
inline

Definition at line 324 of file lam.h.

◆ uncurry() [2/2]

template<size_t N = std::dynamic_extent>
auto mim::App::uncurry ( const Def * def)
inlinestatic

Definition at line 323 of file lam.h.

◆ uncurry_args() [1/2]

template<size_t N = std::dynamic_extent>
auto mim::App::uncurry_args ( ) const
inline

Definition at line 330 of file lam.h.

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

◆ uncurry_args() [2/2]

template<size_t N = std::dynamic_extent>
auto mim::App::uncurry_args ( const Def * def)
inlinestatic

Definition at line 329 of file lam.h.

Referenced by mim::PhaseMan::apply().

◆ uncurry_callee() [1/2]

const Def * mim::App::uncurry_callee ( ) const
inline

Definition at line 327 of file lam.h.

Referenced by mim::Stage::create(), and mim::optimize().

◆ uncurry_callee() [2/2]

const Def * mim::App::uncurry_callee ( const Def * def)
inlinestatic

Definition at line 326 of file lam.h.

◆ World

friend class World
friend

Definition at line 340 of file lam.h.

References World.

Referenced by rebuild_(), and World.

Member Data Documentation

◆ Node

auto mim::App::Node = mim::Node::App
staticconstexpr

Definition at line 334 of file lam.h.

◆ Num_Ops

size_t mim::App::Num_Ops = 2
staticconstexpr

Definition at line 335 of file lam.h.


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