void Inst::write_to_stream( Stream &os ) const { write_dot( os ); os << "("; for( int i = 0; i < inp_size(); ++i ) { if ( i ) os << ","; os << inp_expr( i ); } os << ")"; }
/* void print7_alpha() * @param1 letter - a one byte char to be displayed * displays on a 7 segment led the given letter */ void write7_alpha(char letter) { // start at pin number 2 byte pin = 2; // mod by 65 to give me the placement in the array byte digit = (byte)letter % 65; // ternary operator - if it is Q/V/X/R turn the dot on (letter == 'Q' || letter == 'V' || letter == 'X' || letter == 'R' ) ? write_dot(1) : write_dot(0); // iterate through each of the alpha segments to instantly print the value for (byte segCount = 0; segCount < 7; ++segCount) { digitalWrite(pin, sevent_seg_alpha[digit][segCount]); ++pin; } }
int main(int argc, char *argv[]) { int do_insert = 0; int from = -1, to = -1; expensive_checking = True; // we always want this here const char *file = NULL; for (int i=1; argv[i]; ++i) { if (strcmp(argv[i], "-v") == 0) { verbose = 1; } else if (strcmp(argv[i], "-n") == 0) { // no post processing nopost = 1; } else if (strcmp(argv[i], "--no-post") == 0) { // no post processing nopost = 1; } else if (strcmp(argv[i], "--no-rot") == 0) { // no rotate norotate = 1; } else if (strcmp(argv[i], "-i") == 0) { ++i; assert(argv[i]); do_insert = 1; int n = sscanf(argv[i], "%d:%d", &from, &to); assert(n == 2); } else { assert(file == NULL); file = argv[i]; } } assert(file); NSegment *tree = read_file(file); check_tree(tree); // Write out the tree prior to inserting something // write_dot(tree, NULL, NULL, file); /* insert a segment */ if (do_insert) { NSegment *subtree = locate_subtree_containing(root_segment(), from, to); NSegment *inserted = insert_node(from, to); check_tree(root_segment()); char buf[strlen(file) + 40]; // large enough sprintf(buf, "%s-i%d:%d", file, from, to); write_dot(root_segment(), subtree, inserted, buf); } return 0; }
/* draw the heap (binary tree) */ void heap2fig(int * A, int Asize, int heapsize, char * label_fmt, ...) { va_list args; va_start(args, label_fmt); char label[DOT_LABEL_STR_LEN]; vsnprintf(label, DOT_LABEL_STR_LEN, label_fmt, args); const char prefix[] = "heap/heap illustration"; /* const char HEAP_ATTR[] = ", style=\"filled\", fillcolor=\"green\""; */ const char HEAP_ATTR[] = ""; const char SORTED_ATTR[] = ", style=\"filled\", fillcolor=\"gray90\""; const char L_ATTR[] = "color=\"gray75\""; const char R_ATTR[] = "color=\"gray75\""; static int id = 0; char all_elements[MAX_NUM_NR * MAX_NUM_WIDTH]; char * p = all_elements; for (int i = 0; i < Asize; i++) { p += snprintf(p, MAX_NUM_NR * MAX_NUM_WIDTH, "%s%d%s", i == 0 ? "[" : ", ", A[i], i == Asize - 1 ? "]" : ""); } write_dot(prefix, id, "label = \"heap\\n%s\\n%s\";\n", all_elements, label); for (int i = 0; i < Asize; i++) { double x; double y; calc_coor(i, &x, &y); write_dot(prefix, id, "\"%X\" [label=\"%d\"%s, pos=\"%.5f,%.5f!\"];\n", &A[i], A[i], i < heapsize ? HEAP_ATTR : SORTED_ATTR, x, y); write_dot(prefix, id, "\"%Xidx\" [shape=\"none\", label=\"%d\"" ", fontcolor=\"gold\", pos=\"%.5f,%.5f!\"];\n", &A[i], i, x, y+0.4); if (LEFT(i) < heapsize) write_dot(prefix, id, "\"%X\" -- \"%X\" [%s];\n", (unsigned int)&A[i], (unsigned int)&A[LEFT(i)], L_ATTR); if (RIGHT(i) < heapsize) write_dot(prefix, id, "\"%X\" -- \"%X\" [%s];\n", (unsigned int)&A[i], (unsigned int)&A[RIGHT(i)], R_ATTR); } write_dot(prefix, id, ""); id++; va_end(args); }
/* void print7_digital() * @param1 number - what integer do you want to display? * displays on a 7 segment led the number */ void write7_digit(int number) { // turn off dot write_dot(0); // start pin byte pin = 2; // convert number into a byte byte digit = (byte)number; // iterate through the array to build the segment for (byte segCount = 0; segCount < 7; ++segCount) { digitalWrite(pin, seven_seg_digits[digit][segCount]); ++pin; } }
void Instruction::write_dot_rec( std::ostream &os, bool disp_inst_pred, bool disp_trans_freq, bool disp_rc_item, bool rec ) const { if ( op_id == cur_op_id ) return; op_id = cur_op_id; os << " node_" << this << " [label=\""; std::ostringstream ss; if ( display_id ) ss << "(" << display_id << ") "; if ( orig && orig->display_id ) ss << "(orig=" << orig->display_id << ") "; if ( disp_rc_item ) { ss << "["; for( unsigned i = 0; i < cx.pos.size(); ++i ) ss << ( i ? "," : "" ) << cx.pos[ i ]->compact_repr(); ss << "]"; if ( cx.flags ) { ss << "("; if ( cx.flags & cx.FL_BEG ) ss << "B"; if ( cx.flags & cx.FL_EOF ) ss << "O"; if ( cx.flags & cx.FL_NOT_EOF ) ss << "N"; if ( cx.flags & cx.FL_OK ) ss << "K"; ss << ")"; } ss << " "; } std::vector<std::string> edge_labels; write_dot( ss, &edge_labels ); if ( disp_rc_item ) { if ( mark ) ss << "\n[" << cx.paths_to_mark << "]"; for( const auto &p : cx.paths_to_strings ) ss << "\n" << p.first << ":[" << p.second << "]"; for( const std::string &str : running_strs ) ss << "\n" << str; // if ( cx.paths_to_strings.empty() ) { // } else { // for( const auto &p : cx.paths_to_strings ) // ss << "\n" << p.first << ":[" << p.second << "]"; // for( const std::string &str : running_strs ) // ss << "\n" << str; // } } else { for( const std::string &str : running_strs ) ss << "\n" << str; } dot_out( os, ss.str() ); os << "\""; if ( in_a_cycle ) os << ",style=dotted"; if ( mark ) os << ",color=green"; os << "];\n"; write_dot_add( os, disp_inst_pred, disp_trans_freq, disp_rc_item ); if ( orig ) { for( unsigned nr = 0; nr < next_rw.size(); ++nr ) { for( unsigned nt = 0; nt < next_rw[ nr ].size(); ++nt) { const Transition &t = next_rw[ nr ][ nt ]; if ( ! t.inst ) continue; if ( rec ) t.inst->write_dot_rec( os, disp_inst_pred, disp_trans_freq, disp_rc_item, rec ); std::ostringstream label; int cpt = 0; if ( disp_rc_item ) label << ( cpt++ ? "\n" : "" ) << t.rcitem; if ( disp_trans_freq and t.freq >= 0 ) label << ( cpt++ ? "\n" : "" ) << "f=" << t.freq; if ( nr < edge_labels.size() ) label << ( cpt++ ? "\n" : "" ) << edge_labels[ nr ]; dot_out( os << " node_" << this << " -> node_" << t.inst << " [label=\"", label.str() ) << "\""; // switch ( nt ) { // case 0: break; // case 1: os << ",style=dashed"; break; // default: os << ",style=dotted"; break; // } if ( nr and dynamic_cast<const InstructionNextChar *>( this ) ) os << ",color=lightgray"; os << "];\n"; } } } else { for( unsigned nt = 0; nt < next.size(); ++nt) { const Transition &t = next[ nt ]; if ( ! t.inst ) continue; if ( rec ) t.inst->write_dot_rec( os, disp_inst_pred, disp_trans_freq, disp_rc_item, rec ); std::ostringstream label; int cpt = 0; if ( disp_rc_item ) label << ( cpt++ ? "\n" : "" ) << t.rcitem; if ( disp_trans_freq and t.freq >= 0 ) label << ( cpt++ ? "\n" : "" ) << "f=" << t.freq; if ( nt < edge_labels.size() ) label << ( cpt++ ? "\n" : "" ) << edge_labels[ nt ]; dot_out( os << " node_" << this << " -> node_" << t.inst << " [label=\"", label.str() ) << "\""; // switch ( nt ) { // case 0: break; // case 1: os << ",style=dashed"; break; // default: os << ",style=dotted"; break; // } if ( nt and dynamic_cast<const InstructionNextChar *>( this ) ) os << ",color=lightgray"; os << "];\n"; } } if ( disp_inst_pred ) { for( const Transition &t : prev ) { if ( ! t.inst ) continue; std::ostringstream label; int cpt = 0; // if ( t.inst->type == Instruction::COND ) { // if ( t.eof ) // label << ( cpt++ ? "\n" : "" ) << "EOF"; // if ( not t.cond.never_checked() or t.eof == false ) // label << ( cpt++ ? "\n" : "" ) << t.cond; // } if ( disp_rc_item ) label << ( cpt++ ? "\n" : "" ) << t.rcitem; t.inst->write_dot_rec( os, disp_inst_pred, disp_trans_freq, disp_rc_item, rec ); dot_out( os << " node_" << t.inst << " -> node_" << this << " [label=\"", label.str() ) << "\",color=blue];\n"; } } }
void Instruction::write_to_stream( std::ostream &os ) const { os << "(" << get_display_id() << ") "; write_dot( os ); }
void Inst::write_graph_rec( Vec<const Inst *> &ext_buf, Stream &os ) const { if ( op_id_vis == cur_op_id ) return; op_id_vis = cur_op_id; // label std::ostringstream ss; write_dot( ss ); // node std::string ls = ss.str(); os << " node" << this << " [label=\""; for( unsigned i = 0; i < ls.size(); ++i ) { switch ( ls[ i ] ) { case '<': case '>': case '\\': os << '\\'; } os << ls[ i ]; } if ( full_dot ) { if ( out_size() > 1 ) for( int i = 0; i < out_size(); ++i ) os << "|<f" << i << ">o"; if ( inp_size() > 1 ) for( int i = 0; i < inp_size(); ++i ) os << "|<f" << out_size() + i << ">i"; } os << "\"];\n"; // children for( int i = 0, n = inp_size(); i < n; ++i ) { const Expr &ch = inp_expr( i ); if ( full_dot ) { os << " node" << this; if ( inp_size() > 1 ) os << ":f" << out_size() + i; os << " -> node" << ch.inst.ptr(); if ( ch.inst->out_size() > 1 ) os << ":f" << ch.nout; os << ";\n"; } else os << " node" << this << " -> node" << ch.inst.ptr() << ";\n"; if ( ch.inst ) ch.inst->write_graph_rec( ext_buf, os ); } // ext for( int i = 0, n = ext_size_disp(); i < n; ++i ) if ( const Inst *ch = ext_inst( i ) ) ext_buf << ch; // parents // for( int nout = 0; nout < out_size(); ++nout ) { // VPar &p = parents( nout ); // for( int i = 0; i < p.size(); ++i ) { // os << " node" << p[ i ] << " -> node" << this << ":f" << nout << " [color=\"red\"];\n"; // // parents[ i ]->write_graph_rec( ext_buf, os ); // } // } }