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 `include "std_lib/vmm_data_macros_utils.sv"
00024
00025
00026 `define vmm_data_member_begin(_class) \
00027 \
00028 protected static _class __vmm_rhs; \
00029 \
00030 function void do_all(vmm_data::do_what_e do_what, \
00031 ref logic [7:0] pack[], \
00032 const ref logic [7:0] unpack[]); \
00033 super.__vmm_rhs = this.__vmm_rhs; \
00034 this.__vmm_status = 1; \
00035 super.do_all(do_what, pack, unpack); \
00036 if (super.__vmm_status == 0) return;
00037
00038 `define vmm_data_member_scalar(_name, _do) \
00039 \
00040 case (do_what & _do) \
00041 DO_PRINT: begin \
00042 $sformat(this.__vmm_image, `"%s\n%s``_name='h%0h`", this.__vmm_image, this.__vmm_prefix, this._name); \
00043 end \
00044 DO_COPY: begin \
00045 __vmm_rhs._name = this._name; \
00046 end \
00047 DO_COMPARE: begin \
00048 if (__vmm_rhs._name !== this._name) begin \
00049 $sformat(this.__vmm_image, `"this._name ('h%0h) !== to._name ('h%0h)`", \
00050 this._name, __vmm_rhs._name); \
00051 this.__vmm_status = 0; \
00052 return; \
00053 end \
00054 end \
00055 DO_PACK: begin \
00056 int start; \
00057 int count; \
00058 start = this.__vmm_offset; \
00059 `vmm_data_member_scalar_count(this._name,count) \
00060 this.__vmm_maxbits = this._name; \
00061 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00062 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00063 this.__vmm_len = this.__vmm_offset; \
00064 end \
00065 DO_UNPACK: begin \
00066 int count; \
00067 int start; \
00068 start = this.__vmm_offset; \
00069 `vmm_data_member_scalar_count(this._name,count) \
00070 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00071 this._name = this.__vmm_maxbits; \
00072 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00073 end \
00074 endcase
00075
00076 `define vmm_data_member_scalar_array(_name, _do) \
00077 \
00078 case (do_what & _do) \
00079 DO_PRINT: begin \
00080 int size =0; \
00081 size = $size(this._name); \
00082 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, size); \
00083 for (int i = 0; i < size; i++) begin \
00084 $sformat(this.__vmm_image, `"%s 'h%0h`", this.__vmm_image, this._name[i]); \
00085 if (i == 2 && size > 5) begin \
00086 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
00087 i = size - 3; \
00088 end \
00089 end \
00090 end \
00091 DO_COPY: begin \
00092 __vmm_rhs._name = this._name; \
00093 end \
00094 DO_COMPARE: begin \
00095 foreach (this._name[i]) begin \
00096 if (__vmm_rhs._name[i] !== this._name[i]) begin \
00097 $sformat(this.__vmm_image, `"this._name[%0d] ('h%0h) !== to._name[%0d] ('h%0h)`", \
00098 i, this._name[i], i, __vmm_rhs._name[i]); \
00099 this.__vmm_status = 0; \
00100 return; \
00101 end \
00102 end \
00103 end \
00104 DO_PACK: begin \
00105 int start; \
00106 int count; \
00107 bit [31:0] size=0; \
00108 start = this.__vmm_offset; \
00109 `vmm_data_member_update_offset(this.__vmm_offset,8) \
00110 foreach (this._name[j]) begin \
00111 if ( j == 0 ) \
00112 `vmm_data_member_scalar_count(this._name[j],count) \
00113 this.__vmm_maxbits = this._name[j]; \
00114 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00115 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00116 size++; \
00117 end \
00118 `vmm_data_member_scalar_packint(pack,size,start,0) \
00119 `vmm_data_member_scalar_packint(pack,count,(start+4),0) \
00120 this.__vmm_len = this.__vmm_offset; \
00121 end \
00122 DO_UNPACK: begin \
00123 int start; \
00124 int count; \
00125 bit [31:0] size = 0; \
00126 `vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \
00127 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00128 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00129 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00130 for (int j=0; j < size; j++) begin \
00131 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00132 this._name[j] = this.__vmm_maxbits; \
00133 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00134 end \
00135 end \
00136 endcase
00137
00138
00139 `define vmm_data_member_scalar_da(_name, _do) \
00140 \
00141 case (do_what & _do) \
00142 DO_PRINT: begin \
00143 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.size()); \
00144 for (int i = 0; i < this._name.size(); i++) begin \
00145 $sformat(this.__vmm_image, `"%s 'h%0h`", this.__vmm_image, this._name[i]); \
00146 if (i == 2 && this._name.size() > 5) begin \
00147 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
00148 i = this._name.size() - 3; \
00149 end \
00150 end \
00151 end \
00152 DO_COPY: begin \
00153 __vmm_rhs._name = new [this._name.size()]; \
00154 foreach(this._name[i]) __vmm_rhs._name[i]=this._name[i]; \
00155 end \
00156 DO_COMPARE: begin \
00157 if (__vmm_rhs._name.size() !== this._name.size()) begin \
00158 $sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
00159 this._name.size(), __vmm_rhs._name.size()); \
00160 this.__vmm_status = 0; \
00161 return; \
00162 end \
00163 foreach (this._name[i]) begin \
00164 if (__vmm_rhs._name[i] !== this._name[i]) begin \
00165 $sformat(this.__vmm_image, `"this._name[%0d] ('h%0h) !== to._name[%0d] ('h%0h)`", \
00166 i, this._name[i], i, __vmm_rhs._name[i]); \
00167 this.__vmm_status = 0; \
00168 return; \
00169 end \
00170 end \
00171 end \
00172 DO_PACK: begin \
00173 int start; \
00174 int count; \
00175 int index; \
00176 bit [31:0] size=0; \
00177 start = this.__vmm_offset; \
00178 size = this._name.size(); \
00179 foreach (this._name[j]) begin \
00180 if ( j == 0) begin \
00181 `vmm_data_member_scalar_count(this._name[j],count) \
00182 `vmm_data_member_update_offset(this.__vmm_offset,8) \
00183 end \
00184 this.__vmm_maxbits = this._name[j]; \
00185 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00186 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00187 end \
00188 this.__vmm_len = this.__vmm_offset; \
00189 `vmm_data_member_scalar_packint(pack,size,start,0) \
00190 `vmm_data_member_scalar_packint(pack,count,(start+4),0) \
00191 end \
00192 DO_UNPACK: begin \
00193 int start; \
00194 int count; \
00195 int index; \
00196 bit [31:0] size = 0; \
00197 `vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \
00198 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00199 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00200 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00201 this._name = new [size]; \
00202 for (int j=0; j < size; j++) begin \
00203 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00204 this._name[j] = this.__vmm_maxbits; \
00205 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00206 end \
00207 end \
00208 endcase
00209
00210
00211 `define vmm_data_member_scalar_aa_scalar(_name, _do) \
00212 \
00213 case (do_what & _do) \
00214 DO_PRINT: begin \
00215 int _count = 0; \
00216 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, \
00217 this.__vmm_prefix, this._name.num()); \
00218 foreach (this._name[i]) begin \
00219 if (_count <= 2 || _count >= this._name.num()-2) \
00220 $sformat(this.__vmm_image, `"%s %0d:`h%0h`", this.__vmm_image, \
00221 i, this._name[i]); \
00222 if (_count == 2 && this._name.num() > 5) begin \
00223 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
00224 end \
00225 _count++; \
00226 end \
00227 end \
00228 DO_COPY: begin \
00229 __vmm_rhs._name.delete(); \
00230 foreach(this._name[i]) begin \
00231 __vmm_rhs._name[i]=this._name[i]; \
00232 end \
00233 end \
00234 DO_COMPARE: begin \
00235 if (__vmm_rhs._name.num() !== this._name.num()) begin \
00236 $sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
00237 this._name.num(), __vmm_rhs._name.num()); \
00238 this.__vmm_status = 0; \
00239 return; \
00240 end \
00241 foreach (this._name[i]) begin \
00242 if (!__vmm_rhs._name.exists(i)) begin \
00243 $sformat(this.__vmm_image, `"this._name[%0d] exists but to._name[%0d] does not`", \
00244 i, i); \
00245 this.__vmm_status = 0; \
00246 return; \
00247 end \
00248 else if (__vmm_rhs._name[i] != this._name[i]) begin \
00249 $sformat(this.__vmm_image, `"this._name[%0d]:'h%0h !== to._name[%0d]:'h%0h`", \
00250 i, this._name[i], i, __vmm_rhs._name[i]); \
00251 this.__vmm_status = 0; \
00252 return; \
00253 end \
00254 end \
00255 end \
00256 DO_PACK: begin \
00257 int start; \
00258 int count; \
00259 int index; \
00260 int element=0; \
00261 bit [31:0] size=0; \
00262 start = this.__vmm_offset; \
00263 element = this._name.first(index); \
00264 `vmm_data_member_scalar_count(element,count) \
00265 element = 0; \
00266 size = this._name.num(); \
00267 foreach (this._name[j]) begin \
00268 this.__vmm_maxbits = this._name[j]; \
00269 index = j; \
00270 if (element == 0 ) begin\
00271 `vmm_data_member_update_offset(this.__vmm_offset,8) \
00272 element = 1; \
00273 end \
00274 `vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \
00275 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00276 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00277 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00278 end \
00279 this.__vmm_len = this.__vmm_offset; \
00280 `vmm_data_member_scalar_packint(pack,size,start,0) \
00281 `vmm_data_member_scalar_packint(pack,count,(start+4),0) \
00282 end \
00283 DO_UNPACK: begin \
00284 int start; \
00285 int count; \
00286 int index; \
00287 bit [31:0] size = 0; \
00288 start = this.__vmm_offset; \
00289 `vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \
00290 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00291 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00292 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00293 for (int j=0; j < size; j++) begin \
00294 `vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \
00295 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00296 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00297 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00298 this._name[index] = this.__vmm_maxbits; \
00299 end \
00300 end \
00301 endcase
00302
00303 `define vmm_data_member_scalar_aa_string(_name, _do) \
00304 \
00305 case (do_what & _do) \
00306 DO_PRINT: begin \
00307 int _count = 0; \
00308 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, \
00309 this.__vmm_prefix, this._name.num()); \
00310 foreach (this._name[i]) begin \
00311 if (_count <= 2 || _count >= this._name.num()-2) \
00312 $sformat(this.__vmm_image, `"%s ``%s':'h%0h`", this.__vmm_image, i, this._name[i]); \
00313 if (_count == 2 && this._name.num() > 5) begin \
00314 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
00315 end \
00316 _count++; \
00317 end \
00318 end \
00319 DO_COPY: begin \
00320 __vmm_rhs._name.delete(); \
00321 foreach(this._name[i]) begin \
00322 __vmm_rhs._name[i] = this._name[i]; \
00323 end \
00324 end \
00325 DO_COMPARE: begin \
00326 if (__vmm_rhs._name.num() !== this._name.num()) begin \
00327 $sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
00328 this._name.num(), __vmm_rhs._name.num()); \
00329 this.__vmm_status = 0; \
00330 return; \
00331 end \
00332 foreach (this._name[i]) begin \
00333 if(!__vmm_rhs._name.exists(i)) begin \
00334 $sformat(this.__vmm_image, `"this._name[``%s'] exists but to._name[``%s'] does not`", \
00335 i, i); \
00336 this.__vmm_status = 0; \
00337 return; \
00338 end \
00339 else if (__vmm_rhs._name[i] != this._name[i]) begin \
00340 $sformat(this.__vmm_image, `"this._name[``%s']:'h%0h !== to._name[``%s']:'h%0h`", \
00341 i, this._name[i], i, __vmm_rhs._name[i]); \
00342 this.__vmm_status = 0; \
00343 return; \
00344 end \
00345 end \
00346 end \
00347 DO_PACK: begin \
00348 int start; \
00349 int count; \
00350 string sindextemp; \
00351 int sindexcount; \
00352 string stemp; \
00353 bit [31:0] size=0; \
00354 start = this.__vmm_offset; \
00355 stemp = this._name.first(sindextemp); \
00356 size = this._name.num(); \
00357 `vmm_data_member_scalar_packint(pack,size,start,0) \
00358 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00359 this.__vmm_maxbits = 0; \
00360 foreach (this._name[j]) begin \
00361 this.__vmm_maxbits =0; \
00362 sindextemp = j; \
00363 sindexcount = sindextemp.len(); \
00364 this.__vmm_maxbits = sindextemp; \
00365 `vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \
00366 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00367 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
00368 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
00369 this.__vmm_maxbits =0; \
00370 `vmm_data_member_scalar_count(this._name[j],count) \
00371 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00372 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00373 this.__vmm_maxbits = this._name[j]; \
00374 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00375 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00376 end \
00377 this.__vmm_len = this.__vmm_offset; \
00378 end \
00379 DO_UNPACK: begin \
00380 int start; \
00381 int count; \
00382 string sindextemp; \
00383 int sindexcount; \
00384 string stemp; \
00385 bit [31:0] size=0; \
00386 this.__vmm_maxbits = 0; \
00387 start = this.__vmm_offset; \
00388 `vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \
00389 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00390 for (int j=0; j < size; j++) begin \
00391 `vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \
00392 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00393 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
00394 sindextemp = this.__vmm_maxbits; \
00395 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
00396 this.__vmm_maxbits = 0; \
00397 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00398 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00399 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00400 this._name[sindextemp] = this.__vmm_maxbits; \
00401 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00402 end \
00403 end \
00404 endcase
00405
00406
00407 `define vmm_data_member_string(_name, _do) \
00408 \
00409 case (do_what & _do) \
00410 DO_PRINT: begin \
00411 $sformat(this.__vmm_image, `"%s\n%s``_name=``%s'`", this.__vmm_image, this.__vmm_prefix, this._name); \
00412 end \
00413 DO_COPY: begin \
00414 __vmm_rhs._name = this._name; \
00415 end \
00416 DO_COMPARE: begin \
00417 if (__vmm_rhs._name != this._name) begin \
00418 $sformat(this.__vmm_image, `"this._name (``%s') !== to._name (``%s')`", \
00419 this._name, __vmm_rhs._name); \
00420 this.__vmm_status = 0; \
00421 return; \
00422 end \
00423 end \
00424 DO_PACK: begin \
00425 int start; \
00426 int count; \
00427 start = this.__vmm_offset; \
00428 count = (this._name.len()); \
00429 this.__vmm_maxbits = 0; \
00430 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00431 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00432 this.__vmm_maxbits = this._name; \
00433 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00434 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00435 this.__vmm_len = this.__vmm_offset; \
00436 end \
00437 DO_UNPACK: begin \
00438 int count; \
00439 int start; \
00440 int size; \
00441 this.__vmm_maxbits = 0; \
00442 start = this.__vmm_offset; \
00443 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00444 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00445 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00446 this._name = this.__vmm_maxbits; \
00447 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00448 end \
00449 endcase
00450
00451
00452 `define vmm_data_member_string_array(_name, _do) \
00453 \
00454 case (do_what & _do) \
00455 DO_PRINT: begin \
00456 int size =0; \
00457 size = $size(this._name); \
00458 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, size); \
00459 for (int i = 0; i < size; i++) begin \
00460 $sformat(this.__vmm_image, `"%s ``%s'`", this.__vmm_image, this._name[i]); \
00461 if (i == 2 && size > 5) begin \
00462 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
00463 i = size - 3; \
00464 end \
00465 end \
00466 end \
00467 DO_COPY: begin \
00468 __vmm_rhs._name = this._name; \
00469 end \
00470 DO_COMPARE: begin \
00471 foreach (this._name[i]) begin \
00472 if (__vmm_rhs._name[i] != this._name[i]) begin \
00473 $sformat(this.__vmm_image, `"this._name[%0d] (%s) !== to._name[%0d] (%s)`", \
00474 i, this._name[i], i, __vmm_rhs._name[i]); \
00475 this.__vmm_status = 0; \
00476 return; \
00477 end \
00478 end \
00479 end \
00480 DO_PACK: begin \
00481 int start; \
00482 int count; \
00483 string stemp; \
00484 bit [31:0] size=0; \
00485 start = this.__vmm_offset; \
00486 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00487 this.__vmm_maxbits =0; \
00488 foreach (this._name[j]) begin \
00489 count = (this._name[j].len()); \
00490 this.__vmm_maxbits = this._name[j]; \
00491 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00492 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00493 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00494 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00495 size++; \
00496 end \
00497 `vmm_data_member_scalar_packint(pack,size,start,0) \
00498 this.__vmm_len = this.__vmm_offset; \
00499 end \
00500 DO_UNPACK: begin \
00501 int count; \
00502 int start; \
00503 bit [31:0] size = 0; \
00504 start = this.__vmm_offset; \
00505 this.__vmm_maxbits =0; \
00506 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
00507 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00508 for (int j=0; j < size; j++) begin \
00509 this.__vmm_maxbits =`"`"; \
00510 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00511 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00512 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00513 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00514 this._name[j] = this.__vmm_maxbits; \
00515 this.__vmm_maxbits =`"`"; \
00516 end \
00517 end \
00518 endcase
00519
00520 `define vmm_data_member_string_da(_name, _do) \
00521 \
00522 case (do_what & _do) \
00523 DO_PRINT: begin \
00524 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.size()); \
00525 for (int i = 0; i < this._name.size(); i++) begin \
00526 $sformat(this.__vmm_image, `"%s ``%s'`", this.__vmm_image, this._name[i]); \
00527 if (i == 2 && this._name.size() > 5) begin \
00528 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
00529 i = this._name.size() - 3; \
00530 end \
00531 end \
00532 end \
00533 DO_COPY: begin \
00534 __vmm_rhs._name = new [this._name.size()]; \
00535 foreach(this._name[i]) __vmm_rhs._name[i] = this._name[i]; \
00536 end \
00537 DO_COMPARE: begin \
00538 if (__vmm_rhs._name.size() !== this._name.size()) begin \
00539 $sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
00540 this._name.size(), __vmm_rhs._name.size()); \
00541 this.__vmm_status = 0; \
00542 return; \
00543 end \
00544 foreach (this._name[i]) begin \
00545 if (__vmm_rhs._name[i] != this._name[i]) begin \
00546 $sformat(this.__vmm_image, `"this._name[%0d] (%s) !== to._name[%0d] (%s)`", \
00547 i, this._name[i], i, __vmm_rhs._name[i]); \
00548 this.__vmm_status = 0; \
00549 return; \
00550 end \
00551 end \
00552 end \
00553 DO_PACK: begin \
00554 int start; \
00555 int count; \
00556 int firstcount; \
00557 string stemp; \
00558 bit [31:0] size=0; \
00559 start = this.__vmm_offset; \
00560 size = this._name.size(); \
00561 `vmm_data_member_scalar_packint(pack,size,start,0) \
00562 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00563 this.__vmm_maxbits =0; \
00564 foreach (this._name[j]) begin \
00565 count = (this._name[j].len()); \
00566 this.__vmm_maxbits = this._name[j]; \
00567 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00568 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00569 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00570 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00571 end \
00572 this.__vmm_len = this.__vmm_offset; \
00573 end \
00574 DO_UNPACK: begin \
00575 int count; \
00576 int index; \
00577 int start; \
00578 bit [31:0] size = 0; \
00579 start = this.__vmm_offset; \
00580 this.__vmm_maxbits =0; \
00581 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
00582 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00583 this._name = new [size]; \
00584 for (int j=0; j < size; j++) begin \
00585 this.__vmm_maxbits =`"`"; \
00586 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00587 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00588 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00589 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00590 this._name[j] = this.__vmm_maxbits; \
00591 this.__vmm_maxbits =`"`"; \
00592 end \
00593 end \
00594 endcase
00595
00596 `define vmm_data_member_string_aa_scalar(_name, _do) \
00597 \
00598 case (do_what & _do) \
00599 DO_PRINT: begin \
00600 int _count = 0; \
00601 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
00602 foreach(this._name[i]) begin \
00603 if (_count <= 2 || _count >= this._name.num()-2) \
00604 $sformat(this.__vmm_image, `"%s %0d:``%s'`", this.__vmm_image, i, this._name[i]); \
00605 if (_count == 2 && this._name.num() > 5) begin \
00606 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
00607 end \
00608 _count++; \
00609 end \
00610 $sformat(this.__vmm_image, `"%s'`", this.__vmm_image); \
00611 end \
00612 DO_COPY: begin \
00613 __vmm_rhs._name.delete(); \
00614 foreach(this._name[i]) begin \
00615 __vmm_rhs._name[i]=this._name[i]; \
00616 end \
00617 end \
00618 DO_COMPARE: begin \
00619 if (__vmm_rhs._name.num() !== this._name.num()) begin \
00620 $sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
00621 this._name.num(), __vmm_rhs._name.num()); \
00622 this.__vmm_status = 0; \
00623 return; \
00624 end \
00625 foreach (this._name[i]) begin \
00626 if (!__vmm_rhs._name.exists(i)) begin \
00627 $sformat(this.__vmm_image, `"this._name[%0d] exists but to._name[%0d] does not`", \
00628 i, i); \
00629 this.__vmm_status = 0; \
00630 return; \
00631 end \
00632 else if (__vmm_rhs._name[i] != this._name[i]) begin \
00633 $sformat(this.__vmm_image, `"this._name[%0d] (``%s') !== to._name[%0d] (``%s')`", \
00634 i, this._name[i], i, __vmm_rhs._name[i]); \
00635 this.__vmm_status = 0; \
00636 return; \
00637 end \
00638 end \
00639 end \
00640 DO_PACK: begin \
00641 int start; \
00642 int count; \
00643 int index; \
00644 bit [31:0] size=0; \
00645 start = this.__vmm_offset; \
00646 this.__vmm_maxbits = 0; \
00647 size = this._name.num(); \
00648 `vmm_data_member_scalar_packint(pack,size,start,0) \
00649 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00650 foreach (this._name[j]) begin \
00651 this.__vmm_maxbits = 0; \
00652 count = (this._name[j].len()); \
00653 this.__vmm_maxbits = this._name[j]; \
00654 index = j; \
00655 `vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \
00656 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00657 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00658 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00659 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00660 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00661 end \
00662 this.__vmm_len = this.__vmm_offset; \
00663 end \
00664 DO_UNPACK: begin \
00665 int start; \
00666 int count; \
00667 int index; \
00668 bit [31:0] size = 0; \
00669 start = this.__vmm_offset; \
00670 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
00671 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00672 this.__vmm_maxbits = 0; \
00673 for (int j=0; j < size; j++) begin \
00674 `vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \
00675 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00676 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00677 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00678 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00679 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00680 this._name[index] = this.__vmm_maxbits; \
00681 this.__vmm_maxbits = 0; \
00682 end \
00683 end \
00684 endcase
00685
00686
00687 `define vmm_data_member_string_aa_string(_name, _do) \
00688 \
00689 case (do_what & _do) \
00690 DO_PRINT: begin \
00691 int _count = 0; \
00692 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
00693 foreach (this._name[i]) begin \
00694 if (_count <= 2 || _count >= this._name.num()-2) \
00695 $sformat(this.__vmm_image, `"%s ``%s':``%s'`", this.__vmm_image, i, this._name[i]); \
00696 if (_count == 2 && this._name.num() > 5) begin \
00697 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
00698 end \
00699 _count++; \
00700 end \
00701 end \
00702 DO_COPY: begin \
00703 __vmm_rhs._name.delete(); \
00704 foreach(this._name[i]) __vmm_rhs._name[i] = this._name[i]; \
00705 end \
00706 DO_COMPARE: begin \
00707 if (__vmm_rhs._name.num() !== this._name.num()) begin \
00708 $sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
00709 this._name.num(), __vmm_rhs._name.num()); \
00710 this.__vmm_status = 0; \
00711 return; \
00712 end \
00713 foreach (this._name[i]) begin \
00714 if (!__vmm_rhs._name.exists(i)) begin \
00715 $sformat(this.__vmm_image, `"this._name[``%s'] exists but to._name[``%s'] does not`", \
00716 i, i); \
00717 this.__vmm_status = 0; \
00718 return; \
00719 end \
00720 else if (__vmm_rhs._name[i] != this._name[i]) begin \
00721 $sformat(this.__vmm_image, `"this._name[``%s'] (``%s') !== to._name[``%s'] (``%s')`", \
00722 i, this._name[i], i, __vmm_rhs._name[i]); \
00723 this.__vmm_status = 0; \
00724 return; \
00725 end \
00726 end \
00727 end \
00728 DO_PACK: begin \
00729 int start; \
00730 int count; \
00731 string sindextemp; \
00732 int sindexcount; \
00733 bit [31:0] size=0; \
00734 start = this.__vmm_offset; \
00735 size = this._name.num(); \
00736 `vmm_data_member_scalar_packint(pack,size,start,0) \
00737 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00738 this.__vmm_maxbits = 0; \
00739 foreach (this._name[j]) begin \
00740 this.__vmm_maxbits =0; \
00741 sindextemp = j; \
00742 sindexcount = sindextemp.len(); \
00743 this.__vmm_maxbits = sindextemp; \
00744 `vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \
00745 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00746 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
00747 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
00748 this.__vmm_maxbits =0; \
00749 count = this._name[j].len(); \
00750 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00751 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00752 this.__vmm_maxbits = this._name[j]; \
00753 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00754 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00755 end \
00756 this.__vmm_len = this.__vmm_offset; \
00757 end \
00758 DO_UNPACK: begin \
00759 int start; \
00760 int count; \
00761 string sindextemp; \
00762 int sindexcount; \
00763 string stemp; \
00764 bit [31:0] size=0; \
00765 this.__vmm_maxbits = 0; \
00766 start = this.__vmm_offset; \
00767 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
00768 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00769 for (int j=0; j < size; j++) begin \
00770 this.__vmm_maxbits = 0; \
00771 `vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \
00772 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00773 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
00774 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
00775 sindextemp = this.__vmm_maxbits; \
00776 this.__vmm_maxbits = 0; \
00777 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00778 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00779 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00780 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00781 this._name[sindextemp] = this.__vmm_maxbits; \
00782 end \
00783 end \
00784 endcase
00785
00786
00787 `define vmm_data_member_enum(_name, _do) \
00788 \
00789 case (do_what & _do) \
00790 DO_PRINT: begin \
00791 $sformat(this.__vmm_image, `"%s\n%s``_name=%s`", this.__vmm_image, this.__vmm_prefix, this._name.name()); \
00792 end \
00793 DO_COPY: begin \
00794 __vmm_rhs._name = this._name; \
00795 end \
00796 DO_COMPARE: begin \
00797 if (__vmm_rhs._name !== this._name) begin \
00798 $sformat(this.__vmm_image, `"this._name (%s) !== to._name (%s)`", \
00799 this._name.name(), __vmm_rhs._name.name()); \
00800 this.__vmm_status = 0; \
00801 return; \
00802 end \
00803 end \
00804 DO_PACK: begin \
00805 int start; \
00806 int count; \
00807 string stemp; \
00808 bit [31:0] size=0; \
00809 start = this.__vmm_offset; \
00810 stemp = this._name.name(); \
00811 count = (stemp.len()); \
00812 this.__vmm_maxbits = this._name.name(); \
00813 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00814 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00815 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00816 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00817 this.__vmm_len = this.__vmm_offset; \
00818 end \
00819 DO_UNPACK: begin \
00820 int count; \
00821 int start; \
00822 int size; \
00823 int index; \
00824 string stemp; \
00825 start = this.__vmm_offset; \
00826 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00827 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00828 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00829 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00830 stemp = this.__vmm_maxbits; \
00831 index = 0; \
00832 `vmm_data_member_enum_set_name(this._name,stemp,index) \
00833 end \
00834 endcase
00835
00836
00837 `define vmm_data_member_enum_array(_name, _do) \
00838 \
00839 case (do_what & _do) \
00840 DO_PRINT: begin \
00841 int size =0; \
00842 size = $size(this._name); \
00843 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, size); \
00844 for (int i = 0; i < size; i++) begin \
00845 $sformat(this.__vmm_image, `"%s %s`", this.__vmm_image, this._name[i].name()); \
00846 if (i == 2 && size > 5) begin \
00847 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
00848 i = size - 3; \
00849 end \
00850 end \
00851 end \
00852 DO_COPY: begin \
00853 __vmm_rhs._name = this._name; \
00854 end \
00855 DO_COMPARE: begin \
00856 foreach (this._name[i]) begin \
00857 if (__vmm_rhs._name[i] !== this._name[i]) begin \
00858 $sformat(this.__vmm_image, `"this._name[%0d] (%s) !== to._name[%0d] (%s)`", \
00859 i, this._name[i].name(), i, __vmm_rhs._name[i].name()); \
00860 this.__vmm_status = 0; \
00861 return; \
00862 end \
00863 end \
00864 end \
00865 DO_PACK: begin \
00866 int start; \
00867 int count; \
00868 string stemp; \
00869 bit [31:0] size=0; \
00870 start = this.__vmm_offset; \
00871 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00872 this.__vmm_maxbits = 0; \
00873 foreach (this._name[j]) begin \
00874 stemp = this._name[j].name(); \
00875 count = (stemp.len()); \
00876 this.__vmm_maxbits = this._name[j].name(); \
00877 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00878 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00879 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00880 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00881 size++; \
00882 end \
00883 `vmm_data_member_scalar_packint(pack,size,start,0) \
00884 this.__vmm_len = this.__vmm_offset; \
00885 end \
00886 DO_UNPACK: begin \
00887 int count; \
00888 int start; \
00889 int index; \
00890 string stemp; \
00891 bit [31:0] size = 0; \
00892 start = this.__vmm_offset; \
00893 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
00894 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00895 this.__vmm_maxbits =0; \
00896 for (int j=0; j < size; j++) begin \
00897 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00898 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00899 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00900 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00901 stemp = this.__vmm_maxbits; \
00902 index = 0; \
00903 `vmm_data_member_enum_set_name(this._name[j],stemp,index) \
00904 this.__vmm_maxbits =`"`"; \
00905 end \
00906 end \
00907 endcase
00908
00909 `define vmm_data_member_enum_da(_name, _do) \
00910 \
00911 case (do_what & _do) \
00912 DO_PRINT: begin \
00913 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.size()); \
00914 for (int i = 0; i < this._name.size(); i++) begin \
00915 $sformat(this.__vmm_image, `"%s %s`", this.__vmm_image, this._name[i].name()); \
00916 if (i == 2 && this._name.size() > 5) begin \
00917 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
00918 i = this._name.size() - 3; \
00919 end \
00920 end \
00921 end \
00922 DO_COPY: begin \
00923 __vmm_rhs._name = new [this._name.size()]; \
00924 foreach(this._name[i]) __vmm_rhs._name[i] = this._name[i]; \
00925 end \
00926 DO_COMPARE: begin \
00927 if (__vmm_rhs._name.size() !== this._name.size()) begin \
00928 $sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
00929 this._name.size(), __vmm_rhs._name.size()); \
00930 this.__vmm_status = 0; \
00931 return; \
00932 end \
00933 foreach (this._name[i]) begin \
00934 if (__vmm_rhs._name[i] !== this._name[i]) begin \
00935 $sformat(this.__vmm_image, `"this._name[%0d] (%s) !== to._name[%0d] (%s)`", \
00936 i, this._name[i].name(), i, __vmm_rhs._name[i].name()); \
00937 this.__vmm_status = 0; \
00938 return; \
00939 end \
00940 end \
00941 end \
00942 DO_PACK: begin \
00943 int start; \
00944 int count; \
00945 int index; \
00946 int element; \
00947 string stemp; \
00948 bit [31:0] size=0; \
00949 start = this.__vmm_offset; \
00950 size = this._name.size(); \
00951 `vmm_data_member_scalar_packint(pack,size,start,0) \
00952 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00953 this.__vmm_maxbits = 0; \
00954 foreach (this._name[j]) begin \
00955 stemp = this._name[j].name(); \
00956 count = (stemp.len()); \
00957 this.__vmm_maxbits = this._name[j].name(); \
00958 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00959 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00960 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00961 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00962 end \
00963 this.__vmm_len = this.__vmm_offset; \
00964 end \
00965 DO_UNPACK: begin \
00966 int count; \
00967 int index; \
00968 int start; \
00969 string stemp; \
00970 bit [31:0] size = 0; \
00971 start = this.__vmm_offset; \
00972 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
00973 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00974 this._name = new [size]; \
00975 this.__vmm_maxbits =0; \
00976 for (int j=0; j < size; j++) begin \
00977 this.__vmm_maxbits =`"`"; \
00978 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00979 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00980 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00981 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00982 stemp = this.__vmm_maxbits; \
00983 index = 0; \
00984 `vmm_data_member_enum_set_name(this._name[j],stemp,index) \
00985 this.__vmm_maxbits =`"`"; \
00986 end \
00987 end \
00988 endcase
00989
00990
00991 `define vmm_data_member_enum_aa_scalar(_name, _do) \
00992 \
00993 case (do_what & _do) \
00994 DO_PRINT: begin \
00995 int _count = 0; \
00996 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
00997 foreach(this._name[i]) begin \
00998 if (_count <= 2 || _count >= this._name.num()-2) begin \
00999 $sformat(this.__vmm_image, `"%s %0d: %s `", this.__vmm_image, i, this._name[i].name()); \
01000 if (_count == 2 && this._name.num() > 5) begin \
01001 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
01002 end \
01003 end \
01004 _count++; \
01005 end \
01006 $sformat(this.__vmm_image, `"%s`", this.__vmm_image); \
01007 end \
01008 DO_COPY: begin \
01009 __vmm_rhs._name.delete(); \
01010 foreach(this._name[i]) begin \
01011 __vmm_rhs._name[i]=this._name[i]; \
01012 end \
01013 end \
01014 DO_COMPARE: begin \
01015 if (__vmm_rhs._name.num() !== this._name.num()) begin \
01016 $sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
01017 this._name.num(), __vmm_rhs._name.num()); \
01018 this.__vmm_status = 0; \
01019 return; \
01020 end \
01021 foreach (this._name[i]) begin \
01022 if (!__vmm_rhs._name.exists(i)) begin \
01023 $sformat(this.__vmm_image, `"this._name[%0d] exists but to._name[%0d] does not`", \
01024 i, i); \
01025 this.__vmm_status = 0; \
01026 return; \
01027 end \
01028 else if (__vmm_rhs._name[i] != this._name[i]) begin \
01029 $sformat(this.__vmm_image, `"this._name[%0d] (%s) !== to._name[%0d] (%s)`", \
01030 i, this._name[i].name, i, __vmm_rhs._name[i].name); \
01031 this.__vmm_status = 0; \
01032 return; \
01033 end \
01034 end \
01035 end \
01036 DO_PACK: begin \
01037 int start; \
01038 int count; \
01039 int index; \
01040 string stemp; \
01041 bit [31:0] size=0; \
01042 start = this.__vmm_offset; \
01043 this.__vmm_maxbits = 0; \
01044 size = this._name.num(); \
01045 `vmm_data_member_scalar_packint(pack,size,start,0) \
01046 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01047 foreach (this._name[j]) begin \
01048 this.__vmm_maxbits = 0; \
01049 stemp = this._name[j].name(); \
01050 count = (stemp.len()); \
01051 this.__vmm_maxbits = this._name[j].name(); \
01052 index = j; \
01053 `vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \
01054 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01055 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
01056 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01057 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
01058 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01059 end \
01060 this.__vmm_len = this.__vmm_offset; \
01061 end \
01062 DO_UNPACK: begin \
01063 int count; \
01064 int start; \
01065 int index=0; \
01066 string stemp; \
01067 bit [31:0] size = 0; \
01068 start = this.__vmm_offset; \
01069 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
01070 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01071 this.__vmm_maxbits =0; \
01072 for (int j=0; j < size; j++) begin \
01073 this.__vmm_maxbits =0; \
01074 `vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \
01075 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01076 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
01077 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01078 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
01079 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01080 stemp = this.__vmm_maxbits; \
01081 count = 0; \
01082 `vmm_data_member_enum_set_name(this._name[index],stemp,count) \
01083 this.__vmm_maxbits =`"`"; \
01084 end \
01085 end \
01086 endcase
01087
01088
01089
01090 `define vmm_data_member_enum_aa_string(_name, _do) \
01091 \
01092 case (do_what & _do) \
01093 DO_PRINT: begin \
01094 int _count = 0; \
01095 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
01096 foreach(this._name[i]) begin \
01097 if (_count <= 2 || _count >= this._name.num()-2) begin \
01098 $sformat(this.__vmm_image, `"%s ``%s':%s`", this.__vmm_image, i, this._name[i].name); \
01099 if (_count == 2 && this._name.num() > 5) begin \
01100 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
01101 end \
01102 end \
01103 _count++; \
01104 end \
01105 end \
01106 DO_COPY: begin \
01107 __vmm_rhs._name.delete(); \
01108 foreach (this._name[i]) begin \
01109 __vmm_rhs._name[i] = this._name[i]; \
01110 end \
01111 end \
01112 DO_COMPARE: begin \
01113 if (__vmm_rhs._name.num() !== this._name.num()) begin \
01114 $sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
01115 this._name.num(), __vmm_rhs._name.num()); \
01116 this.__vmm_status = 0; \
01117 return; \
01118 end \
01119 foreach (this._name[i]) begin \
01120 if (!__vmm_rhs._name.exists(i)) begin \
01121 $sformat(this.__vmm_image, `"this._name[``%s'] exists but to._name[``%s'] does not`", \
01122 i, i); \
01123 this.__vmm_status = 0; \
01124 return; \
01125 end \
01126 else if (__vmm_rhs._name[i] != this._name[i]) begin \
01127 $sformat(this.__vmm_image, `"this._name[``%s'] (%s) !== to._name[``%s'] (%s)`", \
01128 i, this._name[i].name, i, __vmm_rhs._name[i].name); \
01129 this.__vmm_status = 0; \
01130 return; \
01131 end \
01132 end \
01133 end \
01134 DO_PACK: begin \
01135 int start; \
01136 int count; \
01137 int index; \
01138 string sindextemp; \
01139 int sindexcount; \
01140 string stemp; \
01141 bit [31:0] size=0; \
01142 start = this.__vmm_offset; \
01143 stemp = this._name.first(sindextemp); \
01144 index = 0; \
01145 size = this._name.num(); \
01146 `vmm_data_member_scalar_packint(pack,size,start,0) \
01147 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01148 this.__vmm_maxbits = 0; \
01149 foreach (this._name[j]) begin \
01150 this.__vmm_maxbits =0; \
01151 sindextemp = j; \
01152 sindexcount = sindextemp.len(); \
01153 this.__vmm_maxbits = sindextemp; \
01154 `vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \
01155 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01156 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
01157 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
01158 this.__vmm_maxbits =0; \
01159 stemp = this._name[j].name(); \
01160 count = (stemp.len()); \
01161 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
01162 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01163 this.__vmm_maxbits = this._name[j].name(); \
01164 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
01165 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01166 end \
01167 this.__vmm_len = this.__vmm_offset; \
01168 end \
01169 DO_UNPACK: begin \
01170 int start; \
01171 int count; \
01172 int index; \
01173 string sindextemp; \
01174 int sindexcount; \
01175 string stemp; \
01176 bit [31:0] size=0; \
01177 index = 0; \
01178 start = this.__vmm_offset; \
01179 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
01180 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01181 this.__vmm_maxbits = 0; \
01182 for (int j=0; j < size; j++) begin \
01183 this.__vmm_maxbits = 0; \
01184 `vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \
01185 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01186 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
01187 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
01188 sindextemp = this.__vmm_maxbits; \
01189 this.__vmm_maxbits = 0; \
01190 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
01191 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01192 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
01193 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01194 stemp = this.__vmm_maxbits; \
01195 index = 0; \
01196 `vmm_data_member_enum_set_name(this._name[sindextemp],stemp,index) \
01197 this.__vmm_maxbits =`"`"; \
01198 end \
01199 end \
01200 endcase
01201
01202
01203 `define vmm_data_member_handle(_name, _do) \
01204 \
01205 case (do_what & _do) \
01206 DO_PRINT: begin \
01207 if ( _name == null ) begin \
01208 `vmm_warning(this.log, `" vmm_data _name object does not exist, no action`"); \
01209 end \
01210 else begin \
01211 string _prefix = this.__vmm_prefix; \
01212 $sformat(this.__vmm_image, `"%s\n%s``_name is %s`", this.__vmm_image, this.__vmm_prefix, \
01213 (this._name == null) ? `"null`" : `"<ref>`"); \
01214 this.__vmm_prefix = _prefix; \
01215 end \
01216 end \
01217 DO_COPY: begin \
01218 if ( _name == null ) begin \
01219 `vmm_warning(this.log, `" vmm_data _name object does not exist, no action`"); \
01220 end \
01221 else begin \
01222 __vmm_rhs._name = this._name; \
01223 end \
01224 end \
01225 DO_COMPARE: begin \
01226 string diff; \
01227 if ( _name == null ) begin \
01228 `vmm_warning(this.log, `" vmm_data _name object does not exist, no action`"); \
01229 end \
01230 else begin \
01231 if (this._name != __vmm_rhs._name) begin \
01232 this.__vmm_image = `"this._name !== to._name`"; \
01233 this.__vmm_status = 0; \
01234 return; \
01235 end \
01236 end \
01237 end \
01238 DO_PACK: begin \
01239 if ( _name == null ) begin \
01240 `vmm_warning(this.log, `" vmm_data _name object does not exist, no action`"); \
01241 end \
01242 else begin \
01243 end \
01244 end \
01245 DO_UNPACK: begin \
01246 this._name = null; \
01247 end \
01248 endcase
01249
01250
01251 `define vmm_data_member_handle_array(_name, _do) \
01252 \
01253 case (do_what & _do) \
01254 DO_PRINT: begin \
01255 int size =0; \
01256 size = $size(this._name); \
01257 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, size); \
01258 for (int i = 0; i < size; i++) begin \
01259 $sformat(this.__vmm_image, `"%s %s`", this.__vmm_image, \
01260 (this._name[i] == null) ? `"null`" : `"<ref>`"); \
01261 if (i == 2 && size > 5) begin \
01262 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
01263 i = size - 3; \
01264 end \
01265 end \
01266 end \
01267 DO_COPY: begin \
01268 __vmm_rhs._name = this._name; \
01269 end \
01270 DO_COMPARE: begin \
01271 foreach (this._name[i]) begin \
01272 if (this._name[i] != __vmm_rhs._name[i]) begin \
01273 $sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
01274 this.__vmm_status = 0; \
01275 return; \
01276 end \
01277 end \
01278 end \
01279 DO_PACK: begin \
01280 end \
01281 DO_UNPACK: begin \
01282 foreach (this._name[i]) begin \
01283 this._name[i] = null; \
01284 end \
01285 end \
01286 endcase
01287
01288
01289 `define vmm_data_member_handle_da(_name, _do) \
01290 \
01291 case (do_what & _do) \
01292 DO_PRINT: begin \
01293 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.size()); \
01294 for (int i = 0; i < this._name.size(); i++) begin \
01295 $sformat(this.__vmm_image, `"%s %s`", this.__vmm_image, \
01296 (this._name[i] == null) ? `"null`" : `"<ref>`"); \
01297 if (i == 2 && this._name.size() > 5) begin \
01298 this.__vmm_image = {this.__vmm_image, `" ...`"}; \
01299 i = this._name.size() - 3; \
01300 end \
01301 end \
01302 end \
01303 DO_COPY: begin \
01304 __vmm_rhs._name = new[this._name.size()]; \
01305 foreach(this._name[i]) begin \
01306 __vmm_rhs._name[i] = this._name[i]; \
01307 end \
01308 end \
01309 DO_COMPARE: begin \
01310 if (__vmm_rhs._name.size() !== this._name.size()) begin \
01311 $sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
01312 this._name.size(), __vmm_rhs._name.size()); \
01313 this.__vmm_status = 0; \
01314 return; \
01315 end \
01316 foreach (this._name[i]) begin \
01317 if (this._name[i] != __vmm_rhs._name[i]) begin \
01318 $sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
01319 this.__vmm_status = 0; \
01320 return; \
01321 end \
01322 end \
01323 end \
01324 DO_PACK: begin \
01325 end \
01326 DO_UNPACK: begin \
01327 foreach (this._name[i]) begin \
01328 this._name[i] = null; \
01329 end \
01330 end \
01331 endcase
01332
01333
01334 `define vmm_data_member_handle_aa_scalar(_name, _do) \
01335 \
01336 case (do_what & _do) \
01337 DO_PRINT: begin \
01338 int _count = 0; \
01339 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
01340 foreach(this._name[i]) begin \
01341 if (_count <= 2 || _count >= this._name.num()-2) \
01342 $sformat(this.__vmm_image, `"%s %0d: %s`", this.__vmm_image, i,(this._name[i] == null) ? `"null`" : `"<ref>`"); \
01343 if (_count== 2 && this._name.num() > 5) begin \
01344 this.__vmm_image = {this.__vmm_image, `"\n...`"}; \
01345 end \
01346 _count++; \
01347 end \
01348 end \
01349 DO_COPY: begin \
01350 __vmm_rhs._name.delete(); \
01351 foreach(this._name[i]) begin \
01352 __vmm_rhs._name[i] = new; \
01353 __vmm_rhs._name[i] = this._name[i]; \
01354 end \
01355 end \
01356 DO_COMPARE: begin \
01357 if (__vmm_rhs._name.num() !== this._name.num()) begin \
01358 $sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
01359 this._name.num(), __vmm_rhs._name.num()); \
01360 this.__vmm_status = 0; \
01361 return; \
01362 end \
01363 foreach (this._name[i]) begin \
01364 if (!__vmm_rhs._name.exists(i)) begin \
01365 $sformat(this.__vmm_image, `"this._name[%0d] exists but to._name[%0d] does not`", i, i); \
01366 this.__vmm_status = 0; \
01367 return; \
01368 end \
01369 if (this._name[i] != __vmm_rhs._name[i]) begin \
01370 $sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
01371 this.__vmm_status = 0; \
01372 return; \
01373 end \
01374 end \
01375 end \
01376 DO_PACK: begin \
01377 end \
01378 DO_UNPACK: begin \
01379 foreach (this._name[i]) begin \
01380 this._name[i] = null; \
01381 end \
01382 end \
01383 endcase
01384
01385
01386 `define vmm_data_member_handle_aa_string(_name, _do) \
01387 \
01388 case (do_what & _do) \
01389 DO_PRINT: begin \
01390 int _count = 0; \
01391 $sformat(this.__vmm_image, `"%s\n%s``_name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
01392 foreach(this._name[i]) begin \
01393 if (_count <= 2 || _count >= this._name.num()-2) \
01394 $sformat(this.__vmm_image, `"%s ``%s': %s`", this.__vmm_image, i,(this._name[i] == null) ? `"null`" : `"<ref>`"); \
01395 if (_count== 2 && this._name.num() > 5) begin \
01396 this.__vmm_image = {this.__vmm_image, `"\n...`"}; \
01397 end \
01398 _count++; \
01399 end \
01400 end \
01401 DO_COPY: begin \
01402 __vmm_rhs._name.delete(); \
01403 foreach(this._name[i]) begin \
01404 __vmm_rhs._name[i] = new; \
01405 __vmm_rhs._name[i] = this._name[i]; \
01406 end \
01407 end \
01408 DO_COMPARE: begin \
01409 if (__vmm_rhs._name.num() !== this._name.num()) begin \
01410 $sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
01411 this._name.num(), __vmm_rhs._name.num()); \
01412 this.__vmm_status = 0; \
01413 return; \
01414 end \
01415 foreach (this._name[i]) begin \
01416 if (!__vmm_rhs._name.exists(i)) begin \
01417 $sformat(this.__vmm_image, `"this._name[``%s'] exists but to._name[``%s'] does not`", i, i); \
01418 this.__vmm_status = 0; \
01419 return; \
01420 end \
01421 if (this._name[i] != __vmm_rhs._name[i]) begin \
01422 $sformat(this.__vmm_image, `"this._name[``%s'] !== to._name[``%s']`", i, i); \
01423 this.__vmm_status = 0; \
01424 return; \
01425 end \
01426 end \
01427 end \
01428 DO_PACK: begin \
01429 end \
01430 DO_UNPACK: begin \
01431 foreach (this._name[i]) begin \
01432 this._name[i] = null; \
01433 end \
01434 end \
01435 endcase
01436
01437
01438 `define vmm_data_member_vmm_data(_name, _do, _how) \
01439 \
01440 case (do_what & _do) \
01441 DO_PRINT: begin \
01442 if ( _name == null ) begin \
01443 `vmm_warning(this.log, `" do-print 1jvmm_data _name object does not exist, no action`"); \
01444 end \
01445 else begin \
01446 string _prefix = this.__vmm_prefix; \
01447 $sformat(this.__vmm_image, `"%s\n%s`", this.__vmm_image, this._name.psdisplay({this.__vmm_prefix, `"_name: `"})); \
01448 this.__vmm_prefix = _prefix; \
01449 end \
01450 end \
01451 DO_COPY: begin \
01452 if (_name == null) begin \
01453 `vmm_warning(this.log, `" do-copy 1vmm_data _name object does not exist, no action`"); \
01454 end \
01455 else begin \
01456 case (_how & HOW_TO_COPY) \
01457 DO_REFCOPY: begin \
01458 __vmm_rhs._name = this._name; \
01459 end \
01460 DO_DEEPCOPY: begin \
01461 $cast(__vmm_rhs._name, this._name.copy()); \
01462 end \
01463 endcase \
01464 end \
01465 end \
01466 DO_COMPARE: begin \
01467 if (_name == null) begin \
01468 `vmm_warning(this.log, `" do-ccompare 1 vmm_data _name object does not exist, no action`"); \
01469 end \
01470 else begin \
01471 case (_how & HOW_TO_COMPARE) \
01472 DO_REFCOMPARE: begin \
01473 if (this._name != __vmm_rhs._name) begin \
01474 $sformat(this.__vmm_image, `"this._name !== to._name`"); \
01475 this.__vmm_status = 0; \
01476 return; \
01477 end \
01478 end \
01479 DO_DEEPCOMPARE: begin \
01480 string diff; \
01481 if (!this._name.compare(__vmm_rhs._name, diff)) begin \
01482 $sformat(this.__vmm_image, `"this._name !== to._name: %s `", diff); \
01483 this.__vmm_status = 0; \
01484 return; \
01485 end \
01486 end \
01487 endcase \
01488 end \
01489 end \
01490 DO_PACK: begin \
01491 int count=0; \
01492 if (_name == null) begin \
01493 `vmm_warning(this.log, `" vmm_data _name object does not exist, no action`"); \
01494 end \
01495 else begin \
01496 count = this._name.byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \
01497 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01498 end \
01499 end \
01500 DO_UNPACK: begin \
01501 int count=0; \
01502 this._name = new(); \
01503 count = this._name.byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \
01504 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01505 end \
01506 endcase
01507
01508
01509 `define vmm_data_member_vmm_data_array(_name, _do, _how) \
01510 \
01511 case (do_what & _do) \
01512 DO_PRINT: begin \
01513 int size =0; \
01514 string _prefix = this.__vmm_prefix; \
01515 size = $size(this._name); \
01516 for (int i = 0; i < size; i++) begin \
01517 string pf; \
01518 $sformat(pf, `"%s _name[%0d]: `", this.__vmm_prefix, i); \
01519 $sformat(this.__vmm_image, `"%s\n%s`", this.__vmm_image, this._name[i].psdisplay(pf)); \
01520 if (i == 2 && size > 5 ) begin \
01521 this.__vmm_image = {this.__vmm_image, `"\n`", _prefix, `"...`"}; \
01522 i = size -3; \
01523 end \
01524 end \
01525 this.__vmm_prefix = _prefix; \
01526 end \
01527 DO_COPY: begin \
01528 case (_how & HOW_TO_COPY) \
01529 DO_REFCOPY: begin \
01530 __vmm_rhs._name = this._name; \
01531 foreach (this._name[i]) begin \
01532 __vmm_rhs._name[i] = this._name[i]; \
01533 end \
01534 end \
01535 DO_DEEPCOPY: begin \
01536 __vmm_rhs._name = this._name; \
01537 foreach(this._name[i]) begin \
01538 $cast(__vmm_rhs._name[i], this._name[i].copy()); \
01539 end \
01540 end \
01541 endcase \
01542 end \
01543 DO_COMPARE: begin \
01544 string diff; \
01545 case (_how & HOW_TO_COMPARE) \
01546 DO_REFCOMPARE: begin \
01547 foreach (this._name[i]) begin \
01548 if (this._name[i] != __vmm_rhs._name[i]) begin \
01549 $sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
01550 this.__vmm_status = 0; \
01551 return; \
01552 end \
01553 end \
01554 end \
01555 DO_DEEPCOMPARE: begin \
01556 foreach(this._name[i]) begin \
01557 if (!this._name[i].compare(__vmm_rhs._name[i],diff)) begin \
01558 $sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]: %s`", i, i, diff); \
01559 this.__vmm_status = 0; \
01560 return; \
01561 end \
01562 end \
01563 end \
01564 endcase \
01565 end \
01566 DO_PACK: begin \
01567 int start; \
01568 int count; \
01569 bit [31:0] size=0; \
01570 start = this.__vmm_offset; \
01571 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01572 this.__vmm_maxbits = 0; \
01573 foreach (this._name[j]) begin \
01574 count = this._name[j].byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \
01575 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01576 size++; \
01577 end \
01578 `vmm_data_member_scalar_packint(pack,size,start,0) \
01579 this.__vmm_len = this.__vmm_offset; \
01580 end \
01581 DO_UNPACK: begin \
01582 int count; \
01583 int start; \
01584 int index; \
01585 string stemp; \
01586 bit [31:0] size = 0; \
01587 start = this.__vmm_offset; \
01588 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
01589 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01590 this.__vmm_maxbits =0; \
01591 for (int j=0; j < size; j++) begin \
01592 this._name[j] = new(); \
01593 count = this._name[j].byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \
01594 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01595 end \
01596 end \
01597 endcase
01598
01599
01600 `define vmm_data_member_vmm_data_da(_name, _do, _how) \
01601 \
01602 case (do_what & _do) \
01603 DO_PRINT: begin \
01604 string _prefix = this.__vmm_prefix; \
01605 for (int i = 0; i < this._name.size(); i++) begin \
01606 string pf; \
01607 $sformat(pf, `"%s``_name[%0d]: `", this.__vmm_prefix, i); \
01608 $sformat(this.__vmm_image, `"%s\n%s`", this.__vmm_image, this._name[i].psdisplay(pf)); \
01609 if (i == 2 && this._name.size() > 5) begin \
01610 this.__vmm_image = {this.__vmm_image, `"\n`", _prefix, `"...`"}; \
01611 i = this._name.size() - 3; \
01612 end \
01613 end \
01614 this.__vmm_prefix = _prefix; \
01615 end \
01616 DO_COPY: begin \
01617 case (_how & HOW_TO_COPY) \
01618 DO_REFCOPY: begin \
01619 __vmm_rhs._name = new [this._name.size()]; \
01620 foreach (this._name[i]) begin \
01621 __vmm_rhs._name[i] = this._name[i]; \
01622 end \
01623 end \
01624 DO_DEEPCOPY: begin \
01625 __vmm_rhs._name = new [this._name.size()]; \
01626 foreach(this._name[i]) begin \
01627 $cast(__vmm_rhs._name[i], this._name[i].copy()); \
01628 end \
01629 end \
01630 endcase \
01631 end \
01632 DO_COMPARE: begin \
01633 string diff; \
01634 if (__vmm_rhs._name.size() !== this._name.size()) begin \
01635 $sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
01636 this._name.size(), __vmm_rhs._name.size()); \
01637 this.__vmm_status = 0; \
01638 return; \
01639 end \
01640 case (_how & HOW_TO_COMPARE) \
01641 DO_REFCOMPARE: begin \
01642 foreach (this._name[i]) begin \
01643 if (this._name[i] != __vmm_rhs._name[i]) begin \
01644 $sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
01645 this.__vmm_status = 0; \
01646 return; \
01647 end \
01648 end \
01649 end \
01650 DO_DEEPCOMPARE: begin \
01651 foreach(this._name[i]) begin \
01652 if (!this._name[i].compare(__vmm_rhs._name[i],diff)) begin \
01653 $sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]: %s`", i, i, diff); \
01654 this.__vmm_status = 0; \
01655 return; \
01656 end \
01657 end \
01658 end \
01659 endcase \
01660 end \
01661 DO_PACK: begin \
01662 int start; \
01663 int count; \
01664 int index; \
01665 int element; \
01666 string stemp; \
01667 bit [31:0] size=0; \
01668 start = this.__vmm_offset; \
01669 size = this._name.size(); \
01670 `vmm_data_member_scalar_packint(pack,size,start,0) \
01671 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01672 this.__vmm_maxbits = 0; \
01673 foreach (this._name[j]) begin \
01674 count = this._name[j].byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \
01675 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01676 end \
01677 this.__vmm_len = this.__vmm_offset; \
01678 end \
01679 DO_UNPACK: begin \
01680 int count; \
01681 int start; \
01682 int index; \
01683 string stemp; \
01684 bit [31:0] size = 0; \
01685 start = this.__vmm_offset; \
01686 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
01687 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01688 this.__vmm_maxbits =0; \
01689 foreach (this._name[j]) begin \
01690 this._name[j] = new(); \
01691 count = this._name[j].byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \
01692 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01693 end \
01694 end \
01695 endcase
01696
01697 `define vmm_data_member_vmm_data_aa_scalar(_name, _do, _how) \
01698 \
01699 case (do_what & _do) \
01700 DO_PRINT: begin \
01701 int _count = 0; \
01702 string _prefix = this.__vmm_prefix; \
01703 foreach (this._name[i]) begin \
01704 if (_count <= 2 || _count >= this._name.num()-2) begin \
01705 string pf; \
01706 $sformat(pf, `"%s``_name[%0d]`", this.__vmm_prefix, i); \
01707 $sformat(this.__vmm_image, `"%s\n%s`", this.__vmm_image, this._name[i].psdisplay(pf)); \
01708 if (_count== 2 && this._name.num() > 5) begin \
01709 this.__vmm_image = {this.__vmm_image, `"\n`", _prefix, `"...`"}; \
01710 end \
01711 _count++; \
01712 end \
01713 end \
01714 this.__vmm_prefix = _prefix; \
01715 end \
01716 DO_COPY: begin \
01717 case (_how & HOW_TO_COPY) \
01718 DO_REFCOPY: begin \
01719 __vmm_rhs._name.delete(); \
01720 foreach (this._name[i]) begin \
01721 __vmm_rhs._name[i] = this._name[i]; \
01722 end \
01723 end \
01724 DO_DEEPCOPY: begin \
01725 __vmm_rhs._name.delete(); \
01726 foreach(this._name[i]) begin \
01727 $cast(__vmm_rhs._name[i], this._name[i].copy()); \
01728 end \
01729 end \
01730 endcase \
01731 end \
01732 DO_COMPARE: begin \
01733 string diff; \
01734 if (__vmm_rhs._name.num() !== this._name.num()) begin \
01735 $sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
01736 this._name.num(), __vmm_rhs._name.num()); \
01737 this.__vmm_status = 0; \
01738 return; \
01739 end \
01740 case (_how & HOW_TO_COMPARE) \
01741 DO_REFCOMPARE: begin \
01742 __vmm_rhs._name.delete(); \
01743 foreach (this._name[i]) begin \
01744 if (!__vmm_rhs._name.exists(i)) begin \
01745 $sformat(this.__vmm_image, `"this._name[%0d] exists but to._name[%0d] does not`", i, i); \
01746 this.__vmm_status = 0; \
01747 return; \
01748 end \
01749 if (this._name[i] != __vmm_rhs._name[i]) begin \
01750 $sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
01751 this.__vmm_status = 0; \
01752 return; \
01753 end \
01754 end \
01755 end \
01756 DO_DEEPCOMPARE: begin \
01757 __vmm_rhs._name.delete(); \
01758 foreach(this._name[i]) begin \
01759 if (!__vmm_rhs._name.exists(i)) begin \
01760 $sformat(this.__vmm_image, `"this._name[%0d] exists but to._name[%0d] does not`", i, i); \
01761 this.__vmm_status = 0; \
01762 return; \
01763 end \
01764 if (!this._name[i].compare(__vmm_rhs._name[i], diff)) begin \
01765 $sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]: %s`", i, i, diff); \
01766 this.__vmm_status = 0; \
01767 return; \
01768 end \
01769 end \
01770 end \
01771 endcase \
01772 end \
01773 DO_PACK: begin \
01774 int start; \
01775 int count; \
01776 int index; \
01777 string stemp; \
01778 bit [31:0] size=0; \
01779 start = this.__vmm_offset; \
01780 this.__vmm_maxbits = 0; \
01781 size = this._name.num(); \
01782 `vmm_data_member_scalar_packint(pack,size,start,0) \
01783 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01784 foreach (this._name[j]) begin \
01785 this.__vmm_maxbits = 0; \
01786 index = j; \
01787 `vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \
01788 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01789 count = this._name[j].byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \
01790 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01791 end \
01792 this.__vmm_len = this.__vmm_offset; \
01793 end \
01794 DO_UNPACK: begin \
01795 int count; \
01796 int start; \
01797 int index=0; \
01798 string stemp; \
01799 bit [31:0] size = 0; \
01800 start = this.__vmm_offset; \
01801 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
01802 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01803 this.__vmm_maxbits =0; \
01804 for (int j=0; j < size; j++) begin \
01805 this.__vmm_maxbits =0; \
01806 `vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \
01807 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01808 this._name[index] = new(); \
01809 count = this._name[index].byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \
01810 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01811 end \
01812 end \
01813 endcase
01814
01815
01816 `define vmm_data_member_vmm_data_aa_string(_name, _do, _how) \
01817 \
01818 case (do_what & _do) \
01819 DO_PRINT: begin \
01820 int _count = 0; \
01821 string _prefix = this.__vmm_prefix; \
01822 foreach (this._name[i]) begin \
01823 if (_count <= 2 || _count >= this._name.num()-2) begin \
01824 string pf; \
01825 $sformat(pf, `"%s``_name[``%s']`", this.__vmm_prefix, i); \
01826 $sformat(this.__vmm_image, `"%s\n%s`", this.__vmm_image, this._name[i].psdisplay(pf)); \
01827 if (_count== 2 && this._name.num() > 5) begin \
01828 this.__vmm_image = {this.__vmm_image, `"\n`", _prefix, `"...`"}; \
01829 end \
01830 _count++; \
01831 end \
01832 end \
01833 this.__vmm_prefix = _prefix; \
01834 end \
01835 DO_COPY: begin \
01836 case (_how & HOW_TO_COPY) \
01837 DO_REFCOPY: begin \
01838 this.__vmm_rhs._name.delete(); \
01839 foreach (this._name[i]) begin \
01840 this.__vmm_rhs._name[i] = this._name[i]; \
01841 end \
01842 end \
01843 DO_DEEPCOPY: begin \
01844 this.__vmm_rhs._name.delete(); \
01845 foreach(this._name[i]) begin \
01846 $cast(this.__vmm_rhs._name[i], this._name[i].copy()); \
01847 end \
01848 end \
01849 endcase \
01850 end \
01851 DO_COMPARE: begin \
01852 string diff; \
01853 if (this.__vmm_rhs._name.num() !== this._name.num()) begin \
01854 $sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
01855 this._name.num(), this.__vmm_rhs._name.num()); \
01856 this.__vmm_status = 0; \
01857 return; \
01858 end \
01859 case (_how & HOW_TO_COMPARE) \
01860 DO_REFCOMPARE: begin \
01861 this.__vmm_rhs._name.delete(); \
01862 foreach (this._name[i]) begin \
01863 if (!this.__vmm_rhs._name.exists(i)) begin \
01864 $sformat(this.__vmm_image, `"this._name[``%s'] exists but to._name[``%s'] does not`", i, i); \
01865 this.__vmm_status = 0; \
01866 return; \
01867 end \
01868 if (this._name[i] != this.__vmm_rhs._name[i]) begin \
01869 $sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
01870 this.__vmm_status = 0; \
01871 return; \
01872 end \
01873 end \
01874 end \
01875 DO_DEEPCOMPARE: begin \
01876 this.__vmm_rhs._name.delete(); \
01877 foreach(this._name[i]) begin \
01878 if (!this.__vmm_rhs._name.exists(i)) begin \
01879 $sformat(this.__vmm_image, `"this._name[``%s'] exists but to._name[``%s'] does not`", i, i); \
01880 this.__vmm_status = 0; \
01881 return; \
01882 end \
01883 if (!this._name[i].compare(this.__vmm_rhs._name[i], diff)) begin \
01884 $sformat(this.__vmm_image, `"this._name[``%s'] !== to._name[``%s']: %s`", i, i, diff); \
01885 this.__vmm_status = 0; \
01886 return; \
01887 end \
01888 end \
01889 end \
01890 endcase \
01891 end \
01892 DO_PACK: begin \
01893 int start; \
01894 int count; \
01895 int index; \
01896 string sindextemp; \
01897 int sindexcount; \
01898 string stemp; \
01899 bit [31:0] size=0; \
01900 start = this.__vmm_offset; \
01901 stemp = this._name.first(sindextemp); \
01902 index = 0; \
01903 size = this._name.num(); \
01904 `vmm_data_member_scalar_packint(pack,size,start,0) \
01905 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01906 this.__vmm_maxbits = 0; \
01907 foreach (this._name[j]) begin \
01908 this.__vmm_maxbits =0; \
01909 sindextemp = j; \
01910 sindexcount = sindextemp.len(); \
01911 this.__vmm_maxbits = sindextemp; \
01912 `vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \
01913 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01914 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
01915 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
01916 this.__vmm_maxbits =0; \
01917 count = this._name[j].byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \
01918 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01919 end \
01920 this.__vmm_len = this.__vmm_offset; \
01921 end \
01922 DO_UNPACK: begin \
01923 int start; \
01924 int count; \
01925 int index; \
01926 string sindextemp; \
01927 int sindexcount; \
01928 string stemp; \
01929 bit [31:0] size=0; \
01930 index = 0; \
01931 start = this.__vmm_offset; \
01932 `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
01933 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01934 this.__vmm_maxbits = 0; \
01935 for (int j=0; j < size; j++) begin \
01936 this.__vmm_maxbits = 0; \
01937 `vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \
01938 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01939 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
01940 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
01941 sindextemp = this.__vmm_maxbits; \
01942 this.__vmm_maxbits = 0; \
01943 this._name[sindextemp] = new(); \
01944 count = this._name[sindextemp].byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \
01945 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01946 end \
01947 end \
01948 endcase
01949
01950
01951 `define vmm_data_member_user_defined(_name) \
01952 \
01953 this.__vmm_status = this.do_``_name(do_what, this.__vmm_prefix, this.__vmm_image, \
01954 this.__vmm_rhs, \
01955 this.__vmm_kind, this.__vmm_offset, pack, unpack); \
01956 if (__vmm_status == 0) return;
01957
01958
01959 `define vmm_data_member_end(_class) \
01960 endfunction \
01961 \
01962 static `VMM_LOG log = new(`"_class`", `"class`"); \
01963 \
01964 function new(vmm_log log = null); \
01965 super.new((log == null) ? this.log : log); \
01966 endfunction \
01967 \
01968 virtual function vmm_data allocate(); \
01969 _class i = new; \
01970 return i; \
01971 endfunction \
01972 \
01973 virtual function bit is_valid(bit silent = 1, \
01974 int kind = -1); \
01975 return 1; \
01976 endfunction \
01977 \
01978 virtual function string psdisplay(string prefix = `"`"); \
01979 $sformat(this.__vmm_image, `"%s``_class (%0d.%0d.%0d):`", prefix, \
01980 this.stream_id, this.scenario_id, this.data_id); \
01981 this.__vmm_done_user = 1; \
01982 psdisplay = this.do_psdisplay(prefix); \
01983 if (this.__vmm_done_user) return psdisplay; \
01984 \
01985 this.__vmm_prefix = prefix; \
01986 if (`vmm_str_match(prefix, ": $")) begin \
01987 this.__vmm_prefix = {`vmm_str_prematch(prefix), "."}; \
01988 end \
01989 this.do_all(DO_PRINT, __vmm_bytes, __vmm_bytes); \
01990 return this.__vmm_image; \
01991 endfunction \
01992 \
01993 virtual function vmm_data copy(vmm_data to = null); \
01994 _class cpy; \
01995 \
01996 this.__vmm_done_user = 1; \
01997 copy = this.do_copy(to); \
01998 if (this.__vmm_done_user) return copy; \
01999 \
02000 if (to == null) cpy = new; \
02001 else if (!$cast(cpy, to)) begin \
02002 `vmm_fatal(this.log, `"Cannot copy to non-_class instance`"); \
02003 return null; \
02004 end \
02005 \
02006 super.copy_data(cpy); \
02007 this.__vmm_rhs = cpy; \
02008 this.do_all(DO_COPY, __vmm_bytes, __vmm_bytes); \
02009 \
02010 return cpy; \
02011 endfunction \
02012 \
02013 virtual function bit compare( vmm_data to, \
02014 output string diff, \
02015 input int kind = -1); \
02016 _class cp; \
02017 \
02018 this.__vmm_done_user = 1; \
02019 compare = this.do_compare(to, diff, kind); \
02020 if (this.__vmm_done_user) return compare; \
02021 \
02022 if (!$cast(cp, to)) begin \
02023 `vmm_fatal(this.log, `"Cannot compare to non-_class instance`"); \
02024 return 0; \
02025 end \
02026 \
02027 this.__vmm_rhs = cp; \
02028 this.__vmm_kind = kind; \
02029 this.do_all(DO_COMPARE, __vmm_bytes, __vmm_bytes); \
02030 diff = this.__vmm_image; \
02031 \
02032 return this.__vmm_status; \
02033 endfunction \
02034 \
02035 virtual function int unsigned byte_pack(ref logic [7:0] bytes[], \
02036 input int unsigned offset = 0, \
02037 input int kind = -1); \
02038 int min_size; \
02039 this.__vmm_done_user = 1; \
02040 byte_pack = this.do_byte_pack(bytes, offset, kind); \
02041 if (this.__vmm_done_user) return byte_pack; \
02042 \
02043 min_size = offset + this.__vmm_byte_size(kind); \
02044 if (bytes.size() < min_size) bytes = new [min_size] (bytes); \
02045 this.__vmm_offset = offset; \
02046 this.__vmm_kind = kind; \
02047 this.do_all(DO_PACK, bytes, __vmm_bytes); \
02048 \
02049 return this.__vmm_offset - offset; \
02050 endfunction \
02051 \
02052 virtual function int unsigned byte_unpack(const ref logic [7:0] bytes[], \
02053 input int unsigned offset = 0, \
02054 input int len = -1, \
02055 input int kind = -1); \
02056 this.__vmm_done_user = 1; \
02057 byte_unpack = this.do_byte_unpack(bytes, offset, len, kind); \
02058 if (this.__vmm_done_user) return byte_unpack; \
02059 \
02060 this.__vmm_offset = offset; \
02061 this.__vmm_kind = kind; \
02062 this.do_all(DO_UNPACK, __vmm_bytes, bytes); \
02063 \
02064 return this.__vmm_offset - offset; \
02065 endfunction
02066
02067
02068 `define vmm_data_byte_size(_max, _n) \
02069 virtual protected function int unsigned __vmm_byte_size(int kind = -1); \
02070 return this.byte_size(kind); \
02071 endfunction: __vmm_byte_size \
02072 \
02073 virtual function int unsigned byte_size(int kind = -1); \
02074 this.__vmm_done_user = 1; \
02075 byte_size = this.do_byte_size(kind); \
02076 if (this.__vmm_done_user) return byte_size; \
02077 \
02078 return _n; \
02079 endfunction: byte_size \
02080 \
02081 virtual function int unsigned max_byte_size(int kind = -1); \
02082 this.__vmm_done_user = 1; \
02083 max_byte_size = this.do_max_byte_size(kind); \
02084 if (this.__vmm_done_user) return max_byte_size; \
02085 \
02086 return _max; \
02087 endfunction
02088