source: icGREP/icgrep-devel/icgrep/UCD/ucd_compiler.hpp

Last change on this file was 5581, checked in by nmedfort, 8 weeks ago

Optimization to UCD Compiler to make use of multiple assignments for Vars.

File size: 2.8 KB
Line 
1#ifndef UCDCOMPILER_HPP
2#define UCDCOMPILER_HPP
3
4#include <re/re_cc.h>
5#include <vector>
6#include <boost/container/flat_map.hpp>
7
8namespace cc {
9    class CC_Compiler;
10}
11
12namespace re {
13    class Name;
14}
15
16namespace pablo {
17    class PabloBuilder;
18    class PabloAST;
19    class Var;
20}
21
22namespace UCD {
23
24class UnicodeSet;
25
26class UCDCompiler {
27
28    using CC = re::CC;
29    using PabloBuilder = pablo::PabloBuilder;
30    using PabloAST = pablo::PabloAST;
31    using codepoint_t = re::codepoint_t;
32    using RangeList = std::vector<re::interval_t>;
33
34    using TargetMap = boost::container::flat_map<const UnicodeSet *, pablo::Var *>;
35    using ValueMap = boost::container::flat_map<const UnicodeSet *, PabloAST *>;
36    using Values = std::vector<std::pair<ValueMap::key_type, ValueMap::mapped_type>>;
37
38    static const RangeList defaultIfHierachy;
39    static const RangeList noIfHierachy;
40
41public:
42
43    using NameMap = boost::container::flat_map<re::Name *, PabloAST *>;
44
45    UCDCompiler(cc::CC_Compiler & ccCompiler);
46
47    void generateWithDefaultIfHierarchy(NameMap & names, PabloBuilder & entry);
48
49    void generateWithoutIfHierarchy(NameMap & names, PabloBuilder & entry);
50
51protected:
52
53    void generateRange(const RangeList & ifRanges, PabloBuilder & entry);
54
55    void generateRange(const RangeList & ifRanges, const codepoint_t lo, const codepoint_t hi, PabloBuilder & builder);
56
57    void generateSubRanges(const codepoint_t lo, const codepoint_t hi, PabloBuilder & builder);
58
59    PabloAST * sequenceGenerator(const RangeList && ranges, const unsigned byte_no, PabloBuilder & builder, PabloAST * target, PabloAST * prefix);
60
61    PabloAST * sequenceGenerator(const codepoint_t lo, const codepoint_t hi, const unsigned byte_no, PabloBuilder & builder, PabloAST * target, PabloAST * prefix);
62
63    PabloAST * ifTestCompiler(const codepoint_t lo, const codepoint_t hi, PabloBuilder & builder);
64
65    PabloAST * ifTestCompiler(const codepoint_t lo, const codepoint_t hi, const unsigned byte_no, PabloBuilder & builder, PabloAST * target);
66
67    PabloAST * makePrefix(const codepoint_t cp, const unsigned byte_no, PabloBuilder & builder, PabloAST * prefix);
68
69    static RangeList byteDefinitions(const RangeList & list, const unsigned byte_no, bool isUTF_16);
70
71    template <typename RangeListOrUnicodeSet>
72    static RangeList rangeIntersect(const RangeListOrUnicodeSet & list, const codepoint_t lo, const codepoint_t hi);
73
74    static RangeList rangeGaps(const RangeList & list, const codepoint_t lo, const codepoint_t hi);
75
76    static RangeList outerRanges(const RangeList & list);
77
78    static RangeList innerRanges(const RangeList & list);
79
80    void makeTargets(PabloBuilder & entry, NameMap & names);
81
82private:
83    cc::CC_Compiler &       mCharacterClassCompiler;
84    PabloAST *              mSuffixVar;
85    TargetMap               mTarget;
86    ValueMap                mTargetValue;
87};
88
89}
90
91#endif // UCDCOMPILER_HPP
Note: See TracBrowser for help on using the repository browser.