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

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

Bug fix for Mac OS compilation. Partial bug fix for CodeMotionPass?

File size: 7.4 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 If * ifNode = dyn_cast<If>(stmt)) {
46        out << "If ";
47        print(ifNode->getCondition(), out);
48        if (expandNested) {
49            out << ":\n";
50            print(ifNode->getBody(), out, true, indent + BlockIndenting);
51        }
52    } else if (const While * whileNode = dyn_cast<While>(stmt)) {
53        out << "While ";
54        print(whileNode->getCondition(), out);
55        if (expandNested) {
56            out << ":\n";
57            print(whileNode->getBody(), out, true, indent + BlockIndenting);
58        }
59    } else {
60        print(cast<PabloAST>(stmt), out);
61
62        if (const Extract * extract = dyn_cast<Extract>(stmt)) {
63            out << " = Extract ";
64            print(extract->getArray(), out);
65            out << ", ";
66            print(extract->getIndex(), out);
67        } else if (const And * andNode = dyn_cast<And>(stmt)) {
68            out << " = (";
69            for (unsigned i = 0; i != andNode->getNumOperands(); ++i) {
70                if (i) out << " & ";
71                print(andNode->getOperand(i), out);
72            }
73            out << ")";
74        } else if (const Or * orNode = dyn_cast<Or>(stmt)) {
75            out << " = (";
76            for (unsigned i = 0; i != orNode->getNumOperands(); ++i) {
77                if (i) out << " | ";
78                print(orNode->getOperand(i), out);
79            }
80            out << ")";
81        } else if (const Xor * xorNode = dyn_cast<Xor>(stmt)) {
82            out << " = (";
83            for (unsigned i = 0; i != xorNode->getNumOperands(); ++i) {
84                if (i) out << " ^ ";
85                print(xorNode->getOperand(i), out);
86            }
87            out << ")";
88        } else if (const Sel * selNode = dyn_cast<Sel>(stmt)) {
89            out << " = (";
90            print(selNode->getCondition(), out);
91            out << " ? ";
92            print(selNode->getTrueExpr(), out);
93            out << " : ";
94            print(selNode->getFalseExpr(), out);
95            out << ")";
96        } else if (const Not * notNode = dyn_cast<Not>(stmt)) {
97            out << " = (~";
98            print(notNode->getExpr(), out);
99            out << ")";
100        } else if (const Advance * adv = dyn_cast<Advance>(stmt)) {
101            out << " = pablo.Advance(";
102            print(adv->getExpression(), out);
103            out << ", " << std::to_string(adv->getAmount()) << ")";
104        } else if (const Lookahead * adv = dyn_cast<Lookahead>(stmt)) {
105            out << " = pablo.Lookahead(";
106            print(adv->getExpr(), out);
107            out << ", " << std::to_string(adv->getAmount()) << ")";
108        } else if (const MatchStar * mstar = dyn_cast<MatchStar>(stmt)) {
109            out << " = pablo.MatchStar(";
110            print(mstar->getMarker(), out);
111            out << ", ";
112            print(mstar->getCharClass(), out);
113            out << ")";
114        } else if (const ScanThru * sthru = dyn_cast<ScanThru>(stmt)) {
115            out << " = pablo.ScanThru(";
116            print(sthru->getScanFrom(), out);
117            out << ", ";
118            print(sthru->getScanThru(), out);
119            out << ")";
120        } else if (const Count * count = dyn_cast<Count>(stmt)) {
121            out << " = pablo.Count(";
122            print(count->getExpr(), out);
123            out << ")";
124        } else if (const InFile * e = dyn_cast<InFile>(stmt)) {
125            out << " = pablo.InFile(";
126            print(e->getExpr(), out);
127            out << ")";
128        } else if (const AtEOF * e = dyn_cast<AtEOF>(stmt)) {
129            out << " = pablo.AtEOF(";
130            print(e->getExpr(), out);
131            out << ")";
132        } else {
133            out << "???";
134        }
135    }
136}
137
138void PabloPrinter::print(const PabloAST * expr, llvm::raw_ostream & out) {
139    if (expr == nullptr) {
140        out << "<null-expr>";
141    } else if (isa<Zeroes>(expr)) {
142        out << "0";
143    } else if (isa<Ones>(expr)) {
144        out << "1";
145    } else if (const Var * var = dyn_cast<Var>(expr)) {
146        out << var->getName()->value();
147    } else if (const If * ifstmt = dyn_cast<If>(expr)) {
148        out << "If ";
149        print(ifstmt->getCondition(), out);
150    } else if (const While * whl = dyn_cast<While>(expr)) {
151        out << "While ";
152        print(whl->getCondition(), out);
153    } else if (const Assign * assign = dyn_cast<Assign>(expr)) {
154        print(assign->getVariable(), out);
155        out << " = ";
156        print(assign->getValue(), out);
157    } else if (const Add * op = dyn_cast<Add>(expr)) {
158        print(op->getLH(), out);
159        out << " + ";
160        print(op->getRH(), out);
161    } else if (const Subtract * op = dyn_cast<Subtract>(expr)) {
162        print(op->getLH(), out);
163        out << " - ";
164        print(op->getRH(), out);
165    } else if (const LessThan * op = dyn_cast<LessThan>(expr)) {
166        print(op->getLH(), out);
167        out << " < ";
168        print(op->getRH(), out);
169    } else if (const LessThanEquals * op = dyn_cast<LessThanEquals>(expr)) {
170        print(op->getLH(), out);
171        out << " <= ";
172        print(op->getRH(), out);
173    } else if (const Equals * op = dyn_cast<Equals>(expr)) {
174        print(op->getLH(), out);
175        out << " == ";
176        print(op->getRH(), out);
177    } else if (const GreaterThanEquals * op = dyn_cast<GreaterThanEquals>(expr)) {
178        print(op->getLH(), out);
179        out << " >= ";
180        print(op->getRH(), out);
181    } else if (const GreaterThan * op = dyn_cast<GreaterThan>(expr)) {
182        print(op->getLH(), out);
183        out << " > ";
184        print(op->getRH(), out);
185    } else if (const NotEquals * op = dyn_cast<NotEquals>(expr)) {
186        print(op->getLH(), out);
187        out << " != ";
188        print(op->getRH(), out);
189    } else if (const Statement * stmt = dyn_cast<Statement>(expr)) {
190        out << stmt->getName()->value();
191    } else if (isa<Integer>(expr)) {
192        out << cast<Integer>(expr)->value();
193    } else {
194        out << "???";
195    }
196}
197
198void PabloPrinter::print(const PabloBlock * block, raw_ostream & strm, const bool expandNested, const unsigned indent) {
199    for (const Statement * stmt : *block) {
200        print(stmt, strm, expandNested, indent);
201        if (LLVM_LIKELY(!isa<Branch>(stmt) || !expandNested)) {
202            strm << "\n";
203        }
204    }
205}
206
207
Note: See TracBrowser for help on using the repository browser.