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

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

Bug fixes

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