source: icGREP/icgrep-devel/icgrep/pablo/printer_pablos.cpp @ 5297

Last change on this file since 5297 was 5283, checked in by nmedfort, 2 years ago

Optimized Symbol Generation (and fixed potential bug that could allow duplicate names being constructed); made PabloKernel? extend PabloAST (temporarily removed PabloAST::getName() to avoid diamond problem); added an internal scalar to PabloKernel? struct for each Count to avoid InOut? output scalar variable problem; allowed CodeMotionPass? to move code within the same scope but across a branch statement. Began work on separating Kernels into either Block-Oriented or Segment-Oriented kernels.

File size: 7.2 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 "printer_pablos.h"
8#include <pablo/codegenstate.h>
9#include <pablo/boolean.h>
10#include <pablo/arithmetic.h>
11#include <pablo/branch.h>
12#include <pablo/pe_advance.h>
13#include <pablo/pe_lookahead.h>
14#include <pablo/pe_matchstar.h>
15#include <pablo/pe_scanthru.h>
16#include <pablo/pe_infile.h>
17#include <pablo/pe_count.h>
18#include <pablo/pe_integer.h>
19#include <pablo/pe_string.h>
20#include <pablo/pe_zeroes.h>
21#include <pablo/pe_ones.h>
22#include <pablo/pe_var.h>
23#include <pablo/ps_assign.h>
24#include <pablo/pablo_kernel.h>
25#include <llvm/Support/raw_os_ostream.h>
26
27using namespace pablo;
28using namespace llvm;
29using TypeId = PabloAST::ClassTypeId;
30
31const unsigned BlockIndenting = 2;
32
33void PabloPrinter::print(const PabloKernel * kernel, raw_ostream & out) {
34    print(kernel->getEntryBlock(), out, true);
35}
36
37void PabloPrinter::print(const Statement * stmt, raw_ostream & out, const bool expandNested, const unsigned indent) {
38    out.indent(indent);
39    if (stmt == nullptr) {
40        out << "<null-stmt>";
41    } else if (const Assign * assign = dyn_cast<Assign>(stmt)) {
42        print(assign->getVariable(), out);
43        out << " = ";
44        print(assign->getValue(), out);
45    } else if (const Branch * br = dyn_cast<Branch>(stmt)) {
46        if (isa<If>(br)) {
47            out << "If ";
48        } else if (isa<While>(br)) {
49            out << "While ";
50        }
51        print(br->getCondition(), out);
52        if (expandNested) {
53            out << ":\n";
54            print(br->getBody(), out, true, indent + BlockIndenting);
55        }
56    } else {
57        print(cast<PabloAST>(stmt), out);
58
59        if (const Extract * extract = dyn_cast<Extract>(stmt)) {
60            out << " = Extract ";
61            print(extract->getArray(), out);
62            out << ", ";
63            print(extract->getIndex(), out);
64        } else if (const And * andNode = dyn_cast<And>(stmt)) {
65            out << " = (";
66            for (unsigned i = 0; i != andNode->getNumOperands(); ++i) {
67                if (i) out << " & ";
68                print(andNode->getOperand(i), out);
69            }
70            out << ")";
71        } else if (const Or * orNode = dyn_cast<Or>(stmt)) {
72            out << " = (";
73            for (unsigned i = 0; i != orNode->getNumOperands(); ++i) {
74                if (i) out << " | ";
75                print(orNode->getOperand(i), out);
76            }
77            out << ")";
78        } else if (const Xor * xorNode = dyn_cast<Xor>(stmt)) {
79            out << " = (";
80            for (unsigned i = 0; i != xorNode->getNumOperands(); ++i) {
81                if (i) out << " ^ ";
82                print(xorNode->getOperand(i), out);
83            }
84            out << ")";
85        } else if (const Sel * selNode = dyn_cast<Sel>(stmt)) {
86            out << " = (";
87            print(selNode->getCondition(), out);
88            out << " ? ";
89            print(selNode->getTrueExpr(), out);
90            out << " : ";
91            print(selNode->getFalseExpr(), out);
92            out << ")";
93        } else if (const Not * notNode = dyn_cast<Not>(stmt)) {
94            out << " = (~";
95            print(notNode->getExpr(), out);
96            out << ")";
97        } else if (const Advance * adv = dyn_cast<Advance>(stmt)) {
98            out << " = pablo.Advance(";
99            print(adv->getExpression(), out);
100            out << ", " << std::to_string(adv->getAmount()) << ")";
101        } else if (const Lookahead * adv = dyn_cast<Lookahead>(stmt)) {
102            out << " = pablo.Lookahead(";
103            print(adv->getExpr(), out);
104            out << ", " << std::to_string(adv->getAmount()) << ")";
105        } else if (const MatchStar * mstar = dyn_cast<MatchStar>(stmt)) {
106            out << " = pablo.MatchStar(";
107            print(mstar->getMarker(), out);
108            out << ", ";
109            print(mstar->getCharClass(), out);
110            out << ")";
111        } else if (const ScanThru * sthru = dyn_cast<ScanThru>(stmt)) {
112            out << " = pablo.ScanThru(";
113            print(sthru->getScanFrom(), out);
114            out << ", ";
115            print(sthru->getScanThru(), out);
116            out << ")";
117        } else if (const Count * count = dyn_cast<Count>(stmt)) {
118            out << " = pablo.Count(";
119            print(count->getExpr(), out);
120            out << ")";
121        } else if (const InFile * e = dyn_cast<InFile>(stmt)) {
122            out << " = pablo.InFile(";
123            print(e->getExpr(), out);
124            out << ")";
125        } else if (const AtEOF * e = dyn_cast<AtEOF>(stmt)) {
126            out << " = pablo.AtEOF(";
127            print(e->getExpr(), out);
128            out << ")";
129        } else {
130            out << "???";
131        }
132    }
133}
134
135void PabloPrinter::print(const PabloAST * expr, llvm::raw_ostream & out) {
136    if (expr == nullptr) {
137        out << "<null-expr>";
138    } else if (isa<Zeroes>(expr)) {
139        out << "0";
140    } else if (isa<Ones>(expr)) {
141        out << "1";
142    } else if (const Var * var = dyn_cast<Var>(expr)) {
143        out << var->getName();
144    } else if (const If * ifstmt = dyn_cast<If>(expr)) {
145        out << "If ";
146        print(ifstmt->getCondition(), out);
147    } else if (const While * whl = dyn_cast<While>(expr)) {
148        out << "While ";
149        print(whl->getCondition(), out);
150    } else if (const Assign * assign = dyn_cast<Assign>(expr)) {
151        print(assign->getVariable(), out);
152        out << " = ";
153        print(assign->getValue(), out);
154    } else if (const Add * op = dyn_cast<Add>(expr)) {
155        print(op->getLH(), out);
156        out << " + ";
157        print(op->getRH(), out);
158    } else if (const Subtract * op = dyn_cast<Subtract>(expr)) {
159        print(op->getLH(), out);
160        out << " - ";
161        print(op->getRH(), out);
162    } else if (const LessThan * op = dyn_cast<LessThan>(expr)) {
163        print(op->getLH(), out);
164        out << " < ";
165        print(op->getRH(), out);
166    } else if (const LessThanEquals * op = dyn_cast<LessThanEquals>(expr)) {
167        print(op->getLH(), out);
168        out << " <= ";
169        print(op->getRH(), out);
170    } else if (const Equals * op = dyn_cast<Equals>(expr)) {
171        print(op->getLH(), out);
172        out << " == ";
173        print(op->getRH(), out);
174    } else if (const GreaterThanEquals * op = dyn_cast<GreaterThanEquals>(expr)) {
175        print(op->getLH(), out);
176        out << " >= ";
177        print(op->getRH(), out);
178    } else if (const GreaterThan * op = dyn_cast<GreaterThan>(expr)) {
179        print(op->getLH(), out);
180        out << " > ";
181        print(op->getRH(), out);
182    } else if (const NotEquals * op = dyn_cast<NotEquals>(expr)) {
183        print(op->getLH(), out);
184        out << " != ";
185        print(op->getRH(), out);
186    } else if (const Statement * stmt = dyn_cast<Statement>(expr)) {
187        out << stmt->getName();
188    } else if (isa<Integer>(expr)) {
189        out << cast<Integer>(expr)->value();
190    } else {
191        out << "???";
192    }
193}
194
195void PabloPrinter::print(const PabloBlock * block, raw_ostream & strm, const bool expandNested, const unsigned indent) {
196    for (const Statement * stmt : *block) {
197        print(stmt, strm, expandNested, indent);
198        if (LLVM_LIKELY(!isa<Branch>(stmt) || !expandNested)) {
199            strm << "\n";
200        }
201    }
202}
203
204
Note: See TracBrowser for help on using the repository browser.