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

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

Progress on multi-target UCD compiler.

File size: 6.9 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 <pablo/printer_pablos.h>
8#include <iostream>
9#include <ostream>
10#include <llvm/Support/raw_os_ostream.h>
11
12//Regular Expressions
13#include <re/re_re.h>
14#include <re/re_cc.h>
15#include <re/re_start.h>
16#include <re/re_end.h>
17#include <re/re_seq.h>
18#include <re/re_name.h>
19
20//Pablo Expressions
21#include <pablo/pabloAST.h>
22#include <pablo/pe_advance.h>
23#include <pablo/pe_and.h>
24#include <pablo/pe_call.h>
25#include <pablo/pe_matchstar.h>
26#include <pablo/pe_not.h>
27#include <pablo/pe_or.h>
28#include <pablo/pe_scanthru.h>
29#include <pablo/pe_sel.h>
30#include <pablo/pe_var.h>
31#include <pablo/pe_xor.h>
32#include <pablo/ps_assign.h>
33#include <pablo/ps_if.h>
34#include <pablo/ps_while.h>
35#include <pablo/pe_zeroes.h>
36#include <pablo/pe_ones.h>
37#include <pablo/codegenstate.h>
38
39using namespace re;
40using namespace pablo;
41
42void PabloPrinter::print(const PabloBlock & block, llvm::raw_ostream & strm)
43{
44    print(block.statements(), "  ", strm);
45}
46
47void PabloPrinter::print(const StatementList & stmts, llvm::raw_ostream & strm) {
48    print(stmts, "  ", strm);
49}
50
51void PabloPrinter::print(const StatementList & stmts, std::string indent, llvm::raw_ostream & strm) {
52    for (const Statement * stmt : stmts) {
53        print(stmt, indent, strm);
54        strm << "\n";
55    }
56}
57
58void PabloPrinter::print_vars(const DefinedVars & vars, std::string indent, llvm::raw_ostream & strm) {
59    for (const PabloAST * v : vars) {
60        strm << indent << dyn_cast<Assign>(v)->getName() << " = 0" << "\n";
61    }
62}
63
64void PabloPrinter::print(const Statement * stmt, std::string indent, llvm::raw_ostream & strm) {
65    strm << indent;
66    if (stmt == nullptr) {
67        strm << "<null-stmt>";
68    }
69    else if (const Assign * an = dyn_cast<const Assign>(stmt)) {
70        strm << an->getName() << " = ";
71        print(an->getExpression(), strm);
72    }
73    else if (const Next * next = dyn_cast<const Next>(stmt)) {       
74        strm << "Next(" << next->getName() << ") = ";
75        print(next->getExpr(), strm);
76    }
77    else if (const If * ifstmt = dyn_cast<const If>(stmt)) {
78        strm << "if ";
79        print(ifstmt->getCondition(), strm);
80        strm << ":" << "\n";
81        print(ifstmt->getBody(), indent + "  ", strm);
82        strm << indent << "else:" << "\n";
83        print_vars(ifstmt->getDefined(), indent + "  ", strm);
84    }
85    else if (const While * whl = dyn_cast<const While>(stmt)) {
86        strm << "while ";
87        print(whl->getCondition(), strm);
88        strm << ":" << "\n";
89        print(whl->getBody(), indent + "  ", strm);
90    }
91    else if (const Call * call = dyn_cast<const Call>(stmt)) {
92        strm << " = " << call->getCallee() << "()";
93    }
94    else if (const And * pablo_and = dyn_cast<const And>(stmt)) {
95        print(pablo_and, strm);
96        strm << " = (";
97        print(pablo_and->getExpr1(), strm);
98        strm << " & ";
99        print(pablo_and->getExpr2(), strm);
100        strm << ")";
101    }
102    else if (const Or * pablo_or = dyn_cast<const Or>(stmt)) {
103        print(pablo_or, strm);
104        strm << " = (";
105        print(pablo_or->getExpr1(), strm);
106        strm << " | ";
107        print(pablo_or->getExpr2(), strm);
108        strm << ")";
109    }
110    else if (const Xor * pablo_xor = dyn_cast<const Xor>(stmt)) {
111        print(pablo_xor, strm);
112        strm << " = (";
113        print(pablo_xor->getExpr1(), strm);
114        strm << " ^ ";
115        print(pablo_xor->getExpr2(), strm);
116        strm << ")";
117    }
118    else if (const Sel * pablo_sel = dyn_cast<const Sel>(stmt)) {
119        print(pablo_sel, strm);
120        strm << " = (";
121        print(pablo_sel->getCondition(), strm);
122        strm << " ? ";
123        print(pablo_sel->getTrueExpr(), strm);
124        strm << " : ";
125        print(pablo_sel->getFalseExpr(), strm);
126        strm << ")";
127    }
128    else if (const Not * pablo_not = dyn_cast<const Not>(stmt)) {
129        print(pablo_not, strm);
130        strm << " = (~";
131        print(pablo_not->getExpr(), strm);
132        strm << ")";
133    }
134    else if (const Advance * adv = dyn_cast<const Advance>(stmt)) {
135        print(adv, strm);
136        strm << " = pablo.Advance(";
137        print(adv->getExpr(), strm);
138        strm << ", " << std::to_string(adv->getAdvanceAmount()) << ")";
139    }
140    else if (const MatchStar * mstar = dyn_cast<const MatchStar>(stmt)) {
141        print(mstar, strm);
142        strm << " = pablo.MatchStar(";
143        print(mstar->getMarker(), strm);
144        strm << ", ";
145        print(mstar->getCharClass(), strm);
146        strm << ")";
147    }
148    else if (const ScanThru * sthru = dyn_cast<const ScanThru>(stmt)) {
149        print(sthru, strm);
150        strm << " = pablo.ScanThru(";
151        print(sthru->getScanFrom(), strm);
152        strm << ", ";
153        print(sthru->getScanThru(), strm);
154        strm << ")";
155    }
156    else if (const Mod64Advance * adv = dyn_cast<const Mod64Advance>(stmt)) {
157        print(adv, strm);
158        strm << " = pablo.Mod64Advance(";
159        print(adv->getExpr(), strm);
160        strm << ", " << std::to_string(adv->getAdvanceAmount()) << ")";
161    }
162    else if (const Mod64MatchStar * mstar = dyn_cast<const Mod64MatchStar>(stmt)) {
163        print(mstar, strm);
164        strm << " = pablo.Mod64MatchStar(";
165        print(mstar->getMarker(), strm);
166        strm << ", ";
167        print(mstar->getCharClass(), strm);
168        strm << ")";
169    }
170    else if (const Mod64ScanThru * sthru = dyn_cast<const Mod64ScanThru>(stmt)) {
171        print(sthru, strm);
172        strm << " = pablo.Mod64ScanThru(";
173        print(sthru->getScanFrom(), strm);
174        strm << ", ";
175        print(sthru->getScanThru(), strm);
176        strm << ")";
177    }
178    else if (const Count * pablo_not = dyn_cast<const Count>(stmt)) {
179        print(pablo_not, strm);
180        strm << " = pablo.Count(";
181        print(pablo_not->getExpr(), strm);
182        strm << ")";
183    }
184    else {
185        strm << "???";
186    }
187}
188
189void PabloPrinter::print(const PabloAST * expr, llvm::raw_ostream & strm) {
190    if (expr == nullptr) {
191        strm << "<null-expr>";
192    } else if (isa<const Zeroes>(expr)) {
193        strm << "0";
194    } else if (isa<const Ones>(expr)) {
195        strm << "1";
196    } else if (const Var * var = dyn_cast<const Var>(expr)) {
197        assert (var->getName());
198        strm  << var->getName();
199    } else if (const Next * next = dyn_cast<const Next>(expr)) {
200        assert (next->getName());
201        strm << "Next(" << next->getName() << ")";
202    } else if (const If * ifstmt = dyn_cast<If>(expr)) {
203        strm << "if ";
204        print(ifstmt->getCondition(), strm);
205    } else if (const While * whl = dyn_cast<While>(expr)) {
206        strm << "while ";
207        print(whl->getCondition(), strm);
208    } else if (const Statement * stmt = dyn_cast<Statement>(expr)) {
209        assert (stmt->getName());
210        strm << stmt->getName();
211    } else if (isa<Integer>(expr)) {
212        strm << cast<Integer>(expr)->value();
213    } else {
214        strm << "???";
215    }
216}
217
218
Note: See TracBrowser for help on using the repository browser.