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

Last change on this file was 6215, checked in by cameron, 3 months ago

pablo.terminateAt

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