#//------------------------------------------------------------------------------
#//   Copyright 2007-2011 Mentor Graphics Corporation
#//   Copyright 2007-2011 Cadence Design Systems, Inc. 
#//   Copyright 2010 Synopsys, Inc.
#//   All Rights Reserved Worldwide
#//
#//   Licensed under the Apache License, Version 2.0 (the
#//   "License"); you may not use this file except in
#//   compliance with the License.  You may obtain a copy of
#//   the License at
#//
#//       http://www.apache.org/licenses/LICENSE-2.0
#//
#//   Unless required by applicable law or agreed to in
#//   writing, software distributed under the License is
#//   distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
#//   CONDITIONS OF ANY KIND, either express or implied.  See
#//   the License for the specific language governing
#//   permissions and limitations under the License.
#//------------------------------------------------------------------------------
#
#
#//------------------------------------------------------------------------------
#//
#// CLASS: uvm_push_sequencer #(REQ,RSP)
#//
#//------------------------------------------------------------------------------
#
#class uvm_push_sequencer #(type REQ=uvm_sequence_item, RSP=REQ)
#                                   extends uvm_sequencer_param_base #(REQ, RSP);
#
#  typedef uvm_push_sequencer #( REQ , RSP) this_type;
#
#  // Port: req_port
#  //
#  // The push sequencer requires access to a blocking put interface.
#  // A continuous stream of sequence items are sent out this port, based on
#  // the list of available sequences loaded into this sequencer.
#  //
#  uvm_blocking_put_port #(REQ) req_port;
#
#
#  // Function: new
#  //
#  // Standard component constructor that creates an instance of this class
#  // using the given ~name~ and ~parent~, if any.
#  //
#  function new (string name, uvm_component parent=null);
#    super.new(name, parent);
#    req_port = new ("req_port", this);
#  endfunction 
#
#
#  // Task: run_phase
#  //
#  // The push sequencer continuously selects from its list of available
#  // sequences and sends the next item from the selected sequence out its
#  // <req_port> using req_port.put(item). Typically, the req_port would be
#  // connected to the req_export on an instance of a
#  // <uvm_push_driver #(REQ,RSP)>, which would be responsible for
#  // executing the item.
#  //
#  task run_phase(uvm_phase phase);
#    REQ t;
#    int selected_sequence;
#
#    fork
#      super.run_phase(phase);
#      forever
#        begin
#          m_select_sequence();
#          m_req_fifo.get(t);
#          req_port.put(t);
#          m_wait_for_item_sequence_id = t.get_sequence_id();
#          m_wait_for_item_transaction_id = t.get_transaction_id();
#        end
#    join
#  endtask
#
#  protected virtual function int  m_find_number_driver_connections();
#    return req_port.size();
#  endfunction
#
#endclass
