vmm_data_macros.sv

Go to the documentation of this file.
00001 // 
00002 // -------------------------------------------------------------
00003 //    Copyright 2004-2008 Synopsys, Inc.
00004 //    All Rights Reserved Worldwide
00005 // 
00006 //    Licensed under the Apache License, Version 2.0 (the
00007 //    "License"); you may not use this file except in
00008 //    compliance with the License.  You may obtain a copy of
00009 //    the License at
00010 // 
00011 //        http://www.apache.org/licenses/LICENSE-2.0
00012 // 
00013 //    Unless required by applicable law or agreed to in
00014 //    writing, software distributed under the License is
00015 //    distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
00016 //    CONDITIONS OF ANY KIND, either express or implied.  See
00017 //    the License for the specific language governing
00018 //    permissions and limitations under the License.
00019 // -------------------------------------------------------------
00020 // 
00021 
00022 
00023 `include "std_lib/vmm_data_macros_utils.sv"
00024 
00025 
00026 `define vmm_data_member_begin(_class) \
00027  \
00028    protected static _class __vmm_rhs; \
00029  \
00030    function void do_all(vmm_data::do_what_e do_what, \
00031                         ref logic [7:0] pack[], \
00032                         const ref logic [7:0] unpack[]); \
00033       super.__vmm_rhs = this.__vmm_rhs; \
00034       this.__vmm_status = 1; \
00035       super.do_all(do_what, pack, unpack); \
00036       if (super.__vmm_status == 0) return;
00037 
00038 `define vmm_data_member_scalar(_name, _do) \
00039   \
00040       case (do_what & _do) \
00041         DO_PRINT: begin \
00042            $sformat(this.__vmm_image, "%s\n%s   _name='h%0h", this.__vmm_image, this.__vmm_prefix, this._name); \
00043         end \
00044         DO_COPY: begin \
00045            __vmm_rhs._name = this._name; \
00046         end \
00047         DO_COMPARE: begin \
00048            if (__vmm_rhs._name !== this._name) begin \
00049               $sformat(this.__vmm_image, "this._name ('h%0h) !== to._name ('h%0h)", \
00050                        this._name, __vmm_rhs._name); \
00051               this.__vmm_status = 0; \
00052               return; \
00053            end \
00054         end \
00055         DO_PACK: begin \
00056       int start; \
00057       int count; \
00058       start = this.__vmm_offset; \
00059       `vmm_data_member_scalar_count(this._name,count) \
00060       this.__vmm_maxbits = this._name; \
00061       `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00062            `vmm_data_member_update_offset(this.__vmm_offset,count) \
00063       this.__vmm_len = this.__vmm_offset; \
00064       end \
00065         DO_UNPACK: begin \
00066       int count; \
00067       int start; \
00068       start = this.__vmm_offset; \
00069       `vmm_data_member_scalar_count(this._name,count) \
00070       `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00071       this._name = this.__vmm_maxbits; \
00072            `vmm_data_member_update_offset(this.__vmm_offset,count) \
00073       end \
00074       endcase
00075 
00076 `define vmm_data_member_scalar_array(_name, _do) \
00077  \
00078       case (do_what & _do) \
00079         DO_PRINT: begin \
00080       int size =0; \
00081       size = $size(this._name); \
00082            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, this.__vmm_prefix, size); \
00083            for (int i = 0; i < size; i++) begin \
00084               $sformat(this.__vmm_image, "%s 'h%0h", this.__vmm_image, this._name[i]); \
00085               if (i == 2 && size > 5) begin \
00086                  this.__vmm_image = {this.__vmm_image, " ..."}; \
00087                  i = size - 3; \
00088               end \
00089            end \
00090         end \
00091         DO_COPY: begin \
00092       __vmm_rhs._name = this._name; \
00093         end \
00094         DO_COMPARE: begin \
00095            foreach (this._name[i]) begin \
00096               if (__vmm_rhs._name[i] !== this._name[i]) begin \
00097                  $sformat(this.__vmm_image, "this._name[%0d] ('h%0h) !== to._name[%0d] ('h%0h)", \
00098                           i, this._name[i], i, __vmm_rhs._name[i]); \
00099                  this.__vmm_status = 0; \
00100                  return; \
00101               end \
00102            end \
00103         end \
00104         DO_PACK: begin \
00105       int start; \
00106       int count; \
00107       bit [31:0] size=0; \
00108       start = this.__vmm_offset; \
00109            `vmm_data_member_update_offset(this.__vmm_offset,8) \
00110       foreach (this._name[j]) begin \
00111               if ( j == 0 ) \
00112              `vmm_data_member_scalar_count(this._name[j],count) \
00113          this.__vmm_maxbits = this._name[j]; \
00114               `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00115               `vmm_data_member_update_offset(this.__vmm_offset,count) \
00116          size++; \
00117       end \
00118            `vmm_data_member_scalar_packint(pack,size,start,0) \
00119            `vmm_data_member_scalar_packint(pack,count,(start+4),0) \
00120       this.__vmm_len = this.__vmm_offset; \
00121         end \
00122         DO_UNPACK: begin \
00123       int start; \
00124       int count; \
00125       bit [31:0] size = 0; \
00126            `vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \
00127            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00128            `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00129            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00130       for (int j=0; j < size; j++) begin \
00131          `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00132          this._name[j] = this.__vmm_maxbits; \
00133               `vmm_data_member_update_offset(this.__vmm_offset,count) \
00134            end \
00135         end \
00136       endcase
00137 
00138 
00139 `define vmm_data_member_scalar_da(_name, _do) \
00140  \
00141       case (do_what & _do) \
00142         DO_PRINT: begin \
00143            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.size()); \
00144            for (int i = 0; i < this._name.size(); i++) begin \
00145               $sformat(this.__vmm_image, "%s 'h%0h", this.__vmm_image, this._name[i]); \
00146               if (i == 2 && this._name.size() > 5) begin \
00147                  this.__vmm_image = {this.__vmm_image, " ..."}; \
00148                  i = this._name.size() - 3; \
00149               end \
00150            end \
00151         end \
00152         DO_COPY: begin \
00153       __vmm_rhs._name = new [this._name.size()];   \
00154       foreach(this._name[i]) __vmm_rhs._name[i]=this._name[i]; \
00155         end \
00156         DO_COMPARE: begin \
00157            if (__vmm_rhs._name.size() !== this._name.size()) begin \
00158               $sformat(this.__vmm_image, "this._name.size() (%0d) !== to._name.size() (%0d)", \
00159                        this._name.size(), __vmm_rhs._name.size()); \
00160               this.__vmm_status = 0; \
00161               return; \
00162            end \
00163            foreach (this._name[i]) begin \
00164               if (__vmm_rhs._name[i] !== this._name[i]) begin \
00165                  $sformat(this.__vmm_image, "this._name[%0d] ('h%0h) !== to._name[%0d] ('h%0h)", \
00166                           i, this._name[i], i, __vmm_rhs._name[i]); \
00167                  this.__vmm_status = 0; \
00168                  return; \
00169               end \
00170            end \
00171         end \
00172         DO_PACK: begin \
00173       int start; \
00174       int count; \
00175       int index; \
00176       bit [31:0] size=0; \
00177       start = this.__vmm_offset; \
00178       size = this._name.size(); \
00179       foreach (this._name[j]) begin \
00180          if ( j == 0) begin \
00181                   `vmm_data_member_scalar_count(this._name[j],count) \
00182                   `vmm_data_member_update_offset(this.__vmm_offset,8) \
00183          end \
00184          this.__vmm_maxbits = this._name[j]; \
00185               `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00186               `vmm_data_member_update_offset(this.__vmm_offset,count) \
00187       end \
00188       this.__vmm_len = this.__vmm_offset; \
00189            `vmm_data_member_scalar_packint(pack,size,start,0) \
00190            `vmm_data_member_scalar_packint(pack,count,(start+4),0) \
00191         end \
00192         DO_UNPACK: begin \
00193       int start; \
00194       int count; \
00195       int index; \
00196       bit [31:0] size = 0; \
00197            `vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \
00198            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00199            `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00200            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00201       this._name  = new [size]; \
00202       for (int j=0; j < size; j++) begin \
00203          `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00204          this._name[j] = this.__vmm_maxbits; \
00205               `vmm_data_member_update_offset(this.__vmm_offset,count) \
00206            end \
00207         end \
00208       endcase
00209 
00210 
00211 `define vmm_data_member_scalar_aa_scalar(_name, _do) \
00212  \
00213       case (do_what & _do) \
00214         DO_PRINT: begin \
00215       int _count = 0;   \
00216            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, \
00217                     this.__vmm_prefix, this._name.num()); \
00218       foreach (this._name[i]) begin \
00219          if (_count <= 2 || _count >= this._name.num()-2) \
00220                  $sformat(this.__vmm_image, "%s %0d:`h%0h", this.__vmm_image, \
00221                           i, this._name[i]); \
00222               if (_count == 2 && this._name.num() > 5) begin \
00223                  this.__vmm_image = {this.__vmm_image, " ..."}; \
00224               end \
00225          _count++;   \
00226            end \
00227         end \
00228         DO_COPY: begin \
00229       __vmm_rhs._name.delete();  \
00230         foreach(this._name[i]) begin \
00231       __vmm_rhs._name[i]=this._name[i]; \
00232         end \
00233         end \
00234         DO_COMPARE: begin \
00235            if (__vmm_rhs._name.num() !== this._name.num()) begin \
00236               $sformat(this.__vmm_image, "this._name.num() (%0d) !== to._name.num() (%0d)", \
00237                        this._name.num(), __vmm_rhs._name.num()); \
00238               this.__vmm_status = 0; \
00239               return; \
00240            end \
00241            foreach (this._name[i]) begin \
00242          if (!__vmm_rhs._name.exists(i)) begin  \
00243        $sformat(this.__vmm_image, "this._name[%0d] exists but to._name[%0d] does not", \
00244            i, i); \
00245        this.__vmm_status = 0; \
00246        return; \
00247          end \
00248               else if (__vmm_rhs._name[i] != this._name[i]) begin \
00249                 $sformat(this.__vmm_image, "this._name[%0d]:'h%0h !== to._name[%0d]:'h%0h", \
00250                          i, this._name[i], i, __vmm_rhs._name[i]); \
00251                 this.__vmm_status = 0; \
00252                 return; \
00253               end \
00254            end \
00255         end \
00256         DO_PACK: begin \
00257       int start; \
00258       int count; \
00259       int index; \
00260       int element=0; \
00261       bit [31:0] size=0; \
00262       start = this.__vmm_offset; \
00263            element = this._name.first(index); \
00264            `vmm_data_member_scalar_count(element,count) \
00265       element = 0; \
00266       size = this._name.num(); \
00267       foreach (this._name[j]) begin \
00268          this.__vmm_maxbits = this._name[j]; \
00269          index = j; \
00270          if (element == 0 ) begin\
00271                   `vmm_data_member_update_offset(this.__vmm_offset,8) \
00272               element = 1; \
00273          end \
00274               `vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \
00275               `vmm_data_member_update_offset(this.__vmm_offset,4) \
00276               `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00277               `vmm_data_member_update_offset(this.__vmm_offset,count) \
00278       end \
00279       this.__vmm_len = this.__vmm_offset; \
00280       `vmm_data_member_scalar_packint(pack,size,start,0) \
00281       `vmm_data_member_scalar_packint(pack,count,(start+4),0) \
00282         end \
00283         DO_UNPACK: begin \
00284       int start; \
00285       int count; \
00286       int index; \
00287       bit [31:0] size = 0; \
00288       start = this.__vmm_offset; \
00289            `vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \
00290            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00291            `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00292            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00293       for (int j=0; j < size; j++) begin \
00294                 `vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \
00295                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00296                 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00297                 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00298             this._name[index] = this.__vmm_maxbits; \
00299       end \
00300         end \
00301       endcase
00302 
00303 `define vmm_data_member_scalar_aa_string(_name, _do) \
00304  \
00305       case (do_what & _do) \
00306         DO_PRINT: begin \
00307       int _count = 0; \
00308            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, \
00309                     this.__vmm_prefix, this._name.num()); \
00310       foreach (this._name[i]) begin \
00311          if (_count <= 2 || _count >= this._name.num()-2)  \
00312                $sformat(this.__vmm_image, "%s \"%s\":'h%0h", this.__vmm_image, i, this._name[i]); \
00313               if (_count == 2 && this._name.num() > 5) begin \
00314                  this.__vmm_image = {this.__vmm_image, " ..."}; \
00315               end \
00316          _count++; \
00317            end \
00318         end \
00319         DO_COPY: begin \
00320       __vmm_rhs._name.delete(); \
00321       foreach(this._name[i]) begin \
00322          __vmm_rhs._name[i] = this._name[i]; \
00323       end \
00324         end \
00325         DO_COMPARE: begin \
00326            if (__vmm_rhs._name.num() !== this._name.num()) begin \
00327               $sformat(this.__vmm_image, "this._name.num() (%0d) !== to._name.num() (%0d)", \
00328                        this._name.num(), __vmm_rhs._name.num()); \
00329               this.__vmm_status = 0; \
00330               return; \
00331            end \
00332            foreach (this._name[i]) begin \
00333          if(!__vmm_rhs._name.exists(i)) begin  \
00334        $sformat(this.__vmm_image, "this._name[\"%s\"] exists but to._name[\"%s\"] does not", \
00335            i, i); \
00336        this.__vmm_status = 0; \
00337        return; \
00338          end \
00339               else if (__vmm_rhs._name[i] != this._name[i]) begin \
00340                 $sformat(this.__vmm_image, "this._name[\"%s\"]:'h%0h !== to._name[\"%s\"]:'h%0h", \
00341                          i, this._name[i], i, __vmm_rhs._name[i]); \
00342                 this.__vmm_status = 0; \
00343                 return; \
00344               end \
00345            end \
00346         end \
00347         DO_PACK: begin \
00348       int start; \
00349       int count; \
00350       string  sindextemp; \
00351       int sindexcount; \
00352       string  stemp; \
00353       bit [31:0] size=0; \
00354       start = this.__vmm_offset; \
00355            stemp = this._name.first(sindextemp); \
00356       size = this._name.num(); \
00357       `vmm_data_member_scalar_packint(pack,size,start,0) \
00358            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00359       this.__vmm_maxbits = 0; \
00360       foreach (this._name[j]) begin \
00361          this.__vmm_maxbits =0; \
00362          sindextemp = j; \
00363          sindexcount = sindextemp.len(); \
00364          this.__vmm_maxbits = sindextemp; \
00365          `vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \
00366               `vmm_data_member_update_offset(this.__vmm_offset,4) \
00367               `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
00368               `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
00369               this.__vmm_maxbits =0; \
00370          `vmm_data_member_scalar_count(this._name[j],count) \
00371          `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00372               `vmm_data_member_update_offset(this.__vmm_offset,4) \
00373          this.__vmm_maxbits = this._name[j]; \
00374               `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00375               `vmm_data_member_update_offset(this.__vmm_offset,count) \
00376       end \
00377       this.__vmm_len = this.__vmm_offset; \
00378         end \
00379         DO_UNPACK: begin \
00380       int start; \
00381       int count; \
00382       string  sindextemp; \
00383       int sindexcount; \
00384       string  stemp; \
00385       bit [31:0] size=0; \
00386       this.__vmm_maxbits = 0; \
00387       start = this.__vmm_offset; \
00388       `vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \
00389            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00390       for (int j=0; j < size; j++) begin \
00391            `vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \
00392                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00393            `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
00394            sindextemp = this.__vmm_maxbits; \
00395                 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
00396            this.__vmm_maxbits = 0; \
00397            `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00398                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00399            `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00400            this._name[sindextemp] = this.__vmm_maxbits; \
00401                 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00402       end \
00403         end \
00404       endcase
00405 
00406 
00407 `define vmm_data_member_string(_name, _do) \
00408   \
00409       case (do_what & _do) \
00410         DO_PRINT: begin \
00411           $sformat(this.__vmm_image, "%s\n%s   _name=\"%s\"", this.__vmm_image, this.__vmm_prefix, this._name); \
00412         end \
00413         DO_COPY: begin \
00414            __vmm_rhs._name = this._name; \
00415         end \
00416         DO_COMPARE: begin \
00417            if (__vmm_rhs._name != this._name) begin \
00418              $sformat(this.__vmm_image, "this._name (\"%s\") !== to._name (\"%s\")", \
00419                        this._name, __vmm_rhs._name); \
00420               this.__vmm_status = 0; \
00421               return; \
00422            end \
00423         end \
00424         DO_PACK: begin \
00425       int start; \
00426       int count; \
00427       start = this.__vmm_offset; \
00428       count = (this._name.len()); \
00429       this.__vmm_maxbits = 0; \
00430            `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00431            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00432       this.__vmm_maxbits = this._name; \
00433       `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00434            `vmm_data_member_update_offset(this.__vmm_offset,count) \
00435       this.__vmm_len = this.__vmm_offset; \
00436       end \
00437         DO_UNPACK: begin \
00438       int count; \
00439       int start; \
00440       int size; \
00441       this.__vmm_maxbits = 0; \
00442       start = this.__vmm_offset; \
00443            `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00444            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00445            `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00446       this._name = this.__vmm_maxbits; \
00447            `vmm_data_member_update_offset(this.__vmm_offset,count) \
00448       end \
00449       endcase
00450 
00451 
00452 `define vmm_data_member_string_array(_name, _do) \
00453  \
00454       case (do_what & _do) \
00455         DO_PRINT: begin \
00456       int size =0; \
00457       size = $size(this._name); \
00458            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, this.__vmm_prefix, size); \
00459            for (int i = 0; i < size; i++) begin \
00460               $sformat(this.__vmm_image, "%s \"%s\"", this.__vmm_image, this._name[i]); \
00461               if (i == 2 && size > 5) begin \
00462                  this.__vmm_image = {this.__vmm_image, " ..."}; \
00463                  i = size - 3; \
00464               end \
00465            end \
00466         end \
00467         DO_COPY: begin \
00468       __vmm_rhs._name = this._name; \
00469         end \
00470         DO_COMPARE: begin \
00471            foreach (this._name[i]) begin \
00472               if (__vmm_rhs._name[i] != this._name[i]) begin \
00473                  $sformat(this.__vmm_image, "this._name[%0d] (%s) !== to._name[%0d] (%s)", \
00474                           i, this._name[i], i, __vmm_rhs._name[i]); \
00475                  this.__vmm_status = 0; \
00476                  return; \
00477               end \
00478            end \
00479         end \
00480         DO_PACK: begin \
00481       int start; \
00482       int count; \
00483       string stemp; \
00484       bit [31:0] size=0; \
00485       start = this.__vmm_offset; \
00486            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00487       this.__vmm_maxbits =0; \
00488       foreach (this._name[j]) begin \
00489            count = (this._name[j].len()); \
00490            this.__vmm_maxbits = this._name[j]; \
00491          `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00492             `vmm_data_member_update_offset(this.__vmm_offset,4) \
00493          `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00494             `vmm_data_member_update_offset(this.__vmm_offset,count) \
00495          size++; \
00496       end \
00497       `vmm_data_member_scalar_packint(pack,size,start,0) \
00498        this.__vmm_len = this.__vmm_offset; \
00499         end \
00500         DO_UNPACK: begin \
00501       int count; \
00502            int start; \
00503            bit [31:0] size = 0; \
00504       start = this.__vmm_offset; \
00505       this.__vmm_maxbits =0; \
00506            `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
00507            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00508            for (int j=0; j < size; j++) begin \
00509        this.__vmm_maxbits =""; \
00510                  `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00511                  `vmm_data_member_update_offset(this.__vmm_offset,4) \
00512                  `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00513                  `vmm_data_member_update_offset(this.__vmm_offset,count) \
00514        this._name[j] = this.__vmm_maxbits; \
00515        this.__vmm_maxbits =""; \
00516            end  \
00517         end \
00518       endcase
00519 
00520 `define vmm_data_member_string_da(_name, _do) \
00521  \
00522       case (do_what & _do) \
00523         DO_PRINT: begin \
00524            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.size()); \
00525            for (int i = 0; i < this._name.size(); i++) begin \
00526               $sformat(this.__vmm_image, "%s \"%s\"", this.__vmm_image, this._name[i]); \
00527               if (i == 2 && this._name.size() > 5) begin \
00528                  this.__vmm_image = {this.__vmm_image, " ..."}; \
00529                  i = this._name.size() - 3; \
00530               end \
00531            end \
00532         end \
00533         DO_COPY: begin \
00534       __vmm_rhs._name = new [this._name.size()]; \
00535       foreach(this._name[i]) __vmm_rhs._name[i] = this._name[i]; \
00536         end \
00537         DO_COMPARE: begin \
00538            if (__vmm_rhs._name.size() !== this._name.size()) begin \
00539               $sformat(this.__vmm_image, "this._name.size() (%0d) !== to._name.size() (%0d)", \
00540                        this._name.size(), __vmm_rhs._name.size()); \
00541               this.__vmm_status = 0; \
00542               return; \
00543            end \
00544            foreach (this._name[i]) begin \
00545               if (__vmm_rhs._name[i] != this._name[i]) begin \
00546                  $sformat(this.__vmm_image, "this._name[%0d] (%s) !== to._name[%0d] (%s)", \
00547                           i, this._name[i], i, __vmm_rhs._name[i]); \
00548                  this.__vmm_status = 0; \
00549                  return; \
00550               end \
00551            end \
00552         end \
00553         DO_PACK: begin \
00554       int start; \
00555       int count; \
00556       int firstcount; \
00557       string stemp; \
00558       bit [31:0] size=0; \
00559       start = this.__vmm_offset; \
00560       size = this._name.size(); \
00561       `vmm_data_member_scalar_packint(pack,size,start,0) \
00562            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00563       this.__vmm_maxbits =0; \
00564       foreach (this._name[j]) begin \
00565            count = (this._name[j].len()); \
00566            this.__vmm_maxbits = this._name[j]; \
00567          `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00568             `vmm_data_member_update_offset(this.__vmm_offset,4) \
00569          `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00570             `vmm_data_member_update_offset(this.__vmm_offset,count) \
00571       end \
00572       this.__vmm_len = this.__vmm_offset; \
00573         end \
00574         DO_UNPACK: begin \
00575       int count; \
00576       int index; \
00577            int start; \
00578            bit [31:0] size = 0; \
00579       start = this.__vmm_offset; \
00580       this.__vmm_maxbits =0; \
00581            `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
00582            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00583            this._name   = new [size]; \
00584            for (int j=0; j < size; j++) begin \
00585        this.__vmm_maxbits =""; \
00586                  `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00587                  `vmm_data_member_update_offset(this.__vmm_offset,4) \
00588                  `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00589                  `vmm_data_member_update_offset(this.__vmm_offset,count) \
00590        this._name[j] = this.__vmm_maxbits; \
00591        this.__vmm_maxbits =""; \
00592            end  \
00593         end \
00594       endcase
00595 
00596 `define vmm_data_member_string_aa_scalar(_name, _do) \
00597  \
00598       case (do_what & _do) \
00599         DO_PRINT: begin \
00600       int _count = 0; \
00601            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
00602       foreach(this._name[i]) begin \
00603          if (_count <= 2 || _count >= this._name.num()-2)  \
00604                $sformat(this.__vmm_image, "%s %0d:\"%s\"", this.__vmm_image, i, this._name[i]); \
00605                if (_count == 2 && this._name.num() > 5) begin \
00606                    this.__vmm_image = {this.__vmm_image, " ..."}; \
00607                end \
00608          _count++; \
00609            end \
00610            $sformat(this.__vmm_image, "%s\"", this.__vmm_image); \
00611         end \
00612         DO_COPY: begin \
00613       __vmm_rhs._name.delete(); \
00614       foreach(this._name[i]) begin \
00615          __vmm_rhs._name[i]=this._name[i]; \
00616       end \
00617         end \
00618         DO_COMPARE: begin \
00619            if (__vmm_rhs._name.num() !== this._name.num()) begin \
00620               $sformat(this.__vmm_image, "this._name.num() (%0d) !== to._name.num() (%0d)", \
00621                        this._name.num(), __vmm_rhs._name.num()); \
00622               this.__vmm_status = 0; \
00623               return; \
00624            end \
00625            foreach (this._name[i]) begin \
00626          if (!__vmm_rhs._name.exists(i)) begin  \
00627        $sformat(this.__vmm_image, "this._name[%0d] exists but to._name[%0d] does not", \
00628            i, i); \
00629        this.__vmm_status = 0; \
00630        return; \
00631          end \
00632               else if (__vmm_rhs._name[i] != this._name[i]) begin \
00633                 $sformat(this.__vmm_image, "this._name[%0d] (\"%s\") !== to._name[%0d] (\"%s\")", \
00634                            i, this._name[i], i, __vmm_rhs._name[i]); \
00635                 this.__vmm_status = 0; \
00636                 return; \
00637               end \
00638            end \
00639         end \
00640        DO_PACK: begin \
00641       int start; \
00642       int count; \
00643       int index; \
00644       bit [31:0] size=0; \
00645       start = this.__vmm_offset; \
00646       this.__vmm_maxbits = 0; \
00647       size = this._name.num(); \
00648       `vmm_data_member_scalar_packint(pack,size,start,0) \
00649            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00650       foreach (this._name[j]) begin \
00651             this.__vmm_maxbits = 0; \
00652             count = (this._name[j].len()); \
00653             this.__vmm_maxbits = this._name[j]; \
00654             index = j; \
00655            `vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \
00656                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00657            `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00658                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00659            `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00660                 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00661       end \
00662       this.__vmm_len = this.__vmm_offset; \
00663         end \
00664         DO_UNPACK: begin \
00665            int start; \
00666            int count; \
00667            int index; \
00668            bit [31:0] size = 0; \
00669            start = this.__vmm_offset; \
00670            `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
00671            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00672            this.__vmm_maxbits = 0; \
00673            for (int j=0; j < size; j++) begin \
00674                 `vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \
00675                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00676                 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00677                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00678                 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00679                 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00680                this._name[index] = this.__vmm_maxbits; \
00681                this.__vmm_maxbits = 0; \
00682            end \
00683         end \
00684       endcase
00685 
00686 
00687 `define vmm_data_member_string_aa_string(_name, _do) \
00688  \
00689       case (do_what & _do) \
00690         DO_PRINT: begin \
00691       int _count = 0; \
00692            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
00693       foreach (this._name[i]) begin \
00694          if (_count <= 2 || _count >= this._name.num()-2)  \
00695                 $sformat(this.__vmm_image, "%s \"%s\":\"%s\"", this.__vmm_image, i, this._name[i]); \
00696                 if (_count == 2 && this._name.num() > 5) begin \
00697                     this.__vmm_image = {this.__vmm_image, " ..."}; \
00698                 end \
00699          _count++; \
00700            end \
00701         end \
00702         DO_COPY: begin \
00703       __vmm_rhs._name.delete(); \
00704       foreach(this._name[i]) __vmm_rhs._name[i] = this._name[i]; \
00705         end \
00706         DO_COMPARE: begin \
00707            if (__vmm_rhs._name.num() !== this._name.num()) begin \
00708               $sformat(this.__vmm_image, "this._name.num() (%0d) !== to._name.num() (%0d)", \
00709                        this._name.num(), __vmm_rhs._name.num()); \
00710               this.__vmm_status = 0; \
00711               return; \
00712            end \
00713            foreach (this._name[i]) begin \
00714          if (!__vmm_rhs._name.exists(i)) begin  \
00715        $sformat(this.__vmm_image, "this._name[\"%s\"] exists but to._name[\"%s\"] does not", \
00716            i, i); \
00717        this.__vmm_status = 0; \
00718        return; \
00719          end \
00720               else if (__vmm_rhs._name[i] != this._name[i]) begin \
00721                 $sformat(this.__vmm_image, "this._name[\"%s\"] (\"%s\") !== to._name[\"%s\"] (\"%s\")", \
00722                          i, this._name[i], i, __vmm_rhs._name[i]); \
00723                 this.__vmm_status = 0; \
00724                 return; \
00725               end \
00726            end \
00727         end \
00728         DO_PACK: begin \
00729       int start; \
00730       int count; \
00731       string  sindextemp; \
00732       int sindexcount; \
00733       bit [31:0] size=0; \
00734       start = this.__vmm_offset; \
00735       size = this._name.num(); \
00736       `vmm_data_member_scalar_packint(pack,size,start,0) \
00737            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00738       this.__vmm_maxbits = 0; \
00739       foreach (this._name[j]) begin \
00740            this.__vmm_maxbits =0; \
00741            sindextemp = j; \
00742            sindexcount = sindextemp.len(); \
00743            this.__vmm_maxbits = sindextemp; \
00744            `vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \
00745                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00746            `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
00747                 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
00748                 this.__vmm_maxbits =0; \
00749                 count = this._name[j].len(); \
00750                 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00751                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00752            this.__vmm_maxbits = this._name[j]; \
00753            `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00754                 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00755       end \
00756            this.__vmm_len = this.__vmm_offset; \
00757         end \
00758         DO_UNPACK: begin \
00759       int start; \
00760       int count; \
00761       string  sindextemp; \
00762       int sindexcount; \
00763       string  stemp; \
00764       bit [31:0] size=0; \
00765       this.__vmm_maxbits = 0; \
00766            start = this.__vmm_offset; \
00767            `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
00768            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00769       for (int j=0; j < size; j++) begin \
00770            this.__vmm_maxbits = 0; \
00771                 `vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \
00772                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00773                 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
00774                 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
00775            sindextemp = this.__vmm_maxbits; \
00776            this.__vmm_maxbits = 0; \
00777                 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00778                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00779                 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00780                 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00781            this._name[sindextemp] = this.__vmm_maxbits; \
00782       end  \
00783         end \
00784       endcase
00785 
00786 
00787 `define vmm_data_member_enum(_name, _do) \
00788 \
00789     case (do_what & _do) \
00790        DO_PRINT: begin \
00791           $sformat(this.__vmm_image, "%s\n%s   _name=%s", this.__vmm_image, this.__vmm_prefix, this._name.name()); \
00792        end \
00793        DO_COPY: begin \
00794           __vmm_rhs._name = this._name; \
00795        end \
00796         DO_COMPARE: begin \
00797            if (__vmm_rhs._name !== this._name) begin \
00798               $sformat(this.__vmm_image, "this._name (%s) !== to._name (%s)", \
00799                        this._name.name(), __vmm_rhs._name.name()); \
00800               this.__vmm_status = 0; \
00801               return; \
00802            end \
00803         end \
00804         DO_PACK: begin \
00805            int start; \
00806            int count; \
00807            string stemp; \
00808            bit [31:0] size=0; \
00809            start = this.__vmm_offset; \
00810            stemp = this._name.name(); \
00811            count = (stemp.len()); \
00812            this.__vmm_maxbits = this._name.name(); \
00813       `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00814            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00815       `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00816            `vmm_data_member_update_offset(this.__vmm_offset,count) \
00817            this.__vmm_len = this.__vmm_offset; \
00818         end \
00819         DO_UNPACK: begin \
00820       int count; \
00821            int start; \
00822            int size; \
00823            int index; \
00824            string stemp; \
00825            start = this.__vmm_offset; \
00826            `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00827            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00828            `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00829            `vmm_data_member_update_offset(this.__vmm_offset,count) \
00830            stemp = this.__vmm_maxbits; \
00831       index = 0; \
00832       `vmm_data_member_enum_set_name(this._name,stemp,index) \
00833         end \
00834       endcase
00835 
00836 
00837 `define vmm_data_member_enum_array(_name, _do) \
00838 \
00839      case (do_what & _do) \
00840         DO_PRINT: begin \
00841            int size =0; \
00842            size = $size(this._name); \
00843            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, this.__vmm_prefix, size); \
00844            for (int i = 0; i < size; i++) begin \
00845               $sformat(this.__vmm_image, "%s %s", this.__vmm_image, this._name[i].name()); \
00846               if (i == 2 && size > 5) begin \
00847                  this.__vmm_image = {this.__vmm_image, " ..."}; \
00848                  i = size - 3; \
00849               end \
00850            end \
00851         end \
00852         DO_COPY: begin \
00853                __vmm_rhs._name = this._name; \
00854         end \
00855         DO_COMPARE: begin \
00856            foreach (this._name[i]) begin \
00857               if (__vmm_rhs._name[i] !== this._name[i]) begin \
00858                  $sformat(this.__vmm_image, "this._name[%0d] (%s) !== to._name[%0d] (%s)", \
00859                           i, this._name[i].name(), i, __vmm_rhs._name[i].name()); \
00860                  this.__vmm_status = 0; \
00861                  return; \
00862               end \
00863            end \
00864         end \
00865         DO_PACK: begin \
00866            int start; \
00867            int count; \
00868            string stemp; \
00869            bit [31:0] size=0; \
00870            start = this.__vmm_offset; \
00871            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00872            this.__vmm_maxbits = 0; \
00873            foreach (this._name[j]) begin \
00874                stemp = this._name[j].name(); \
00875                count = (stemp.len()); \
00876                this.__vmm_maxbits = this._name[j].name(); \
00877                `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00878                `vmm_data_member_update_offset(this.__vmm_offset,4) \
00879                `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00880                `vmm_data_member_update_offset(this.__vmm_offset,count) \
00881               size++; \
00882            end \
00883            `vmm_data_member_scalar_packint(pack,size,start,0) \
00884            this.__vmm_len = this.__vmm_offset; \
00885         end \
00886         DO_UNPACK: begin \
00887            int count; \
00888            int start; \
00889            int index; \
00890            string  stemp; \
00891            bit [31:0] size = 0; \
00892            start = this.__vmm_offset; \
00893            `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
00894            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00895            this.__vmm_maxbits =0; \
00896            for (int j=0; j < size; j++) begin \
00897                 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00898                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00899                 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00900                 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00901                 stemp = this.__vmm_maxbits; \
00902                 index = 0; \
00903                 `vmm_data_member_enum_set_name(this._name[j],stemp,index) \
00904                 this.__vmm_maxbits =""; \
00905        end \
00906         end \
00907       endcase
00908 
00909 `define vmm_data_member_enum_da(_name, _do) \
00910 \
00911      case (do_what & _do) \
00912         DO_PRINT: begin \
00913           $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.size()); \
00914            for (int i = 0; i < this._name.size(); i++) begin \
00915               $sformat(this.__vmm_image, "%s %s", this.__vmm_image, this._name[i].name()); \
00916               if (i == 2 && this._name.size() > 5) begin \
00917                  this.__vmm_image = {this.__vmm_image, " ..."}; \
00918                  i = this._name.size() - 3; \
00919               end \
00920            end \
00921         end \
00922         DO_COPY: begin \
00923       __vmm_rhs._name = new [this._name.size()]; \
00924             foreach(this._name[i]) __vmm_rhs._name[i] = this._name[i]; \
00925         end \
00926         DO_COMPARE: begin \
00927            if (__vmm_rhs._name.size() !== this._name.size()) begin \
00928               $sformat(this.__vmm_image, "this._name.size() (%0d) !== to._name.size() (%0d)", \
00929                        this._name.size(), __vmm_rhs._name.size()); \
00930               this.__vmm_status = 0; \
00931               return; \
00932            end \
00933            foreach (this._name[i]) begin \
00934               if (__vmm_rhs._name[i] !== this._name[i]) begin \
00935                  $sformat(this.__vmm_image, "this._name[%0d] (%s) !== to._name[%0d] (%s)", \
00936                           i, this._name[i].name(), i, __vmm_rhs._name[i].name()); \
00937                  this.__vmm_status = 0; \
00938                  return; \
00939               end \
00940            end \
00941         end \
00942         DO_PACK: begin \
00943            int start; \
00944            int count; \
00945            int index; \
00946            int element; \
00947            string stemp; \
00948            bit [31:0] size=0; \
00949            start = this.__vmm_offset; \
00950       size = this._name.size(); \
00951       `vmm_data_member_scalar_packint(pack,size,start,0) \
00952            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00953       this.__vmm_maxbits = 0; \
00954            foreach (this._name[j]) begin \
00955                stemp = this._name[j].name(); \
00956                count = (stemp.len()); \
00957                this.__vmm_maxbits = this._name[j].name(); \
00958           `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
00959                `vmm_data_member_update_offset(this.__vmm_offset,4) \
00960           `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
00961                `vmm_data_member_update_offset(this.__vmm_offset,count) \
00962            end \
00963            this.__vmm_len = this.__vmm_offset; \
00964         end \
00965         DO_UNPACK: begin \
00966            int count; \
00967            int index; \
00968            int start; \
00969            string  stemp; \
00970            bit [31:0] size = 0; \
00971            start = this.__vmm_offset; \
00972            `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
00973            `vmm_data_member_update_offset(this.__vmm_offset,4) \
00974            this._name   = new [size]; \
00975            this.__vmm_maxbits =0; \
00976            for (int j=0; j < size; j++) begin \
00977                 this.__vmm_maxbits =""; \
00978                 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
00979                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
00980                 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
00981                 `vmm_data_member_update_offset(this.__vmm_offset,count) \
00982                 stemp = this.__vmm_maxbits; \
00983                 index = 0; \
00984            `vmm_data_member_enum_set_name(this._name[j],stemp,index) \
00985                 this.__vmm_maxbits =""; \
00986            end \
00987         end \
00988       endcase
00989 
00990 
00991 `define vmm_data_member_enum_aa_scalar(_name, _do) \
00992  \
00993       case (do_what & _do) \
00994         DO_PRINT: begin \
00995            int _count = 0; \
00996            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
00997            foreach(this._name[i]) begin \
00998               if (_count <= 2 || _count >= this._name.num()-2) begin \
00999                  $sformat(this.__vmm_image, "%s %0d: %s ", this.__vmm_image, i, this._name[i].name()); \
01000                  if (_count == 2 && this._name.num() > 5) begin \
01001                     this.__vmm_image = {this.__vmm_image, " ..."}; \
01002                  end \
01003               end \
01004               _count++; \
01005            end \
01006            $sformat(this.__vmm_image, "%s", this.__vmm_image); \
01007         end \
01008         DO_COPY: begin \
01009       __vmm_rhs._name.delete();  \
01010         foreach(this._name[i]) begin \
01011       __vmm_rhs._name[i]=this._name[i]; \
01012         end \
01013         end \
01014         DO_COMPARE: begin \
01015            if (__vmm_rhs._name.num() !== this._name.num()) begin \
01016               $sformat(this.__vmm_image, "this._name.size() (%0d) !== to._name.size() (%0d)", \
01017                        this._name.num(), __vmm_rhs._name.num()); \
01018               this.__vmm_status = 0; \
01019               return; \
01020            end \
01021            foreach (this._name[i]) begin \
01022          if (!__vmm_rhs._name.exists(i)) begin  \
01023        $sformat(this.__vmm_image, "this._name[%0d] exists but to._name[%0d] does not", \
01024            i, i); \
01025        this.__vmm_status = 0; \
01026        return; \
01027          end \
01028               else if (__vmm_rhs._name[i] != this._name[i]) begin \
01029                 $sformat(this.__vmm_image, "this._name[%0d] (%s) !== to._name[%0d] (%s)", \
01030                          i, this._name[i].name, i, __vmm_rhs._name[i].name); \
01031                 this.__vmm_status = 0; \
01032                 return; \
01033               end \
01034            end \
01035        end \
01036        DO_PACK: begin \
01037       int start; \
01038       int count; \
01039       int index; \
01040       string stemp; \
01041            bit [31:0] size=0; \
01042            start = this.__vmm_offset; \
01043       this.__vmm_maxbits = 0; \
01044       size = this._name.num(); \
01045       `vmm_data_member_scalar_packint(pack,size,start,0) \
01046            `vmm_data_member_update_offset(this.__vmm_offset,4) \
01047            foreach (this._name[j]) begin \
01048           this.__vmm_maxbits = 0; \
01049                stemp = this._name[j].name(); \
01050                count = (stemp.len()); \
01051                this.__vmm_maxbits = this._name[j].name(); \
01052           index = j; \
01053           `vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \
01054                `vmm_data_member_update_offset(this.__vmm_offset,4) \
01055           `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
01056                `vmm_data_member_update_offset(this.__vmm_offset,4) \
01057           `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
01058                `vmm_data_member_update_offset(this.__vmm_offset,count) \
01059       end \
01060       this.__vmm_len = this.__vmm_offset; \
01061         end \
01062         DO_UNPACK: begin \
01063            int count; \
01064            int start; \
01065            int index=0; \
01066            string  stemp; \
01067            bit [31:0] size = 0; \
01068            start = this.__vmm_offset; \
01069            `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
01070            `vmm_data_member_update_offset(this.__vmm_offset,4) \
01071            this.__vmm_maxbits =0; \
01072            for (int j=0; j < size; j++) begin \
01073                this.__vmm_maxbits =0; \
01074                 `vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \
01075                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01076                 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
01077                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01078                 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
01079                 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01080                stemp = this.__vmm_maxbits; \
01081                count = 0; \
01082           `vmm_data_member_enum_set_name(this._name[index],stemp,count) \
01083                this.__vmm_maxbits =""; \
01084            end \
01085         end \
01086       endcase
01087 
01088 
01089 
01090 `define vmm_data_member_enum_aa_string(_name, _do) \
01091  \
01092       case (do_what & _do) \
01093         DO_PRINT: begin \
01094       int _count = 0; \
01095            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
01096       foreach(this._name[i]) begin \
01097          if (_count <= 2 || _count >= this._name.num()-2) begin \
01098                 $sformat(this.__vmm_image, "%s \"%s\":%s", this.__vmm_image, i, this._name[i].name); \
01099                 if (_count == 2 && this._name.num() > 5) begin \
01100                     this.__vmm_image = {this.__vmm_image, " ..."}; \
01101                 end \
01102               end \
01103          _count++; \
01104            end \
01105         end \
01106         DO_COPY: begin \
01107       __vmm_rhs._name.delete(); \
01108       foreach (this._name[i]) begin \
01109       __vmm_rhs._name[i] = this._name[i]; \
01110       end \
01111         end \
01112         DO_COMPARE: begin \
01113            if (__vmm_rhs._name.num() !== this._name.num()) begin \
01114               $sformat(this.__vmm_image, "this._name.size() (%0d) !== to._name.size() (%0d)", \
01115                        this._name.num(), __vmm_rhs._name.num()); \
01116               this.__vmm_status = 0; \
01117               return; \
01118            end \
01119            foreach (this._name[i]) begin \
01120          if (!__vmm_rhs._name.exists(i)) begin  \
01121        $sformat(this.__vmm_image, "this._name[\"%s\"] exists but to._name[\"%s\"] does not", \
01122            i, i); \
01123        this.__vmm_status = 0; \
01124        return; \
01125          end \
01126               else if (__vmm_rhs._name[i] != this._name[i]) begin \
01127                 $sformat(this.__vmm_image, "this._name[\"%s\"] (%s) !== to._name[\"%s\"] (%s)", \
01128                          i, this._name[i].name, i, __vmm_rhs._name[i].name); \
01129                 this.__vmm_status = 0; \
01130                 return; \
01131               end \
01132            end \
01133         end \
01134         DO_PACK: begin \
01135       int start; \
01136       int count; \
01137       int index; \
01138       string  sindextemp; \
01139       int sindexcount; \
01140       string  stemp; \
01141       bit [31:0] size=0; \
01142       start = this.__vmm_offset; \
01143            stemp = this._name.first(sindextemp); \
01144       index = 0; \
01145       size = this._name.num(); \
01146            `vmm_data_member_scalar_packint(pack,size,start,0) \
01147            `vmm_data_member_update_offset(this.__vmm_offset,4) \
01148       this.__vmm_maxbits = 0; \
01149       foreach (this._name[j]) begin \
01150            this.__vmm_maxbits =0; \
01151            sindextemp = j; \
01152            sindexcount = sindextemp.len(); \
01153            this.__vmm_maxbits = sindextemp; \
01154                 `vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \
01155                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01156                 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
01157                 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
01158                 this.__vmm_maxbits =0; \
01159                 stemp = this._name[j].name(); \
01160                 count = (stemp.len()); \
01161                 `vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
01162                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01163                 this.__vmm_maxbits = this._name[j].name(); \
01164                 `vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
01165                 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01166       end \
01167       this.__vmm_len = this.__vmm_offset; \
01168         end \
01169         DO_UNPACK: begin \
01170       int start; \
01171       int count; \
01172       int index; \
01173       string  sindextemp; \
01174       int sindexcount; \
01175       string  stemp; \
01176       bit [31:0] size=0; \
01177       index = 0; \
01178            start = this.__vmm_offset; \
01179            `vmm_data_member_scalar_unpackint(unpack,size,start,0) \
01180            `vmm_data_member_update_offset(this.__vmm_offset,4) \
01181       this.__vmm_maxbits = 0; \
01182       for (int j=0; j < size; j++) begin \
01183            this.__vmm_maxbits = 0; \
01184                 `vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \
01185                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01186                 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
01187                 `vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
01188            sindextemp = this.__vmm_maxbits; \
01189            this.__vmm_maxbits = 0; \
01190                 `vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
01191                 `vmm_data_member_update_offset(this.__vmm_offset,4) \
01192                 `vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
01193                 `vmm_data_member_update_offset(this.__vmm_offset,count) \
01194                 stemp = this.__vmm_maxbits; \
01195                 index = 0; \
01196                 `vmm_data_member_enum_set_name(this._name[sindextemp],stemp,index) \
01197                 this.__vmm_maxbits =""; \
01198       end \
01199         end \
01200       endcase
01201 
01202 
01203 `define vmm_data_member_handle(_name, _do) \
01204   \
01205       case (do_what & _do) \
01206         DO_PRINT: begin \
01207            if ( _name == null ) begin \
01208                 `vmm_warning(this.log, " vmm_data  _name object does not exist, no action"); \
01209            end \
01210            else begin \
01211          string _prefix = this.__vmm_prefix; \
01212               $sformat(this.__vmm_image, "%s\n%s   _name is %s", this.__vmm_image, this.__vmm_prefix, \
01213                    (this._name == null) ? "null" : "<ref>"); \
01214          this.__vmm_prefix = _prefix; \
01215       end \
01216         end \
01217         DO_COPY: begin \
01218            if ( _name == null ) begin \
01219               `vmm_warning(this.log, " vmm_data  _name object does not exist, no action"); \
01220            end \
01221            else begin \
01222            __vmm_rhs._name = this._name; \
01223       end \
01224    end \
01225         DO_COMPARE: begin \
01226       string diff; \
01227            if ( _name == null ) begin \
01228               `vmm_warning(this.log, " vmm_data  _name object does not exist, no action"); \
01229            end \
01230            else begin \
01231               if (this._name != __vmm_rhs._name) begin \
01232                   this.__vmm_image = "this._name !== to._name"; \
01233                   this.__vmm_status = 0; \
01234                   return; \
01235               end \
01236            end \
01237         end \
01238         DO_PACK: begin \
01239            if ( _name == null ) begin \
01240               `vmm_warning(this.log, " vmm_data  _name object does not exist, no action"); \
01241            end \
01242            else begin \
01243            end \
01244         end \
01245         DO_UNPACK: begin \
01246            this._name = null; \
01247         end \
01248       endcase
01249 
01250 
01251 `define vmm_data_member_handle_array(_name, _do) \
01252  \
01253       case (do_what & _do) \
01254         DO_PRINT: begin \
01255       int size =0; \
01256       size = $size(this._name); \
01257            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, this.__vmm_prefix, size); \
01258            for (int i = 0; i < size; i++) begin \
01259               $sformat(this.__vmm_image, "%s %s", this.__vmm_image, \
01260                        (this._name[i] == null) ? "null" : "<ref>"); \
01261               if (i == 2 && size > 5) begin \
01262                  this.__vmm_image = {this.__vmm_image, " ..."}; \
01263                  i = size - 3; \
01264               end \
01265            end \
01266         end \
01267         DO_COPY: begin \
01268       __vmm_rhs._name = this._name; \
01269         end \
01270         DO_COMPARE: begin \
01271            foreach (this._name[i]) begin \
01272               if (this._name[i] != __vmm_rhs._name[i]) begin \
01273                 $sformat(this.__vmm_image, "this._name[%0d] !== to._name[%0d]", i, i); \
01274                 this.__vmm_status = 0; \
01275                 return; \
01276               end \
01277            end \
01278         end \
01279         DO_PACK: begin \
01280         end \
01281         DO_UNPACK: begin \
01282            foreach (this._name[i]) begin \
01283               this._name[i] = null; \
01284            end \
01285         end \
01286       endcase
01287 
01288 
01289 `define vmm_data_member_handle_da(_name, _do) \
01290  \
01291       case (do_what & _do) \
01292         DO_PRINT: begin \
01293            $sformat(this.__vmm_image, "%s\n%s   _name[%0d]=", this.__vmm_image, this.__vmm_prefix, this._name.size()); \
01294            for (int i = 0; i < this._name.size(); i++) begin \
01295               $sformat(this.__vmm_image, "%s %s", this.__vmm_image, \
01296                        (this._name[i] == null) ?