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

Last change on this file since 5043 was 5043, checked in by cameron, 3 years ago

Some clean-ups

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