00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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) ?