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

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

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

File size: 4.6 KB
Line 
1/*
2 *  Copyright (c) 2014 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
16namespace cc {
17
18class CC_Compiler {
19public:
20   
21    virtual pablo::PabloAST * compileCC(const re::CC *cc) = 0;
22   
23    virtual pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBlock & block) = 0;
24   
25    virtual pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBuilder & builder) = 0;
26   
27    virtual pablo::PabloAST * compileCC(const std::string & canonicalName, const re::CC *cc, pablo::PabloBlock & block) = 0;
28   
29    virtual pablo::PabloAST * compileCC(const std::string & canonicalName, const re::CC *cc, pablo::PabloBuilder & builder) = 0;
30
31protected:
32    CC_Compiler(pablo::PabloKernel * kernel);
33    pablo::PabloBuilder             mBuilder;
34};
35   
36   
37class Parabix_CC_Compiler : public CC_Compiler {
38public:
39   
40    Parabix_CC_Compiler(pablo::PabloKernel * kernel, std::vector<pablo::PabloAST *> basisBitSet);
41   
42    pablo::PabloAST * compileCC(const re::CC *cc) override;
43   
44    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBlock & block) override;
45   
46    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBuilder & builder) override;
47   
48    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBlock & block) override;
49
50    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBuilder & builder) override;
51
52private:
53    pablo::PabloAST * getBasisVar(const unsigned n) const;
54    template<typename PabloBlockOrBuilder>
55    pablo::PabloAST * bit_pattern_expr(const unsigned pattern, unsigned selected_bits, PabloBlockOrBuilder & pb);
56    template<typename PabloBlockOrBuilder>
57    pablo::PabloAST * char_test_expr(const re::codepoint_t ch, PabloBlockOrBuilder & pb);
58    template<typename PabloBlockOrBuilder>
59    pablo::PabloAST * make_range(const re::codepoint_t n1, const re::codepoint_t n2, PabloBlockOrBuilder & pb);
60    template<typename PabloBlockOrBuilder>
61    pablo::PabloAST * GE_Range(const unsigned N, const unsigned n, PabloBlockOrBuilder & pb);
62    template<typename PabloBlockOrBuilder>
63    pablo::PabloAST * LE_Range(const unsigned N, const unsigned n, PabloBlockOrBuilder & pb);
64    template<typename PabloBlockOrBuilder>
65    pablo::PabloAST * char_or_range_expr(const re::codepoint_t lo, const re::codepoint_t hi, PabloBlockOrBuilder & pb);
66    template<typename PabloBlockOrBuilder>
67    pablo::PabloAST * charset_expr(const re::CC *cc, PabloBlockOrBuilder & pb);
68private:   
69    const unsigned                  mEncodingBits;
70    std::vector<pablo::PabloAST *>  mBasisBit;
71    unsigned                        mEncodingMask;
72};
73
74    inline pablo::PabloAST * Parabix_CC_Compiler::compileCC(const re::CC *cc) {
75        return compileCC(cc, mBuilder);
76    }
77   
78    inline pablo::PabloAST * Parabix_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBlock & block) {
79        return compileCC(cc->canonicalName(), cc, block);
80    }
81   
82    inline pablo::PabloAST * Parabix_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBuilder & builder) {
83        return compileCC(cc->canonicalName(), cc, builder);
84    }
85   
86   
87
88class Direct_CC_Compiler : public CC_Compiler {
89public:
90   
91    Direct_CC_Compiler(pablo::PabloKernel * kernel, pablo::PabloAST * codeUnitStream);
92   
93    pablo::PabloAST * compileCC(const re::CC *cc) override;
94   
95    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBlock & block) override;
96   
97    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBuilder & builder) override;
98   
99    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBlock & block) override;
100   
101    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBuilder & builder) override;
102       
103private:
104    pablo::PabloAST *               mCodeUnitStream;
105};
106
107   
108inline pablo::PabloAST * Direct_CC_Compiler::compileCC(const re::CC *cc) {
109    return compileCC(cc, mBuilder);
110}
111
112inline pablo::PabloAST * Direct_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBlock & block) {
113    return compileCC(cc->canonicalName(), cc, block);
114}
115
116inline pablo::PabloAST * Direct_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBuilder & builder) {
117    return compileCC(cc->canonicalName(), cc, builder);
118}
119
120
121
122pablo::PabloAST * compileCCfromCodeUnitStream(const re::CC *cc, pablo::PabloAST * codeUnitStream, pablo::PabloBuilder & pb);
123   
124}
125
126#endif // CC_COMPILER_H
127
128
Note: See TracBrowser for help on using the repository browser.