![]() |
libsesstype
2.0.0
Library for Session Types programming.
|
00001 #ifndef SESSTYPE__PARAMETERISED__UTIL__PRINT_H__ 00002 #define SESSTYPE__PARAMETERISED__UTIL__PRINT_H__ 00003 00004 #ifdef __cplusplus 00005 #include <iostream> 00006 #include <string> 00007 #endif 00008 00009 #include "sesstype/parameterised/exprs.h" 00010 #include "sesstype/parameterised/nodes.h" 00011 00012 #include "sesstype/parameterised/role.h" 00013 #include "sesstype/parameterised/role_grp.h" 00014 00015 #include "sesstype/parameterised/util/node_visitor.h" 00016 #include "sesstype/parameterised/util/role_visitor.h" 00017 #include "sesstype/parameterised/util/expr_visitor.h" 00018 00019 #ifdef __cplusplus 00020 namespace sesstype { 00021 namespace parameterised { 00022 namespace util { 00023 #endif 00024 00025 #ifdef __cplusplus 00026 00029 class PrintVisitor : public NodeVisitor, public RoleVisitor, public ExprVisitor { 00030 std::ostream &os_; 00031 std::string indent_str_; 00032 unsigned int indent_lvl_; 00033 unsigned int line_count_; 00034 00035 public: 00037 PrintVisitor() : os_(std::cout), 00038 indent_str_(" "), 00039 indent_lvl_(0), 00040 line_count_(1) { } 00041 00044 PrintVisitor(std::ostream &os) : os_(os), 00045 indent_str_(" "), 00046 indent_lvl_(0), 00047 line_count_(1) { } 00048 00050 void prefix() 00051 { 00052 if (line_count_ == 1) { 00053 os_ << "Line\t |\tTree\n====================\n"; 00054 } 00055 os_ << line_count_++ << "\t "; 00056 if (indent_lvl_ > 0) { 00057 os_ << '|'; 00058 for (unsigned int i=0; i<indent_lvl_; i++) { 00059 os_ << indent_str_; 00060 } 00061 } 00062 } 00063 00064 void reset_line_num() 00065 { 00066 indent_lvl_ = 0; 00067 line_count_ = 1; 00068 } 00069 00070 void addr(Node *node) 00071 { 00072 os_ << " \033[2;33m" << node << "\033[0m"; 00073 } 00074 00075 void addr(Role *role) 00076 { 00077 os_ << "@\033[2;36m" << role << "\033[0m"; 00078 } 00079 00080 void addr(Expr *expr) 00081 { 00082 os_ << " @ \033[2;35m" << expr << "\033[0m"; 00083 } 00084 00085 virtual void visit(Node *node) 00086 { 00087 prefix(); 00088 os_ << "generic {}"; 00089 addr(node); 00090 os_ << "\n"; 00091 } 00092 00093 virtual void visit(InteractionNode *node) 00094 { 00095 prefix(); 00096 os_ << "interaction"; 00097 addr(node); 00098 os_ << " { from: "; 00099 if (node->sndr()) { 00100 node->sndr()->accept(*this); 00101 } else { 00102 os_ << "(empty)"; 00103 } 00104 os_ << ", to(" << node->num_rcvrs() << "): ["; 00105 if (node->num_rcvrs() > 0) { 00106 node->rcvr()->accept(*this); 00107 } else { 00108 os_ << "(empty)"; 00109 } 00110 os_ << (node->num_rcvrs()>1 ? ".. ]" : "]") 00111 << ", msg: " << node->msg()->label() 00112 << "(" << node->msg()->num_payloads() << ") " 00113 << ", cond: "; 00114 if (node->cond()) { 00115 node->cond()->accept(*this); 00116 } else { 00117 os_ << "(none)"; 00118 } 00119 os_ << " }\n"; 00120 } 00121 00122 virtual void visit(BlockNode *node) 00123 { 00124 if (node->num_children() > 0) { 00125 prefix(); 00126 os_ << "root"; 00127 addr(node); 00128 os_ <<" {\n"; 00129 indent_lvl_++; 00130 for (auto it=node->child_begin(); it!=node->child_end(); it++) { 00131 (*it)->accept(*this); 00132 } 00133 indent_lvl_--; 00134 prefix(); 00135 os_ << "}\n"; 00136 } 00137 } 00138 00139 virtual void visit(RecurNode *node) 00140 { 00141 prefix(); 00142 os_ << "recur"; 00143 addr(node); 00144 os_ <<" { label: " << node->label() << " }"; 00145 os_ << " children: " << node->num_children() << "\n"; 00146 00147 node->BlockNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>::accept(*this); 00148 } 00149 00150 virtual void visit(ContinueNode *node) 00151 { 00152 prefix(); 00153 os_ << "cont"; 00154 addr(node); 00155 os_ << " { label: " << node->label() << " }\n"; 00156 } 00157 00158 virtual void visit(ChoiceNode *node) 00159 { 00160 prefix(); 00161 os_ << "choice"; 00162 addr(node); 00163 os_ << " { at: "; 00164 node->at()->accept(*this); 00165 os_ << ", children: " << node->num_children() << "\n"; 00166 00167 node->BlockNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>::accept(*this); 00168 } 00169 00170 virtual void visit(ParNode *node) 00171 { 00172 prefix(); 00173 os_ << "par"; 00174 addr(node); 00175 os_ << " {}"; 00176 os_ << " parblocks:children: " << node->num_children() << "\n"; 00177 00178 node->BlockNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>::accept(*this); 00179 } 00180 00181 virtual void visit(NestedNode *node) 00182 { 00183 prefix(); 00184 os_ << "nested"; 00185 addr(node); 00186 os_ << " { name: " << node->name(); 00187 os_ << ", scope: " << node->scope(); 00188 os_ << ", arg("<< node->num_args() <<"): <"; 00189 for (auto it=node->arg_begin(); it!=node->arg_end(); it++) { 00190 if (it!=node->arg_begin()) { 00191 os_ << ", "; 00192 } 00193 os_ << (*it)->label() << "(" << (*it)->num_payloads() << ")"; 00194 } 00195 os_ << ">"; 00196 os_ << ", rolearg("<< node->num_roleargs() <<"): ["; 00197 for (auto it=node->rolearg_begin(); it!=node->rolearg_end(); it++) { 00198 if (it != node->rolearg_begin()) { 00199 os_ << ", "; 00200 } 00201 (*it)->accept(*this); 00202 } 00203 os_ << "]}\n"; 00204 } 00205 00206 virtual void visit(InterruptibleNode *node) 00207 { 00208 prefix(); 00209 os_ << "interruptible"; 00210 addr(node); 00211 os_ << " { scope: " << node->scope(); 00212 os_ << " interrupts(" << node->num_interrupts() << "): "; 00213 for (auto it=node->interrupt_begin(); it!=node->interrupt_end(); it++) { 00214 os_ << (*it).first->name() << "/" << (*it).second->label() << ", "; 00215 } 00216 os_ << ", catches(" << node->num_catches() << "): "; 00217 for (auto it=node->catch_begin(); it!=node->catch_end(); it++) { 00218 os_ << (*it).first->name() << "/" << (*it).second->label() << ", "; 00219 } 00220 os_ << ", throws(" << node->num_throws() << "): "; 00221 for (auto it=node->throw_begin(); it!=node->throw_end(); it++) { 00222 os_ << (*it).first->name() << "/" << (*it).second->label() << ", "; 00223 } 00224 os_ <<"}\n"; 00225 } 00226 00227 virtual void visit(ForNode *node) 00228 { 00229 prefix(); 00230 os_ << "for"; 00231 addr(node); 00232 os_ << " { expr: "; 00233 node->bindexpr()->accept(*this); 00234 os_ << " }\n"; 00235 00236 node->BlockNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>::accept(*this); 00237 } 00238 00239 virtual void visit(OneofNode *node) 00240 { 00241 prefix(); 00242 os_ << "oneof"; 00243 addr(node); 00244 os_ << " { range: "; 00245 node->range()->accept(*this); 00246 os_ << " , repeat? " << node->is_repeat(); 00247 os_ << " , unordered? " << node->is_unordered(); 00248 os_ << " }\n"; 00249 00250 node->BlockNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>::accept(*this); 00251 } 00252 00253 virtual void visit(IfNode *node) 00254 { 00255 prefix(); 00256 os_ << "if"; 00257 addr(node); 00258 os_ << " { cond: "; 00259 node->cond()->accept(*this); 00260 os_ << " }\n"; 00261 00262 node->BlockNodeTmpl<Node, Role, MsgSig, util::NodeVisitor>::accept(*this); 00263 } 00264 00265 virtual void visit(AllReduceNode *node) 00266 { 00267 prefix(); 00268 os_ << "allreduce"; 00269 addr(node); 00270 os_ << " { msg: " << node->msg()->label(); 00271 os_ << "(" << node->msg()->num_payloads() << ") }\n"; 00272 } 00273 00274 virtual void visit(Role *role) 00275 { 00276 os_ << role->name(); 00277 for (int i=0; i<role->num_dimens(); i++) { 00278 os_ << "["; 00279 (*role)[i]->accept(*this); 00280 os_ << "]"; 00281 } 00282 addr(role); 00283 } 00284 00285 virtual void visit(RoleGrp *role) 00286 { 00287 os_ << role->name(); 00288 os_ << "{ members#: " << role->num_members() << ", membs: "; 00289 for (auto it=role->member_begin(); it!=role->member_end(); it++) { 00290 (*it)->accept(*this); 00291 os_ << " "; 00292 } 00293 os_ << " }"; 00294 addr(role); 00295 } 00296 00297 virtual void visit(Expr *expr) 00298 { 00299 // Empty. 00300 } 00301 00302 virtual void visit(VarExpr *expr) 00303 { 00304 os_ << "var(" << expr->name() << ")"; 00305 addr(expr); 00306 } 00307 00308 virtual void visit(ValExpr *expr) 00309 { 00310 os_ << "val(" << expr->num() << ")"; 00311 addr(expr); 00312 } 00313 00314 virtual void visit(AddExpr *expr) 00315 { 00316 os_ << "+("; 00317 expr->lhs()->accept(*this); 00318 os_ << " , "; 00319 expr->rhs()->accept(*this); 00320 os_ << ")"; 00321 addr(expr); 00322 } 00323 00324 virtual void visit(SubExpr *expr) 00325 { 00326 os_ << "-("; 00327 expr->lhs()->accept(*this); 00328 os_ << " , "; 00329 expr->rhs()->accept(*this); 00330 os_ << ")"; 00331 addr(expr); 00332 } 00333 00334 virtual void visit(MulExpr *expr) 00335 { 00336 os_ << "*("; 00337 expr->lhs()->accept(*this); 00338 os_ << " , "; 00339 expr->rhs()->accept(*this); 00340 os_ << ")"; 00341 addr(expr); 00342 } 00343 00344 virtual void visit(DivExpr *expr) 00345 { 00346 os_ << "/("; 00347 expr->lhs()->accept(*this); 00348 os_ << " , "; 00349 expr->rhs()->accept(*this); 00350 os_ << ")"; 00351 addr(expr); 00352 } 00353 00354 virtual void visit(ModExpr *expr) 00355 { 00356 os_ << "%("; 00357 expr->lhs()->accept(*this); 00358 os_ << " , "; 00359 expr->rhs()->accept(*this); 00360 os_ << ")"; 00361 addr(expr); 00362 } 00363 00364 virtual void visit(ShlExpr *expr) 00365 { 00366 os_ << "<<("; 00367 expr->lhs()->accept(*this); 00368 os_ << " , "; 00369 expr->rhs()->accept(*this); 00370 os_ << ")"; 00371 addr(expr); 00372 } 00373 00374 virtual void visit(ShrExpr *expr) 00375 { 00376 os_ << ">>("; 00377 expr->lhs()->accept(*this); 00378 os_ << " , "; 00379 expr->rhs()->accept(*this); 00380 os_ << ")"; 00381 addr(expr); 00382 } 00383 00384 virtual void visit(SeqExpr *expr) 00385 { 00386 os_ << "seq: "; 00387 for (unsigned int i=0; i<expr->num_values(); i++) { 00388 if (i != 0) os_ << ","; 00389 os_ << expr->value(i); 00390 } 00391 addr(expr); 00392 } 00393 00394 virtual void visit(RngExpr *expr) 00395 { 00396 os_ << "rng(" << expr->bindvar() << ","; 00397 expr->from()->accept(*this); 00398 os_ << ","; 00399 expr->to()->accept(*this); 00400 os_ << ")"; 00401 addr(expr); 00402 } 00403 00404 virtual void visit(LogExpr *expr) 00405 { 00406 os_ << "log("; 00407 expr->value()->accept(*this); 00408 os_ << ", "; 00409 expr->base()->accept(*this); 00410 os_ << ")"; 00411 addr(expr); 00412 } 00413 }; 00414 #endif // __cplusplus 00415 00416 #ifdef __cplusplus 00417 } // namespace util 00418 } // namespace parameterised 00419 } // namespace sesstype 00420 #endif 00421 00422 #endif//SESSTYPE__PARAMETERISED__UTIL__PRINT_H__