Ignore:
Timestamp:
Aug 5, 2018, 9:06:54 PM (12 months ago)
Author:
xwa163
Message:

UTF-8 support for Multiplexing LZ4 Grep

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/kernels/charclasses.cpp

    r6126 r6140  
    118118
    119119
     120ByteClassesKernel::ByteClassesKernel(const std::unique_ptr<kernel::KernelBuilder> &iBuilder,
     121                                     std::vector<re::CC *> &&ccs, bool useDirectCC, BitNumbering basisNumbering):
     122        CharClassesSignature(ccs, useDirectCC, basisNumbering)
     123        , PabloKernel(iBuilder,
     124                      "ByteClassesKernel_" + sha1sum(mSignature),
     125                      {},
     126                      {Binding{iBuilder->getStreamSetTy(ccs.size(), 1), "charclasses"}})
     127        , mCCs(std::move(ccs)), mBasisSetNumbering(basisNumbering)
     128{
     129    if (useDirectCC) {
     130        mStreamSetInputs.push_back({Binding{iBuilder->getStreamSetTy(1, 8), "byteData"}});
     131    }
     132    else {
     133        mStreamSetInputs.push_back({Binding{iBuilder->getStreamSetTy(8), "basis"}});
     134    }
     135}
     136
     137std::string ByteClassesKernel::makeSignature(const std::unique_ptr<kernel::KernelBuilder> &iBuilder) {
     138    return mSignature;
     139}
     140
     141void ByteClassesKernel::generatePabloMethod() {
     142    PabloBuilder pb(getEntryScope());
     143    std::unique_ptr<CC_Compiler> ccc;
     144    if (mUseDirectCC) {
     145        ccc = make_unique<cc::Direct_CC_Compiler>(getEntryScope(), pb.createExtract(getInput(0), pb.getInteger(0)));
     146    } else {
     147        ccc = make_unique<cc::Parabix_CC_Compiler>(getEntryScope(), getInputStreamSet("basis"), mBasisSetNumbering);
     148    }
     149    unsigned n = mCCs.size();
     150
     151    NameMap nameMap;
     152    std::vector<Name *> names;
     153    for (unsigned i = 0; i < n; i++) {
     154        Name * name = re::makeName("mpx_basis" + std::to_string(i), mCCs[i]);
     155
     156        nameMap.emplace(name, ccc->compileCC(mCCs[i]));
     157        names.push_back(name);
     158
     159    }
     160
     161    if (mBasisSetNumbering == cc::BitNumbering::BigEndian) {
     162        // The first UnicodeSet in the vector ccs represents the last bit of the
     163        // character class basis bit streams.
     164        std::reverse(names.begin(), names.end());
     165    }
     166    for (unsigned i = 0; i < names.size(); i++) {
     167        auto t = nameMap.find(names[i]);
     168        if (t != nameMap.end()) {
     169            PabloAST * const r = pb.createExtract(getOutput(0), pb.getInteger(i));
     170            pb.createAssign(r, pb.createInFile(t->second));
     171        } else {
     172            llvm::report_fatal_error("Can't compile character classes.");
     173        }
     174    }
     175}
Note: See TracChangeset for help on using the changeset viewer.