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
RevLine 
[3850]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
[4870]7#include "printer_pablos.h"
8#include <pablo/codegenstate.h>
9#include <llvm/Support/raw_os_ostream.h>
[4346]10#include <iostream>
[3850]11
[4199]12using namespace pablo;
[4194]13
[4870]14const unsigned BlockIndenting = 2;
[3850]15
[4870]16void PabloPrinter::print(const pablo::PabloFunction & function, llvm::raw_ostream & out) {
17    print(function.getEntryBlock(), out, true);
[3850]18}
19
[4870]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";
[3850]24    }
25}
26
[4870]27void PabloPrinter::print(const Statement * stmt, llvm::raw_ostream & out, const bool expandNested, const unsigned indent) {
28    out.indent(indent);
[4280]29    if (stmt == nullptr) {
[4870]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);
[4919]37    } else if (const If * ifNode = dyn_cast<const If>(stmt)) {
38        out << "If ";
39        print(ifNode->getCondition(), out);
[4870]40        if (expandNested) {
41            out << ":\n";
[4919]42            print(ifNode->getBody(), out, true, indent + BlockIndenting);
[4959]43            if (ifNode->getDefined().size() > 0) {
44                out.indent(indent);
45                out << "Else:\n";
46                print_vars(ifNode->getDefined(), out, indent + BlockIndenting);
47            }
[4870]48        }
49    } else if (const While * whileNode = dyn_cast<const While>(stmt)) {
[4919]50        out << "While ";
[4870]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)) {
[4959]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 << ")";
[4876]65    } else if (const And * andNode = dyn_cast<const And>(stmt)) {
66        out << andNode->getName() << " = (";
67        for (unsigned i = 0; i != andNode->getNumOperands(); ++i) {
[4873]68            if (i) out << " & ";
[4876]69            print(andNode->getOperand(i), out);
[4873]70        }
[4870]71        out << ")";
[4876]72    } else if (const Or * orNode = dyn_cast<const Or>(stmt)) {
73        out << orNode->getName() << " = (";
74        for (unsigned i = 0; i != orNode->getNumOperands(); ++i) {
[4873]75            if (i) out << " | ";
[4876]76            print(orNode->getOperand(i), out);
[4873]77        }
[4870]78        out << ")";
[4876]79    } else if (const Xor * xorNode = dyn_cast<const Xor>(stmt)) {
80        out << xorNode->getName() << " = (";
81        for (unsigned i = 0; i != xorNode->getNumOperands(); ++i) {
[4873]82            if (i) out << " ^ ";
[4876]83            print(xorNode->getOperand(i), out);
[4873]84        }
[4870]85        out << ")";
[4876]86    } else if (const Sel * selNode = dyn_cast<const Sel>(stmt)) {
87        out << selNode->getName() << " = (";
88        print(selNode->getCondition(), out);
[4870]89        out << " ? ";
[4876]90        print(selNode->getTrueExpr(), out);
[4870]91        out << " : ";
[4876]92        print(selNode->getFalseExpr(), out);
[4870]93        out << ")";
[4876]94    } else if (const Not * notNode = dyn_cast<const Not>(stmt)) {
95        out << notNode->getName() << " = (~";
96        print(notNode->getExpr(), out);
[4870]97        out << ")";
98    } else if (const Advance * adv = dyn_cast<const Advance>(stmt)) {
99        out << adv->getName() << " = pablo.Advance(";
100        print(adv->getExpr(), out);
[4959]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()) << ")";
[4870]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 << ")";
[5023]122    } else if (const InFile * e = dyn_cast<const InFile>(stmt)) {
123        out << e->getName() << " = pablo.InFile(";
124        print(e->getExpr(), out);
125        out << ")";
[4870]126    } else {
127        out << "???";
[4280]128    }
[4410]129}
130
[4870]131void PabloPrinter::print(const PabloAST * expr, llvm::raw_ostream & out) {
[4410]132    if (expr == nullptr) {
[4870]133        out << "<null-expr>";
[4762]134    } else if (isa<const Zeroes>(expr)) {
[4870]135        out << "0";
[4762]136    } else if (isa<const Ones>(expr)) {
[4870]137        out << "1";
[4762]138    } else if (const Var * var = dyn_cast<const Var>(expr)) {
[4870]139        out  << var->getName();
[4762]140    } else if (const Next * next = dyn_cast<const Next>(expr)) {
[4870]141        out << "Next(" << next->getName() << ")";
[4762]142    } else if (const If * ifstmt = dyn_cast<If>(expr)) {
[4870]143        out << "If ";
144        print(ifstmt->getCondition(), out);
[4762]145    } else if (const While * whl = dyn_cast<While>(expr)) {
[4870]146        out << "While ";
147        print(whl->getCondition(), out);
[4762]148    } else if (const Statement * stmt = dyn_cast<Statement>(expr)) {
[4870]149        out << stmt->getName();
[4797]150    } else if (isa<Integer>(expr)) {
[4870]151        out << cast<Integer>(expr)->value();
[4762]152    } else {
[4870]153        out << "???";
[4346]154    }
[3850]155}
156
[4870]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}
[3850]163
[4870]164
Note: See TracBrowser for help on using the repository browser.