source: icGREP/icgrep-devel/icgrep/kernels/delmask_kernel.cpp @ 5843

Last change on this file since 5843 was 5843, checked in by cameron, 15 months ago

CC Compiler refactoring step

File size: 5.3 KB
Line 
1/*
2 *  Copyright (c) 2016 International Characters.
3 *  This software is licensed to the public under the Open Software License 3.0.
4 */
5
6#include "delmask_kernel.h"
7#include <re/re_cc.h>
8#include <pablo/pe_ones.h>          // for Ones
9#include <pablo/pe_var.h>           // for Var
10#include <pablo/pe_zeroes.h>        // for Zeroes
11#include <cc/cc_compiler.h>
12#include <pablo/builder.hpp>
13#include <llvm/IR/Module.h>
14#include <pablo/pablo_toolchain.h>
15
16using namespace kernel;
17using namespace pablo;
18using namespace llvm;
19
20void DelMaskKernelBuilder::generatePabloMethod() {
21    PabloBuilder main(getEntryScope());
22    //  input: 8 basis bit streams
23   
24    std::vector<PabloAST *> u8_bits = getInputStreamSet("u8bit");
25    //  output: delmask stream + error stream
26   
27    cc::CC_Compiler ccc(this, u8_bits);
28   
29    Zeroes * zeroes = main.createZeroes();
30
31    // Outputs
32    Var * delmask = main.createVar("delmask", zeroes);
33    Var * neg_delmask = main.createVar("neg_delmask", zeroes);
34    Var * error_mask = main.createVar("error_mask", zeroes);
35   
36    PabloAST * ASCII = ccc.compileCC("ASCII", re::makeCC(0x0, 0x7F), main);
37    auto ascii = main.createScope();
38    main.createIf(ASCII, ascii);
39    PabloAST * u8pfx = ccc.compileCC("u8pfx", re::makeCC(0xC0, 0xFF), main);
40    PabloAST * nonASCII = ccc.compileCC("u8pfx", re::makeCC(0x80, 0xFF), main);
41    auto it = main.createScope();
42    main.createIf(nonASCII, it);
43    Var * u8invalid = it.createVar("u8invalid", zeroes);
44    PabloAST * u8pfx2 = ccc.compileCC(re::makeCC(0xC2, 0xDF), it);
45    PabloAST * u8pfx3 = ccc.compileCC(re::makeCC(0xE0, 0xEF), it);
46    PabloAST * u8pfx4 = ccc.compileCC(re::makeCC(0xF0, 0xF4), it);
47    PabloAST * u8suffix = ccc.compileCC("u8suffix", re::makeCC(0x80, 0xBF), it);
48    //
49    // Two-byte sequences
50    Var * u8scope22 = it.createVar("u8scope22", zeroes);
51    auto it2 = it.createScope();
52    it.createIf(u8pfx2, it2);
53    it2.createAssign(u8scope22, it2.createAdvance(u8pfx2, 1));
54    //
55    // Three-byte sequences
56    Var * u8scope3X = it.createVar("u8scope3X", zeroes);
57    Var * EX_invalid = it.createVar("EX_invalid", zeroes);
58    Var * del3 = it.createVar("del3", zeroes);
59    auto it3 = it.createScope();
60    it.createIf(u8pfx3, it3);
61    PabloAST * u8scope32 = it3.createAdvance(u8pfx3, 1, "u8scope32");
62    PabloAST * u8scope33 = it3.createAdvance(u8scope32, 1, "u8scope33");
63    it3.createAssign(u8scope3X, it3.createOr(u8scope32, u8scope33));
64    PabloAST * E0_invalid = it3.createAnd(it3.createAdvance(ccc.compileCC(re::makeCC(0xE0), it3), 1), ccc.compileCC(re::makeCC(0x80, 0x9F), it3));
65    PabloAST * ED_invalid = it3.createAnd(it3.createAdvance(ccc.compileCC(re::makeCC(0xED), it3), 1), ccc.compileCC(re::makeCC(0xA0, 0xBF), it3));
66    it3.createAssign(EX_invalid, it3.createOr(E0_invalid, ED_invalid));
67    it3.createAssign(del3, u8scope32);
68    //
69    // Four-byte sequences
70    Var * u8scope4nonfinal = it.createVar("u8scope4nonfinal", zeroes);
71    Var * u8scope4X = it.createVar("u8scope4X", zeroes);
72    Var * FX_invalid = it.createVar("FX_invalid", zeroes);
73    Var * del4 = it.createVar("del4", zeroes);
74    auto it4 = it.createScope();
75    it.createIf(u8pfx4, it4);
76    PabloAST * u8scope42 = it4.createAdvance(u8pfx4, 1, "u8scope42");
77    PabloAST * u8scope43 = it4.createAdvance(u8scope42, 1, "u8scope43");
78    PabloAST * u8scope44 = it4.createAdvance(u8scope43, 1, "u8scope44");
79    it4.createAssign(u8scope4nonfinal, it4.createOr(u8scope42, u8scope43));
80    it4.createAssign(u8scope4X, it4.createOr(u8scope4nonfinal, u8scope44));
81    PabloAST * F0_invalid = it4.createAnd(it4.createAdvance(ccc.compileCC(re::makeCC(0xF0), it4), 1), ccc.compileCC(re::makeCC(0x80, 0x8F), it4));
82    PabloAST * F4_invalid = it4.createAnd(it4.createAdvance(ccc.compileCC(re::makeCC(0xF4), it4), 1), ccc.compileCC(re::makeCC(0x90, 0xBF), it4));
83    it4.createAssign(FX_invalid, it4.createOr(F0_invalid, F4_invalid));
84    it4.createAssign(del4, it4.createOr(u8scope42, u8scope43));
85    //
86    // Invalid cases
87    PabloAST * anyscope = it.createOr(u8scope22, it.createOr(u8scope3X, u8scope4X), "anyscope");
88    PabloAST * legalpfx = it.createOr(it.createOr(u8pfx2, u8pfx3), u8pfx4);
89    //  Any scope that does not have a suffix byte, and any suffix byte that is not in
90    //  a scope is a mismatch, i.e., invalid UTF-8.
91    PabloAST * mismatch = it.createXor(anyscope, u8suffix);
92    PabloAST * EF_invalid = it.createOr(EX_invalid, FX_invalid);
93    PabloAST * pfx_invalid = it.createXor(u8pfx, legalpfx);
94    it.createAssign(u8invalid, it.createOr(pfx_invalid, it.createOr(mismatch, EF_invalid)));
95    //PabloAST * u8valid = it.createNot(u8invalid, "u8valid");
96    it.createAssign(error_mask, u8invalid);
97   
98    it.createAssign(delmask, it.createInFile(it.createOr(it.createOr(del3, del4), ccc.compileCC(re::makeCC(0xC0, 0xFF), it))));
99    it.createAssign(neg_delmask, it.createInFile(it.createNot(delmask)));
100   
101    Var * delmask_out = this->getOutputStreamVar("delMask");
102    Var * neg_delmask_out = this->getOutputStreamVar("neg_delMask");
103    Var * error_mask_out = this->getOutputStreamVar("errMask");
104   
105    main.createAssign(main.createExtract(delmask_out, main.getInteger(0)), delmask);
106    main.createAssign(main.createExtract(neg_delmask_out, main.getInteger(0)), neg_delmask);
107    main.createAssign(main.createExtract(error_mask_out,  main.getInteger(0)), error_mask);
108
109}
Note: See TracBrowser for help on using the repository browser.