SyoSil ApS UVM Scoreboard  1.0.3.0
cl_syoscb_queue_iterator_std.svh
1 /// Queue iterator class for iterating over std queues
3  //-------------------------------------
4  // UVM Macros
5  //-------------------------------------
6  `uvm_object_utils(cl_syoscb_queue_iterator_std)
7 
8  function new(string name = "cl_syoscb_queue_iterator_std");
9  super.new(name);
10  endfunction: new
11 
12  //-------------------------------------
13  // Iterator API
14  //-------------------------------------
15  extern virtual function cl_syoscb_proxy_item_base next();
16  extern virtual function bit has_next();
17  extern virtual function cl_syoscb_proxy_item_base previous();
18  extern virtual function bit has_previous();
19  extern virtual function bit first();
20  extern virtual function bit last();
21  extern virtual function bit set_queue(cl_syoscb_queue_base owner);
22  extern protected virtual function cl_syoscb_proxy_item_base get_item_proxy();
24 
25 /// <b>Iterator API:</b> See cl_syoscb_queue_iterator_base#next for details
27  cl_syoscb_proxy_item_base proxy_item;
28  cl_syoscb_queue_base qh = this.get_queue();
29  if(!this.has_next()) begin
30  `uvm_error("ITER_ERROR", $sformatf("Cannot get next item for std-queue %0s with %0d elements. Already pointing to last element", qh.get_name(), qh.get_size()))
31  return null;
32  end
33  proxy_item = this.get_item_proxy();
34  this.position++;
35  return proxy_item;
36 endfunction: next
37 
38 /// <b>Iterator API:</b> See cl_syoscb_queue_iterator_base#has_next for details
40  cl_syoscb_queue_base qh = this.get_queue();
41  return this.position < qh.get_size();
42 endfunction: has_next
43 
44 /// <b>Iterator API:</b> See cl_syoscb_queue_iterator_base#previous for details
45 function cl_syoscb_proxy_item_base cl_syoscb_queue_iterator_std::previous();
46  cl_syoscb_queue_base qh = this.get_queue();
47  if(!this.has_previous()) begin
48  `uvm_error("ITER_ERROR", $sformatf("Cannot get previous item for std-queue %0s with %0d elements. Already pointing to first element", qh.get_name(), qh.get_size()))
49  return null;
50  end
51 
52  this.position--;
53  return this.get_item_proxy();
54 endfunction: previous
55 
56 /// <b>Iterator API:</b> See cl_syoscb_queue_iterator_base#has_previous for details
57 function bit cl_syoscb_queue_iterator_std::has_previous();
58  return (this.position > 0);
59 endfunction: has_previous
60 
61 /// <b>Iterator API:</b> See cl_syoscb_queue_iterator_base#first for details
63  // If the call is done on a empty queue, the method call should fail
64  if(this.owner.get_size() == 0) begin
65  return 1'b0;
66  end else begin
67  this.position = 0;
68  return 1'b1;
69  end
70 endfunction: first
71 
72 /// <b>Iterator API:</b> See cl_syoscb_queue_iterator_base#last for details
74  if(this.owner.get_size() == 0) begin
75  return 1'b0;
76  end else begin
77  this.position = this.owner.get_size();
78  return 1'b1;
79  end
80 endfunction: last
81 
82 /// <b>Iterator API:</b> See cl_syoscb_queue_iterator_base#set_queue for details
83 function bit cl_syoscb_queue_iterator_std::set_queue(cl_syoscb_queue_base owner);
85 
86  if(owner == null) begin
87  // An iterator should always have an associated queue
88  `uvm_error("ITER_ERROR", "Unable to associate queue with iterator as argument was null")
89  return 1'b0;
90  end else if(this.owner != null) begin
91  //An iterator's owner should not be re-assignable
92  `uvm_error("ITER_ERROR", $sformatf("Cannot reassign queue owner. Use create_iterator() to create an iterator for queue %s", owner.get_name()))
93  return 1'b0;
94  end else if(!$cast(qs, owner)) begin
95  `uvm_error("ITER_ERROR", $sformatf({"Cannot assign queue %0s to iterator %0s, as the types do not match.\n",
96  "Expected a queue of type cl_syoscb_queue_std, got %0s"}, owner.get_name(), this.get_name(), owner.get_type_name()))
97  return 1'b0;
98  end else begin
99  this.owner = owner;
100  this.cfg = owner.get_cfg();
101  return 1'b1;
102  end
103 endfunction: set_queue
104 
105 /// <b>Iterator API:</b> See cl_syoscb_queue_iterator_base#get_item_proxy for details
107  cl_syoscb_proxy_item_std proxy_item_std;
108 
109  proxy_item_std = cl_syoscb_proxy_item_std::type_id::create("proxy_item_std");
110  proxy_item_std.idx = this.position;
111  proxy_item_std.set_queue(this.owner);
112  return proxy_item_std;
113 endfunction: get_item_proxy
cl_syoscb_queue_base owner
The owner of this iterator.
virtual cl_syoscb_proxy_item_base next()
Iterator API: See cl_syoscb_queue_iterator_base::next for details
virtual cl_syoscb_queue_base get_queue()
Iterator API: Internal API: Returns the queue over which this iterator is iterating.
virtual cl_syoscb_proxy_item_base previous()
Iterator API: See cl_syoscb_queue_iterator_base::previous for details
Base class for all proxy items.
virtual cl_syoscb_proxy_item_base get_item_proxy()
Iterator API: See cl_syoscb_queue_iterator_base::get_item_proxy for details
virtual bit set_queue(cl_syoscb_queue_base owner)
Iterator API: See cl_syoscb_queue_iterator_base::set_queue for details
virtual bit has_next()
Iterator API: See cl_syoscb_queue_iterator_base::has_next for details
virtual bit has_previous()
Iterator API: See cl_syoscb_queue_iterator_base::has_previous for details
Queue iterator class for iterating over std queues.
cl_syoscb_cfg cfg
Local handle to the SCB cfg.
Queue iterator base class defining the iterator API used for iterating over queues.
virtual bit last()
Iterator API: See cl_syoscb_queue_iterator_base::last for details
int unsigned position
Current position in the queue.
Class which represents the base concept of a queue.
Standard implementation of a queue.
virtual bit first()
Iterator API: See cl_syoscb_queue_iterator_base::first for details
Proxy item implementation for standard queues.

Project: SyoSil ApS UVM Scoreboard, Revision: 1.0.3.0

Copyright 2014-2022 SyoSil ApS
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.
doxygen
Doxygen Version: 1.8.14
Generated with IDV SV Filter Version: 2.6.3
Fri Sep 2 2022 14:39:51
Find a documentation bug? Report bugs to: scoreboard@syosil.com