source: icGREP/icgrep-devel/icgrep/pablo/optimizers/pablo_bddminimization.h @ 4699

Last change on this file since 4699 was 4699, checked in by nmedfort, 4 years ago

Temporary check in.

File size: 2.3 KB
Line 
1#ifndef PABLO_BDDMINIMIZATION_H
2#define PABLO_BDDMINIMIZATION_H
3
4#include <llvm/ADT/DenseMap.h>
5
6struct DdManager; // forward declare of the CUDD manager
7struct DdNode;
8
9namespace pablo {
10
11class PabloAST;
12class PabloBlock;
13class PabloFunction;
14class Statement;
15
16class BDDMinimizationPass {
17
18    using CharacterizationMap = llvm::DenseMap<const PabloAST *, DdNode *>;
19    using StatementVector = std::vector<PabloAST *>;
20
21    struct SubsitutionMap {
22        SubsitutionMap(SubsitutionMap * parent = nullptr) : mParent(parent) {}
23
24        PabloAST * operator [](const DdNode * node) const {
25            auto f = mMap.find(node);
26            if (f == mMap.end()) {
27                return mParent ? mParent->operator [](node) : nullptr;
28            }
29            return f->second;
30        }
31
32        void insert(const DdNode * node, PabloAST * stmt) {
33            mMap.insert(std::make_pair(node, stmt));
34        }
35    private:
36        const SubsitutionMap * const mParent;
37        llvm::DenseMap<const DdNode *, PabloAST *> mMap;
38    };
39
40public:
41    static bool optimize(PabloFunction & function);
42protected:
43    void initialize(const PabloFunction & function);
44    void characterize(const PabloBlock & block);
45    DdNode * characterize(const Statement * const stmt);
46    void eliminateLogicallyEquivalentStatements(PabloBlock & entry);
47    void eliminateLogicallyEquivalentStatements(PabloBlock & block, SubsitutionMap & parent);
48    void simplifyAST(PabloFunction & function);
49    void simplifyAST(PabloBlock & block);
50    void simplifyAST(PabloBlock & block, PabloAST * const stmt);
51
52private:
53    DdNode * Zero() const;
54    DdNode * One() const;
55    bool isZero(DdNode * const x) const;
56    DdNode * And(DdNode * const x, DdNode * const y);
57    DdNode * Intersect(DdNode * const x, DdNode * const y);
58    DdNode * Or(DdNode * const x, DdNode * const y);
59    DdNode * Xor(DdNode * const x, DdNode * const y);
60    DdNode * Not(DdNode * x) const;
61    DdNode * Ite(DdNode * const x, DdNode * const y, DdNode * const z);
62    DdNode * NewVar(Statement * const stmt);
63    bool noSatisfyingAssignment(DdNode * const x);
64    void shutdown();
65private:
66    DdManager *             mManager;
67    unsigned                mVariables;
68    CharacterizationMap     mCharacterizationMap;
69    StatementVector         mStatementVector;
70};
71
72}
73
74#endif // PABLO_BDDMINIMIZATION_H
Note: See TracBrowser for help on using the repository browser.