Ignore:
Timestamp:
Nov 6, 2016, 8:37:11 PM (3 years ago)
Author:
nmedfort
Message:

Initial work on adding types to PabloAST and mutable Var objects.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/pablo/printer_pablos.cpp

    r5156 r5202  
    1212using namespace pablo;
    1313
     14using TypeId = PabloAST::ClassTypeId;
     15
    1416const unsigned BlockIndenting = 2;
    1517
    16 void PabloPrinter::print(const pablo::PabloFunction & function, llvm::raw_ostream & out) {
     18void PabloPrinter::print(const PabloFunction & function, llvm::raw_ostream & out) {
    1719    print(function.getEntryBlock(), out, true);
    18 }
    19 
    20 inline void print_vars(const pablo::If::DefinedVars & vars, llvm::raw_ostream & out, const unsigned indent) {
    21     for (const Assign * def : vars) {
    22         out.indent(indent);
    23         out << def->getName() << " = 0\n";
    24     }
    2520}
    2621
     
    2924    if (stmt == nullptr) {
    3025        out << "<null-stmt>";
    31     } else if (const Assign * an = dyn_cast<const Assign>(stmt)) {
    32         out << an->getName() << " = ";
    33         print(an->getExpression(), out);
    34     } else if (const Next * next = dyn_cast<const Next>(stmt)) {
    35         out << "Next(" << next->getName() << ") = ";
    36         print(next->getExpr(), out);
    37     } else if (const If * ifNode = dyn_cast<const If>(stmt)) {
     26    } else if (const Assign * assign = dyn_cast<Assign>(stmt)) {
     27        print(assign->getVariable(), out);
     28        out << " = ";
     29        print(assign->getValue(), out);
     30    } else if (const If * ifNode = dyn_cast<If>(stmt)) {
    3831        out << "If ";
    3932        print(ifNode->getCondition(), out);
     
    4134            out << ":\n";
    4235            print(ifNode->getBody(), out, true, indent + BlockIndenting);
    43             if (ifNode->getDefined().size() > 0) {
    44                 out.indent(indent);
    45                 out << "Else:\n";
    46                 print_vars(ifNode->getDefined(), out, indent + BlockIndenting);
    47             }
    4836        }
    49     } else if (const While * whileNode = dyn_cast<const While>(stmt)) {
     37    } else if (const While * whileNode = dyn_cast<While>(stmt)) {
    5038        out << "While ";
    5139        print(whileNode->getCondition(), out);
     
    5442            print(whileNode->getBody(), out, true, indent + BlockIndenting);
    5543        }
    56     } else if (const Call * call = dyn_cast<const Call>(stmt)) {
    57         if (call->getPrototype()->getNumOfResults() > 0) {
    58             out << " = ";
     44    } else {
     45        print(cast<PabloAST>(stmt), out);
     46
     47        if (const Extract * extract = dyn_cast<Extract>(stmt)) {
     48            out << " = Extract ";
     49            print(extract->getArray(), out);
     50            out << ", ";
     51            print(extract->getIndex(), out);
     52        } else if (const And * andNode = dyn_cast<And>(stmt)) {
     53            out << " = (";
     54            for (unsigned i = 0; i != andNode->getNumOperands(); ++i) {
     55                if (i) out << " & ";
     56                print(andNode->getOperand(i), out);
     57            }
     58            out << ")";
     59        } else if (const Or * orNode = dyn_cast<Or>(stmt)) {
     60            out << " = (";
     61            for (unsigned i = 0; i != orNode->getNumOperands(); ++i) {
     62                if (i) out << " | ";
     63                print(orNode->getOperand(i), out);
     64            }
     65            out << ")";
     66        } else if (const Xor * xorNode = dyn_cast<Xor>(stmt)) {
     67            out << " = (";
     68            for (unsigned i = 0; i != xorNode->getNumOperands(); ++i) {
     69                if (i) out << " ^ ";
     70                print(xorNode->getOperand(i), out);
     71            }
     72            out << ")";
     73        } else if (const Sel * selNode = dyn_cast<Sel>(stmt)) {
     74            out << " = (";
     75            print(selNode->getCondition(), out);
     76            out << " ? ";
     77            print(selNode->getTrueExpr(), out);
     78            out << " : ";
     79            print(selNode->getFalseExpr(), out);
     80            out << ")";
     81        } else if (const Not * notNode = dyn_cast<Not>(stmt)) {
     82            out << " = (~";
     83            print(notNode->getExpr(), out);
     84            out << ")";
     85        } else if (const Advance * adv = dyn_cast<Advance>(stmt)) {
     86            out << " = pablo.Advance(";
     87            print(adv->getExpr(), out);
     88            out << ", " << std::to_string(adv->getAmount()) << ")";
     89        } else if (const Lookahead * adv = dyn_cast<Lookahead>(stmt)) {
     90            out << " = pablo.Lookahead(";
     91            print(adv->getExpr(), out);
     92            out << ", " << std::to_string(adv->getAmount()) << ")";
     93        } else if (const MatchStar * mstar = dyn_cast<MatchStar>(stmt)) {
     94            out << " = pablo.MatchStar(";
     95            print(mstar->getMarker(), out);
     96            out << ", ";
     97            print(mstar->getCharClass(), out);
     98            out << ")";
     99        } else if (const ScanThru * sthru = dyn_cast<ScanThru>(stmt)) {
     100            out << " = pablo.ScanThru(";
     101            print(sthru->getScanFrom(), out);
     102            out << ", ";
     103            print(sthru->getScanThru(), out);
     104            out << ")";
     105        } else if (const Count * count = dyn_cast<Count>(stmt)) {
     106            out << " = pablo.Count(";
     107            print(count->getExpr(), out);
     108            out << ")";
     109        } else if (const InFile * e = dyn_cast<InFile>(stmt)) {
     110            out << " = pablo.InFile(";
     111            print(e->getExpr(), out);
     112            out << ")";
     113        } else if (const AtEOF * e = dyn_cast<AtEOF>(stmt)) {
     114            out << " = pablo.AtEOF(";
     115            print(e->getExpr(), out);
     116            out << ")";
     117        } else {
     118            out << "???";
    59119        }
    60         out << call->getCallee() << "(";
    61         for (unsigned i = 0; i != call->getNumOperands(); ++i) {
    62             print(call->getOperand(i), out);
    63         }
    64         out << ")";
    65     } else if (const And * andNode = dyn_cast<const And>(stmt)) {
    66         out << andNode->getName() << " = (";
    67         for (unsigned i = 0; i != andNode->getNumOperands(); ++i) {
    68             if (i) out << " & ";
    69             print(andNode->getOperand(i), out);
    70         }
    71         out << ")";
    72     } else if (const Or * orNode = dyn_cast<const Or>(stmt)) {
    73         out << orNode->getName() << " = (";
    74         for (unsigned i = 0; i != orNode->getNumOperands(); ++i) {
    75             if (i) out << " | ";
    76             print(orNode->getOperand(i), out);
    77         }
    78         out << ")";
    79     } else if (const Xor * xorNode = dyn_cast<const Xor>(stmt)) {
    80         out << xorNode->getName() << " = (";
    81         for (unsigned i = 0; i != xorNode->getNumOperands(); ++i) {
    82             if (i) out << " ^ ";
    83             print(xorNode->getOperand(i), out);
    84         }
    85         out << ")";
    86     } else if (const Sel * selNode = dyn_cast<const Sel>(stmt)) {
    87         out << selNode->getName() << " = (";
    88         print(selNode->getCondition(), out);
    89         out << " ? ";
    90         print(selNode->getTrueExpr(), out);
    91         out << " : ";
    92         print(selNode->getFalseExpr(), out);
    93         out << ")";
    94     } else if (const Not * notNode = dyn_cast<const Not>(stmt)) {
    95         out << notNode->getName() << " = (~";
    96         print(notNode->getExpr(), out);
    97         out << ")";
    98     } else if (const Advance * adv = dyn_cast<const Advance>(stmt)) {
    99         out << adv->getName() << " = pablo.Advance(";
    100         print(adv->getExpr(), out);
    101         out << ", " << std::to_string(adv->getAmount()) << ")";
    102     } else if (const Lookahead * adv = dyn_cast<const Lookahead>(stmt)) {
    103         out << adv->getName() << " = pablo.Lookahead(";
    104         print(adv->getExpr(), out);
    105         out << ", " << std::to_string(adv->getAmount()) << ")";
    106     } else if (const MatchStar * mstar = dyn_cast<const MatchStar>(stmt)) {
    107         out << mstar->getName() << " = pablo.MatchStar(";
    108         print(mstar->getMarker(), out);
    109         out << ", ";
    110         print(mstar->getCharClass(), out);
    111         out << ")";
    112     } else if (const ScanThru * sthru = dyn_cast<const ScanThru>(stmt)) {
    113         out << sthru->getName() << " = pablo.ScanThru(";
    114         print(sthru->getScanFrom(), out);
    115         out << ", ";
    116         print(sthru->getScanThru(), out);
    117         out << ")";
    118     } else if (const Count * count = dyn_cast<const Count>(stmt)) {
    119         out << count->getName() << " = pablo.Count(";
    120         print(count->getExpr(), out);
    121         out << ")";
    122     } else if (const InFile * e = dyn_cast<const InFile>(stmt)) {
    123         out << e->getName() << " = pablo.InFile(";
    124         print(e->getExpr(), out);
    125         out << ")";
    126     } else if (const AtEOF * e = dyn_cast<const AtEOF>(stmt)) {
    127         out << e->getName() << " = pablo.AtEOF(";
    128         print(e->getExpr(), out);
    129         out << ")";
    130     } else {
    131         out << "???";
    132120    }
    133121}
     
    136124    if (expr == nullptr) {
    137125        out << "<null-expr>";
    138     } else if (isa<const Zeroes>(expr)) {
     126    } else if (isa<Zeroes>(expr)) {
    139127        out << "0";
    140     } else if (isa<const Ones>(expr)) {
     128    } else if (isa<Ones>(expr)) {
    141129        out << "1";
    142     } else if (const Var * var = dyn_cast<const Var>(expr)) {
    143         out  << var->getName();
    144     } else if (const Next * next = dyn_cast<const Next>(expr)) {
    145         out << "Next(" << next->getName() << ")";
     130    } else if (const Var * var = dyn_cast<Var>(expr)) {
     131        out << var->getName();
    146132    } else if (const If * ifstmt = dyn_cast<If>(expr)) {
    147133        out << "If ";
     
    150136        out << "While ";
    151137        print(whl->getCondition(), out);
     138    } else if (const Assign * assign = dyn_cast<Assign>(expr)) {
     139        print(assign->getVariable(), out);
     140        out << " = ";
     141        print(assign->getValue(), out);
    152142    } else if (const Statement * stmt = dyn_cast<Statement>(expr)) {
    153143        out << stmt->getName();
     
    166156    for (const Statement * stmt : *block) {
    167157        print(stmt, strm, expandNested, indent);
    168         strm << "\n";
     158        if (LLVM_LIKELY(!isa<Branch>(stmt) || !expandNested)) {
     159            strm << "\n";
     160        }
    169161    }
    170162}
Note: See TracChangeset for help on using the changeset viewer.