void _write_char(t_console_desc *console_desc,char data) { unsigned int to_end_line; unsigned int i; SPINLOCK_LOCK(console_desc->spinlock); if (data=='\n') { to_end_line=SCREEN_WIDTH -1 - (console_desc->out_buf_index % SCREEN_WIDTH); for (i=0;i<to_end_line;i++) write_out_buf(console_desc,'\0'); } else write_out_buf(console_desc,data); SPINLOCK_UNLOCK(console_desc->spinlock); }
void _write_char_no_irq(t_console_desc *console_desc,char data) { unsigned int to_end_line; unsigned int i; SAVE_IF_STATUS CLI if (data=='\n') { to_end_line=SCREEN_WIDTH -1 - (console_desc->out_buf_index % SCREEN_WIDTH); for (i=0;i<to_end_line;i++) write_out_buf(console_desc,'\0'); } else write_out_buf(console_desc,data); RESTORE_IF_STATUS }
static void edge_push(struct Simulator *sim, struct Edge *e, int val) { //printf("Pushing value %d to edge %d\r\n", val, e->id); if (e->output->type == 'O') { write_out_buf(sim, val); } else { if ((e->fifo_t + 1) % EDGE_FIFO_SIZE == e->fifo_h) { error("edge FIFO is full!"); } e->fifo[e->fifo_t] = val; e->fifo_t = (e->fifo_t + 1) % EDGE_FIFO_SIZE; } }
void TrafficManager::_Step( ) { Flit *f; Credit *cred; // Inject traffic if ( _voqing ) { _VOQInject( ); } else { _ClassInject( ); } // Advance network _net->ReadInputs( ); _partial_internal_cycles += _internal_speedup; while ( _partial_internal_cycles >= 1.0 ) { _net->InternalStep( ); _partial_internal_cycles -= 1.0; } _net->WriteOutputs( ); ++_time; // Eject traffic and send credits Flit *last_valid_flit; //= new Flit; for ( int output = 0; output < _dests; ++output ) { f = _net->ReadFlit( output ); if ( f ) { if (1 || f->tail) { write_out_buf(output, f); // it should have space! if ( f->watch ) { cout << "Sent flit " << f->id << " to output buffer " << output << endl; cout << " Not sending the credit yet! " <<endl; } } else { if ( f->watch ) { cout << "ejected flit " << f->id << " at output " << output << endl; cout << "sending credit for " << f->vc << endl; } if ( _reorder ) { if ( f->watch ) { cout << "adding flit " << f->id << " to reorder buffer" << endl; cout << "flit's SN is " << f->sn << " buffer's SN is " << _rob_sqn[f->src][f->dest] << endl; } if ( f->sn > _rob_sqn_max[f->src][f->dest] ) { _rob_sqn_max[f->src][f->dest] = f->sn; } if ( f->head ) { _rob_size->AddSample( f->sn - _rob_sqn[f->src][f->dest] ); } f->rob_time = _time; _rob[f->src][output].push( f ); } else { _RetireFlit( f, output ); if ( !_empty_network ) { _accepted_packets[output]->AddSample( 1 ); } } } } transfer2boundary_buf( output ); if (!credit_return_queue[output].empty()) { last_valid_flit = credit_return_queue[output].front(); credit_return_queue[output].pop(); } else { last_valid_flit=NULL; } if (last_valid_flit) { cred = new Credit( 1 ); cred->vc[0] =last_valid_flit->vc; cred->vc_cnt = 1; cred->head = last_valid_flit->head; cred->tail =last_valid_flit->tail; _net->WriteCredit( cred, output ); if (last_valid_flit->watch) { cout <<"WE WROTE A CREDIT for flit "<<last_valid_flit->id<<"To output "<<output<< endl; } _RetireFlit(last_valid_flit, output ); if ( !_empty_network ) { _accepted_packets[output]->AddSample( 1 ); } } else { _net->WriteCredit( 0, output ); if ( !_reorder && !_empty_network) { _accepted_packets[output]->AddSample( 0 ); } } if ( _reorder ) { f = _ReadROB( output ); if ( f ) { if ( f->watch ) { cout << "flit " << f->id << " removed from ROB at output " << output << endl; } _RetireFlit( f, output ); if ( !_empty_network ) { _accepted_packets[output]->AddSample( 1 ); } } else { if ( !_empty_network ) { _accepted_packets[output]->AddSample( 0 ); } } } } }