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

Last change on this file since 6194 was 5847, checked in by cameron, 17 months ago

Unify Parabix CC compiler and Direct CC compiler with a common superclass

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