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

Last change on this file since 4359 was 4359, checked in by cameron, 5 years ago

Sel -> Xor optimization; implement Pablo Xor in printer, compiler

File size: 5.0 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    }
54}
55
56void PabloPrinter::print(const Statement * stmt, std::string indent, std::ostream & strm) {
57    if (stmt == nullptr) {
58        strm << "<null-stmt>" << std::endl;
59    }
60    else if (const Assign * an = dyn_cast<const Assign>(stmt)) {
61        strm << indent;
62        if (an->isOutputAssignment()) {
63            strm << "Output[" << std::to_string(an->getOutputIndex()) << "].";
64        }
65        strm << an->getName()->str() << " = ";
66        print(an->getExpr(), strm);
67        strm << std::endl;
68    }
69    else if (const Next * next = dyn_cast<const Next>(stmt)) {
70        strm << indent << "Next(" << next->getName()->str() << ") = "; 
71        print(next->getExpr(), strm);
72        strm << std::endl;
73    }
74    else if (const If * ifstmt = dyn_cast<const If>(stmt)) {
75        strm << indent << "if ";
76        print(ifstmt->getCondition(), strm);
77        strm << ":\n";
78        print(ifstmt->getBody(), indent + "  ", strm);
79    }
80    else if (const While * whl = dyn_cast<const While>(stmt)) {
81        strm << indent << "while";
82        print(whl->getCondition(), strm);
83        strm << ":\n";
84        print(whl->getBody(), indent + "  ", strm);
85    }
86    else {
87        strm << indent << "**UNKNOWN Pablo Statement type **" << std::endl;
88    }
89}
90
91void PabloPrinter::print(const PabloAST *expr, std::ostream & strm) {
92    if (expr == nullptr) {
93        strm << "<null-expr>";
94    }
95    else if (isa<const Zeroes>(expr)) {
96        strm << "0";
97    }
98    else if (isa<const Ones>(expr)) {
99        strm << "1";
100    }
101    else if (const Call * pablo_call = dyn_cast<const Call>(expr)) {
102        strm << pablo_call->getCallee()->str() << "()";
103    }
104    else if (const Var * pablo_var = dyn_cast<const Var>(expr)) {
105        strm << pablo_var->getName()->str();
106    }
107    else if (const And * pablo_and = dyn_cast<const And>(expr)) {
108        strm << "(";
109        print(pablo_and->getExpr1(), strm);
110        strm << " & "; 
111        print(pablo_and->getExpr2(), strm);
112        strm << ")";
113    }
114    else if (const Or * pablo_or = dyn_cast<const Or>(expr)) {
115        strm << "(";
116        print(pablo_or->getExpr1(), strm);
117        strm << " | "; 
118        print(pablo_or->getExpr2(), strm);
119        strm << ")";
120    }
121    else if (const Xor * pablo_xor = dyn_cast<const Xor>(expr)) {
122        strm << "(";
123        print(pablo_xor->getExpr1(), strm);
124        strm << " ^ "; 
125        print(pablo_xor->getExpr2(), strm);
126        strm << ")";
127    }
128    else if (const Sel * pablo_sel = dyn_cast<const Sel>(expr)) {
129        strm << "(";
130        print(pablo_sel->getCondition(), strm);
131        strm << " ? ";
132        print(pablo_sel->getTrueExpr(), strm);
133        strm << " : ";
134        print(pablo_sel->getFalseExpr(), strm);
135        strm << ")";
136    }
137    else if (const Not * pablo_not = dyn_cast<const Not>(expr)) {
138        strm << "(~";
139        print(pablo_not->getExpr(), strm);
140        strm << ")";
141    }
142    else if (const Advance * adv = dyn_cast<const Advance>(expr)) {
143        strm << "pablo.Advance(";
144        print(adv->getExpr(), strm);
145        strm << ", " << std::to_string(adv->getAdvanceAmount()) << ")";
146    }
147    else if (const MatchStar * mstar = dyn_cast<const MatchStar>(expr)) {
148        strm << "pablo.MatchStar(";
149        print(mstar->getMarker(), strm);
150        strm << ", ";
151        print(mstar->getCharClass(), strm);
152        strm << ")";
153    }
154    else if (const ScanThru * sthru = dyn_cast<const ScanThru>(expr)) {
155        strm << "pablo.ScanThru(";
156        print(sthru->getScanFrom(), strm);
157        strm << ", ";
158        print(sthru->getScanThru(), strm);
159        strm << ")";
160    }
161    else if (isa<Statement>(expr)) {
162        print(cast<Statement>(expr), strm);
163    }
164    else {
165        strm << "**UNKNOWN Pablo Expression type **\n" << std::endl;
166    }
167}
168
169
Note: See TracBrowser for help on using the repository browser.