source: icGREP/icgrep-devel/icgrep/cc/cc_compiler.h @ 6089

Last change on this file since 6089 was 6089, checked in by cameron, 11 months ago

Little-endian/big-endian bit number options, default to little-endian

File size: 4.8 KB
Line 
1/*
2 *  Copyright (c) 2018 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 *  icgrep is a trademark of International Characters.
5 */
6
7#ifndef CC_COMPILER_H
8#define CC_COMPILER_H
9
10
11#include <re/re_cc.h>
12#include <pablo/builder.hpp>
13#include <kernels/interface.h>
14#include <string>
15#include <cc/alphabet.h>
16
17namespace cc {
18
19class CC_Compiler {
20public:
21   
22    virtual pablo::PabloAST * compileCC(const re::CC *cc) = 0;
23   
24    virtual pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBlock & block) = 0;
25   
26    virtual pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBuilder & builder) = 0;
27   
28    virtual pablo::PabloAST * compileCC(const std::string & canonicalName, const re::CC *cc, pablo::PabloBlock & block) = 0;
29   
30    virtual pablo::PabloAST * compileCC(const std::string & canonicalName, const re::CC *cc, pablo::PabloBuilder & builder) = 0;
31   
32    virtual ~CC_Compiler(){}
33
34protected:
35    CC_Compiler(pablo::PabloBlock * scope);
36    pablo::PabloBuilder             mBuilder;
37};
38   
39   
40class Parabix_CC_Compiler : public CC_Compiler {
41public:
42   
43    Parabix_CC_Compiler(pablo::PabloBlock * scope, std::vector<pablo::PabloAST *> basisBitSet, cc::BitNumbering b = BitNumbering::LittleEndian);
44   
45    pablo::PabloAST * compileCC(const re::CC *cc) override;
46   
47    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBlock & block) override;
48   
49    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBuilder & builder) override;
50   
51    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBlock & block) override;
52
53    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBuilder & builder) override;
54   
55    ~Parabix_CC_Compiler() {}
56
57private:
58    pablo::PabloAST * getBasisVar(const unsigned n) const;
59    template<typename PabloBlockOrBuilder>
60    pablo::PabloAST * bit_pattern_expr(const unsigned pattern, unsigned selected_bits, PabloBlockOrBuilder & pb);
61    template<typename PabloBlockOrBuilder>
62    pablo::PabloAST * char_test_expr(const re::codepoint_t ch, PabloBlockOrBuilder & pb);
63    template<typename PabloBlockOrBuilder>
64    pablo::PabloAST * make_range(const re::codepoint_t n1, const re::codepoint_t n2, PabloBlockOrBuilder & pb);
65    template<typename PabloBlockOrBuilder>
66    pablo::PabloAST * GE_Range(const unsigned N, const unsigned n, PabloBlockOrBuilder & pb);
67    template<typename PabloBlockOrBuilder>
68    pablo::PabloAST * LE_Range(const unsigned N, const unsigned n, PabloBlockOrBuilder & pb);
69    template<typename PabloBlockOrBuilder>
70    pablo::PabloAST * char_or_range_expr(const re::codepoint_t lo, const re::codepoint_t hi, PabloBlockOrBuilder & pb);
71    template<typename PabloBlockOrBuilder>
72    pablo::PabloAST * charset_expr(const re::CC *cc, PabloBlockOrBuilder & pb);
73private:   
74    const unsigned                  mEncodingBits;
75    BitNumbering               mBasisSetNumbering;
76    std::vector<pablo::PabloAST *>  mBasisBit;
77    unsigned                        mEncodingMask;
78};
79
80    inline pablo::PabloAST * Parabix_CC_Compiler::compileCC(const re::CC *cc) {
81        return compileCC(cc, mBuilder);
82    }
83   
84    inline pablo::PabloAST * Parabix_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBlock & block) {
85        return compileCC(cc->canonicalName(), cc, block);
86    }
87   
88    inline pablo::PabloAST * Parabix_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBuilder & builder) {
89        return compileCC(cc->canonicalName(), cc, builder);
90    }
91   
92   
93
94class Direct_CC_Compiler : public CC_Compiler {
95public:
96   
97    Direct_CC_Compiler(pablo::PabloBlock * scope, pablo::PabloAST * codeUnitStream);
98   
99    pablo::PabloAST * compileCC(const re::CC *cc) override;
100   
101    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBlock & block) override;
102   
103    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBuilder & builder) override;
104   
105    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBlock & block) override;
106   
107    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBuilder & builder) override;
108   
109    ~Direct_CC_Compiler() {}
110   
111private:
112    pablo::PabloAST *               mCodeUnitStream;
113};
114
115   
116inline pablo::PabloAST * Direct_CC_Compiler::compileCC(const re::CC *cc) {
117    return compileCC(cc, mBuilder);
118}
119
120inline pablo::PabloAST * Direct_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBlock & block) {
121    return compileCC(cc->canonicalName(), cc, block);
122}
123
124inline pablo::PabloAST * Direct_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBuilder & builder) {
125    return compileCC(cc->canonicalName(), cc, builder);
126}
127
128
129
130pablo::PabloAST * compileCCfromCodeUnitStream(const re::CC *cc, pablo::PabloAST * codeUnitStream, pablo::PabloBuilder & pb);
131   
132}
133
134#endif // CC_COMPILER_H
135
136
Note: See TracBrowser for help on using the repository browser.