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

Last change on this file since 5377 was 5310, checked in by nmedfort, 2 years ago

Adjusted pablo compiler to use getInputStream and getOutputStream when accessing packed stream fields.

  • Property svn:executable set to *
File size: 3.7 KB
Line 
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"
8#include <pablo/builder.hpp>
9#include <pablo/pe_zeroes.h>
10#include <pablo/pe_ones.h>
11
12using namespace pablo;
13
14namespace re {
15
16
17Pattern_Compiler::Pattern_Compiler(PabloKernel & kernel)
18: mKernel(kernel)
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
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){
28    PabloBuilder it = PabloBuilder::Create(pb);
29
30    Zeroes * zeroes = pb.createZeroes();
31
32    for(int n = 0; n < stepSize; n++){
33
34        PabloAST * name = basisBits[(patt[i] >> 1) & 0x3];
35       
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));
42        }
43       
44        i++;
45        if (i >= patt.length()) break;
46    } 
47
48    if (i < patt.length()) {
49        optimizer(patt, basisBits, e, i, e[i - 1][dist], main, it, dist, stepSize);
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        }
57    }
58
59    pb.createIf(cond, it);
60}
61
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);
65
66    for(int d=0; d<=dist; d++){
67        E[d] = pb.createZeroes();
68    }
69
70    for(unsigned r = 0; r < patts.size(); r++){
71        const std::string & patt = patts[r];
72
73        PabloAST * name = basisBits[(patt[0] >> 1) & 0x3];
74
75        e[0][0] = name;
76        for(int j = 1; j <= dist; j++){
77          e[0][j] = pb.createOnes();
78        }
79
80        unsigned i = 1;
81        while (i < patt.length() && i < optPosition) {
82
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));
86            for(int j = 1; j <= dist; j++){     
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));
91            }
92           
93            i++;
94        }
95
96        //Optimize from optPosition
97        if (i >= optPosition) {
98            optimizer(patt, basisBits, e, i, e[i-1][dist], pb, pb, dist, stepSize);
99        }
100
101        E[0] = pb.createOr(E[0], e[patt.length() - 1][0]);
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    }
107
108
109    Var * output = mKernel.getOutputStreamVar("E");
110    for (int d = 0; d <= dist; d++) {
111        pb.createAssign(pb.createExtract(output, d), E[d]);
112    }
113}
114
115}//end of re namespace
Note: See TracBrowser for help on using the repository browser.