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.
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: