VMM OpenSource - (expanded) sv/std_lib/vmm_data_macros.sv

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

sv/std_lib/vmm_data_macros.sv unexpanded source

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