VMM OpenSource - sv/std_lib/vmm_data_macros.sv

sv/std_lib/vmm_data_macros.sv expanded source

00001 // 
00002 // -------------------------------------------------------------
00003 //    Copyright 2004-2008 Synopsys, Inc.
00004 //    All Rights Reserved Worldwide
00005 // 
00006 //    Licensed under the Apache License, Version 2.0 (the
00007 //    "License"); you may not use this file except in
00008 //    compliance with the License.  You may obtain a copy of
00009 //    the License at
00010 // 
00011 //        http://www.apache.org/licenses/LICENSE-2.0
00012 // 
00013 //    Unless required by applicable law or agreed to in
00014 //    writing, software distributed under the License is
00015 //    distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
00016 //    CONDITIONS OF ANY KIND, either express or implied.  See
00017 //    the License for the specific language governing
00018 //    permissions and limitations under the License.
00019 // -------------------------------------------------------------
00020 // 
00021 
00022 
00023 `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