void SeparableInputFirstAllocator::Allocate() {
  
  _ClearMatching() ;
  
  //  cout << "SeparableInputFirstAllocator::Allocate()" << endl ;
  //  PrintRequests() ;
  
  // Execute the input arbiters and propagate the grants to the
  // output arbiters.
  for(set<int>::iterator i = in_event.begin(); i!=in_event.end(); i++){
    int input = *i;
    int id;
    int pri;
    int out =_input_arb[input]->Arbitrate( &id, &pri );
    const sRequest& req = (_requests[input][id]); 
    assert(out == req.port && pri == req.in_pri);
    _output_arb[out]->AddRequest( input, req.label, req.out_pri );
    out_event.insert(out);
  }


  // Execute the output arbiters.
  for(set<int>::iterator i = out_event.begin(); i!=out_event.end(); i++){

    int label, pri ;
    int output = *i;
    int  input = _output_arb[output]->Arbitrate( &label, &pri ) ;
    assert( _inmatch[input] == -1 && _outmatch[output] == -1 ) ;
    _inmatch[input]   = output ;
    _outmatch[output] = input ;
    _input_arb[input]->UpdateState() ;
    _output_arb[output]->UpdateState() ;

  }
  in_event.clear();
  out_event.clear();
}
Example #2
0
void iSLIP_Sparse::Allocate( )
{
  int input;
  int output;

  int input_offset;
  int output_offset;

  list<sRequest>::iterator p;
  bool wrapped;

  _ClearMatching( );

  for ( int iter = 0; iter < _iSLIP_iter; ++iter ) {
    // Grant phase

    for ( output = 0; output < _outputs; ++output ) {
      _grants[output] = -1;

      // Skip loop if there are no requests
      // or the output is already matched
      if ( ( _out_req[output].empty( ) ) ||
	   ( _outmatch[output] != -1 ) ) {
	continue;
      }

      // A round-robin arbiter between input requests
      input_offset = _gptrs[output];

      p = _out_req[output].begin( );
      while( ( p != _out_req[output].end( ) ) &&
	     ( p->port < input_offset ) ) {
	p++;
      }

      wrapped = false;
      while( (!wrapped) || ( p->port < input_offset ) ) {
	if ( p == _out_req[output].end( ) ) {
	  if ( wrapped ) { break; }
	  // p is valid here because empty lists
	  // are skipped (above)
	  p = _out_req[output].begin( );
	  wrapped = true;
	}

	input = p->port;

	// we know the output is free (above) and
	// if the input is free, grant request
	if ( _inmatch[input] == -1 ) {
	  _grants[output] = input;
	  break;
	}

	p++;
      }      
    }

#ifdef DEBUG_ISLIP
    cout << "grants: ";
    for ( int i = 0; i < _outputs; ++i ) {
      cout << _grants[i] << " ";
    }
    cout << endl;

    cout << "aptrs: ";
    for ( int i = 0; i < _inputs; ++i ) {
      cout << _aptrs[i] << " ";
    }
    cout << endl;
#endif

    // Accept phase

    for ( input = 0; input < _inputs; ++input ) {

      if ( _in_req[input].empty( ) ) {
	continue;
      }

      // A round-robin arbiter between output grants
      output_offset = _aptrs[input];

      p = _in_req[input].begin( );
      while( ( p != _in_req[input].end( ) ) &&
	     ( p->port < output_offset ) ) {
	p++;
      }

      wrapped = false;
      while( (!wrapped) || ( p->port < output_offset ) ) {
	if ( p == _in_req[input].end( ) ) {
	  if ( wrapped ) { break; }
	  // p is valid here because empty lists
	  // are skipped (above)
	  p = _in_req[input].begin( );
	  wrapped = true;
	}

	output = p->port;

	// we know the output is free (above) and
	// if the input is free, grant request
	if ( _grants[output] == input ) {
	  // Accept
	  _inmatch[input]   = output;
	  _outmatch[output] = input;

	  // Only update pointers if accepted during the 1st iteration
	  if ( iter == 0 ) {
	    _gptrs[output] = ( input + 1 ) % _inputs;
	    _aptrs[input]  = ( output + 1 ) % _outputs;
	  }

	  break;
	}

	p++;
      } 
    }
  }

#ifdef DEBUG_ISLIP
  cout << "input match: ";
  for ( int i = 0; i < _inputs; ++i ) {
    cout << _inmatch[i] << " ";
  }
  cout << endl;

  cout << "output match: ";
  for ( int j = 0; j < _outputs; ++j ) {
    cout << _outmatch[j] << " ";
  }
  cout << endl;
#endif
}
Example #3
0
void SelAlloc::Allocate( )
{
    int input;
    int output;

    int input_offset;
    int output_offset;

    list<sRequest>::iterator p;
    list<int>::iterator outer_iter;
    bool wrapped;

    int max_index;
    int max_pri;

    _ClearMatching( );

    for ( int i = 0; i < _outputs; ++i ) {
        _grants[i] = -1;
    }

    for ( int iter = 0; iter < _iter; ++iter ) {
        // Grant phase

        for ( outer_iter = _out_occ->begin( );
                outer_iter != _out_occ->end( ); ++outer_iter ) {
            output = *outer_iter;

            // Skip loop if there are no requests
            // or the output is already matched or
            // the output is masked
            if ( ( _out_req[output].empty( ) ) ||
                    ( _outmatch[output] != -1 ) ||
                    ( _outmask[output] != 0 ) ) {
                continue;
            }

            // A round-robin arbiter between input requests
            input_offset = _gptrs[output];

            p = _out_req[output].begin( );
            while ( ( p != _out_req[output].end( ) ) &&
                    ( p->port < input_offset ) ) {
                p++;
            }

            max_index = -1;
            max_pri   = 0;

            wrapped = false;
            while ( (!wrapped) || ( p->port < input_offset ) ) {
                if ( p == _out_req[output].end( ) ) {
                    if ( wrapped ) {
                        break;
                    }
                    // p is valid here because empty lists
                    // are skipped (above)
                    p = _out_req[output].begin( );
                    wrapped = true;
                }

                input = p->port;

                // we know the output is free (above) and
                // if the input is free, check if request is the
                // highest priority so far
                if ( ( _inmatch[input] == -1 ) &&
                        ( ( p->out_pri > max_pri ) || ( max_index == -1 ) ) ) {
                    max_pri   = p->out_pri;
                    max_index = input;
                }

                p++;
            }

            if ( max_index != -1 ) { // grant
                _grants[output] = max_index;
            }
        }

#ifdef DEBUG_SELALLOC
        cout << "grants: ";
        for ( int i = 0; i < _outputs; ++i ) {
            cout << _grants[i] << " ";
        }
        cout << endl;

        cout << "aptrs: ";
        for ( int i = 0; i < _inputs; ++i ) {
            cout << _aptrs[i] << " ";
        }
        cout << endl;
#endif

        // Accept phase

        for ( outer_iter = _in_occ->begin( );
                outer_iter != _in_occ->end( ); ++outer_iter ) {
            input = *outer_iter;

            if ( _in_req[input].empty( ) ) {
                continue;
            }

            // A round-robin arbiter between output grants
            output_offset = _aptrs[input];

            p = _in_req[input].begin( );
            while ( ( p != _in_req[input].end( ) ) &&
                    ( p->port < output_offset ) ) {
                p++;
            }

            max_index = -1;
            max_pri   = 0;

            wrapped = false;
            while ( (!wrapped) || ( p->port < output_offset ) ) {
                if ( p == _in_req[input].end( ) ) {
                    if ( wrapped ) {
                        break;
                    }
                    // p is valid here because empty lists
                    // are skipped (above)
                    p = _in_req[input].begin( );
                    wrapped = true;
                }

                output = p->port;

                // we know the output is free (above) and
                // if the input is free, check if the highest
                // priroity
                if ( ( _grants[output] == input ) &&
                        ( !_out_req[output].empty( ) ) &&
                        ( ( p->in_pri > max_pri ) || ( max_index == -1 ) ) ) {
                    max_pri   = p->in_pri;
                    max_index = output;
                }

                p++;
            }

            if ( max_index != -1 ) {
                // Accept
                output = max_index;

                _inmatch[input]   = output;
                _outmatch[output] = input;

                // Only update pointers if accepted during the 1st iteration
                if ( iter == 0 ) {
                    _gptrs[output] = ( input + 1 ) % _inputs;
                    _aptrs[input]  = ( output + 1 ) % _outputs;
                }
            }
        }
    }

#ifdef DEBUG_SELALLOC
    cout << "input match: ";
    for ( int i = 0; i < _inputs; ++i ) {
        cout << _inmatch[i] << " ";
    }
    cout << endl;

    cout << "output match: ";
    for ( int j = 0; j < _outputs; ++j ) {
        cout << _outmatch[j] << " ";
    }
    cout << endl;
#endif
}