Support more vpi file functions
This commit is contained in:
parent
6d2f09b579
commit
bd55bfa071
|
|
@ -714,17 +714,21 @@ IData VL_FGETS_IXI(int obits, void* destp, IData fpi) {
|
||||||
return got;
|
return got;
|
||||||
}
|
}
|
||||||
|
|
||||||
QData VL_FOPEN_QI(QData filename, IData mode) {
|
IData VL_FOPEN_QI(QData filename, IData mode) {
|
||||||
IData fnw[2]; VL_SET_WQ(fnw, filename);
|
IData fnw[2]; VL_SET_WQ(fnw, filename);
|
||||||
return VL_FOPEN_WI(2, fnw, mode);
|
return VL_FOPEN_WI(2, fnw, mode);
|
||||||
}
|
}
|
||||||
QData VL_FOPEN_WI(int fnwords, WDataInP filenamep, IData mode) {
|
IData VL_FOPEN_WI(int fnwords, WDataInP filenamep, IData mode) {
|
||||||
char filenamez[VL_TO_STRING_MAX_WORDS*VL_WORDSIZE+1];
|
char filenamez[VL_TO_STRING_MAX_WORDS*VL_WORDSIZE+1];
|
||||||
_VL_VINT_TO_STRING(fnwords*VL_WORDSIZE, filenamez, filenamep);
|
_VL_VINT_TO_STRING(fnwords*VL_WORDSIZE, filenamez, filenamep);
|
||||||
char modez[5];
|
char modez[5];
|
||||||
_VL_VINT_TO_STRING(VL_WORDSIZE, modez, &mode);
|
_VL_VINT_TO_STRING(VL_WORDSIZE, modez, &mode);
|
||||||
return VerilatedImp::fdNew(fopen(filenamez,modez));
|
return VL_FOPEN_S(filenamez,modez);
|
||||||
}
|
}
|
||||||
|
IData VL_FOPEN_S(const char* filenamep, const char* modep) {
|
||||||
|
return VerilatedImp::fdNew(fopen(filenamep,modep));
|
||||||
|
}
|
||||||
|
|
||||||
void VL_FCLOSE_I(IData fdi) {
|
void VL_FCLOSE_I(IData fdi) {
|
||||||
FILE* fp = VL_CVT_I_FP(fdi);
|
FILE* fp = VL_CVT_I_FP(fdi);
|
||||||
if (VL_UNLIKELY(!fp)) return;
|
if (VL_UNLIKELY(!fp)) return;
|
||||||
|
|
|
||||||
|
|
@ -324,9 +324,10 @@ extern WDataOutP _vl_moddiv_w(int lbits, WDataOutP owp, WDataInP lwp, WDataInP r
|
||||||
/// File I/O
|
/// File I/O
|
||||||
extern IData VL_FGETS_IXI(int obits, void* destp, IData fpi);
|
extern IData VL_FGETS_IXI(int obits, void* destp, IData fpi);
|
||||||
|
|
||||||
extern QData VL_FOPEN_WI(int fnwords, WDataInP ofilename, IData mode);
|
extern IData VL_FOPEN_S(const char* filenamep, const char* mode);
|
||||||
extern QData VL_FOPEN_QI(QData ofilename, IData mode);
|
extern IData VL_FOPEN_WI(int fnwords, WDataInP ofilename, IData mode);
|
||||||
inline QData VL_FOPEN_II(IData ofilename, IData mode) { return VL_FOPEN_QI(ofilename,mode); }
|
extern IData VL_FOPEN_QI(QData ofilename, IData mode);
|
||||||
|
inline IData VL_FOPEN_II(IData ofilename, IData mode) { return VL_FOPEN_QI(ofilename,mode); }
|
||||||
|
|
||||||
extern void VL_FCLOSE_I(IData fdi);
|
extern void VL_FCLOSE_I(IData fdi);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -739,19 +739,26 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p,
|
||||||
|
|
||||||
// I/O routines
|
// I/O routines
|
||||||
|
|
||||||
//-PLI_UINT32 vpi_mcd_open(PLI_BYTE8 *fileName) {
|
PLI_UINT32 vpi_mcd_open(PLI_BYTE8 *filenamep) {
|
||||||
//- _VL_VPI_UNIMP(); return 0;
|
return VL_FOPEN_S(filenamep,"wb");
|
||||||
//-}
|
}
|
||||||
//-PLI_UINT32 vpi_mcd_close(PLI_UINT32 mcd) {
|
|
||||||
//- _VL_VPI_UNIMP(); return 0;
|
PLI_UINT32 vpi_mcd_close(PLI_UINT32 mcd) {
|
||||||
//-}
|
VL_FCLOSE_I(mcd); return 0;
|
||||||
//-PLI_BYTE8 *vpi_mcd_name(PLI_UINT32 cd) {
|
}
|
||||||
//- _VL_VPI_UNIMP(); return 0;
|
|
||||||
//-}
|
//-PLI_BYTE8 *vpi_mcd_name(PLI_UINT32 mcd) {
|
||||||
//-PLI_INT32 vpi_mcd_printf(PLI_UINT32 mcd, PLI_BYTE8 *format, ...) {
|
|
||||||
//- _VL_VPI_UNIMP(); return 0;
|
//- _VL_VPI_UNIMP(); return 0;
|
||||||
//-}
|
//-}
|
||||||
|
|
||||||
|
PLI_INT32 vpi_mcd_printf(PLI_UINT32 mcd, PLI_BYTE8 *formatp, ...) {
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap,formatp);
|
||||||
|
int chars = vpi_mcd_vprintf(mcd, formatp, ap);
|
||||||
|
va_end(ap);
|
||||||
|
return chars;
|
||||||
|
}
|
||||||
|
|
||||||
PLI_INT32 vpi_printf(PLI_BYTE8 *formatp, ...) {
|
PLI_INT32 vpi_printf(PLI_BYTE8 *formatp, ...) {
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap,formatp);
|
va_start(ap,formatp);
|
||||||
|
|
@ -764,15 +771,24 @@ PLI_INT32 vpi_vprintf(PLI_BYTE8* formatp, va_list ap) {
|
||||||
return VL_VPRINTF(formatp, ap);
|
return VL_VPRINTF(formatp, ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
//-PLI_INT32 vpi_mcd_vprintf(PLI_UINT32 mcd, PLI_BYTE8 *format, va_list ap) {
|
PLI_INT32 vpi_mcd_vprintf(PLI_UINT32 mcd, PLI_BYTE8 *format, va_list ap) {
|
||||||
//- _VL_VPI_UNIMP(); return 0;
|
FILE* fp = VL_CVT_I_FP(mcd);
|
||||||
//-}
|
if (VL_UNLIKELY(!fp)) return 0;
|
||||||
//-PLI_INT32 vpi_flush(void) {
|
int chars = vfprintf(fp, format, ap);
|
||||||
//- _VL_VPI_UNIMP(); return 0;
|
return chars;
|
||||||
//-}
|
}
|
||||||
//-PLI_INT32 vpi_mcd_flush(PLI_UINT32 mcd) {
|
|
||||||
//- _VL_VPI_UNIMP(); return 0;
|
PLI_INT32 vpi_flush(void) {
|
||||||
//-}
|
Verilated::flushCall();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
PLI_INT32 vpi_mcd_flush(PLI_UINT32 mcd) {
|
||||||
|
FILE* fp = VL_CVT_I_FP(mcd);
|
||||||
|
if (VL_UNLIKELY(!fp)) return 1;
|
||||||
|
fflush(fp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// utility routines
|
// utility routines
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -76,6 +76,35 @@ public:
|
||||||
return __LINE__; \
|
return __LINE__; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int _mon_check_mcd() {
|
||||||
|
PLI_INT32 status;
|
||||||
|
|
||||||
|
PLI_UINT32 mcd;
|
||||||
|
PLI_BYTE8* filename = (PLI_BYTE8*)"mcd_open.tmp";
|
||||||
|
mcd = vpi_mcd_open(filename);
|
||||||
|
CHECK_RESULT_NZ(mcd);
|
||||||
|
|
||||||
|
{ // Check it got written
|
||||||
|
FILE* fp = fopen(filename,"r");
|
||||||
|
CHECK_RESULT_NZ(fp);
|
||||||
|
fclose(fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
status = vpi_mcd_printf(mcd, (PLI_BYTE8*)"hello %s", "vpi_mcd_printf");
|
||||||
|
CHECK_RESULT(status, strlen("hello vpi_mcd_printf"));
|
||||||
|
|
||||||
|
status = vpi_mcd_flush(mcd);
|
||||||
|
CHECK_RESULT(status, 0);
|
||||||
|
|
||||||
|
status = vpi_mcd_close(mcd);
|
||||||
|
CHECK_RESULT(status, 0);
|
||||||
|
|
||||||
|
status = vpi_flush();
|
||||||
|
CHECK_RESULT(status, 0);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int _mon_check_callbacks() {
|
int _mon_check_callbacks() {
|
||||||
t_cb_data cb_data;
|
t_cb_data cb_data;
|
||||||
cb_data.reason = cbEndOfSimulation;
|
cb_data.reason = cbEndOfSimulation;
|
||||||
|
|
@ -289,6 +318,7 @@ int _mon_check_quad() {
|
||||||
|
|
||||||
int mon_check() {
|
int mon_check() {
|
||||||
// Callback from initial block in monitor
|
// Callback from initial block in monitor
|
||||||
|
if (int status = _mon_check_mcd()) return status;
|
||||||
if (int status = _mon_check_callbacks()) return status;
|
if (int status = _mon_check_callbacks()) return status;
|
||||||
if (int status = _mon_check_value_callbacks()) return status;
|
if (int status = _mon_check_value_callbacks()) return status;
|
||||||
if (int status = _mon_check_var()) return status;
|
if (int status = _mon_check_var()) return status;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue