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

Last change on this file since 4280 was 4280, checked in by nmedfort, 5 years ago

More Pablo IR manipulation functionality; finished use analysis optimizer (requires boost). Removed remaining LLVM optimization passes.

File size: 4.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
9
10//Regular Expressions
11#include <re/re_re.h>
12#include <re/re_cc.h>
13#include <re/re_start.h>
14#include <re/re_end.h>
15#include <re/re_seq.h>
16#include <re/re_name.h>
17
18//Pablo Expressions
19#include <pablo/pabloAST.h>
20#include <pablo/pe_advance.h>
21#include <pablo/pe_and.h>
22#include <pablo/pe_call.h>
23#include <pablo/pe_matchstar.h>
24#include <pablo/pe_not.h>
25#include <pablo/pe_or.h>
26#include <pablo/pe_scanthru.h>
27#include <pablo/pe_sel.h>
28#include <pablo/pe_var.h>
29#include <pablo/pe_xor.h>
30#include <pablo/ps_assign.h>
31#include <pablo/ps_if.h>
32#include <pablo/ps_while.h>
33#include <pablo/pe_zeroes.h>
34#include <pablo/pe_ones.h>
35#include <pablo/codegenstate.h>
36
37using namespace re;
38using namespace pablo;
39
40std::string PabloPrinter::print(const PabloBlock & block)
41{
42    std::string strOut = "[";
43
44    strOut = strOut.substr(0, strOut.length() - 1);
45    strOut += "],[";
46
47    strOut += print(block.statements());
48
49    strOut = strOut.substr(0, strOut.length() - 1);
50    strOut += "]";
51
52    return strOut;
53}
54
55std::string PabloPrinter::print(const StatementList & stmts) {
56    std::string strOut = "";
57    for (const Statement * stmt : stmts) {
58        strOut += print(stmt) + "\n";
59    }
60    return strOut;
61}
62
63std::string PabloPrinter::print(const Statement * stmt) {
64    if (stmt == nullptr) {
65        return "<null>";
66    }
67    else if (const Assign * an = dyn_cast<const Assign>(stmt)) {
68        std::string result = "Assign('" + an->getName()->str() + "'," + print(an->getExpr());
69        if (an->isOutputAssignment()) {
70            result += ",Output=" + std::to_string(an->getOutputIndex());
71        }
72        return result + ")";
73    }
74    else if (const Next * next = dyn_cast<const Next>(stmt)) {
75        return "Next(" + next->getName()->str() + "," + print(next->getExpr()) + ")";
76    }
77    else if (const If * ifstmt = dyn_cast<const If>(stmt)) {
78        return "If(" + print(ifstmt->getCondition()) + "," + print(ifstmt->getBody()) + ")";
79    }
80    else if (const While * whl = dyn_cast<const While>(stmt)) {
81        return "While(" + print(whl->getCondition()) + "," + print(whl->getBody()) + ")";
82    }
83    return "???";
84}
85
86std::string PabloPrinter::print(const PabloAST *expr) {
87    if (expr == nullptr) {
88        return "<null>";
89    }
90    else if (isa<const Zeroes>(expr)) {
91        return "Zeroes";
92    }
93    else if (isa<const Ones>(expr)) {
94        return "Ones";
95    }
96    else if (const Call * pablo_call = dyn_cast<const Call>(expr)) {
97        return "Call '" + pablo_call->getCallee()->str() + "'";
98    }
99    else if (const Var * pablo_var = dyn_cast<const Var>(expr)) {
100        return "Var '" + pablo_var->getName()->str() + "' ";
101    }
102    else if (const And * pablo_and = dyn_cast<const And>(expr)) {
103        return "And(" + print(pablo_and->getExpr1()) +"," + print(pablo_and->getExpr2()) + ")";
104    }
105    else if (const Or * pablo_or = dyn_cast<const Or>(expr)) {
106        return "Or(" + print(pablo_or->getExpr1()) + "," + print(pablo_or->getExpr2()) + ")";
107    }
108    else if (const Sel * pablo_sel = dyn_cast<const Sel>(expr)) {
109        return "(" + print(pablo_sel->getCondition()) + " ? " + print(pablo_sel->getTrueExpr()) + " : " + print(pablo_sel->getFalseExpr()) + ")";
110    }
111    else if (const Not * pablo_not = dyn_cast<const Not>(expr)) {
112        return "Not (" + print(pablo_not->getExpr()) + ")";
113    }
114    else if (const Advance * adv = dyn_cast<const Advance>(expr)) {
115        return "Advance(" + print(adv->getExpr()) + ", " + std::to_string(adv->getAdvanceAmount()) + ")";
116    }
117    else if (const MatchStar * mstar = dyn_cast<const MatchStar>(expr)) {
118        return "MatchStar(" + print(mstar->getMarker()) + ", " + print(mstar->getCharClass()) + ")";
119    }
120    else if (const ScanThru * sthru = dyn_cast<const ScanThru>(expr)) {
121        return "ScanThru(" + print(sthru->getScanFrom()) + ", " + print(sthru->getScanThru()) + ")";
122    }
123    else if (isa<Statement>(expr)) {
124        return print(cast<Statement>(expr));
125    }
126    return "???";
127}
128
129
Note: See TracBrowser for help on using the repository browser.