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

Last change on this file since 5923 was 5872, checked in by cameron, 19 months ago

Decoupling CC compilers from Pablo Kernel

File size: 4.7 KB
RevLine 
[3850]1/*
[5872]2 *  Copyright (c) 2018 International Characters.
[3850]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
[5140]10
[4602]11#include <re/re_cc.h>
[4612]12#include <pablo/builder.hpp>
[5299]13#include <kernels/interface.h>
[4215]14#include <string>
[3850]15
[4198]16namespace cc {
17
[5847]18class CC_Compiler {
[3850]19public:
[5299]20   
[5847]21    virtual pablo::PabloAST * compileCC(const re::CC *cc) = 0;
[5843]22   
[5847]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;
[5854]30   
31    virtual ~CC_Compiler(){}
[4612]32
[5847]33protected:
[5872]34    CC_Compiler(pablo::PabloBlock * scope);
[5847]35    pablo::PabloBuilder             mBuilder;
36};
37   
38   
39class Parabix_CC_Compiler : public CC_Compiler {
40public:
41   
[5872]42    Parabix_CC_Compiler(pablo::PabloBlock * scope, std::vector<pablo::PabloAST *> basisBitSet);
[5847]43   
44    pablo::PabloAST * compileCC(const re::CC *cc) override;
45   
46    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBlock & block) override;
47   
48    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBuilder & builder) override;
49   
50    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBlock & block) override;
[4357]51
[5847]52    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBuilder & builder) override;
[5854]53   
54    ~Parabix_CC_Compiler() {}
[4602]55
[4337]56private:
[5202]57    pablo::PabloAST * getBasisVar(const unsigned n) const;
[4612]58    template<typename PabloBlockOrBuilder>
59    pablo::PabloAST * bit_pattern_expr(const unsigned pattern, unsigned selected_bits, PabloBlockOrBuilder & pb);
60    template<typename PabloBlockOrBuilder>
61    pablo::PabloAST * char_test_expr(const re::codepoint_t ch, PabloBlockOrBuilder & pb);
62    template<typename PabloBlockOrBuilder>
63    pablo::PabloAST * make_range(const re::codepoint_t n1, const re::codepoint_t n2, PabloBlockOrBuilder & pb);
64    template<typename PabloBlockOrBuilder>
65    pablo::PabloAST * GE_Range(const unsigned N, const unsigned n, PabloBlockOrBuilder & pb);
66    template<typename PabloBlockOrBuilder>
67    pablo::PabloAST * LE_Range(const unsigned N, const unsigned n, PabloBlockOrBuilder & pb);
68    template<typename PabloBlockOrBuilder>
69    pablo::PabloAST * char_or_range_expr(const re::codepoint_t lo, const re::codepoint_t hi, PabloBlockOrBuilder & pb);
70    template<typename PabloBlockOrBuilder>
71    pablo::PabloAST * charset_expr(const re::CC *cc, PabloBlockOrBuilder & pb);
[4602]72private:   
[5299]73    const unsigned                  mEncodingBits;
[5202]74    std::vector<pablo::PabloAST *>  mBasisBit;
75    unsigned                        mEncodingMask;
[3850]76};
77
[5847]78    inline pablo::PabloAST * Parabix_CC_Compiler::compileCC(const re::CC *cc) {
79        return compileCC(cc, mBuilder);
80    }
81   
82    inline pablo::PabloAST * Parabix_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBlock & block) {
83        return compileCC(cc->canonicalName(), cc, block);
84    }
85   
86    inline pablo::PabloAST * Parabix_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBuilder & builder) {
87        return compileCC(cc->canonicalName(), cc, builder);
88    }
89   
90   
91
92class Direct_CC_Compiler : public CC_Compiler {
93public:
94   
[5872]95    Direct_CC_Compiler(pablo::PabloBlock * scope, pablo::PabloAST * codeUnitStream);
[5847]96   
97    pablo::PabloAST * compileCC(const re::CC *cc) override;
98   
99    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBlock & block) override;
100   
101    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBuilder & builder) override;
102   
103    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBlock & block) override;
104   
105    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBuilder & builder) override;
[5854]106   
107    ~Direct_CC_Compiler() {}
108   
[5847]109private:
110    pablo::PabloAST *               mCodeUnitStream;
111};
112
113   
114inline pablo::PabloAST * Direct_CC_Compiler::compileCC(const re::CC *cc) {
[4612]115    return compileCC(cc, mBuilder);
[4198]116}
117
[5847]118inline pablo::PabloAST * Direct_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBlock & block) {
119    return compileCC(cc->canonicalName(), cc, block);
[4612]120}
121
[5847]122inline pablo::PabloAST * Direct_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBuilder & builder) {
123    return compileCC(cc->canonicalName(), cc, builder);
[4612]124}
125
[5847]126
127
[5823]128pablo::PabloAST * compileCCfromCodeUnitStream(const re::CC *cc, pablo::PabloAST * codeUnitStream, pablo::PabloBuilder & pb);
129   
[4612]130}
131
[3850]132#endif // CC_COMPILER_H
133
134
Note: See TracBrowser for help on using the repository browser.