示例#1
0
文件: Inst.cpp 项目: hleclerc/Stela
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 << ")";
}
示例#2
0
/* 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;
  }

}
示例#3
0
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;
}
示例#4
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);
}
示例#5
0
/* 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;
  }
}
示例#6
0
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";
        }
    }
}
示例#7
0
void Instruction::write_to_stream( std::ostream &os ) const {
    os << "(" << get_display_id() << ") ";
    write_dot( os );
}
示例#8
0
文件: Inst.cpp 项目: hleclerc/Stela
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 );
    //        }
    //    }
}