source: icGREP/icgrep-devel/icgrep/kernels/charclasses.cpp

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

Initial version of PipelineKernel? + revised StreamSet? model.

File size: 5.3 KB
Line 
1/*
2 *  Copyright (c) 2017 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 */
5
6#include "charclasses.h"
7#include <re/re_toolchain.h>
8#include <kernels/kernel_builder.h>
9#include <UCD/ucd_compiler.hpp>
10#include <cc/cc_compiler.h>
11#include <re/re_name.h>
12#include <pablo/builder.hpp>
13#include <llvm/Support/ErrorHandling.h>
14#include <llvm/Support/raw_ostream.h>
15
16using NameMap = UCD::UCDCompiler::NameMap;
17
18using namespace cc;
19using namespace kernel;
20using namespace pablo;
21using namespace re;
22using namespace llvm;
23using namespace UCD;
24
25inline std::string signature(const std::vector<re::CC *> & ccs) {
26    if (LLVM_UNLIKELY(ccs.empty())) {
27        return "[]";
28    } else {
29        std::string tmp;
30        raw_string_ostream out(tmp);
31        char joiner = '[';
32        for (const auto & set : ccs) {
33            out << joiner;
34            set->print(out);
35            joiner = ',';
36        }
37        out << ']';
38        return out.str();
39    }
40}
41
42CharClassesSignature::CharClassesSignature(const std::vector<CC *> &ccs, bool useDirectCC, cc::BitNumbering bn)
43: mUseDirectCC(useDirectCC),
44  mSignature((useDirectCC ? "d" : "p") + numberingSuffix(bn) + signature(ccs)) {
45}
46
47
48CharClassesKernel::CharClassesKernel(const std::unique_ptr<kernel::KernelBuilder> & iBuilder, std::vector<CC *> && ccs, StreamSet * BasisBits, StreamSet * CharClasses, cc::BitNumbering basisNumbering)
49: CharClassesSignature(ccs, BasisBits->getNumElements() == 1, basisNumbering)
50, PabloKernel(iBuilder, "cc" + getStringHash(mSignature), {Binding{"basis", BasisBits}}, {Binding{"charclasses", CharClasses}})
51, mCCs(std::move(ccs))
52, mBasisSetNumbering(basisNumbering) {
53
54}
55
56std::string CharClassesKernel::makeSignature(const std::unique_ptr<kernel::KernelBuilder> &) {
57    return mSignature;
58}
59
60void CharClassesKernel::generatePabloMethod() {
61    PabloBuilder pb(getEntryScope());
62    std::unique_ptr<CC_Compiler> ccc;
63    if (mUseDirectCC) {
64        ccc = make_unique<cc::Direct_CC_Compiler>(getEntryScope(), pb.createExtract(getInput(0), pb.getInteger(0)));
65    } else {
66        ccc = make_unique<cc::Parabix_CC_Compiler>(getEntryScope(), getInputStreamSet("basis"), mBasisSetNumbering);
67    }
68    unsigned n = mCCs.size();
69
70    NameMap nameMap;
71    std::vector<Name *> names;
72    for (unsigned i = 0; i < n; i++) {
73        Name * name = re::makeName("mpx_basis" + std::to_string(i), mCCs[i]);
74        nameMap.emplace(name, nullptr);
75        names.push_back(name);
76    }
77
78    UCD::UCDCompiler ucdCompiler(*ccc.get());
79    if (LLVM_UNLIKELY(AlgorithmOptionIsSet(DisableIfHierarchy))) {
80        ucdCompiler.generateWithoutIfHierarchy(nameMap, pb);
81    } else {
82        ucdCompiler.generateWithDefaultIfHierarchy(nameMap, pb);
83    }
84    if (mBasisSetNumbering == cc::BitNumbering::BigEndian) {
85        // The first UnicodeSet in the vector ccs represents the last bit of the
86        // character class basis bit streams.
87        std::reverse(names.begin(), names.end());
88    }
89    for (unsigned i = 0; i < names.size(); i++) {
90        auto t = nameMap.find(names[i]); 
91        if (t != nameMap.end()) {
92            PabloAST * const r = pb.createExtract(getOutput(0), pb.getInteger(i));
93            pb.createAssign(r, pb.createInFile(t->second));
94        } else {
95            llvm::report_fatal_error("Can't compile character classes.");
96        }
97    }
98}
99
100
101ByteClassesKernel::ByteClassesKernel(const std::unique_ptr<kernel::KernelBuilder> &iBuilder,
102                                     std::vector<re::CC *> && ccs,
103                                     StreamSet * inputStream,
104                                     StreamSet * CharClasses,
105                                     BitNumbering basisNumbering):
106CharClassesSignature(ccs, inputStream->getNumElements() == 1, basisNumbering)
107, PabloKernel(iBuilder, "ByteClassesKernel_" + getStringHash(mSignature), {Binding{"basis", inputStream}}, {Binding{"charclasses", CharClasses}})
108, mCCs(std::move(ccs))
109, mBasisSetNumbering(basisNumbering) {
110
111}
112
113std::string ByteClassesKernel::makeSignature(const std::unique_ptr<kernel::KernelBuilder> &) {
114    return mSignature;
115}
116
117void ByteClassesKernel::generatePabloMethod() {
118    PabloBuilder pb(getEntryScope());
119    std::unique_ptr<CC_Compiler> ccc;
120    if (mUseDirectCC) {
121        ccc = make_unique<cc::Direct_CC_Compiler>(getEntryScope(), pb.createExtract(getInput(0), pb.getInteger(0)));
122    } else {
123        ccc = make_unique<cc::Parabix_CC_Compiler>(getEntryScope(), getInputStreamSet("basis"), mBasisSetNumbering);
124    }
125    unsigned n = mCCs.size();
126
127    NameMap nameMap;
128    std::vector<Name *> names;
129    for (unsigned i = 0; i < n; i++) {
130        Name * name = re::makeName("mpx_basis" + std::to_string(i), mCCs[i]);
131
132        nameMap.emplace(name, ccc->compileCC(mCCs[i]));
133        names.push_back(name);
134
135    }
136
137    if (mBasisSetNumbering == cc::BitNumbering::BigEndian) {
138        // The first UnicodeSet in the vector ccs represents the last bit of the
139        // character class basis bit streams.
140        std::reverse(names.begin(), names.end());
141    }
142    for (unsigned i = 0; i < names.size(); i++) {
143        auto t = nameMap.find(names[i]);
144        if (t != nameMap.end()) {
145            PabloAST * const r = pb.createExtract(getOutput(0), pb.getInteger(i));
146            pb.createAssign(r, pb.createInFile(t->second));
147        } else {
148            llvm::report_fatal_error("Can't compile character classes.");
149        }
150    }
151}
Note: See TracBrowser for help on using the repository browser.