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

Last change on this file since 4529 was 4518, checked in by cameron, 4 years ago

Modify -print-pablo output for python pablo compiler

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