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

Last change on this file since 5227 was 5227, checked in by nmedfort, 3 years ago

Rewrite of the CarryManager? to support non-carry-collapsing loops.

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