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

Last change on this file since 4878 was 4876, checked in by nmedfort, 4 years ago

More work towards n-ary And/Or/Xor? functions.

File size: 6.2 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 * ifstmt = dyn_cast<const If>(stmt)) {
38        out << "if ";
39        print(ifstmt->getCondition(), out);
40        if (expandNested) {
41            out << ":\n";
42            print(ifstmt->getBody(), out, true, indent + BlockIndenting);
43            out.indent(indent);
44            out << "else:\n";
45            print_vars(ifstmt->getDefined(), out, indent + BlockIndenting);
46        }
47    } else if (const While * whileNode = dyn_cast<const While>(stmt)) {
48        out << "while ";
49        print(whileNode->getCondition(), out);
50        if (expandNested) {
51            out << ":\n";
52            print(whileNode->getBody(), out, true, indent + BlockIndenting);
53        }
54    } else if (const Call * call = dyn_cast<const Call>(stmt)) {
55        out << " = " << call->getCallee() << "()";
56    } else if (const And * andNode = dyn_cast<const And>(stmt)) {
57        out << andNode->getName() << " = (";
58        for (unsigned i = 0; i != andNode->getNumOperands(); ++i) {
59            if (i) out << " & ";
60            print(andNode->getOperand(i), out);
61        }
62        out << ")";
63    } else if (const Or * orNode = dyn_cast<const Or>(stmt)) {
64        out << orNode->getName() << " = (";
65        for (unsigned i = 0; i != orNode->getNumOperands(); ++i) {
66            if (i) out << " | ";
67            print(orNode->getOperand(i), out);
68        }
69        out << ")";
70    } else if (const Xor * xorNode = dyn_cast<const Xor>(stmt)) {
71        out << xorNode->getName() << " = (";
72        for (unsigned i = 0; i != xorNode->getNumOperands(); ++i) {
73            if (i) out << " ^ ";
74            print(xorNode->getOperand(i), out);
75        }
76        out << ")";
77    } else if (const Sel * selNode = dyn_cast<const Sel>(stmt)) {
78        out << selNode->getName() << " = (";
79        print(selNode->getCondition(), out);
80        out << " ? ";
81        print(selNode->getTrueExpr(), out);
82        out << " : ";
83        print(selNode->getFalseExpr(), out);
84        out << ")";
85    } else if (const Not * notNode = dyn_cast<const Not>(stmt)) {
86        out << notNode->getName() << " = (~";
87        print(notNode->getExpr(), out);
88        out << ")";
89    } else if (const Advance * adv = dyn_cast<const Advance>(stmt)) {
90        out << adv->getName() << " = pablo.Advance(";
91        print(adv->getExpr(), out);
92        out << ", " << std::to_string(adv->getAdvanceAmount()) << ")";
93    } else if (const MatchStar * mstar = dyn_cast<const MatchStar>(stmt)) {
94        out << mstar->getName() << " = pablo.MatchStar(";
95        print(mstar->getMarker(), out);
96        out << ", ";
97        print(mstar->getCharClass(), out);
98        out << ")";
99    } else if (const ScanThru * sthru = dyn_cast<const ScanThru>(stmt)) {
100        out << sthru->getName() << " = pablo.ScanThru(";
101        print(sthru->getScanFrom(), out);
102        out << ", ";
103        print(sthru->getScanThru(), out);
104        out << ")";
105    } else if (const Mod64Advance * adv = dyn_cast<const Mod64Advance>(stmt)) {
106        out << adv->getName() << " = pablo.Mod64Advance(";
107        print(adv->getExpr(), out);
108        out << ", " << std::to_string(adv->getAdvanceAmount()) << ")";
109    } else if (const Mod64MatchStar * mstar = dyn_cast<const Mod64MatchStar>(stmt)) {
110        out << mstar->getName() << " = pablo.Mod64MatchStar(";
111        print(mstar->getMarker(), out);
112        out << ", ";
113        print(mstar->getCharClass(), out);
114        out << ")";
115    } else if (const Mod64ScanThru * sthru = dyn_cast<const Mod64ScanThru>(stmt)) {
116        out << sthru->getName() << " = pablo.Mod64ScanThru(";
117        print(sthru->getScanFrom(), out);
118        out << ", ";
119        print(sthru->getScanThru(), out);
120        out << ")";
121    } else if (const Count * count = dyn_cast<const Count>(stmt)) {
122        out << count->getName() << " = pablo.Count(";
123        print(count->getExpr(), out);
124        out << ")";
125    } else {
126        out << "???";
127    }
128}
129
130void PabloPrinter::print(const PabloAST * expr, llvm::raw_ostream & out) {
131    if (expr == nullptr) {
132        out << "<null-expr>";
133    } else if (isa<const Zeroes>(expr)) {
134        out << "0";
135    } else if (isa<const Ones>(expr)) {
136        out << "1";
137    } else if (const Var * var = dyn_cast<const Var>(expr)) {
138        out  << var->getName();
139    } else if (const Next * next = dyn_cast<const Next>(expr)) {
140        out << "Next(" << next->getName() << ")";
141    } else if (const If * ifstmt = dyn_cast<If>(expr)) {
142        out << "If ";
143        print(ifstmt->getCondition(), out);
144    } else if (const While * whl = dyn_cast<While>(expr)) {
145        out << "While ";
146        print(whl->getCondition(), out);
147    } else if (const Statement * stmt = dyn_cast<Statement>(expr)) {
148        out << stmt->getName();
149    } else if (isa<Integer>(expr)) {
150        out << cast<Integer>(expr)->value();
151    } else {
152        out << "???";
153    }
154}
155
156void PabloPrinter::print(const PabloBlock * block, llvm::raw_ostream & strm, const bool expandNested, const unsigned indent) {
157    for (const Statement * stmt : *block) {
158        print(stmt, strm, expandNested, indent);
159        strm << "\n";
160    }
161}
162
163
Note: See TracBrowser for help on using the repository browser.