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

Last change on this file was 6184, checked in by nmedfort, 6 months ago

Initial version of PipelineKernel? + revised StreamSet? model.

File size: 4.9 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 <cc/alphabet.h>
14
15namespace cc {
16
17class CC_Compiler {
18public:
19   
20    virtual pablo::PabloAST * compileCC(const re::CC *cc) = 0;
21   
22    virtual pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBlock & block) = 0;
23   
24    virtual pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBuilder & builder) = 0;
25   
26    virtual pablo::PabloAST * compileCC(const std::string & canonicalName, const re::CC *cc, pablo::PabloBlock & block) = 0;
27   
28    virtual pablo::PabloAST * compileCC(const std::string & canonicalName, const re::CC *cc, pablo::PabloBuilder & builder) = 0;
29   
30    virtual ~CC_Compiler(){}
31
32protected:
33    CC_Compiler(pablo::PabloBlock * scope);
34    pablo::PabloBuilder             mBuilder;
35};
36   
37   
38class Parabix_CC_Compiler : public CC_Compiler {
39public:
40   
41    Parabix_CC_Compiler(pablo::PabloBlock * scope, std::vector<pablo::PabloAST *> basisBitSet, cc::BitNumbering b = BitNumbering::LittleEndian);
42   
43    pablo::PabloAST * compileCC(const re::CC *cc) override;
44   
45    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBlock & block) override;
46   
47    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBuilder & builder) override;
48   
49    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBlock & block) override;
50
51    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBuilder & builder) override;
52   
53    ~Parabix_CC_Compiler() {}
54
55private:
56    template<typename PabloBlockOrBuilder>
57    pablo::PabloAST * getBasisVar(const unsigned n, PabloBlockOrBuilder & pb) const;
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);
72private:   
73    const unsigned                  mEncodingBits;
74    BitNumbering               mBasisSetNumbering;
75    std::vector<pablo::PabloAST *>  mBasisBit;
76    unsigned                        mEncodingMask;
77};
78
79    inline pablo::PabloAST * Parabix_CC_Compiler::compileCC(const re::CC *cc) {
80        return compileCC(cc, mBuilder);
81    }
82   
83    inline pablo::PabloAST * Parabix_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBlock & block) {
84        return compileCC(cc->canonicalName(), cc, block);
85    }
86   
87    inline pablo::PabloAST * Parabix_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBuilder & builder) {
88        return compileCC(cc->canonicalName(), cc, builder);
89    }
90   
91   
92
93class Direct_CC_Compiler : public CC_Compiler {
94public:
95   
96    Direct_CC_Compiler(pablo::PabloBlock * scope, pablo::PabloAST * codeUnitStream);
97   
98    pablo::PabloAST * compileCC(const re::CC *cc) override;
99   
100    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBlock & block) override;
101   
102    pablo::PabloAST * compileCC(const re::CC *cc, pablo::PabloBuilder & builder) override;
103   
104    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBlock & block) override;
105   
106    pablo::PabloAST * compileCC(const std::string & name, const re::CC *cc, pablo::PabloBuilder & builder) override;
107   
108    ~Direct_CC_Compiler() {}
109   
110private:
111    pablo::PabloAST *               mCodeUnitStream;
112};
113
114   
115inline pablo::PabloAST * Direct_CC_Compiler::compileCC(const re::CC *cc) {
116    return compileCC(cc, mBuilder);
117}
118
119inline pablo::PabloAST * Direct_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBlock & block) {
120    return compileCC(cc->canonicalName(), cc, block);
121}
122
123inline pablo::PabloAST * Direct_CC_Compiler::compileCC(const re::CC *cc, pablo::PabloBuilder & builder) {
124    return compileCC(cc->canonicalName(), cc, builder);
125}
126
127
128
129pablo::PabloAST * compileCCfromCodeUnitStream(const re::CC *cc, pablo::PabloAST * codeUnitStream, pablo::PabloBuilder & pb);
130   
131}
132
133#endif // CC_COMPILER_H
134
135
Note: See TracBrowser for help on using the repository browser.