|
MimIR 0.1
MimIR is my Intermediate Representation
|
#include <mim/axm.h>
Classes | |
| class | IsA |
| struct | IsANode |
Public Member Functions | |
Normalization | |
For a curried App of an Axm, you only want to trigger normalization at specific spots. For this reason, MimIR maintains a Def::curry_ counter that each App decrements. The Axm::normalizer() will be triggered when Axm::curry() becomes Using an initial value as x a b c1 d1 e1 c2 d2 e2 c3 d3 e3
the Axm::normalizer will be triggered after App'ing | |
| NormalizeFn | normalizer () const |
| u8 | curry () const |
| u8 | trip () const |
Annex Name | |
| plugin_t | plugin () const |
| tag_t | tag () const |
| sub_t | sub () const |
| flags_t | base () const |
Public Member Functions inherited from mim::Def | |
| World & | world () 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 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. | |
| const Def * | var_type () |
If this is a binder, compute the type of its Variable. | |
| 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()? | |
| bool | is_external () const noexcept |
| void | make_external () |
| void | make_internal () |
| void | transfer_external (Def *to) |
| 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 ben 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, zonks 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, 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 |
Public Member Functions inherited from mim::Setters< Axm > | |
| const Axm * | set (Loc l) const |
| Axm * | set (Loc l) |
| const Axm * | set (Sym s) const |
| Axm * | set (Sym s) |
| const Axm * | set (std::string s) const |
| Axm * | set (std::string s) |
| const Axm * | set (Loc l, Sym s) const |
| Axm * | set (Loc l, Sym s) |
| const Axm * | set (Loc l, std::string s) const |
| Axm * | set (Loc l, std::string s) |
| const Axm * | set (Dbg d) const |
| Axm * | set (Dbg d) |
Static Public Member Functions | |
Normalization - Helpers | |
| static std::tuple< const Axm *, u8, u8 > | get (const Def *def) |
Yields currying counter of def. | |
| static std::pair< u8, u8 > | infer_curry_and_trip (const Def *type) |
isa/as | |
| template<class Id, bool DynCast = true> | |
| static auto | isa (const Def *def) |
| template<class Id, bool DynCast = true> | |
| static auto | isa (Id id, const Def *def) |
| template<class Id> | |
| static auto | as (const Def *def) |
| template<class Id> | |
| static auto | as (Id id, const Def *def) |
Static Public Member Functions inherited from mim::Def | |
| static DefVec | zonk (Defs defs) |
zonks all defs and retuns 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) |
Static Public Attributes | |
| static constexpr u8 | Trip_End = u8(-1) |
| static constexpr auto | Node = mim::Node::Axm |
| static constexpr size_t | Num_Ops = 0 |
Private Member Functions | |
| const Def * | rebuild_ (World &, const Def *, Defs) const final |
Friends | |
| class | World |
Additional Inherited Members | ||
| enum class | Cmp { L , G , E , U } | |
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 Axm * | axm_ | |
| App only: Curried Apps of Axms use this member to propagate the Axm. | ||
| const Var * | var_ | |
| Mutable only: Var of a mutable. | ||
| World * | world_ | |
| }; | ||
| flags_t | flags_ | |
| u8 | curry_ = 0 | |
| u8 | trip_ = 0 | |
| struct mim::Axm::IsANode |
|
inlinestatic |
Definition at line 129 of file axm.h.
References isa().
Referenced by mim::ll::Emitter::emit_bb(), mim::plug::mem::normalize_lea(), mim::plug::mem::normalize_load(), mim::plug::mem::op_lea(), and mim::plug::mem::op_lea_unsafe().
|
inlinestatic |
|
inline |
Definition at line 57 of file axm.h.
References mim::Def::flags(), and mim::Annex::flags2base().
|
inline |
Definition at line 37 of file axm.h.
References mim::Def::curry_.
Referenced by infer_curry_and_trip(), isa(), isa(), and rebuild_().
Yields currying counter of def.
{nullptr, 0, 0} if no Axm is present. Definition at line 38 of file axm.cpp.
References get().
Referenced by mim::World::app(), get(), isa(), isa(), and mim::World::raw_app().
Definition at line 14 of file axm.cpp.
References curry(), infer_curry_and_trip(), trip(), and mim::Def::type().
Referenced by mim::ast::AxmDecl::emit(), and infer_curry_and_trip().
|
inlinestatic |
Definition at line 107 of file axm.h.
References mim::Annex::base(), curry(), and get().
Referenced by mim::plug::clos::LowerTypedClosPrep::analyze(), mim::plug::regex::any_unwanted_for_not(), as(), as(), mim::plug::autodiff::autodiff_type_fun(), mim::plug::regex::compare_re(), mim::ll::Emitter::emit_bb(), mim::ll::Emitter::emit_epilogue(), mim::ll::Emitter::emit_imported(), mim::plug::regex::equals_any(), mim::plug::regex::equals_any(), mim::plug::regex::equals_any(), mim::plug::clos::ClosLit::fnc_as_lam(), mim::plug::regex::get_range(), mim::plug::clos::ClosLit::isa_clos_lit, mim::plug::math::isa_f(), mim::plug::math::match_f(), mim::plug::mem::mem_def(), mim::plug::regex::merge_ranges(), mim::plug::autodiff::normalize_add(), mim::plug::core::normalize_bitcast(), mim::plug::ord::normalize_contains(), mim::plug::regex::normalize_disj(), mim::plug::ord::normalize_get(), mim::plug::ord::normalize_insert(), mim::plug::core::normalize_pe(), mim::plug::regex::normalize_quant(), mim::plug::matrix::normalize_read(), mim::plug::matrix::normalize_shape(), mim::plug::ord::normalize_size(), mim::plug::core::normalize_trait(), mim::plug::matrix::op_read(), mim::ll::Emitter::prepare(), reg_stages(), mim::plug::mem::replace_mem(), mim::plug::autodiff::Eval::rewrite(), mim::plug::clos::ClosConvPrep::rewrite(), mim::plug::clos::LowerTypedClosPrep::rewrite(), mim::plug::mem::pass::SSA::rewrite(), mim::plug::regex::LowerRegex::rewrite(), mim::plug::matrix::LowerMatrixHighLevelMapRed::rewrite_(), mim::plug::matrix::LowerMatrixMediumLevel::rewrite_(), mim::plug::clos::ClosConvPrep::rewrite_arg(), mim::plug::affine::phase::LowerFor::rewrite_imm_App(), mim::plug::matrix::LowerMatrixLowLevel::rewrite_imm_App(), mim::plug::mem::strip_mem(), and mim::plug::mem::strip_mem_ty().
|
inlinestatic |
|
inline |
Definition at line 36 of file axm.h.
Referenced by rebuild_().
|
inline |
Definition at line 54 of file axm.h.
References mim::Def::flags(), and mim::Annex::flags2plugin().
Referenced by mim::Axm::IsA< Id, D >::plugin(), and rebuild_().
Implements mim::Def.
Definition at line 135 of file def.cpp.
References mim::Checker::alpha(), curry(), mim::Def::dbg(), normalizer(), plugin(), sub(), tag(), trip(), mim::Def::type(), World, and mim::Def::world().
|
inline |
Definition at line 56 of file axm.h.
References mim::Def::flags(), and mim::Annex::flags2sub().
Referenced by mim::Axm::IsA< Id, D >::base(), rebuild_(), and mim::Axm::IsA< Id, D >::sub().
|
inline |
Definition at line 55 of file axm.h.
References mim::Def::flags(), and mim::Annex::flags2tag().
Referenced by rebuild_(), and mim::Axm::IsA< Id, D >::tag().
|
inline |
Definition at line 38 of file axm.h.
References mim::Def::trip_.
Referenced by infer_curry_and_trip(), and rebuild_().
|
friend |
|
staticconstexpr |
Definition at line 134 of file axm.h.
Referenced by mim::World::app(), and mim::World::raw_app().