source: icGREP/icgrep-devel/icgrep/editd/pattern_compiler.cpp @ 6184

Last change on this file since 6184 was 5836, checked in by nmedfort, 20 months ago

Added PabloBlock/Builder? createScope() methods + minor code changes.

  • Property svn:executable set to *
File size: 3.6 KB
RevLine 
[5172]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#include "pattern_compiler.h"
[5267]8#include <pablo/builder.hpp>
9#include <pablo/pe_zeroes.h>
10#include <pablo/pe_ones.h>
[5172]11
12using namespace pablo;
13
14namespace re {
15
16
[5217]17Pattern_Compiler::Pattern_Compiler(PabloKernel & kernel)
18: mKernel(kernel)
[5172]19{
20
21}
22
23
24inline std::string make_e(int i, int j) {return ("e_"+std::to_string(i)+"_"+std::to_string(j));}
25
26
[5202]27void optimizer(const std::string & patt, PabloAST * basisBits[], std::vector<std::vector<PabloAST *>> & e, unsigned i, PabloAST * cond, PabloBuilder & main, PabloBuilder & pb, int dist, int stepSize){
[5836]28    auto it = pb.createScope();
[5202]29
30    Zeroes * zeroes = pb.createZeroes();
31
[5172]32    for(int n = 0; n < stepSize; n++){
[5202]33
34        PabloAST * name = basisBits[(patt[i] >> 1) & 0x3];
[5172]35       
[5202]36        e[i][0] = it.createAnd(it.createAdvance(e[i - 1][0], 1), name, make_e(i, 0));
37        for(int j = 1; j <= dist; j++){
38            auto tmp1 = it.createAnd(it.createAdvance(e[i-1][j],1), name);
39            auto tmp2 = it.createAnd(it.createAdvance(e[i-1][j-1],1), it.createNot(name));
40            auto tmp3 = it.createOr(it.createAdvance(e[i][j-1],1), e[i-1][j-1]);
41            e[i][j] = it.createOr(it.createOr(tmp1, tmp2), tmp3, make_e(i, j));
[5172]42        }
43       
44        i++;
[5202]45        if (i >= patt.length()) break;
[5172]46    } 
47
[5202]48    if (i < patt.length()) {
[5267]49        optimizer(patt, basisBits, e, i, e[i - 1][dist], main, it, dist, stepSize);
[5202]50    } else {
51        const auto i = patt.length() - 1;
52        for(int j = 0; j <= dist; j++){
53            auto eij = main.createVar("m" + std::to_string(j), zeroes);
54            it.createAssign(eij, e[i][j]);
55            e[i][j] = eij;
56        }
[5172]57    }
58
[5202]59    pb.createIf(cond, it);
[5172]60}
61
[5202]62void Pattern_Compiler::compile(const std::vector<std::string> & patts, PabloBuilder & pb, PabloAST * basisBits[], int dist, unsigned optPosition, int stepSize) {
63    std::vector<std::vector<PabloAST *>> e(patts[0].length() * 2, std::vector<PabloAST *>(dist+1));
64    std::vector<PabloAST*> E(dist + 1);
[5172]65
66    for(int d=0; d<=dist; d++){
67        E[d] = pb.createZeroes();
68    }
69
[5202]70    for(unsigned r = 0; r < patts.size(); r++){
71        const std::string & patt = patts[r];
[5172]72
[5202]73        PabloAST * name = basisBits[(patt[0] >> 1) & 0x3];
74
75        e[0][0] = name;
[5172]76        for(int j = 1; j <= dist; j++){
[5202]77          e[0][j] = pb.createOnes();
[5172]78        }
79
[5202]80        unsigned i = 1;
81        while (i < patt.length() && i < optPosition) {
[5172]82
[5202]83            name = basisBits[(patt[i] >> 1) & 0x3];
84
85            e[i][0] = pb.createAnd(pb.createAdvance(e[i-1][0], 1), name, make_e(i, 0));
[5172]86            for(int j = 1; j <= dist; j++){     
[5202]87                auto tmp1 = pb.createAnd(pb.createAdvance(e[i-1][j],1), name);
88                auto tmp2 = pb.createAnd(pb.createAdvance(e[i-1][j-1],1), pb.createNot(name));
89                auto tmp3 = pb.createOr(pb.createAdvance(e[i][j-1],1), e[i-1][j-1]);
90                e[i][j] = pb.createOr(pb.createOr(tmp1,tmp2),tmp3, make_e(i, j));
[5172]91            }
92           
93            i++;
94        }
95
96        //Optimize from optPosition
[5202]97        if (i >= optPosition) {
98            optimizer(patt, basisBits, e, i, e[i-1][dist], pb, pb, dist, stepSize);
[5172]99        }
100
[5202]101        E[0] = pb.createOr(E[0], e[patt.length() - 1][0]);
[5172]102        for(int d=1; d<=dist; d++){
103            E[d] = pb.createOr(E[d], pb.createAnd(e[patt.length()-1][d], pb.createNot(e[patt.length()-1][d-1])));
104        }
105
106    }
[5202]107
108
[5310]109    Var * output = mKernel.getOutputStreamVar("E");
[5217]110    for (int d = 0; d <= dist; d++) {
[5202]111        pb.createAssign(pb.createExtract(output, d), E[d]);
[5172]112    }
113}
114
115}//end of re namespace
Note: See TracBrowser for help on using the repository browser.