blob: 6b0032f8d5d3ba764ebf50967a227cff504bc298 [file] [log] [blame]
//
// -------------------------------------------------------------
// Copyright 2004-2008 Synopsys, Inc.
// Copyright 2008-2009 Mentor Graphics Corporation
// All Rights Reserved Worldwide
//
// Licensed under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in
// writing, software distributed under the License is
// distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See
// the License for the specific language governing
// permissions and limitations under the License.
// -------------------------------------------------------------
//
`include "std_lib/vmm_data_macros_utils.sv"
`ifdef INCA
`define string_cast(V) $psprintf("%s",V)
`else
`define string_cast(V) string'(V)
`endif
`define vmm_data_member_begin(_class) \
\
protected static _class __vmm_rhs; \
\
function void do_all(vmm_data::do_what_e do_what, \
ref logic [7:0] pack[], \
const ref logic [7:0] unpack[]); \
super.__vmm_rhs = this.__vmm_rhs; \
this.__vmm_status = 1; \
case (do_what) \
DO_PRINT: begin \
this.__vmm_image = super.psdisplay(this.__vmm_prefix); \
if (`vmm_str_match(this.__vmm_prefix, ": $")) begin \
this.__vmm_prefix = {`vmm_str_prematch(this.__vmm_prefix), "."}; \
end \
end \
DO_COPY: begin \
void'(super.copy(this.__vmm_rhs)); \
end \
DO_COMPARE: begin \
if (!super.compare(this.__vmm_rhs, this.__vmm_image)) begin \
this.__vmm_status = 0; \
return; \
end \
end \
DO_PACK: begin \
int _offset = this.__vmm_offset; \
this.__vmm_offset = _offset + super.byte_pack(pack, _offset, this.__vmm_kind); \
end \
DO_UNPACK: begin \
int _offset = this.__vmm_offset; \
this.__vmm_offset = _offset + super.byte_unpack(unpack, _offset, this.__vmm_len, this.__vmm_kind); \
end \
endcase \
`define vmm_data_member_scalar(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
$sformat(this.__vmm_image, `"%s\n%s _name='h%0h`", this.__vmm_image, this.__vmm_prefix, this._name); \
end \
DO_COPY: begin \
__vmm_rhs._name = this._name; \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name !== this._name) begin \
$sformat(this.__vmm_image, `"this._name ('h%0h) !== to._name ('h%0h)`", \
this._name, __vmm_rhs._name); \
this.__vmm_status = 0; \
return; \
end \
end \
DO_PACK: begin \
int count; \
`vmm_data_member_scalar_count(this._name,count) \
this.__vmm_maxbits = this._name; \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
DO_UNPACK: begin \
int count; \
int start; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_count(this._name,count) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
this._name = this.__vmm_maxbits; \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
endcase
`define vmm_data_member_scalar_array(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
int size =0; \
size = $size(this._name); \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, size); \
for (int i = 0; i < size; i++) begin \
$sformat(this.__vmm_image, "%s 'h%0h", this.__vmm_image, this._name[i]); \
if (i == 2 && size > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
i = size - 3; \
end \
end \
end \
DO_COPY: begin \
__vmm_rhs._name = this._name; \
end \
DO_COMPARE: begin \
// for (int i=0; i<this._name.size(); ++i) begin \
foreach(_name[i]) begin \
if (__vmm_rhs._name[i] !== this._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] ('h%0h) !== to._name[%0d] ('h%0h)`", \
i, this._name[i], i, __vmm_rhs._name[i]); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
int start; \
int count; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
`vmm_data_member_update_offset(this.__vmm_offset,8) \
// for (int j=0; j < this._name.size(); ++j) begin \
foreach(_name[j]) begin \
if ( j == 0 ) \
`vmm_data_member_scalar_count(this._name[j],count) \
this.__vmm_maxbits = this._name[j]; \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
size++; \
end \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_scalar_packint(pack,count,(start+4),0) \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int start; \
int count; \
bit [31:0] size = 0; \
`vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
for (int j=0; j < size; j++) begin \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
this._name[j] = this.__vmm_maxbits; \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
end \
endcase
`ifdef INCA
`define THIS
`else
`define THIS this.
`endif
`define vmm_data_member_scalar_da(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.size()); \
for (int i = 0; i < this._name.size(); i++) begin \
$sformat(this.__vmm_image, "%s 'h%0h", this.__vmm_image, this._name[i]); \
if (i == 2 && this._name.size() > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
i = this._name.size() - 3; \
end \
end \
end \
DO_COPY: begin \
__vmm_rhs._name = new [this._name.size()]; \
for(int i=0; i<this._name.size(); ++i) __vmm_rhs._name[i]=this._name[i]; \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name.size() !== this._name.size()) begin \
$sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
this._name.size(), __vmm_rhs._name.size()); \
this.__vmm_status = 0; \
return; \
end \
for(int i=0; i<this._name.size(); ++i) begin \
if (__vmm_rhs._name[i] !== this._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] ('h%0h) !== to._name[%0d] ('h%0h)`", \
i, this._name[i], i, __vmm_rhs._name[i]); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
int start; \
int count; \
int index; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
size = this._name.size(); \
`vmm_data_member_update_offset(this.__vmm_offset,8) \
for(int j=0; j<this._name.size(); ++j) begin \
if ( j == 0) begin \
`vmm_data_member_scalar_count(this._name[j],count) \
end \
this.__vmm_maxbits = this._name[j]; \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
this.__vmm_len = this.__vmm_offset; \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_scalar_packint(pack,count,(start+4),0) \
end \
DO_UNPACK: begin \
int start; \
int count; \
int index; \
bit [31:0] size = 0; \
`vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this._name = new [size]; \
for (int j=0; j < size; j++) begin \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
this._name[j] = this.__vmm_maxbits; \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
end \
endcase
`define vmm_data_member_scalar_aa_scalar(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
int _count = 0; \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, \
this.__vmm_prefix, this._name.num()); \
foreach (`THIS _name[i]) begin \
if (_count <= 2 || _count >= this._name.num()-2) \
$sformat(this.__vmm_image, "%s %0d:'h%0h", this.__vmm_image, \
i, this._name[i]); \
if (_count == 2 && this._name.num() > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
end \
_count++; \
end \
end \
DO_COPY: begin \
__vmm_rhs._name.delete(); \
foreach(`THIS _name[i]) begin \
__vmm_rhs._name[i]=this._name[i]; \
end \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name.num() !== this._name.num()) begin \
$sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
this._name.num(), __vmm_rhs._name.num()); \
this.__vmm_status = 0; \
return; \
end \
foreach (`THIS _name[i]) begin \
if (!__vmm_rhs._name.exists(i)) begin \
$sformat(this.__vmm_image, `"this._name[%0d] exists but to._name[%0d] does not`", \
i, i); \
this.__vmm_status = 0; \
return; \
end \
else if (__vmm_rhs._name[i] != this._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d]:'h%0h !== to._name[%0d]:'h%0h`", \
i, this._name[i], i, __vmm_rhs._name[i]); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
int start; \
int count; \
int index; \
int element=0; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
element = this._name.first(index); \
`vmm_data_member_scalar_count(element,count) \
element = 0; \
size = this._name.num(); \
`vmm_data_member_update_offset(this.__vmm_offset,8) \
foreach (`THIS _name[j]) begin \
this.__vmm_maxbits = this._name[j]; \
index = j; \
`vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
this.__vmm_len = this.__vmm_offset; \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_scalar_packint(pack,count,(start+4),0) \
end \
DO_UNPACK: begin \
int start; \
int count; \
int index; \
bit [31:0] size = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
for (int j=0; j < size; j++) begin \
`vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
this._name[index] = this.__vmm_maxbits; \
end \
end \
endcase
`define vmm_data_member_scalar_aa_string(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
int _count = 0; \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, \
this.__vmm_prefix, this._name.num()); \
foreach (`THIS _name[i]) begin \
if (_count <= 2 || _count >= this._name.num()-2) \
$sformat(this.__vmm_image, "%s \"%s\":'h%0h", this.__vmm_image, i, this._name[i]); \
if (_count == 2 && this._name.num() > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
end \
_count++; \
end \
end \
DO_COPY: begin \
__vmm_rhs._name.delete(); \
foreach(`THIS _name[i]) begin \
__vmm_rhs._name[i] = this._name[i]; \
end \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name.num() !== this._name.num()) begin \
$sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
this._name.num(), __vmm_rhs._name.num()); \
this.__vmm_status = 0; \
return; \
end \
foreach (`THIS _name[i]) begin \
if(!__vmm_rhs._name.exists(i)) begin \
$sformat(this.__vmm_image, `"this._name[\"%s\"] exists but to._name[\"%s\"] does not`", \
i, i); \
this.__vmm_status = 0; \
return; \
end \
else if (__vmm_rhs._name[i] != this._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[\"%s\"]:'h%0h !== to._name[\"%s\"]:'h%0h`", \
i, this._name[i], i, __vmm_rhs._name[i]); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
int start; \
int count; \
string sindextemp; \
int sindexcount; \
string stemp; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
void'(this._name.first(sindextemp)); \
size = this._name.num(); \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits = 0; \
foreach (`THIS _name[j]) begin \
this.__vmm_maxbits =0; \
sindextemp = `string_cast(j); \
sindexcount = sindextemp.len(); \
// this.__vmm_maxbits = sindextemp; \
this.__vmm_maxbits = sindexcount; \
`vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
this.__vmm_maxbits =0; \
`vmm_data_member_scalar_count(this._name[j],count) \
`vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits = this._name[j]; \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int start; \
int count; \
string sindextemp; \
int sindexcount; \
string stemp; \
bit [31:0] size=0; \
this.__vmm_maxbits = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,size,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
for (int j=0; j < size; j++) begin \
`vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
sindextemp = `string_cast(this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
this.__vmm_maxbits = 0; \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
this._name[sindextemp] = this.__vmm_maxbits; \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
end \
endcase
`define vmm_data_member_string(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
$sformat(this.__vmm_image, `"%s\n%s _name=\"%s\"`", this.__vmm_image, this.__vmm_prefix, this._name); \
end \
DO_COPY: begin \
__vmm_rhs._name = this._name; \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name != this._name) begin \
$sformat(this.__vmm_image, `"this._name (\"%s\") !== to._name (\"%s\")`", \
this._name, __vmm_rhs._name); \
this.__vmm_status = 0; \
return; \
end \
end \
DO_PACK: begin \
int start; \
int count; \
start = this.__vmm_offset; \
count = (this._name.len()); \
this.__vmm_maxbits = 0; \
`vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
// this.__vmm_maxbits = this._name; \
$swrite(this.__vmm_maxbits, "%s", this._name); \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int count; \
int start; \
int size; \
this.__vmm_maxbits = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
this._name = $psprintf("%s", this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
endcase
`define vmm_data_member_string_array(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
int size =0; \
size = $size(this._name); \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, size); \
for (int i = 0; i < size; i++) begin \
$sformat(this.__vmm_image, "%s \"%s\"", this.__vmm_image, this._name[i]); \
if (i == 2 && size > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
i = size - 3; \
end \
end \
end \
DO_COPY: begin \
__vmm_rhs._name = this._name; \
end \
DO_COMPARE: begin \
for(int i=0; i<this._name.size(); ++i) begin \
if (__vmm_rhs._name[i] != this._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] (%s) !== to._name[%0d] (%s)`", \
i, this._name[i], i, __vmm_rhs._name[i]); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
int start; \
int count; \
string stemp; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits =0; \
for(int j=0; j<this._name.size(); ++j) begin \
count = (this._name[j].len()); \
$swrite(this.__vmm_maxbits, "%s", this._name[j]); \
`vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
size++; \
end \
`vmm_data_member_scalar_packint(pack,size,start,0) \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int count; \
int start; \
bit [31:0] size = 0; \
start = this.__vmm_offset; \
this.__vmm_maxbits =0; \
`vmm_data_member_scalar_unpackint(unpack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
for (int j=0; j < size; j++) begin \
this.__vmm_maxbits =""; \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
this._name[j] = $psprintf("%s", this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
this.__vmm_maxbits =""; \
end \
end \
endcase
`define vmm_data_member_string_da(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.size()); \
for (int i = 0; i < this._name.size(); i++) begin \
$sformat(this.__vmm_image, "%s \"%s\"", this.__vmm_image, this._name[i]); \
if (i == 2 && this._name.size() > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
i = this._name.size() - 3; \
end \
end \
end \
DO_COPY: begin \
__vmm_rhs._name = new [this._name.size()]; \
for(int i=0; i<this._name.size(); ++i) __vmm_rhs._name[i] = this._name[i]; \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name.size() !== this._name.size()) begin \
$sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
this._name.size(), __vmm_rhs._name.size()); \
this.__vmm_status = 0; \
return; \
end \
for (int i=0; i<this._name.size(); ++i) begin \
if (__vmm_rhs._name[i] != this._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] (%s) !== to._name[%0d] (%s)`", \
i, this._name[i], i, __vmm_rhs._name[i]); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
int start; \
int count; \
int firstcount; \
string stemp; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
size = this._name.size(); \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits =0; \
for (int j=0; j<this._name.size(); ++j) begin \
count = (this._name[j].len()); \
$swrite(this.__vmm_maxbits, "%s", this._name[j]); \
`vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int count; \
int index; \
int start; \
bit [31:0] size = 0; \
start = this.__vmm_offset; \
this.__vmm_maxbits =0; \
`vmm_data_member_scalar_unpackint(unpack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this._name = new [size]; \
for (int j=0; j < size; j++) begin \
this.__vmm_maxbits =""; \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
this._name[j] = $psprintf("%s", this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
this.__vmm_maxbits =""; \
end \
end \
endcase
`define vmm_data_member_string_aa_scalar(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
int _count = 0; \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
foreach(`THIS _name[i]) begin \
string tmps=this._name[i]; \
if (_count <= 2 || _count >= `THIS _name.num()-2) \
$sformat(this.__vmm_image, "%s %0d:\"%s\"", this.__vmm_image, i, tmps); \
if (_count == 2 && this._name.num() > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
end \
_count++; \
end \
$sformat(this.__vmm_image, "%s", this.__vmm_image); \
end \
DO_COPY: begin \
__vmm_rhs._name.delete(); \
foreach(`THIS _name[i]) begin \
__vmm_rhs._name[i]=this._name[i]; \
end \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name.num() !== this._name.num()) begin \
$sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
this._name.num(), __vmm_rhs._name.num()); \
this.__vmm_status = 0; \
return; \
end \
foreach (`THIS _name[i]) begin \
if (!__vmm_rhs._name.exists(i)) begin \
$sformat(this.__vmm_image, `"this._name[%0d] exists but to._name[%0d] does not`", \
i, i); \
this.__vmm_status = 0; \
return; \
end \
else if (__vmm_rhs._name[i] != this._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] (\"%s\") !== to._name[%0d] (\"%s\")`", \
i, this._name[i], i, __vmm_rhs._name[i]); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
int start; \
int count; \
int index; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
this.__vmm_maxbits = 0; \
size = this._name.num(); \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
foreach (`THIS _name[j]) begin \
this.__vmm_maxbits = 0; \
count = (this._name[j].len()); \
$swrite(this.__vmm_maxbits, "%s", this._name[j]); \
index = j; \
`vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int start; \
int count; \
int index; \
bit [31:0] size = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits = 0; \
for (int j=0; j < size; j++) begin \
`vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
this._name[j] = $psprintf("%s", this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
this.__vmm_maxbits = 0; \
end \
end \
endcase
`define vmm_data_member_string_aa_string(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
int _count = 0; \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
foreach (`THIS _name[i]) begin \
string tmps = this._name[i]; \
if (_count <= 2 || _count >= this._name.num()-2) \
$sformat(this.__vmm_image, "%s \"%s\":\"%s\"", this.__vmm_image, i, tmps); \
if (_count == 2 && this._name.num() > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
end \
_count++; \
end \
end \
DO_COPY: begin \
__vmm_rhs._name.delete(); \
foreach(`THIS _name[i]) __vmm_rhs._name[i] = this._name[i]; \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name.num() !== this._name.num()) begin \
$sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
this._name.num(), __vmm_rhs._name.num()); \
this.__vmm_status = 0; \
return; \
end \
foreach (`THIS _name[i]) begin \
if (!__vmm_rhs._name.exists(i)) begin \
$sformat(this.__vmm_image, `"this._name[\"%s\"] exists but to._name[\"%s\"] does not`", \
i, i); \
this.__vmm_status = 0; \
return; \
end \
else if (__vmm_rhs._name[i] != this._name[i]) begin \
string tmps = this._name[i]; \
string tmp_rhs = __vmm_rhs._name[i]; \
$sformat(this.__vmm_image, `"this._name[\"%s\"] (\"%s\") !== to._name[\"%s\"] (\"%s\")`", \
i, tmps, i, tmp_rhs); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
int start; \
int count; \
string sindextemp; \
int sindexcount; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
size = this._name.num(); \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits = 0; \
foreach (`THIS _name[j]) begin \
string tmps = this._name[j]; \
this.__vmm_maxbits =0; \
sindextemp = `string_cast(j); \
sindexcount = sindextemp.len(); \
this.__vmm_maxbits = sindexcount; \
`vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
this.__vmm_maxbits =0; \
count = this._name[j].len(); \
`vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
$swrite(this.__vmm_maxbits, "%s", tmps); \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int start; \
int count; \
string sindextemp; \
int sindexcount; \
string stemp; \
bit [31:0] size=0; \
this.__vmm_maxbits = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
for (int j=0; j < size; j++) begin \
this.__vmm_maxbits = 0; \
`vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
sindextemp = $psprintf("%s",this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
this.__vmm_maxbits = 0; \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
this._name[sindextemp] = $psprintf("%s",this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
end \
endcase
`define vmm_data_member_enum(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
$sformat(this.__vmm_image, `"%s\n%s _name=%s`", this.__vmm_image, this.__vmm_prefix, this._name.name()); \
end \
DO_COPY: begin \
__vmm_rhs._name = this._name; \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name !== this._name) begin \
$sformat(this.__vmm_image, `"this._name (%s) !== to._name (%s)`", \
this._name.name(), __vmm_rhs._name.name()); \
this.__vmm_status = 0; \
return; \
end \
end \
DO_PACK: begin \
int start; \
int count; \
start = this.__vmm_offset; \
count = 4; \
this.__vmm_maxbits = this._name; \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int count; \
int start; \
start = this.__vmm_offset; \
count = 4; \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
$cast(this._name,this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
endcase
`define vmm_data_member_enum_array(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
int size =0; \
size = $size(this._name); \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, size); \
for (int i = 0; i < size; i++) begin \
$sformat(this.__vmm_image, "%s %s", this.__vmm_image, this._name[i].name()); \
if (i == 2 && size > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
i = size - 3; \
end \
end \
end \
DO_COPY: begin \
__vmm_rhs._name = this._name; \
end \
DO_COMPARE: begin \
for (int i=0; i<this._name.size(); ++i) begin \
if (__vmm_rhs._name[i] !== this._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] (%s) !== to._name[%0d] (%s)`", \
i, this._name[i].name(), i, __vmm_rhs._name[i].name()); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
int start; \
int count; \
string stemp; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits = 0; \
for (int j=0; j<this._name.size(); ++j) begin \
stemp = this._name[j].name(); \
count = (stemp.len()); \
$swrite(this.__vmm_maxbits, "%s", stemp); \
`vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
size++; \
end \
`vmm_data_member_scalar_packint(pack,size,start,0) \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int count; \
int start; \
int index; \
string stemp; \
bit [31:0] size = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits =0; \
for (int j=0; j < size; j++) begin \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
stemp = $psprintf("%s",this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
index = 0; \
`vmm_data_member_enum_set_name(this._name[j],stemp,index) \
this.__vmm_maxbits =""; \
end \
end \
endcase
`define vmm_data_member_enum_da(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.size()); \
for (int i = 0; i < this._name.size(); i++) begin \
$sformat(this.__vmm_image, "%s %s", this.__vmm_image, this._name[i].name()); \
if (i == 2 && this._name.size() > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
i = this._name.size() - 3; \
end \
end \
end \
DO_COPY: begin \
__vmm_rhs._name = new [this._name.size()]; \
for(int i=0; i<this._name.size(); ++i) __vmm_rhs._name[i] = this._name[i]; \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name.size() !== this._name.size()) begin \
$sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
this._name.size(), __vmm_rhs._name.size()); \
this.__vmm_status = 0; \
return; \
end \
for (int i=0; i<this._name.size(); ++i) begin \
if (__vmm_rhs._name[i] !== this._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] (%s) !== to._name[%0d] (%s)`", \
i, this._name[i].name(), i, __vmm_rhs._name[i].name()); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
int start; \
int count; \
int index; \
int element; \
string stemp; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
size = this._name.size(); \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits = 0; \
for (int j=0; j<this._name.size(); ++j) begin \
stemp = this._name[j].name(); \
count = (stemp.len()); \
$swrite(this.__vmm_maxbits, "%s", stemp); \
`vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int count; \
int index; \
int start; \
string stemp; \
bit [31:0] size = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this._name = new [size]; \
this.__vmm_maxbits =0; \
for (int j=0; j < size; j++) begin \
this.__vmm_maxbits =""; \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
stemp = $psprintf("%s",this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
index = 0; \
`vmm_data_member_enum_set_name(this._name[j],stemp,index) \
this.__vmm_maxbits =""; \
end \
end \
endcase
`define vmm_data_member_enum_aa_scalar(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
int _count = 0; \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
foreach(`THIS _name[i]) begin \
if (_count <= 2 || _count >= this._name.num()-2) begin \
$sformat(this.__vmm_image, "%s %0d: %s ", this.__vmm_image, i, this._name[i].name()); \
if (_count == 2 && this._name.num() > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
end \
end \
_count++; \
end \
$sformat(this.__vmm_image, "%s", this.__vmm_image); \
end \
DO_COPY: begin \
__vmm_rhs._name.delete(); \
foreach(`THIS _name[i]) begin \
__vmm_rhs._name[i]=this._name[i]; \
end \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name.num() !== this._name.num()) begin \
$sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
this._name.num(), __vmm_rhs._name.num()); \
this.__vmm_status = 0; \
return; \
end \
foreach (`THIS _name[i]) begin \
if (!__vmm_rhs._name.exists(i)) begin \
$sformat(this.__vmm_image, `"this._name[%0d] exists but to._name[%0d] does not`", \
i, i); \
this.__vmm_status = 0; \
return; \
end \
else if (__vmm_rhs._name[i] != this._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] (%s) !== to._name[%0d] (%s)`", \
i, this._name[i].name(), i, __vmm_rhs._name[i].name()); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
int start; \
int count; \
int index; \
string stemp; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
this.__vmm_maxbits = 0; \
size = this._name.num(); \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
foreach (`THIS _name[j]) begin \
this.__vmm_maxbits = 0; \
stemp = this._name[j].name(); \
count = (stemp.len()); \
$swrite(this.__vmm_maxbits, "%s", stemp); \
index = j; \
`vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int count; \
int start; \
int index=0; \
string stemp; \
bit [31:0] size = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits =0; \
for (int j=0; j < size; j++) begin \
this.__vmm_maxbits =0; \
`vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
stemp = $psprintf("%s",this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
count = 0; \
`vmm_data_member_enum_set_name(this._name[index],stemp,count) \
this.__vmm_maxbits =""; \
end \
end \
endcase
`define vmm_data_member_enum_aa_string(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
int _count = 0; \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
foreach(`THIS _name[i]) begin \
if (_count <= 2 || _count >= this._name.num()-2) begin \
$sformat(this.__vmm_image, "%s \"%s\":%s", this.__vmm_image, i, this._name[i].name()); \
if (_count == 2 && this._name.num() > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
end \
end \
_count++; \
end \
end \
DO_COPY: begin \
__vmm_rhs._name.delete(); \
foreach (`THIS _name[i]) begin \
__vmm_rhs._name[i] = this._name[i]; \
end \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name.num() !== this._name.num()) begin \
$sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
this._name.num(), __vmm_rhs._name.num()); \
this.__vmm_status = 0; \
return; \
end \
foreach (`THIS _name[i]) begin \
if (!__vmm_rhs._name.exists(i)) begin \
$sformat(this.__vmm_image, `"this._name[\"%s\"] exists but to._name[\"%s\"] does not`", \
i, i); \
this.__vmm_status = 0; \
return; \
end \
else if (__vmm_rhs._name[i] != this._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[\"%s\"] (%s) !== to._name[\"%s\"] (%s)`", \
i, this._name[i].name(), i, __vmm_rhs._name[i].name()); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
int start; \
int count; \
int index; \
string sindextemp; \
int sindexcount; \
string stemp; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
void'(this._name.first(sindextemp)); \
index = 0; \
size = this._name.num(); \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits = 0; \
foreach (`THIS _name[j]) begin \
this.__vmm_maxbits =0; \
sindextemp = `string_cast(j); \
sindexcount = sindextemp.len(); \
this.__vmm_maxbits = sindexcount; \
`vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
this.__vmm_maxbits =0; \
stemp = this._name[j].name(); \
count = (stemp.len()); \
`vmm_data_member_scalar_packint(pack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
$swrite(this.__vmm_maxbits, "%s", stemp); \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,count,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int start; \
int count; \
int index; \
string sindextemp; \
int sindexcount; \
string stemp; \
bit [31:0] size=0; \
index = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits = 0; \
for (int j=0; j < size; j++) begin \
this.__vmm_maxbits = 0; \
`vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
sindextemp = `string_cast(this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
this.__vmm_maxbits = 0; \
`vmm_data_member_scalar_unpackint(unpack,count,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,count,this.__vmm_offset) \
stemp = $psprintf("%s",this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
index = 0; \
`vmm_data_member_enum_set_name(this._name[sindextemp],stemp,index) \
this.__vmm_maxbits =""; \
end \
end \
endcase
`define vmm_data_member_handle(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
if ( _name == null ) begin \
$sformat(this.__vmm_image, `" vmm_data _name object does not exist, no action`"); \
`vmm_warning(this.log, this.__vmm_image); \
end \
else begin \
string _prefix = this.__vmm_prefix; \
$sformat(this.__vmm_image, `"%s\n%s _name is %s`", this.__vmm_image, this.__vmm_prefix, \
(this._name == null) ? "null" : "<ref>"); \
this.__vmm_prefix = _prefix; \
end \
end \
DO_COPY: begin \
if ( _name == null ) begin \
$sformat(this.__vmm_image, `" vmm_data _name object does not exist, no action`"); \
`vmm_warning(this.log, this.__vmm_image); \
end \
else begin \
__vmm_rhs._name = this._name; \
end \
end \
DO_COMPARE: begin \
string diff; \
if ( _name == null ) begin \
$sformat(this.__vmm_image, `" vmm_data _name object does not exist, no action`"); \
`vmm_warning(this.log, this.__vmm_image); \
end \
else begin \
if (this._name != __vmm_rhs._name) begin \
this.__vmm_image = `"this._name !== to._name`"; \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
if ( _name == null ) begin \
$sformat(this.__vmm_image, `" vmm_data _name object does not exist, no action`"); \
`vmm_warning(this.log, this.__vmm_image); \
end \
else begin \
end \
end \
DO_UNPACK: begin \
this._name = null; \
end \
endcase
`define vmm_data_member_handle_array(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
int size =0; \
size = $size(this._name); \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, size); \
for (int i = 0; i < size; i++) begin \
$sformat(this.__vmm_image, "%s %s", this.__vmm_image, \
(this._name[i] == null) ? "null" : "<ref>"); \
if (i == 2 && size > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
i = size - 3; \
end \
end \
end \
DO_COPY: begin \
__vmm_rhs._name = this._name; \
end \
DO_COMPARE: begin \
for (int i=0; i<this._name.size(); ++i) begin \
if (this._name[i] != __vmm_rhs._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
end \
DO_UNPACK: begin \
for (int i=0; i<this._name.size(); ++i) begin \
this._name[i] = null; \
end \
end \
endcase
`define vmm_data_member_handle_da(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.size()); \
for (int i = 0; i < this._name.size(); i++) begin \
$sformat(this.__vmm_image, "%s %s", this.__vmm_image, \
(this._name[i] == null) ? "null" : "<ref>"); \
if (i == 2 && this._name.size() > 5) begin \
this.__vmm_image = {this.__vmm_image, " ..."}; \
i = this._name.size() - 3; \
end \
end \
end \
DO_COPY: begin \
__vmm_rhs._name = new[this._name.size()]; \
for (int i=0; i<this._name.size(); ++i) begin \
__vmm_rhs._name[i] = this._name[i]; \
end \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name.size() !== this._name.size()) begin \
$sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
this._name.size(), __vmm_rhs._name.size()); \
this.__vmm_status = 0; \
return; \
end \
for (int i=0; i<this._name.size(); ++i) begin \
if (this._name[i] != __vmm_rhs._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
end \
DO_UNPACK: begin \
for (int i=0; i<this._name.size(); ++i) begin \
this._name[i] = null; \
end \
end \
endcase
`define vmm_data_member_handle_aa_scalar(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
int _count = 0; \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
foreach(`THIS _name[i]) begin \
if (_count <= 2 || _count >= this._name.num()-2) \
$sformat(this.__vmm_image, "%s %0d: %s", this.__vmm_image, i,(this._name[i] == null) ? `"null`" : `"<ref>`"); \
if (_count== 2 && this._name.num() > 5) begin \
this.__vmm_image = {this.__vmm_image, "\n..."}; \
end \
_count++; \
end \
end \
DO_COPY: begin \
__vmm_rhs._name.delete(); \
foreach(`THIS _name[i]) begin \
__vmm_rhs._name[i] = new; \
__vmm_rhs._name[i] = this._name[i]; \
end \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name.num() !== this._name.num()) begin \
$sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
this._name.num(), __vmm_rhs._name.num()); \
this.__vmm_status = 0; \
return; \
end \
foreach (`THIS _name[i]) begin \
if (!__vmm_rhs._name.exists(i)) begin \
$sformat(this.__vmm_image, `"this._name[%0d] exists but to._name[%0d] does not`", i, i); \
this.__vmm_status = 0; \
return; \
end \
if (this._name[i] != __vmm_rhs._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
end \
DO_UNPACK: begin \
foreach (`THIS _name[i]) begin \
this._name[i] = null; \
end \
end \
endcase
`define vmm_data_member_handle_aa_string(_name, _do) \
\
case (do_what & _do) \
DO_PRINT: begin \
int _count = 0; \
$sformat(this.__vmm_image, `"%s\n%s _name[%0d]=`", this.__vmm_image, this.__vmm_prefix, this._name.num()); \
foreach(`THIS _name[i]) begin \
if (_count <= 2 || _count >= this._name.num()-2) \
$sformat(this.__vmm_image, "%s \"%s\": %s`", this.__vmm_image, i,(this._name[i] == null) ? `"null`" : `"<ref>`"); \
if (_count== 2 && this._name.num() > 5) begin \
this.__vmm_image = {this.__vmm_image, "\n..."}; \
end \
_count++; \
end \
end \
DO_COPY: begin \
__vmm_rhs._name.delete(); \
foreach(`THIS _name[i]) begin \
__vmm_rhs._name[i] = new; \
__vmm_rhs._name[i] = this._name[i]; \
end \
end \
DO_COMPARE: begin \
if (__vmm_rhs._name.num() !== this._name.num()) begin \
$sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
this._name.num(), __vmm_rhs._name.num()); \
this.__vmm_status = 0; \
return; \
end \
foreach (`THIS _name[i]) begin \
if (!__vmm_rhs._name.exists(i)) begin \
$sformat(this.__vmm_image, `"this._name[\"%s\"] exists but to._name[\"%s\"] does not`", i, i); \
this.__vmm_status = 0; \
return; \
end \
if (this._name[i] != __vmm_rhs._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[\"%s\"] !== to._name[\"%s\"]`", i, i); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_PACK: begin \
end \
DO_UNPACK: begin \
foreach (`THIS _name[i]) begin \
this._name[i] = null; \
end \
end \
endcase
`define vmm_data_member_vmm_data(_name, _do, _how) \
\
case (do_what & _do) \
DO_PRINT: begin \
if ( _name == null ) begin \
$sformat(this.__vmm_image, `"%s\n%s%s: (null)`", this.__vmm_image, \
this.__vmm_prefix, `"_name`"); \
end \
else begin \
string _prefix = this.__vmm_prefix; \
string _image = this.__vmm_image; \
$sformat(this.__vmm_image, "%s\n%s", _image, this._name.psdisplay({this.__vmm_prefix, `" _name: `"})); \
this.__vmm_prefix = _prefix; \
end \
end \
DO_COPY: begin \
if (_name == null) begin \
__vmm_rhs._name = this._name; \
end \
else begin \
case (_how & HOW_TO_COPY) \
DO_REFCOPY: begin \
__vmm_rhs._name = this._name; \
end \
DO_DEEPCOPY: begin \
$cast(__vmm_rhs._name, this._name.copy()); \
end \
endcase \
end \
end \
DO_COMPARE: begin \
if (_name == null || __vmm_rhs._name == null) begin \
if (this._name != __vmm_rhs._name) begin \
this.__vmm_image = `"this._name !== to._name !== NULL`"; \
this.__vmm_status = 0; \
return; \
end \
end \
if (_name == null) begin \
$sformat(this.__vmm_image, `" do-ccompare 1 vmm_data _name object does not exist, no action`"); \
`vmm_warning(this.log, this.__vmm_image); \
end \
else begin \
case (_how & HOW_TO_COMPARE) \
DO_REFCOMPARE: begin \
if (this._name != __vmm_rhs._name) begin \
$sformat(this.__vmm_image, `"this._name !== to._name`"); \
this.__vmm_status = 0; \
return; \
end \
end \
DO_DEEPCOMPARE: begin \
string diff; \
if (!this._name.compare(__vmm_rhs._name, diff)) begin \
$sformat(this.__vmm_image, `"this._name !== to._name: %s `", diff); \
this.__vmm_status = 0; \
return; \
end \
end \
endcase \
end \
end \
DO_PACK: begin \
int count=0; \
if (_name == null) begin \
$sformat(this.__vmm_image, `" vmm_data _name object does not exist, no action`"); \
`vmm_warning(this.log, this.__vmm_image); \
end \
else begin \
count = this._name.byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
end \
DO_UNPACK: begin \
int count=0; \
this._name = new(); \
count = this._name.byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
endcase
`define vmm_data_member_vmm_data_array(_name, _do, _how) \
\
case (do_what & _do) \
DO_PRINT: begin \
int size =0; \
string _prefix = this.__vmm_prefix; \
size = $size(this._name); \
for (int i = 0; i < size; i++) begin \
string pf; \
string _image = this.__vmm_image; \
$sformat(pf, `"%s _name[%0d]: `", _prefix, i); \
$sformat(this.__vmm_image, "%s\n%s", _image, this._name[i].psdisplay(pf)); \
if (i == 2 && size > 5 ) begin \
this.__vmm_image = {this.__vmm_image, "\n", _prefix, "..."}; \
i = size -3; \
end \
end \
this.__vmm_prefix = _prefix; \
end \
DO_COPY: begin \
case (_how & HOW_TO_COPY) \
DO_REFCOPY: begin \
__vmm_rhs._name = this._name; \
for (int i=0; i<this._name.size(); ++i) begin \
__vmm_rhs._name[i] = this._name[i]; \
end \
end \
DO_DEEPCOPY: begin \
__vmm_rhs._name = this._name; \
for (int i=0; i<this._name.size(); ++i) begin \
$cast(__vmm_rhs._name[i], this._name[i].copy()); \
end \
end \
endcase \
end \
DO_COMPARE: begin \
string diff; \
case (_how & HOW_TO_COMPARE) \
DO_REFCOMPARE: begin \
for (int i=0; i<this._name.size(); ++i) begin \
if (this._name[i] != __vmm_rhs._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_DEEPCOMPARE: begin \
for (int i=0; i<this._name.size(); ++i) begin \
if (!this._name[i].compare(__vmm_rhs._name[i],diff)) begin \
$sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]: %s`", i, i, diff); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
endcase \
end \
DO_PACK: begin \
int start; \
int count; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits = 0; \
for (int j=0; j<this._name.size(); ++j) begin \
count = this._name[j].byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
size++; \
end \
`vmm_data_member_scalar_packint(pack,size,start,0) \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int count; \
int start; \
int index; \
string stemp; \
bit [31:0] size = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits =0; \
for (int j=0; j < size; j++) begin \
this._name[j] = new(); \
count = this._name[j].byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
end \
endcase
`define vmm_data_member_vmm_data_da(_name, _do, _how) \
\
case (do_what & _do) \
DO_PRINT: begin \
string _prefix = this.__vmm_prefix; \
for (int i = 0; i < this._name.size(); i++) begin \
string pf; \
string _image = this.__vmm_image; \
$sformat(pf, `"%s _name[%0d]: `", _prefix, i); \
$sformat(this.__vmm_image, "%s\n%s", _image, this._name[i].psdisplay(pf)); \
if (i == 2 && this._name.size() > 5) begin \
this.__vmm_image = {this.__vmm_image, "\n", _prefix, "..."}; \
i = this._name.size() - 3; \
end \
end \
this.__vmm_prefix = _prefix; \
end \
DO_COPY: begin \
case (_how & HOW_TO_COPY) \
DO_REFCOPY: begin \
__vmm_rhs._name = new [this._name.size()]; \
for (int i=0; i<this._name.size(); ++i) begin \
__vmm_rhs._name[i] = this._name[i]; \
end \
end \
DO_DEEPCOPY: begin \
__vmm_rhs._name = new [this._name.size()]; \
for (int i=0; i<this._name.size(); ++i) begin \
$cast(__vmm_rhs._name[i], this._name[i].copy()); \
end \
end \
endcase \
end \
DO_COMPARE: begin \
string diff; \
if (__vmm_rhs._name.size() !== this._name.size()) begin \
$sformat(this.__vmm_image, `"this._name.size() (%0d) !== to._name.size() (%0d)`", \
this._name.size(), __vmm_rhs._name.size()); \
this.__vmm_status = 0; \
return; \
end \
case (_how & HOW_TO_COMPARE) \
DO_REFCOMPARE: begin \
for (int i=0; i<this._name.size(); ++i) begin \
if (this._name[i] != __vmm_rhs._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_DEEPCOMPARE: begin \
for (int i=0; i<this._name.size(); ++i) begin \
if (!this._name[i].compare(__vmm_rhs._name[i],diff)) begin \
$sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]: %s`", i, i, diff); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
endcase \
end \
DO_PACK: begin \
int start; \
int count; \
int index; \
int element; \
string stemp; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
size = this._name.size(); \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits = 0; \
for (int j=0; j<this._name.size(); ++j) begin \
count = this._name[j].byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int count; \
int start; \
int index; \
string stemp; \
bit [31:0] size = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits =0; \
for (int j=0; j<this._name.size(); ++j) begin \
this._name[j] = new(); \
count = this._name[j].byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
end \
endcase
`define vmm_data_member_vmm_data_aa_scalar(_name, _do, _how) \
\
case (do_what & _do) \
DO_PRINT: begin \
int _count = 0; \
string _prefix = this.__vmm_prefix; \
foreach (`THIS _name[i]) begin \
if (_count <= 2 || _count >= this._name.num()-2) begin \
string pf; \
string _image = this.__vmm_image; \
$sformat(pf, `"%s _name[%0d]`", _prefix, i); \
$sformat(this.__vmm_image, "%s\n%s", _image, this._name[i].psdisplay(pf)); \
if (_count== 2 && this._name.num() > 5) begin \
this.__vmm_image = {this.__vmm_image, "\n", _prefix, "..."}; \
end \
_count++; \
end \
end \
this.__vmm_prefix = _prefix; \
end \
DO_COPY: begin \
case (_how & HOW_TO_COPY) \
DO_REFCOPY: begin \
__vmm_rhs._name.delete(); \
foreach (`THIS _name[i]) begin \
__vmm_rhs._name[i] = this._name[i]; \
end \
end \
DO_DEEPCOPY: begin \
__vmm_rhs._name.delete(); \
foreach(`THIS _name[i]) begin \
$cast(__vmm_rhs._name[i], this._name[i].copy()); \
end \
end \
endcase \
end \
DO_COMPARE: begin \
string diff; \
if (__vmm_rhs._name.num() !== this._name.num()) begin \
$sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
this._name.num(), __vmm_rhs._name.num()); \
this.__vmm_status = 0; \
return; \
end \
case (_how & HOW_TO_COMPARE) \
DO_REFCOMPARE: begin \
__vmm_rhs._name.delete(); \
foreach (`THIS _name[i]) begin \
if (!__vmm_rhs._name.exists(i)) begin \
$sformat(this.__vmm_image, `"this._name[%0d] exists but to._name[%0d] does not`", i, i); \
this.__vmm_status = 0; \
return; \
end \
if (this._name[i] != __vmm_rhs._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_DEEPCOMPARE: begin \
__vmm_rhs._name.delete(); \
foreach(`THIS _name[i]) begin \
if (!__vmm_rhs._name.exists(i)) begin \
$sformat(this.__vmm_image, `"this._name[%0d] exists but to._name[%0d] does not`", i, i); \
this.__vmm_status = 0; \
return; \
end \
if (!this._name[i].compare(__vmm_rhs._name[i], diff)) begin \
$sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]: %s`", i, i, diff); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
endcase \
end \
DO_PACK: begin \
int start; \
int count; \
int index; \
string stemp; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
this.__vmm_maxbits = 0; \
size = this._name.num(); \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
foreach (`THIS _name[j]) begin \
this.__vmm_maxbits = 0; \
index = j; \
`vmm_data_member_scalar_packint(pack,index,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
count = this._name[j].byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int count; \
int start; \
int index=0; \
string stemp; \
bit [31:0] size = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits =0; \
for (int j=0; j < size; j++) begin \
this.__vmm_maxbits =0; \
`vmm_data_member_scalar_unpackint(unpack,index,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this._name[index] = new(); \
count = this._name[index].byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
end \
endcase
`define vmm_data_member_vmm_data_aa_string(_name, _do, _how) \
\
case (do_what & _do) \
DO_PRINT: begin \
int _count = 0; \
string _prefix = this.__vmm_prefix; \
foreach (`THIS _name[i]) begin \
if (_count <= 2 || _count >= this._name.num()-2) begin \
string pf; \
string _image = this.__vmm_image; \
$sformat(pf, `"%s _name[\"%s\"]`", _prefix, i); \
$sformat(this.__vmm_image, "%s\n%s", _image, this._name[i].psdisplay(pf)); \
if (_count== 2 && this._name.num() > 5) begin \
this.__vmm_image = {this.__vmm_image, "\n", _prefix, "..."}; \
end \
_count++; \
end \
end \
this.__vmm_prefix = _prefix; \
end \
DO_COPY: begin \
case (_how & HOW_TO_COPY) \
DO_REFCOPY: begin \
this.__vmm_rhs._name.delete(); \
foreach (`THIS _name[i]) begin \
this.__vmm_rhs._name[i] = this._name[i]; \
end \
end \
DO_DEEPCOPY: begin \
this.__vmm_rhs._name.delete(); \
foreach(`THIS _name[i]) begin \
$cast(this.__vmm_rhs._name[i], this._name[i].copy()); \
end \
end \
endcase \
end \
DO_COMPARE: begin \
string diff; \
if (this.__vmm_rhs._name.num() !== this._name.num()) begin \
$sformat(this.__vmm_image, `"this._name.num() (%0d) !== to._name.num() (%0d)`", \
this._name.num(), this.__vmm_rhs._name.num()); \
this.__vmm_status = 0; \
return; \
end \
case (_how & HOW_TO_COMPARE) \
DO_REFCOMPARE: begin \
this.__vmm_rhs._name.delete(); \
foreach (`THIS _name[i]) begin \
if (!this.__vmm_rhs._name.exists(i)) begin \
$sformat(this.__vmm_image, `"this._name[\"%s\"] exists but to._name[\"%s\"] does not`", i, i); \
this.__vmm_status = 0; \
return; \
end \
if (this._name[i] != this.__vmm_rhs._name[i]) begin \
$sformat(this.__vmm_image, `"this._name[%0d] !== to._name[%0d]`", i, i); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
DO_DEEPCOMPARE: begin \
this.__vmm_rhs._name.delete(); \
foreach(`THIS _name[i]) begin \
if (!this.__vmm_rhs._name.exists(i)) begin \
$sformat(this.__vmm_image, `"this._name[\"%s\"] exists but to._name[\"%s\"] does not`", i, i); \
this.__vmm_status = 0; \
return; \
end \
if (!this._name[i].compare(this.__vmm_rhs._name[i], diff)) begin \
$sformat(this.__vmm_image, `"this._name[\"%s\"] !== to._name[\"%s\"]: %s`", i, i, diff); \
this.__vmm_status = 0; \
return; \
end \
end \
end \
endcase \
end \
DO_PACK: begin \
int start; \
int count; \
int index; \
string sindextemp; \
int sindexcount; \
string stemp; \
bit [31:0] size=0; \
start = this.__vmm_offset; \
void'(this._name.first(sindextemp)); \
index = 0; \
size = this._name.num(); \
`vmm_data_member_scalar_packint(pack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits = 0; \
foreach (`THIS _name[j]) begin \
this.__vmm_maxbits =0; \
sindextemp = `string_cast(j); \
sindexcount = sindextemp.len(); \
this.__vmm_maxbits = sindexcount; \
`vmm_data_member_scalar_packint(pack,sindexcount,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_pack(pack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
`vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
this.__vmm_maxbits =0; \
count = this._name[j].byte_pack(pack, this.__vmm_offset, this.__vmm_kind); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
this.__vmm_len = this.__vmm_offset; \
end \
DO_UNPACK: begin \
int start; \
int count; \
int index; \
string sindextemp; \
int sindexcount; \
string stemp; \
bit [31:0] size=0; \
index = 0; \
start = this.__vmm_offset; \
`vmm_data_member_scalar_unpackint(unpack,size,start,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
this.__vmm_maxbits = 0; \
for (int j=0; j < size; j++) begin \
this.__vmm_maxbits = 0; \
`vmm_data_member_scalar_unpackint(unpack,sindexcount,this.__vmm_offset,0) \
`vmm_data_member_update_offset(this.__vmm_offset,4) \
`vmm_data_member_scalar_unpack(unpack,this.__vmm_maxbits,sindexcount,this.__vmm_offset) \
sindextemp = `string_cast(this.__vmm_maxbits); \
`vmm_data_member_update_offset(this.__vmm_offset,sindexcount) \
this.__vmm_maxbits = 0; \
this._name[sindextemp] = new(); \
count = this._name[sindextemp].byte_unpack(unpack, this.__vmm_offset, this.__vmm_len, this.__vmm_kind); \
`vmm_data_member_update_offset(this.__vmm_offset,count) \
end \
end \
endcase
`define vmm_data_member_user_defined(_name) \
\
this.__vmm_status = this.do_``_name(do_what, this.__vmm_prefix, this.__vmm_image, \
this.__vmm_rhs, \
this.__vmm_kind, this.__vmm_offset, pack, unpack); \
if (__vmm_status == 0) return;
`define vmm_data_new(_class) \
\
`define vmm_data_new_used 1 \
\
static `VMM_LOG log = new(`"_class`", `"class`"); \
`define vmm_data_member_end(_class) \
endfunction \
\
`ifndef vmm_data_new_used \
static `VMM_LOG log = new(`"_class`", `"class`"); \
\
function new(vmm_log log = null); \
super.new((log == null) ? this.log : log); \
endfunction \
`endif \
`undef vmm_data_new_used \
`vmm_data_methods(_class)
`define vmm_data_methods(_class) \
\
local virtual function string this_class_name(); \
return `"_class`"; \
endfunction \
\
local virtual function vmm_log get_vmm_log(); \
return this.log; \
endfunction \
\
virtual function vmm_data allocate(); \
_class i = new; \
return i; \
endfunction \
\
virtual function bit is_valid(bit silent = 1, \
int kind = -1); \
this.__vmm_done_user = 1; \
is_valid = this.do_is_valid(silent, kind); \
if (this.__vmm_done_user) return is_valid; \
\
return 1; \
endfunction \
\
virtual function string psdisplay(string prefix = `"`"); \
this.__vmm_done_user = 1; \
psdisplay = this.do_psdisplay(prefix); \
if (this.__vmm_done_user) return psdisplay; \
\
this.__vmm_prefix = prefix; \
this.do_all(DO_PRINT, __vmm_bytes, __vmm_bytes); \
return this.__vmm_image; \
endfunction \
\
virtual function vmm_data copy(vmm_data to = null); \
_class cpy; \
\
this.__vmm_done_user = 1; \
copy = this.do_copy(to); \
if (this.__vmm_done_user) return copy; \
\
if (to == null) cpy = new; \
else if (!$cast(cpy, to)) begin \
`vmm_fatal(this.log, `"Cannot copy to non-_class instance`"); \
return null; \
end \
\
super.copy_data(cpy); \
this.__vmm_rhs = cpy; \
this.do_all(DO_COPY, __vmm_bytes, __vmm_bytes); \
\
return cpy; \
endfunction \
\
virtual function bit compare( vmm_data to, \
output string diff, \
input int kind = -1); \
_class cp; \
\
if (to == null) begin \
diff = `"'to' is NULL`"; \
return 0; \
end \
\
this.__vmm_done_user = 1; \
compare = this.do_compare(to, diff, kind); \
if (this.__vmm_done_user) return compare; \
\
if (!$cast(cp, to)) begin \
diff = `"'to' is not a _class instance`"; \
return 0; \
end \
\
this.__vmm_rhs = cp; \
this.__vmm_kind = kind; \
this.do_all(DO_COMPARE, __vmm_bytes, __vmm_bytes); \
diff = this.__vmm_image; \
\
return this.__vmm_status; \
endfunction \
\
virtual function int unsigned byte_pack(ref logic [7:0] bytes[], \
input int unsigned offset = 0, \
input int kind = -1); \
int min_size; \
this.__vmm_done_user = 1; \
byte_pack = this.do_byte_pack(bytes, offset, kind); \
if (this.__vmm_done_user) return byte_pack; \
\
min_size = offset + this.__vmm_byte_size(kind); \
if (bytes.size() < min_size) bytes = new [min_size] (bytes); \
this.__vmm_offset = offset; \
this.__vmm_kind = kind; \
this.do_all(DO_PACK, bytes, __vmm_bytes); \
\
return this.__vmm_offset - offset; \
endfunction \
\
virtual function int unsigned byte_unpack(const ref logic [7:0] bytes[], \
input int unsigned offset = 0, \
input int len = -1, \
input int kind = -1); \
this.__vmm_done_user = 1; \
byte_unpack = this.do_byte_unpack(bytes, offset, len, kind); \
if (this.__vmm_done_user) return byte_unpack; \
\
this.__vmm_offset = offset; \
this.__vmm_kind = kind; \
this.do_all(DO_UNPACK, __vmm_bytes, bytes); \
\
return this.__vmm_offset - offset; \
endfunction
`define vmm_data_byte_size(_max, _n) \
virtual protected function int unsigned __vmm_byte_size(int kind = -1); \
return this.byte_size(kind); \
endfunction: __vmm_byte_size \
\
virtual function int unsigned byte_size(int kind = -1); \
this.__vmm_done_user = 1; \
byte_size = this.do_byte_size(kind); \
if (this.__vmm_done_user) return byte_size; \
\
return _n; \
endfunction: byte_size \
\
virtual function int unsigned max_byte_size(int kind = -1); \
this.__vmm_done_user = 1; \
max_byte_size = this.do_max_byte_size(kind); \
if (this.__vmm_done_user) return max_byte_size; \
\
return _max; \
endfunction