// //------------------------------------------------------------------------------ // Copyright 2007-2010 Mentor Graphics Corporation // Copyright 2007-2010 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. //------------------------------------------------------------------------------ `ifndef UVM_QUEUE_SVH `define UVM_QUEUE_SVH //------------------------------------------------------------------------------ // // CLASS: uvm_queue #(T) // //------------------------------------------------------------------------------ // Implements a class-based dynamic queue. Allows queues to be allocated on // demand, and passed and stored by reference. //------------------------------------------------------------------------------ class uvm_queue #(type T=int) extends uvm_object; const static string type_name = "uvm_queue"; typedef uvm_queue #(T) this_type; static local this_type m_global_queue; protected T queue[$]; // Function: new // // Creates a new queue with the given ~name~. function new (string name=""); super.new(name); endfunction // Function: get_global_queue // // Returns the singleton global queue for the item type, T. // // This allows items to be shared amongst components throughout the // verification environment. static function this_type get_global_queue (); if (m_global_queue==null) m_global_queue = new("global_queue"); return m_global_queue; endfunction // Function: get_global // // Returns the specified item instance from the global item queue. static function T get_global (int index); this_type gqueue; gqueue = get_global_queue(); return gqueue.get(index); endfunction // Function: get // // Returns the item at the given ~index~. // // If no item exists by that key, a new item is created with that key // and returned. virtual function T get (int index); T default_value; if (index >= size() || index < 0) begin uvm_report_warning("QUEUEGET", $sformatf("get: given index out of range for queue of size %0d. Ignoring get request",size())); return default_value; end return queue[index]; endfunction // Function: size // // Returns the number of items stored in the queue. virtual function int size (); return queue.size(); endfunction // Function: insert // // Inserts the item at the given ~index~ in the queue. virtual function void insert (int index, T item); if (index >= size() || index < 0) begin uvm_report_warning("QUEUEINS", $sformatf("insert: given index out of range for queue of size %0d. Ignoring insert request",size())); return; end queue.insert(index,item); endfunction // Function: delete // // Removes the item at the given ~index~ from the queue; if ~index~ is // not provided, the entire contents of the queue are deleted. virtual function void delete (int index=-1); if (index >= size() || index < -1) begin uvm_report_warning("QUEUEDEL", $sformatf("delete: given index out of range for queue of size %0d. Ignoring delete request",size())); return; end if (index == -1) queue.delete(); else queue.delete(index); endfunction // Function: pop_front // // Returns the first element in the queue (index=0), // or ~null~ if the queue is empty. virtual function T pop_front(); return queue.pop_front(); endfunction // Function: pop_back // // Returns the last element in the queue (index=size()-1), // or ~null~ if the queue is empty. virtual function T pop_back(); return queue.pop_back(); endfunction // Function: push_front // // Inserts the given ~item~ at the front of the queue. virtual function void push_front(T item); queue.push_front(item); endfunction // Function: push_back // // Inserts the given ~item~ at the back of the queue. virtual function void push_back(T item); queue.push_back(item); endfunction virtual function uvm_object create (string name=""); this_type v; v=new(name); return v; endfunction virtual function string get_type_name (); return type_name; endfunction virtual function void do_copy (uvm_object rhs); this_type p; super.do_copy(rhs); if (rhs == null || !$cast(p, rhs)) return; queue = p.queue; endfunction virtual function string convert2string(); return $sformatf("%p",queue); endfunction endclass `endif // UVM_QUEUE_SVH