mirror of
https://github.com/luau-lang/luau.git
synced 2025-04-08 04:40:54 +01:00
Definition 2.1.1.
This commit is contained in:
parent
ab0d7c0387
commit
2338185296
5 changed files with 92 additions and 0 deletions
52
EqSat/include/Luau/EGraph.h
Normal file
52
EqSat/include/Luau/EGraph.h
Normal file
|
@ -0,0 +1,52 @@
|
|||
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
||||
#pragma once
|
||||
|
||||
#include "Luau/DenseHash.h"
|
||||
#include "Luau/Id.h"
|
||||
#include "Luau/UnionFind.h"
|
||||
|
||||
#include <utility>
|
||||
#include <vector>
|
||||
|
||||
namespace Luau::EqSat
|
||||
{
|
||||
|
||||
/// Each e-class is a set of e-nodes representing equivalent terms from a given language,
|
||||
/// and an e-node is a function symbol paired with a list of children e-classes.
|
||||
template<typename L, typename D>
|
||||
struct EClass {
|
||||
Id id;
|
||||
std::vector<L> nodes;
|
||||
D data;
|
||||
std::vector<std::pair<L, Id>> parents;
|
||||
};
|
||||
|
||||
/// In Definition 2.1, an EGraph is composed with a tuple (U, M, H) where
|
||||
/// - U: [`EGraph::u`]
|
||||
/// - M: [`EGraph::m`]
|
||||
/// - H: [`EGraph::h`]
|
||||
///
|
||||
/// See <https://arxiv.org/pdf/2004.03082>.
|
||||
template<typename L, typename N>
|
||||
struct EGraph
|
||||
{
|
||||
// TODO: static_assert L <: Language
|
||||
// TODO: static_assert N <: Analysis<L>
|
||||
|
||||
private:
|
||||
/// A union-find data structure 𝑈 stores an equivalence relation over e-class ids.
|
||||
UnionFind u;
|
||||
|
||||
/// The e-class map 𝑀 maps e-class ids to e-classes. All equivalent e-class ids map to the same
|
||||
/// e-class, i.e., 𝑎 ≡id 𝑏 iff 𝑀[𝑎] is the same set as 𝑀[𝑏]. An e-class id 𝑎 is said to refer to the
|
||||
/// e-class 𝑀[find(𝑎)].
|
||||
DenseHashMap<Id, EClass<L, typename N::Data>> m;
|
||||
|
||||
/// The hashcons 𝐻 is a map from e-nodes to e-node ids.
|
||||
///
|
||||
/// Author note: the paper says this maps from e-nodes to e-class ids, but the
|
||||
/// corresponding map in the egg crate called `memo`, they map it to e-node ids?
|
||||
DenseHashMap<EClass<L, typename N::Data>, Id> h;
|
||||
};
|
||||
|
||||
} // namespace Luau::EqSat
|
15
EqSat/include/Luau/Language.h
Normal file
15
EqSat/include/Luau/Language.h
Normal file
|
@ -0,0 +1,15 @@
|
|||
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
||||
#pragma once
|
||||
|
||||
#include "Luau/Id.h"
|
||||
|
||||
namespace Luau::EqSat
|
||||
{
|
||||
|
||||
template<typename L>
|
||||
struct Language
|
||||
{
|
||||
|
||||
};
|
||||
|
||||
} // namespace Luau::EqSat
|
12
EqSat/include/Luau/UnionFind.h
Normal file
12
EqSat/include/Luau/UnionFind.h
Normal file
|
@ -0,0 +1,12 @@
|
|||
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
||||
#pragma once
|
||||
|
||||
namespace Luau::EqSat
|
||||
{
|
||||
|
||||
/// See <https://dl.acm.org/doi/pdf/10.1145/321879.321884>.
|
||||
struct UnionFind
|
||||
{
|
||||
};
|
||||
|
||||
} // namespace Luau::EqSat
|
9
EqSat/src/UnionFind.cpp
Normal file
9
EqSat/src/UnionFind.cpp
Normal file
|
@ -0,0 +1,9 @@
|
|||
// This file is part of the Luau programming language and is licensed under MIT License; see LICENSE.txt for details
|
||||
#include "Luau/UnionFind.h"
|
||||
|
||||
namespace Luau::EqSat
|
||||
{
|
||||
|
||||
|
||||
|
||||
} // namespace Luau::EqSat
|
|
@ -297,9 +297,13 @@ target_sources(Luau.Analysis PRIVATE
|
|||
|
||||
# Luau.Analysis Sources
|
||||
target_sources(Luau.EqSat PRIVATE
|
||||
EqSat/include/Luau/EGraph.h
|
||||
EqSat/include/Luau/Id.h
|
||||
EqSat/include/Luau/Language.h
|
||||
EqSat/include/Luau/UnionFind.h
|
||||
|
||||
EqSat/src/Id.cpp
|
||||
EqSat/src/UnionFind.cpp
|
||||
)
|
||||
|
||||
# Luau.VM Sources
|
||||
|
|
Loading…
Add table
Reference in a new issue