VMM OpenSource - sv/std_lib/vmm_ms_scenario_gen.sv

sv/std_lib/vmm_ms_scenario_gen.sv expanded source

00001 // 
00002 // -------------------------------------------------------------
00003 //    Copyright 2004-2008 Synopsys, Inc.
00004 //    All Rights Reserved Worldwide
00005 // 
00006 //    Licensed under the Apache License, Version 2.0 (the
00007 //    "License"); you may not use this file except in
00008 //    compliance with the License.  You may obtain a copy of
00009 //    the License at
00010 // 
00011 //        http://www.apache.org/licenses/LICENSE-2.0
00012 // 
00013 //    Unless required by applicable law or agreed to in
00014 //    writing, software distributed under the License is
00015 //    distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
00016 //    CONDITIONS OF ANY KIND, either express or implied.  See
00017 //    the License for the specific language governing
00018 //    permissions and limitations under the License.
00019 // -------------------------------------------------------------
00020 // 
00021 
00022 
00023 function vmm_ms_scenario::new(`VMM_SCENARIO parent
00024                                   `VMM_SCENARIO_NEW_ARGS);
00025     super.new(this.log `VMM_SCENARIO_NEW_CALL);
00026     if(this.log == null) begin
00027         this.log = new("Multi Stream Scenario", "Class");
00028         this.notify.log = this.log;
00029     end
00030     this.set_parent_scenario(parent);
00031 endfunction: new
00032 
00033 
00034 task vmm_ms_scenario::execute(ref int n);
00035     `vmm_error(this.log, "User needs to define the 'execute' for their multi stream scenarios");
00036 endtask: execute
00037 
00038 
00039 /*local*/ function void vmm_ms_scenario::Xset_context_genX(vmm_ms_scenario_gen gen);
00040     this.context_scenario_gen = gen;
00041 endfunction: Xset_context_genX
00042 
00043 
00044 /*local*/ function vmm_ms_scenario_gen vmm_ms_scenario::Xget_context_genX();
00045     Xget_context_genX = this.context_scenario_gen;
00046 endfunction: Xget_context_genX
00047 
00048 
00049 function string vmm_ms_scenario::psdisplay(string prefix);
00050    return super.psdisplay(prefix);
00051 endfunction: psdisplay
00052 
00053 
00054 function vmm_ms_scenario vmm_ms_scenario::get_ms_scenario(string scenario, string gen);
00055     if(this.context_scenario_gen == null) begin
00056         `vmm_error(this.log, "User needs to set the context ms scenario generator for this scenario");
00057         return null;
00058     end
00059     if(gen == "") begin
00060         return this.context_scenario_gen.get_ms_scenario(scenario);
00061     end
00062     else begin
00063         vmm_ms_scenario_gen ext_gen;
00064         ext_gen=this.context_scenario_gen.get_ms_scenario_gen(gen);
00065         if(ext_gen == null) begin
00066             `vmm_error(this.log, `vmm_sformatf("Got a null handle for scenario generator %s", gen));
00067             return null;
00068         end
00069         return ext_gen.get_ms_scenario(scenario);
00070     end
00071 endfunction: get_ms_scenario
00072 
00073 
00074 function vmm_channel vmm_ms_scenario::get_channel(string name);
00075     if(this.context_scenario_gen == null) begin
00076         `vmm_error(this.log, "User needs to set the context ms scenario generator for this scenario");
00077         return null;
00078     end
00079     return this.context_scenario_gen.get_channel(name);
00080 endfunction: get_channel
00081 
00082 
00083 task vmm_ms_scenario::grab_channels(ref vmm_channel channels[$]);
00084    forever begin: retry_all
00085       foreach (channels[i]) begin
00086          if (!channels[i].try_grab(this)) begin
00087             for (int j = 0; j < i; j++) channels[j].ungrab(this);
00088             channels[i].notify.wait_for(vmm_channel::UNGRABBED);
00089             disable retry_all;
00090          end
00091       end
00092       return;
00093    end
00094 endtask
00095 
00096 
00097 function vmm_ms_scenario_gen::new(string inst,
00098                                   int stream_id
00099                                   `VMM_XACTOR_NEW_ARGS);
00100     super.new("VMM Multistream Scenario Generator", inst, stream_id
00101               `VMM_XACTOR_NEW_CALL);
00102 
00103     this.scenario_count = 0;
00104     this.inst_count = 0;
00105     this.stop_after_n_insts = 0;
00106     this.stop_after_n_scenarios = 0;
00107 
00108     this.select_scenario = new;
00109 
00110     void'(this.notify.configure(GENERATED));
00111     void'(this.notify.configure(DONE, vmm_notify::ON_OFF));
00112 endfunction: new
00113 
00114 
00115 function string vmm_ms_scenario_gen::psdisplay(string prefix = "");
00116    psdisplay = super.psdisplay(prefix);
00117    $sformat(psdisplay, "%s [stops after #insts %0d>%0d or #scenarios %0d>%0d]",
00118             psdisplay, this.inst_count, this.stop_after_n_insts,
00119             this.scenario_count, this.stop_after_n_scenarios);
00120 
00121    foreach (this.channel_registry[i]) begin
00122       string pfx;
00123       $sformat(pfx, "%s  Channel \"%s\": ", prefix, i);
00124       psdisplay = {psdisplay, "\n", this.channel_registry[i].psdisplay(pfx)};
00125    end
00126 
00127    foreach (this.mss_registry[i]) begin
00128       string pfx;
00129       $sformat(pfx, "%s  Scenario \"%s\": ", prefix, i);
00130       psdisplay = {psdisplay, "\n", this.mss_registry[i].psdisplay(pfx)};
00131    end
00132 
00133    foreach (this.mssg_registry[i]) begin
00134       string pfx;
00135       $sformat(pfx, "%s  SubGen'tor \"%s\": ", prefix, i);
00136       psdisplay = {psdisplay, "\n", this.mssg_registry[i].psdisplay(pfx)};
00137    end
00138    return psdisplay;
00139 endfunction
00140 
00141 
00142 function int unsigned vmm_ms_scenario_gen::get_n_insts();
00143     get_n_insts = this.inst_count;
00144 endfunction: get_n_insts
00145 
00146 
00147 function int unsigned vmm_ms_scenario_gen::get_n_scenarios();
00148     get_n_scenarios = this.scenario_count;
00149 endfunction: get_n_scenarios
00150 
00151 
00152 function void vmm_ms_scenario_gen::reset_xactor(vmm_xactor::reset_e rst_typ);
00153     super.reset_xactor(rst_typ);
00154     this.scenario_count = 0;
00155     this.inst_count = 0;
00156     `vmm_delQ(this.select_scenario.last_selected);
00157 
00158     if(rst_typ >= FIRM_RST) begin
00159         this.notify.reset( , vmm_notify::HARD);
00160     end
00161 
00162     if(rst_typ >= HARD_RST) begin
00163         this.stop_after_n_insts = 0;
00164         this.stop_after_n_scenarios = 0;
00165         this.select_scenario = new;
00166     end
00167 endfunction: reset_xactor
00168 
00169 
00170 function void vmm_ms_scenario_gen::register_channel(string name,
00171                                                     vmm_channel chan);
00172     if(name == "") begin
00173         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00174         return;
00175     end
00176     if(this.channel_registry.exists(name)) begin
00177         `vmm_error(this.log, `vmm_sformatf("%s already has an entry in the channel registry", name));
00178         return;
00179     end
00180     if(chan == null) begin
00181         `vmm_error(this.log, `vmm_sformatf("channel passed for %s is a null value", name));
00182         return;
00183     end
00184 
00185     this.channel_registry[name] = chan;
00186 endfunction: register_channel
00187 
00188 
00189 function bit vmm_ms_scenario_gen::channel_exists(string name);
00190     if(name == "") begin
00191         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00192         return 0;
00193     end
00194     return this.channel_registry.exists(name);
00195 endfunction: channel_exists
00196 
00197 
00198 function void vmm_ms_scenario_gen::replace_channel(string name,
00199                                                    vmm_channel chan);
00200     if(name == "") begin
00201         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00202         return;
00203     end
00204 
00205     if(chan == null) begin
00206         `vmm_error(this.log, `vmm_sformatf("channel passed for %s is a null value", name));
00207         return;
00208     end
00209 
00210     if(!this.channel_registry.exists(name)) begin
00211        `vmm_error(this.log, `vmm_sformatf("cannot replace a unregistered %s entry [use register_channel]", name));
00212        return;
00213     end
00214        
00215     this.channel_registry[name]=chan;
00216 endfunction: replace_channel
00217 
00218 
00219 function void vmm_ms_scenario_gen::get_all_channel_names(ref string name[$]);
00220    string s;
00221 
00222     if(this.channel_registry.first(s)) begin
00223         do begin
00224             name.push_back(s);
00225         end while(this.channel_registry.next(s));
00226     end
00227     else begin
00228         `vmm_warning(this.log, "There are no entries in the channel registry");
00229     end
00230 endfunction: get_all_channel_names
00231 
00232 
00233 function void vmm_ms_scenario_gen::get_names_by_channel(vmm_channel chan,
00234                                                         ref string name[$]);
00235     string s;
00236 
00237     if(chan == null) begin
00238         `vmm_error(this.log, `vmm_sformatf("channel passed is a null value"));
00239         return;
00240     end
00241 
00242     if(this.channel_registry.first(s)) begin
00243         do begin
00244             if(this.channel_registry[s] == chan) begin
00245                 name.push_back(s);
00246             end
00247         end while(this.channel_registry.next(s));
00248     end
00249     if(name.size() == 0) begin
00250         `vmm_warning(this.log, "There are no entries in the channel registry");
00251     end
00252 endfunction: get_names_by_channel
00253 
00254 
00255 function string vmm_ms_scenario_gen::get_channel_name(vmm_channel chan);
00256     string s[$];
00257 
00258     if(chan == null) begin
00259         `vmm_error(this.log, `vmm_sformatf("channel passed is a null value"));
00260         return "";
00261     end
00262 
00263     this.get_names_by_channel(chan, s);
00264     if (s.size() > 0) return s[0];
00265 
00266     return "";
00267 endfunction: get_channel_name
00268 
00269 
00270 function bit vmm_ms_scenario_gen::unregister_channel(vmm_channel chan);
00271     string s;
00272 
00273     unregister_channel = 0;
00274 
00275     if(chan == null) begin
00276         `vmm_error(this.log, `vmm_sformatf("channel passed is a null value"));
00277         return 0;
00278     end
00279 
00280     if(this.channel_registry.first(s)) begin
00281         do begin
00282             if(this.channel_registry[s] == chan) begin
00283                 this.channel_registry.delete(s);
00284                 unregister_channel = 1;
00285             end
00286         end while(this.channel_registry.next(s));
00287     end
00288     if(unregister_channel==0) begin
00289         `vmm_warning(this.log, "There are no entries in the channel registry");
00290     end
00291 endfunction: unregister_channel
00292 
00293 
00294 function vmm_channel vmm_ms_scenario_gen::unregister_channel_by_name(string name);
00295     if(name == "") begin
00296         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00297         return null;
00298     end
00299 
00300     if(!this.channel_registry.exists(name)) begin
00301         `vmm_warning(this.log, `vmm_sformatf("There is no entry for %s in the channel registry", name));
00302         return null;
00303     end
00304     else begin
00305         unregister_channel_by_name = this.channel_registry[name];
00306         this.channel_registry.delete(name);
00307     end
00308 endfunction: unregister_channel_by_name
00309 
00310 
00311 function vmm_channel vmm_ms_scenario_gen::get_channel(string name);
00312     if (name == "") begin
00313         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00314         return null;
00315     end
00316 
00317     if(!this.channel_registry.exists(name)) begin
00318         `vmm_error(this.log, `vmm_sformatf("%s does not have an entry in the channel registry", name));
00319         return null;
00320     end
00321 
00322     get_channel = this.channel_registry[name];
00323 
00324     // If null, issue a warning
00325     if(get_channel == null)
00326         `vmm_warning(this.log, `vmm_sformatf("%s has a null channel associated with it in the channel registry", name));
00327 endfunction: get_channel
00328 
00329 
00330 function void vmm_ms_scenario_gen::register_ms_scenario(string name,
00331                                                     vmm_ms_scenario scenario);
00332     int i;
00333 
00334     if(name == "") begin
00335         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00336         return;
00337     end
00338 
00339     if(this.mss_registry.exists(name)) begin
00340         `vmm_error(this.log, `vmm_sformatf("%s already has an entry in the multistream scenario registry", name));
00341         return;
00342     end
00343     if(scenario == null) begin
00344         `vmm_error(this.log, `vmm_sformatf("scenario passed for %s is a null value", name));
00345         return;
00346     end
00347 
00348     // set the context generator for this scenario
00349     scenario.Xset_context_genX(this);
00350     this.mss_registry[name] = scenario;
00351 
00352     // add the ms_scenario to the scenario_set only
00353     // if this scenario was not previously added
00354     foreach(this.scenario_set[i]) begin
00355         if(this.scenario_set[i] == scenario)
00356             return;
00357     end
00358     this.scenario_set.push_back(scenario);
00359 endfunction: register_ms_scenario
00360 
00361 
00362 function bit vmm_ms_scenario_gen::ms_scenario_exists(string name);
00363     if (name == "") begin
00364         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00365         return 0;
00366     end
00367 
00368     return this.mss_registry.exists(name);
00369 endfunction: ms_scenario_exists
00370 
00371 
00372 function void vmm_ms_scenario_gen::replace_ms_scenario(string name,
00373                                                    vmm_ms_scenario scenario);
00374     if(name == "") begin
00375         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00376         return;
00377     end
00378     if(scenario == null) begin
00379         `vmm_error(this.log, `vmm_sformatf("scenario passed for %s is a null value", name));
00380         return;
00381     end
00382 
00383     if(!this.mss_registry.exists(name)) begin
00384         `vmm_error(this.log, `vmm_sformatf("cannot replace a unregistered %s entry [use register_ms_scenario]", name));
00385         return;
00386     end
00387 
00388     scenario.Xset_context_genX(this);
00389 
00390     // remove the scenario from the scenario_set
00391     foreach(this.scenario_set[i]) begin
00392         if(this.scenario_set[i] == this.mss_registry[name]) begin
00393             this.scenario_set.delete(i);
00394             break;
00395         end
00396     end
00397     this.mss_registry[name] = scenario;
00398     foreach(this.scenario_set[i]) begin
00399         if(this.scenario_set[i] == scenario)
00400             return;
00401     end
00402     this.scenario_set.push_back(scenario);
00403 endfunction: replace_ms_scenario
00404 
00405 
00406 function void vmm_ms_scenario_gen::get_all_ms_scenario_names(ref string name[$]);
00407     string s;
00408 
00409     if(this.mss_registry.first(s)) begin
00410         do begin
00411             name.push_back(s);
00412         end while(this.channel_registry.next(s));
00413     end
00414     if(name.size() == 0) begin
00415         `vmm_warning(this.log, "There are no entries in the multistream scenario registry");
00416     end
00417 endfunction: get_all_ms_scenario_names
00418 
00419 
00420 function void vmm_ms_scenario_gen::get_names_by_ms_scenario(vmm_ms_scenario scenario,
00421                                                             ref string name[$]);
00422     string s;
00423 
00424     if(scenario == null) begin
00425         `vmm_error(this.log, `vmm_sformatf("scenario passed is a null value"));
00426         return;
00427     end
00428 
00429     if(this.mss_registry.first(s)) begin
00430         do begin
00431             if(this.mss_registry[s] == scenario)
00432                 name.push_back(s);
00433         end while(this.mss_registry.next(s));
00434     end
00435     if(name.size() == 0) begin
00436         `vmm_warning(this.log, "There are no entries in the multistream scenario registry");
00437     end
00438 endfunction: get_names_by_ms_scenario
00439 
00440 
00441 function string vmm_ms_scenario_gen::get_ms_scenario_name(vmm_ms_scenario scenario);
00442     string s[$];
00443 
00444     if(scenario == null) begin
00445         `vmm_error(this.log, `vmm_sformatf("scenario passed is a null value"));
00446         return "";
00447     end
00448 
00449     this.get_names_by_ms_scenario(scenario, s);
00450     if (s.size() > 0) return s[0];
00451 
00452     return "";
00453 endfunction: get_ms_scenario_name
00454 
00455 
00456 function int vmm_ms_scenario_gen::get_ms_scenario_index(vmm_ms_scenario scenario);
00457     get_ms_scenario_index = -1;
00458     foreach(this.scenario_set[i]) begin
00459         if(this.scenario_set[i] == scenario) begin
00460             return (get_ms_scenario_index = i);
00461         end
00462     end
00463     if(get_ms_scenario_index == -1) begin
00464         `vmm_warning(this.log, `vmm_sformatf("Cannot find the index for the ms scenario"));
00465     end
00466 endfunction: get_ms_scenario_index
00467 
00468 
00469 function bit vmm_ms_scenario_gen::unregister_ms_scenario(vmm_ms_scenario scenario);
00470     string s;
00471 
00472     unregister_ms_scenario=0;
00473 
00474     if(scenario == null) begin
00475         `vmm_error(this.log, `vmm_sformatf("scenario passed is a null value"));
00476         return 0;
00477     end
00478 
00479     if(this.mss_registry.first(s)) begin
00480         do begin
00481             if(this.mss_registry[s] == scenario) begin
00482                 this.mss_registry.delete(s);
00483                 unregister_ms_scenario=1;
00484             end
00485         end while(this.mss_registry.next(s));
00486     end
00487     if(unregister_ms_scenario == 0) begin
00488         `vmm_warning(this.log, "There are no entries in the multistream scenario registry");
00489     end
00490     if(unregister_ms_scenario) begin
00491         foreach(this.scenario_set[i]) begin
00492             if(this.scenario_set[i] == scenario) begin
00493                 this.scenario_set.delete(i);
00494                 break;
00495             end
00496         end
00497     end
00498 endfunction: unregister_ms_scenario
00499 
00500 
00501 function vmm_ms_scenario vmm_ms_scenario_gen::unregister_ms_scenario_by_name(string name);
00502     if(name == "") begin
00503         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00504         return null;
00505     end
00506 
00507     if(!this.mss_registry.exists(name)) begin
00508         `vmm_warning(this.log, `vmm_sformatf("There is no entry for %s in the multistream scenario registry", name));
00509         return null;
00510     end
00511     else begin
00512         unregister_ms_scenario_by_name = this.mss_registry[name];
00513         // delete it from the scenario set
00514         foreach(this.scenario_set[i]) begin
00515             if(this.scenario_set[i] == this.mss_registry[name]) begin
00516                 this.scenario_set.delete(i);
00517                 break;
00518             end
00519         end
00520         this.mss_registry.delete(name);
00521     end
00522 endfunction: unregister_ms_scenario_by_name
00523 
00524 
00525 function vmm_ms_scenario vmm_ms_scenario_gen::get_ms_scenario(string name);
00526     string s = name;
00527 
00528     if(name == "") begin
00529         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00530         return null;
00531     end
00532 
00533     if(!this.mss_registry.exists(name)) begin
00534         `vmm_error(this.log, `vmm_sformatf("%s does not have an entry in the multistream scenario registry", name));
00535         return null;
00536     end
00537     get_ms_scenario=this.mss_registry[name];
00538 
00539     if(get_ms_scenario == null)
00540         `vmm_warning(this.log, `vmm_sformatf("%s has a null scenario associated with it in the multistream scenario registry", name));
00541 endfunction: get_ms_scenario
00542 
00543 
00544 function void vmm_ms_scenario_gen::register_ms_scenario_gen(string name,
00545                                                             vmm_ms_scenario_gen scenario_gen);
00546 
00547     if(name == "") begin
00548         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00549         return;
00550     end
00551 
00552     if(this.mssg_registry.exists(name)) begin
00553         `vmm_error(this.log, `vmm_sformatf("%s already has an entry in the multistream scenario generator registry", name));
00554         return;
00555     end
00556 
00557     if(scenario_gen == null) begin
00558         `vmm_error(this.log, `vmm_sformatf("multistream scenario generator for %s is a null value", name));
00559         return;
00560     end
00561 
00562     this.mssg_registry[name] = scenario_gen;
00563 endfunction: register_ms_scenario_gen
00564 
00565 
00566 function bit vmm_ms_scenario_gen::ms_scenario_gen_exists(string name);
00567     if(name == "") begin
00568         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00569         return 0;
00570     end
00571 
00572    return this.mssg_registry.exists(name);
00573 endfunction: ms_scenario_gen_exists
00574 
00575 
00576 function void vmm_ms_scenario_gen::replace_ms_scenario_gen(string name,
00577                                                            vmm_ms_scenario_gen scenario_gen);
00578     if(name == "") begin
00579         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00580         return;
00581     end
00582 
00583     if(scenario_gen == null) begin
00584         `vmm_error(this.log, `vmm_sformatf("multistream scenario generator for %s is a null value", name));
00585         return;
00586     end
00587 
00588     if(!this.mssg_registry.exists(name)) begin
00589         `vmm_error(this.log, `vmm_sformatf("cannot replace a unregistered %s entry [use register_ms_scenario_gen]", name));
00590         return;
00591     end
00592 
00593     this.mssg_registry[name] = scenario_gen;
00594 endfunction: replace_ms_scenario_gen
00595 
00596 
00597 function void vmm_ms_scenario_gen::get_all_ms_scenario_gen_names(ref string name[$]);
00598     string s;
00599 
00600     if(this.mssg_registry.first(s)) begin
00601         do begin
00602             name.push_back(s);
00603         end while(this.mssg_registry.next(s));
00604     end
00605     if(name.size() == 0) begin
00606         `vmm_warning(this.log, "There are no entries in the multistream scenario generator registry");
00607     end
00608 endfunction: get_all_ms_scenario_gen_names
00609 
00610 
00611 function void vmm_ms_scenario_gen::get_names_by_ms_scenario_gen(vmm_ms_scenario_gen scenario_gen,
00612                                                                 ref string name[$]);
00613     string s;
00614 
00615     if(scenario_gen == null) begin
00616         `vmm_error(this.log, `vmm_sformatf("multistream scenario generator is a null value"));
00617         return;
00618     end
00619 
00620     if(this.mssg_registry.first(s)) begin
00621         do begin
00622             if(this.mssg_registry[s] == scenario_gen)
00623                 name.push_back(s);
00624         end while(this.mssg_registry.next(s));
00625     end
00626     if(name.size() == 0) begin
00627         `vmm_warning(this.log, "There are no entries in the multistream scenario generator registry");
00628     end
00629 endfunction: get_names_by_ms_scenario_gen
00630 
00631 
00632 function string vmm_ms_scenario_gen::get_ms_scenario_gen_name(vmm_ms_scenario_gen scenario_gen);
00633     string s[$];
00634 
00635     if(scenario_gen == null) begin
00636         `vmm_error(this.log, `vmm_sformatf("multistream scenario generator is a null value"));
00637         return "";
00638     end
00639 
00640     this.get_names_by_ms_scenario_gen(scenario_gen, s);
00641 
00642     if (s.size() > 0) return s[0];
00643 
00644     return "";
00645 endfunction: get_ms_scenario_gen_name
00646 
00647 
00648 function bit vmm_ms_scenario_gen::unregister_ms_scenario_gen(vmm_ms_scenario_gen scenario_gen);
00649     string s;
00650 
00651     unregister_ms_scenario_gen=0;
00652 
00653     if(scenario_gen == null) begin
00654         `vmm_error(this.log, `vmm_sformatf("multistream scenario generator is a null value"));
00655         return 0;
00656     end
00657 
00658     if(this.mssg_registry.first(s)) begin
00659         do begin
00660             if(this.mssg_registry[s] == scenario_gen) begin
00661                 this.mssg_registry.delete(s);
00662                 unregister_ms_scenario_gen=1;
00663             end
00664         end while(this.mssg_registry.next(s));
00665     end
00666     if(unregister_ms_scenario_gen==0) begin
00667         `vmm_warning(this.log, "There are no entries in the multistream scenario generator registry");
00668     end
00669 endfunction: unregister_ms_scenario_gen
00670 
00671 
00672 function vmm_ms_scenario_gen vmm_ms_scenario_gen::unregister_ms_scenario_gen_by_name(string name);
00673     if(name == "") begin
00674         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00675         return null;
00676     end
00677 
00678     if(!this.mssg_registry.exists(name)) begin
00679         `vmm_warning(this.log, `vmm_sformatf("There is no entry for %s in the multistream scenario generator registry", name));
00680         return null;
00681     end
00682     else begin
00683         unregister_ms_scenario_gen_by_name = this.mssg_registry[name];
00684         this.mssg_registry.delete(name);
00685     end
00686 endfunction: unregister_ms_scenario_gen_by_name
00687 
00688 
00689 function vmm_ms_scenario_gen vmm_ms_scenario_gen::get_ms_scenario_gen(string name);
00690     if(name == "") begin
00691         `vmm_error(this.log, `vmm_sformatf("Invalid '%s' string was passed", name));
00692         return null;
00693     end
00694 
00695     if(!this.mssg_registry.exists(name)) begin
00696         `vmm_error(this.log, `vmm_sformatf("%s does not have an entry in the multistream scenario generator registry", name));
00697         return null;
00698     end
00699     get_ms_scenario_gen = this.mssg_registry[name];
00700     if(get_ms_scenario_gen == null)
00701         `vmm_warning(this.log, `vmm_sformatf("%s has a null scenario generator associated with it in the multisteam scenario generator registry", name));
00702 endfunction: get_ms_scenario_gen
00703 
00704 
00705 task vmm_ms_scenario_gen::main();
00706     vmm_ms_scenario the_scenario;
00707     int n_insts;
00708 
00709     fork
00710         super.main();
00711     join_none
00712 
00713     if(this.scenario_set.size() == 0) begin
00714         // do not start the main routine
00715         return;
00716     end
00717 
00718     while( (this.stop_after_n_insts <=0 || this.inst_count < this.stop_after_n_insts)
00719            && (this.stop_after_n_scenarios <= 0 || this.scenario_count < this.stop_after_n_scenarios)) begin
00720         this.wait_if_stopped();
00721 
00722         this.select_scenario.stream_id = this.stream_id;
00723         this.select_scenario.scenario_id = this.scenario_count;
00724         this.select_scenario.n_scenarios = this.scenario_set.size();
00725         this.select_scenario.scenario_set = this.scenario_set;
00726         if(this.select_scenario.last_selected.size() == 0)
00727             this.select_scenario.next_in_set = 0;
00728         else
00729             this.select_scenario.next_in_set = ((this.select_scenario.last_selected[$] + 1) % this.scenario_set.size());
00730         if(!this.select_scenario.randomize()) begin
00731             `vmm_fatal(this.log, "Cannot select multistream scenario descriptor");
00732             continue;
00733         end
00734 
00735         if(this.select_scenario.select < 0 ||
00736            this.select_scenario.select >= this.scenario_set.size()) begin
00737             `vmm_fatal(this.log, `vmm_sformatf("Select scenario #%0d is not within available set (0-%0d)",
00738                                                this.select_scenario.select, this.scenario_set.size()-1));
00739             continue;
00740         end
00741 
00742         this.select_scenario.last_selected.push_back(this.select_scenario.select);
00743         while(this.select_scenario.last_selected.size() > 10) begin
00744             void'(this.select_scenario.last_selected.pop_front());
00745         end
00746 
00747         the_scenario = this.scenario_set[this.select_scenario.select];
00748         if(the_scenario == null) begin
00749             `vmm_fatal(this.log, `vmm_sformatf("Selected scenario #%0d does not exist",
00750                                                this.select_scenario.select));
00751             continue;
00752         end
00753 
00754         the_scenario.stream_id = this.stream_id;
00755         the_scenario.scenario_id = this.scenario_count;
00756 
00757         `vmm_callback(vmm_ms_scenario_gen_callbacks, pre_scenario_randomize(this, the_scenario));
00758         if(the_scenario == null) continue;
00759 
00760         if(!the_scenario.randomize()) begin
00761             `vmm_fatal(this.log, `vmm_sformatf("Cannot randomize scenario descriptor #%0d",
00762                                                this.select_scenario.select));
00763             continue;
00764         end
00765 
00766         this.scenario_count++;
00767         this.notify.indicate(GENERATED, the_scenario);
00768         n_insts=0;
00769         the_scenario.execute(n_insts);
00770         this.inst_count += n_insts;
00771     end
00772 
00773     this.notify.indicate(DONE);
00774     this.notify.indicate(XACTOR_STOPPED);
00775     this.notify.indicate(XACTOR_IDLE);
00776     this.notify.reset(XACTOR_BUSY);
00777 endtask: main