VMM - (expanded) std_lib/vmm_data.sv

Expanded versions of source files are the output of the preprocessor. Lines subject to conditional compilation are not shown and all compiler pragmas have been stripped. Macros have been completely expanded.

std_lib/vmm_data.sv unexpanded 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_data::new(vmm_log log
00024:                        );
00028: 
00029:    this.log = log;
00030: 
00031:    this.notify = new(log);
00032:    this.notify.configure(EXECUTE, vmm_notify::ON_OFF);
00033:    this.notify.configure(STARTED, vmm_notify::ON_OFF);
00034:    this.notify.configure(ENDED,   vmm_notify::ON_OFF);
00035:    this.notify.indicate(EXECUTE);
00036: endfunction: new
00037: 
00038: 
00039: function vmm_log vmm_data::set_log(vmm_log log);
00040:    set_log = this.log;
00041:    this.log = log;
00042:    this.notify.log = log;
00043: endfunction: set_log
00044: 
00045: 
00046: function void vmm_data::display(string prefix);
00047:    $display(this.psdisplay(prefix));
00048: endfunction: display
00049: 
00050: 
00051: function string vmm_data::psdisplay(string prefix);
00052:    $sformat(psdisplay, "%0s#%0d.%0d.%0d", prefix,
00053:             this.stream_id, this.scenario_id, this.data_id);
00054: endfunction: psdisplay
00055: 
00056: 
00057: function bit vmm_data::is_valid(bit silent,
00058:                                 int kind);
00059:   is_valid = 1;
00060: endfunction: is_valid
00061: 
00062: 
00063: function vmm_data vmm_data::allocate();
00064:    string msg = "Virtual vmm_data::allocate() not implemented in derivative";
00065: 
00066:    if (this.log == null) begin
00067:      $display(msg);
00068:      $finish;
00069:    end
00070:    else 
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text(msg)); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00071:    allocate = null;
00072: endfunction: allocate
00073: 
00074: 
00075: function vmm_data vmm_data::copy(vmm_data to);
00076:    string msg = "Virtual vmm_data::copy() not implemented in derivative";
00077: 
00078:    if (this.log == null) begin
00079:      $display(msg);
00080:      $finish;
00081:    end
00082:    else
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text(msg)); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00083:    copy = to;
00084: endfunction: copy
00085: 
00086: 
00087: function void vmm_data::copy_data(vmm_data to);
00088:    if (to == null) begin
00089:       string msg = "vmm_data::copy_data() called with null reference";
00090: 
00091:       if (this.log == null) begin
00092:          $display(msg);
00093:          $finish;
00094:       end
00095:       else
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text(msg)); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00096:       return;
00097:    end
00098:    else begin
00099:       to.stream_id   = this.stream_id;
00100:       to.scenario_id = this.scenario_id;
00101:       to.data_id     = this.data_id;
00102:    end
00103: endfunction: copy_data
00104: 
00105:    
00106: 
00107: 
00108: function bit vmm_data::compare(       vmm_data to,
00109:                                output string   diff,
00110:                                input  int      kind);
00111:    string msg = "Virtual vmm_data::compare() not implemented in derivative";
00112:    if (this.log == null) begin
00113:      $display(msg);
00114:      $finish;
00115:    end
00116:    else
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text(msg)); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00117:    compare = 0;
00118: endfunction : compare
00119: 
00120: 
00121: function int unsigned vmm_data::byte_size(int kind);
00122:    string msg = "Virtual vmm_data::byte_size() not implemented in derivative";
00123:    if (this.log == null) begin
00124:      $display(msg);
00125:      $finish;
00126:    end
00127:    else
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text(msg)); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00128:    byte_size = 0;
00129: endfunction : byte_size
00130: 
00131: 
00132: function int unsigned vmm_data::max_byte_size(int kind);
00133:    max_byte_size = 0;
00134: endfunction : max_byte_size
00135: 
00136: 
00137: function int unsigned vmm_data::byte_pack(ref   logic [7:0]  bytes[],
00138:                                           input int unsigned offset,
00139:                                           input int          kind);
00140:    string msg = "Virtual vmm_data::byte_pack() not implemented in derivative";
00141:    if (this.log == null) begin
00142:       $display(msg);
00143:       $finish;
00144:    end
00145:    else
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text(msg)); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00146:    byte_pack = 0;
00147: endfunction : byte_pack
00148: 
00149: 
00150: 
00151: 
00152: function int unsigned vmm_data::byte_unpack(const ref logic [7:0] bytes[],
00153:                                             input int unsigned    offset,
00154:                                             input int             len,
00155:                                             input int             kind);
00156:    string msg = "Virtual vmm_data::byte_unpack() not implemented in derivative";
00157:    if (this.log == null) begin
00158:       $display(msg);
00159:       $finish;
00160:    end
00161:    else
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text(msg)); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00162:    byte_unpack = 0;
00163: endfunction : byte_unpack
00164: 
00165: 
00166: function string vmm_data::do_psdisplay(string prefix);
00167:    this.__vmm_done_user = 0;
00168: endfunction: do_psdisplay
00169: 
00170: 
00171: function bit vmm_data::do_is_valid(bit silent,
00172:                                    int kind);
00173:   this.__vmm_done_user = 0;
00174: endfunction: do_is_valid
00175: 
00176: 
00177: function vmm_data vmm_data::do_allocate();
00178:    this.__vmm_done_user = 0;
00179: endfunction: do_allocate
00180: 
00181: 
00182: function vmm_data vmm_data::do_copy(vmm_data to);
00183:    this.__vmm_done_user = 0;
00184: endfunction: do_copy
00185: 
00186:    
00187: function bit vmm_data::do_compare(       vmm_data to,
00188:                                   output string   diff,
00189:                                   input  int      kind);
00190:    this.__vmm_done_user = 0;
00191: endfunction : do_compare
00192: 
00193: 
00194: function int unsigned vmm_data::do_byte_size(int kind);
00195:    this.__vmm_done_user = 0;
00196: endfunction : do_byte_size
00197: 
00198: 
00199: function int unsigned vmm_data::do_max_byte_size(int kind);
00200:    this.__vmm_done_user = 0;
00201: endfunction : do_max_byte_size
00202: 
00203: 
00204: function int unsigned vmm_data::do_byte_pack(ref   logic [7:0]  bytes[],
00205:                                              input int unsigned offset,
00206:                                              input int          kind);
00207:    this.__vmm_done_user = 0;
00208: endfunction : do_byte_pack
00209: 
00210: 
00211: function int unsigned vmm_data::do_byte_unpack(const ref logic [7:0] bytes[],
00212:                                                input int unsigned    offset,
00213:                                                input int             len,
00214:                                                input int             kind);
00215:    this.__vmm_done_user = 0;
00216: endfunction : do_byte_unpack
00217: 
00218: 
00219: 
00220: function bit vmm_data::load(int file);
00221:    int len, i;
00222:    logic [7:0] bytes[];
00223:    bit escaped = 0;
00224: 
00225:    load = 0;
00226: 
00227:    // Expect one record for the object, with the following format:
00228:    // [<blanks>]<n><SPACE><n bytes (potentially inclusing \n)>\n
00229:    if ($fscanf(file, " %d", len) != 1) begin
00230:       string msg = "Invalid input record in vmm_data::load()";
00231:       if (this.log == null) begin
00232:          $display(msg);
00233:          $finish;
00234:       end
00235:       else
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text(msg)); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00236:       return 0;
00237:    end
00238: 
00239:    // Skip the <SPACE>
00240:    begin
00241:       bit [7:0] c;
00242:       c = $fgetc(file);
00243:    end
00244: 
00245:    // Read the next 'len' characters and unpack
00246:    bytes = new [len];
00247:    i = 0;
00248:    while (i < len) begin
00249:       int c = $fgetc(file);
00250:       if (c < 0) begin
00251:          string msg = "Truncated input record in vmm_data::load()";
00252:          if (this.log == null) begin
00253:             $display(msg);
00254:             $finish;
00255:          end
00256:          else
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text(msg)); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00257:          return 0;
00258:       end
00259:       bytes[i] = c;
00260:       // Some characters have been escaped
00261:       if (bytes[i] == 8'h2E) begin
00262:          escaped = 1;
00263:          continue;
00264:       end
00265:       if (escaped) begin
00266:          bit [7:0] c = bytes[i];
00267:          c[7] = ~c[7];
00268:          bytes[i] = c;
00269:          escaped = 0;
00270:       end
00271:       i++;
00272:    end
00273:    if (this.byte_unpack(bytes) != len) begin
00274:       string msg = "Unable to fully unpack input record in vmm_data::load()";
00275:       if (this.log == null) begin
00276:          $display(msg);
00277:          $finish;
00278:       end
00279:       else
     : do 
     :    if (this.log.start_msg(vmm_log::FAILURE_TYP, vmm_log::FATAL_SEV)) begin 
     :       void'(this.log.text(msg)); 
     :       this.log.end_msg(); 
     :    end 
     : while (0);
00280:       return 0;
00281:    end
00282: 
00283:    // Skip the final \n
00284:    begin
00285:       bit [7:0] c;
00286:       c = $fgetc(file);
00287:    end
00288: 
00289:    load = 1;
00290: endfunction: load
00291:    
00292: 
00293: function void vmm_data::save(int file);
00294:    logic [7:0] bytes[];
00295:    int   i;
00296: 
00297:    // Produce the format expected by vmm_data::load()
00298:    void'(this.byte_pack(bytes));
00299:    $fwrite(file, "%0d ", bytes.size());
00300:    for (i = 0; i < bytes.size(); i++) begin
00301:       bit [7:0] a_byte = bytes[i]; // Make sure there are no X's
00302:       // Some characters need to be escaped
00303:       case (a_byte)
00304:       8'h00,
00305:       8'hFF,
00306:       8'h2E: begin
00307:          bit [7:0] c = a_byte;
00308:          c[7] = ~c[7];
00309:          $fwrite(file, ".%c", c);
00310:       end
00311: 
00312:       default: $fwrite(file, "%c", a_byte);
00313:       endcase
00314:    end
00315:    $fwrite(file, "\n");
00316: endfunction: save
00317: 
00318: 
00319: