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

Last change on this file since 5842 was 5837, checked in by cameron, 20 months ago

Pablo packh/packl and transposition with -enable-pablo-s2p

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