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); }