module test; typedef struct { byte red; byte green; byte blue; } RGB_TYPE; import "DPI-C" function void set_fixed1(inout RGB_TYPE mem [10:1 ]); import "DPI-C" function void set_fixed2(inout RGB_TYPE mem [10:1][3:2 ]); import "DPI-C" function void set_fixed3(inout RGB_TYPE mem [10:1][3:2][4:3 ]); RGB_TYPE m1[10:1]; RGB_TYPE m2 [10:1][3:2]; RGB_TYPE m3 [10:1][3:2][4:3]; initial begin //1-D for (int i=1;i<=10;i++) begin m1[i].red=i; m1[i].green=i+1; m1[i].blue=i+2; end set_fixed1(m1); //2-D for (int m=1;m<=10;m++) for (int n=2;n<=3;n++) begin m2[m][n].red=m<<3 | n; m2[m][n].green=m<<3 | n+1; m2[m][n].blue= m<< 3| n+2; end set_fixed2(m2); //3-D for (int m=1;m<=10;m++) for (int n=2;n<=3;n++) for (int i=3;i<=4;i++) begin m3[m][n][i].red=m<< 4 | n<<3 | i; m3[m][n][i].green=m<<4 | n<<3 | i+1; m3[m][n][i].blue= m<< 4 | n<<3 | i+2; end set_fixed3(m3); end endmodule
/* Copyright 2011 www.sugawara-systems.com
* Note:
* This file is automatically generated.
* Please do not edit this file - you will lose your edits.*/
#ifndef INCLUDED_DPIHEADER
#define INCLUDED_DPIHEADER
#ifdef __cplusplus
#define DPI_LINK_DECL extern "C"
#else
#define DPI_LINK_DECL
#endif
#include "svdpi.h"
typedefstruct {
char red;
char green;
char blue;
} RGB_TYPE;
DPI_LINK_DECL DPI_DLLESPEC
void set_fixed1(RGB_TYPE*);
DPI_LINK_DECL DPI_DLLESPEC
void set_fixed2(RGB_TYPE*);
DPI_LINK_DECL DPI_DLLESPEC
void set_fixed3(RGB_TYPE*);
| ↓m1構造体配列の先頭 | ||||||||||
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | C++ |
| [1] | [2] | [3] | [4] | [5] | [6] | [7] | [8] | [9] | [10] | SV |
| red | red | red | red | red | red | red | red | red | red | |
| green | green | green | green | green | green | green | green | green | green | |
| blue | blue | blue | blue | blue | blue | blue | blue | blue | blue | |
| ↓m2構造体配列の先頭 | ||||||||||
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | C++ |
| [1][2] | [1][3] | [2][2] | [2][3] | [3][2] | [3][3] | [4][2] | [4][3] | [5][2] | [5][3] | SV |
| red | red | red | red | red | red | red | red | red | red | |
| green | green | green | green | green | green | green | green | green | green | |
| blue | blue | blue | blue | blue | blue | blue | blue | blue | blue | |
| ↓m3構造体配列の先頭 | ||||||||||
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | C++ |
| [1][2][3] | [1][2][4] | [1][3][3] | [1][3][4] | [2][2][3] | [2][2][4] | [2][3][3] | [2][3][4] | [3][2][3] | [3][2][4] | SV |
| red | red | red | red | red | red | red | red | red | red | |
| green | green | green | green | green | green | green | green | green | green | |
| blue | blue | blue | blue | blue | blue | blue | blue | blue | blue |
void set_fixed1(RGB_TYPE *mem){
for (int m=0;m<10;m++){
printf("mem1[%3d]={%2x,%2x, %2x}\n",m,mem[m].red,mem[m].green,mem[m].blue);
}
}
void set_fixed2(RGB_TYPE *mem ){
for (int m=0;m<10;m++){
for (int n=0;n<2;n++){
printf("mem2[%3d][%3d]={%2x,%2x, %2x}\n",
m,n,mem[m*2+n].red,mem[m*2+n].green,mem[m*2+n].blue);
}
}
}
void set_fixed3(RGB_TYPE *mem){
for (int m=0;m<10;m++){
for (int n=0;n <2;n++){
for (int i=0;i<2;i++){
printf("mem3[%3d][%3d][%3d]={%2x,%2x, %2x}\n",
m,n,i,mem[m*4+2*n+i].red,mem[m*4+2*n+i].green,mem[m*4+2*n+i].blue);
}
}
}
}
module test;
typedefstruct {
byte red;
byte green;
byte blue;
} RGB_TYPE;
import "DPI-C" function void set_rgb1(inout RGB_TYPE mem []);
RGB_TYPE m1[10:1];
RGB_TYPE m2 [10:1][3:2];
RGB_TYPE m3 [10:1][3:2][4:3];
initial begin
//1-D
for (int i=1;i<=10;i++) begin
m1[i].red=i;
m1[i].green=i+1;
m1[i].blue=i+2;
end
set_rgb1(m1);
//2-D
for (int m=1;m<=10;m++)
for (int n=2;n<=3;n++) begin
m2[m][n].red=m<<3 | n;
m2[m][n].green=m<<3 | n+1;
m2[m][n].blue= m<< 3| n+2;
end
set_rgb1(m2);
//3-D
for (int m=1;m<=10;m++)
for (int n=2;n<=3;n++)
for (int i=3;i<=4;i++) begin
m3[m][n][i].red=m<< 4 | n<<3 | i;
m3[m][n][i].green=m<<4 | n<<3 | i+1;
m3[m][n][i].blue= m<< 4 | n<<3 | i+2;
end
set_rgb1(m3);
end
endmodule
/* Copyright 2011 www.sugawara-systems.com
* Note:
* This file is automatically generated.
* Please do not edit this file - you will lose your edits.*/
#ifndef INCLUDED_DPIHEADER#define INCLUDED_DPIHEADER#ifdef __cplusplus#define DPI_LINK_DECL extern "C" #else#define DPI_LINK_DECL#endif#include "svdpi.h"
typedefstruct {
char red;
char green;
char blue;
} RGB_TYPE;
DPI_LINK_DECL DPI_DLLESPEC
void set_rgb1(svOpenArrayHandle );
void set_rgb1(svOpenArrayHandle handle){
RGB_TYPE * data;
data=reinterpret_cast<RGB_TYPE*>(svGetArrayPtr(handle));
int unpacked_dim=svDimensions(handle);
printf("Declared Dimensions are ");
for (int i=1;i<=unpacked_dim;i++){
printf("[%d:%d]",svLeft(handle,i),svRight(handle,i));
}
printf("\n");
printf("sizeofarray =%dbytes\n",svSizeOfArray(handle));
if (unpacked_dim==1){
for (int m=svLow(handle,1);m <= svHigh(handle,1);m++){
RGB_TYPE *a;
a=reinterpret_cast<RGB_TYPE*>(svGetArrElemPtr(handle,m));
printf("[%3d]==[%x,%x,%x]\n",m,a->red,a->green,a->blue);
}
} elseif (unpacked_dim==2){
for (int m=svLow(handle,1);m <= svHigh(handle,1);m++){
for (int n=svLow(handle,2);n <= svHigh(handle,2);n++){
RGB_TYPE *a;
a=reinterpret_cast<RGB_TYPE*>(svGetArrElemPtr(handle,m,n));
printf("[%2d][%2d]=[%x,%x,%x]\n",m,n,a->red,a->green,a->blue);
}
}
} elseif (unpacked_dim==3){
for (int m=svLow(handle,1);m <= svHigh(handle,1);m++){
for (int n=svLow(handle,2);n <= svHigh(handle,2);n++){
for (int i=svLow(handle,3);i <= svHigh(handle,3);i++){
RGB_TYPE *a;
a=reinterpret_cast<RGB_TYPE*>(svGetArrElemPtr(handle,m,n,i));
printf("[%2d][%2d][%2d]=[%x,%x,%x]\n",m,n,i,a->red,a->green,a->blue);
}
}
}
}
}
/*
* Open array querying functions
* These functions are modeled upon the SystemVerilog array
* querying functions and use the same semantics.
*
* If the dimension is 0, then the query refers to the
* packed part of an array (which is one dimensional).
* Dimensions > 0 refer to the unpacked part of an array.
*//* h= handle to open array, d=dimension */
XXTERN int svLeft(const svOpenArrayHandle h, int d);
XXTERN int svRight(const svOpenArrayHandle h, int d);
XXTERN int svLow(const svOpenArrayHandle h, int d);
XXTERN int svHigh(const svOpenArrayHandle h, int d);
XXTERN int svIncrement(const svOpenArrayHandle h, int d);
XXTERN int svSize(const svOpenArrayHandle h, int d);
XXTERN int svDimensions(const svOpenArrayHandle h);
/*
* Pointer to the actual representation of the whole array of any type
* NULL if not in C layout
*/
XXTERN void* svGetArrayPtr(const svOpenArrayHandle);
/* total size in bytes or 0 if not in C layout */
XXTERN int svSizeOfArray(const svOpenArrayHandle);
/*
* Return a pointer to an element of the array
* or NULL if index outside the range or null pointer
*/
XXTERN void* svGetArrElemPtr(const svOpenArrayHandle, int indx1, ...);
/* specialized versions for 1-, 2- and 3-dimensional arrays: */
XXTERN void* svGetArrElemPtr1(const svOpenArrayHandle, int indx1);
XXTERN void* svGetArrElemPtr2(const svOpenArrayHandle, int indx1, int indx2);
XXTERN void* svGetArrElemPtr3(const svOpenArrayHandle, int indx1, int indx2,
int indx3);
module test; import "DPI-C" function void set_bitvecval_mem( inoutbit[] mem[]); import "DPI-C" function void set_logicvecval_mem( inoutlogic[] mem[]); import "DPI-C" function void set_byte_mem( inoutbyte mem[]); import "DPI-C" function void set_shortint_mem( inoutshortint mem[]); import "DPI-C" function void set_longint_mem( inoutlongint mem[]); import "DPI-C" function void set_float_mem( inoutshortreal mem[]); import "DPI-C" function void set_double_mem( inoutreal mem[]); //1-D bit[7:0] mem[10:1]; logic[7:0] mem_logic[10:1]; byte mem_byte [10:1]; shortint mem_shortint [10:1]; int mem_int [10:1]; longint mem_longint [10:1]; shortreal mem_shortreal [10:1]; real mem_real [10:1]; //2-D bit[0:3][7:0] mem2 [10:1][3:2] ; //3-D bit[1:0][0:3][7:0] mem3 [10:1][3:2][4:3]; initial begin //1-D for (int i=1;i<=10;i++) mem[i]=i; set_bitvecval_mem(mem); for (int i=1;i<=10;i++) mem_byte[i]=i; set_byte_mem(mem_byte); for (int i=1;i<=10;i++) mem_shortint[i]=i; set_shortint_mem(mem_shortint); for (int i=1;i<=10;i++) mem_int[i]=i; set_bitvecval_mem(mem_int); for (int i=1;i<=10;i++) mem_longint[i]=i; set_longint_mem(mem_longint); for (int i=1;i<=10;i++) mem_shortreal[i]=i; set_float_mem(mem_shortreal); for (int i=1;i<=10;i++) mem_real[i]=i; set_double_mem(mem_real); for (int i=1;i<=10;i++) mem_logic[i]=i; set_logicvecval_mem(mem_int); //2-D for (int m=1;m<=10;m++) for (int n=2;n<=3;n++) mem2[m][n]=(m << 8) | n; set_bitvecval_mem(mem2); //3-D for (int m=1;m<=10;m++) for (int n=2;n<=3;n++) for (int i=3;i<=4;i++) mem3[m][n][i]= (m<<16)| (n<<8) | i; set_bitvecval_mem(mem3); end endmodule
#ifndef INCLUDED_DPIHEADER #define INCLUDED_DPIHEADER #ifdef __cplusplus #define DPI_LINK_DECL extern "C" #else #define DPI_LINK_DECL #endif #include "svdpi.h" DPI_LINK_DECL DPI_DLLESPEC void set_bitvecval_mem(svOpenArrayHandle ); DPI_LINK_DECL DPI_DLLESPEC void set_byte_mem(svOpenArrayHandle ); DPI_LINK_DECL DPI_DLLESPEC void set_double_mem(svOpenArrayHandle ); DPI_LINK_DECL DPI_DLLESPEC void set_float_mem(svOpenArrayHandle ); DPI_LINK_DECL DPI_DLLESPEC void set_logicvecval_mem(svOpenArrayHandle ); DPI_LINK_DECL DPI_DLLESPEC void set_longint_mem(svOpenArrayHandle ); DPI_LINK_DECL DPI_DLLESPEC void set_shortint_mem(svOpenArrayHandle );
template <typename X>
void set_mem(svOpenArrayHandle handle )
{
X * data;
data=reinterpret_cast<X*>(svGetArrayPtr(handle));
//data[0]=0xdeadbeaf;
int unpacked_dim=svDimensions(handle);
printf("Declared Dimensions are [%d:0] mem",svSize(handle,0)-1);
for (int i=1;i<=unpacked_dim;i++){
printf("[%d:%d]",svLeft(handle,i),svRight(handle,i));
}
printf("\n");
printf("sizeofarray =%dbytes\n",svSizeOfArray(handle));
if (unpacked_dim==1){
for (int m=svLow(handle,1);m <= svHigh(handle,1);m++){
X *a;
a=reinterpret_cast<X*>(svGetArrElemPtr(handle,m));
if (typeid(X)==typeid(float) || typeid(X)==typeid(double)) printf("[%3d]=%f\n",m,*a);
else printf("[%3d]=%x\n",m,*a);
}
}else if (unpacked_dim==2){
for (int m=svLow(handle,1);m <= svHigh(handle,1);m++){
for (int n=svLow(handle,2);n <= svHigh(handle,2);n++){
X *a;
a=reinterpret_cast<X*>(svGetArrElemPtr(handle,m,n));
printf("[%2d][%2d]=%x\n",m,n,*a);
}
}
}else if (unpacked_dim==3){
for (int m=svLow(handle,1);m <= svHigh(handle,1);m++){
for (int n=svLow(handle,2);n <= svHigh(handle,2);n++){
for (int i=svLow(handle,3);i <= svHigh(handle,3);i++){
X *a;
a=reinterpret_cast<X*>(svGetArrElemPtr(handle,m,n,i));
printf("[%2d][%2d][%2d]=%2x\n",m,n,i,*a);
}
}
}
}
}
void set_byte_mem(svOpenArrayHandle handle)
{
return set_mem<char>(handle);
}
void set_shortint_mem(svOpenArrayHandle handle)
{
return set_mem<short>(handle);
}
void set_longint_mem(svOpenArrayHandle handle)
{
return set_mem<__int64>(handle);
}
void set_float_mem(svOpenArrayHandle handle)
{
return set_mem<float>(handle);
}
void set_double_mem(svOpenArrayHandle handle)
{
return set_mem<double>(handle);
}
void set_bitvecval_mem(svOpenArrayHandle handle)
{
return set_mem<svBitVecVal>(handle);
}
void set_packed_struct_mem(svOpenArrayHandle handle)
{
return set_mem<svBitVecVal>(handle);
}
void set_logicvecval_mem(svOpenArrayHandle handle)
{
return set_mem<svLogicVecVal>(handle);
}