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

Last change on this file since 5828 was 5828, checked in by nmedfort, 13 months ago

Pablo support for byte comparisions; LineFeed? kernel processes byte streams directly. Some clean up of PabloBuilder? functionality.

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