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

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

pablo.InFile? initial support

File size: 6.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 <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 {
127        out << "???";
128    }
129}
130
131void PabloPrinter::print(const PabloAST * expr, llvm::raw_ostream & out) {
132    if (expr == nullptr) {
133        out << "<null-expr>";
134    } else if (isa<const Zeroes>(expr)) {
135        out << "0";
136    } else if (isa<const Ones>(expr)) {
137        out << "1";
138    } else if (const Var * var = dyn_cast<const Var>(expr)) {
139        out  << var->getName();
140    } else if (const Next * next = dyn_cast<const Next>(expr)) {
141        out << "Next(" << next->getName() << ")";
142    } else if (const If * ifstmt = dyn_cast<If>(expr)) {
143        out << "If ";
144        print(ifstmt->getCondition(), out);
145    } else if (const While * whl = dyn_cast<While>(expr)) {
146        out << "While ";
147        print(whl->getCondition(), out);
148    } else if (const Statement * stmt = dyn_cast<Statement>(expr)) {
149        out << stmt->getName();
150    } else if (isa<Integer>(expr)) {
151        out << cast<Integer>(expr)->value();
152    } else {
153        out << "???";
154    }
155}
156
157void PabloPrinter::print(const PabloBlock * block, llvm::raw_ostream & strm, const bool expandNested, const unsigned indent) {
158    for (const Statement * stmt : *block) {
159        print(stmt, strm, expandNested, indent);
160        strm << "\n";
161    }
162}
163
164
Note: See TracBrowser for help on using the repository browser.