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

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

Use llvm:raw_ostream in Pablo printer

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