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

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

Bug fix for Multiplexing. Added ability to set the body of a If/While? node after creation.

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 * 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 * pablo_and = dyn_cast<const And>(stmt)) {
57        out << pablo_and->getName() << " = (";
58        print(pablo_and->getExpr1(), out);
59        out << " & ";
60        print(pablo_and->getExpr2(), out);
61        out << ")";
62    } else if (const Or * pablo_or = dyn_cast<const Or>(stmt)) {
63        out << pablo_or->getName() << " = (";
64        print(pablo_or->getExpr1(), out);
65        out << " | ";
66        print(pablo_or->getExpr2(), out);
67        out << ")";
68    } else if (const Xor * pablo_xor = dyn_cast<const Xor>(stmt)) {
69        out << pablo_xor->getName() << " = (";
70        print(pablo_xor->getExpr1(), out);
71        out << " ^ ";
72        print(pablo_xor->getExpr2(), out);
73        out << ")";
74    } else if (const Sel * pablo_sel = dyn_cast<const Sel>(stmt)) {
75        out << pablo_sel->getName() << " = (";
76        print(pablo_sel->getCondition(), out);
77        out << " ? ";
78        print(pablo_sel->getTrueExpr(), out);
79        out << " : ";
80        print(pablo_sel->getFalseExpr(), out);
81        out << ")";
82    } else if (const Not * pablo_not = dyn_cast<const Not>(stmt)) {
83        out << pablo_not->getName() << " = (~";
84        print(pablo_not->getExpr(), out);
85        out << ")";
86    } else if (const Advance * adv = dyn_cast<const Advance>(stmt)) {
87        out << adv->getName() << " = pablo.Advance(";
88        print(adv->getExpr(), out);
89        out << ", " << std::to_string(adv->getAdvanceAmount()) << ")";
90    } else if (const MatchStar * mstar = dyn_cast<const MatchStar>(stmt)) {
91        out << mstar->getName() << " = pablo.MatchStar(";
92        print(mstar->getMarker(), out);
93        out << ", ";
94        print(mstar->getCharClass(), out);
95        out << ")";
96    } else if (const ScanThru * sthru = dyn_cast<const ScanThru>(stmt)) {
97        out << sthru->getName() << " = pablo.ScanThru(";
98        print(sthru->getScanFrom(), out);
99        out << ", ";
100        print(sthru->getScanThru(), out);
101        out << ")";
102    } else if (const Mod64Advance * adv = dyn_cast<const Mod64Advance>(stmt)) {
103        out << adv->getName() << " = pablo.Mod64Advance(";
104        print(adv->getExpr(), out);
105        out << ", " << std::to_string(adv->getAdvanceAmount()) << ")";
106    } else if (const Mod64MatchStar * mstar = dyn_cast<const Mod64MatchStar>(stmt)) {
107        out << mstar->getName() << " = pablo.Mod64MatchStar(";
108        print(mstar->getMarker(), out);
109        out << ", ";
110        print(mstar->getCharClass(), out);
111        out << ")";
112    } else if (const Mod64ScanThru * sthru = dyn_cast<const Mod64ScanThru>(stmt)) {
113        out << sthru->getName() << " = pablo.Mod64ScanThru(";
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 {
123        out << "???";
124    }
125}
126
127void PabloPrinter::print(const PabloAST * expr, llvm::raw_ostream & out) {
128    if (expr == nullptr) {
129        out << "<null-expr>";
130    } else if (isa<const Zeroes>(expr)) {
131        out << "0";
132    } else if (isa<const Ones>(expr)) {
133        out << "1";
134    } else if (const Var * var = dyn_cast<const Var>(expr)) {
135        out  << var->getName();
136    } else if (const Next * next = dyn_cast<const Next>(expr)) {
137        out << "Next(" << next->getName() << ")";
138    } else if (const If * ifstmt = dyn_cast<If>(expr)) {
139        out << "If ";
140        print(ifstmt->getCondition(), out);
141    } else if (const While * whl = dyn_cast<While>(expr)) {
142        out << "While ";
143        print(whl->getCondition(), out);
144    } else if (const Statement * stmt = dyn_cast<Statement>(expr)) {
145        out << stmt->getName();
146    } else if (isa<Integer>(expr)) {
147        out << cast<Integer>(expr)->value();
148    } else {
149        out << "???";
150    }
151}
152
153void PabloPrinter::print(const PabloBlock * block, llvm::raw_ostream & strm, const bool expandNested, const unsigned indent) {
154    for (const Statement * stmt : *block) {
155        print(stmt, strm, expandNested, indent);
156        strm << "\n";
157    }
158}
159
160
Note: See TracBrowser for help on using the repository browser.