From bd55bfa0714bec09ecb93a566e0eef1e07083311 Mon Sep 17 00:00:00 2001 From: Wilson Snyder Date: Thu, 28 Jul 2011 07:05:40 -0400 Subject: [PATCH] Support more vpi file functions --- include/verilated.cpp | 10 +++++-- include/verilated.h | 7 +++-- include/verilated_vpi.h | 54 +++++++++++++++++++++++------------- test_regress/t/t_vpi_var.cpp | 30 ++++++++++++++++++++ 4 files changed, 76 insertions(+), 25 deletions(-) diff --git a/include/verilated.cpp b/include/verilated.cpp index fa873ee4e..bf911fa4d 100644 --- a/include/verilated.cpp +++ b/include/verilated.cpp @@ -714,17 +714,21 @@ IData VL_FGETS_IXI(int obits, void* destp, IData fpi) { 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); 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]; _VL_VINT_TO_STRING(fnwords*VL_WORDSIZE, filenamez, filenamep); char modez[5]; _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) { FILE* fp = VL_CVT_I_FP(fdi); if (VL_UNLIKELY(!fp)) return; diff --git a/include/verilated.h b/include/verilated.h index fb60fbc4f..49471c18f 100644 --- a/include/verilated.h +++ b/include/verilated.h @@ -324,9 +324,10 @@ extern WDataOutP _vl_moddiv_w(int lbits, WDataOutP owp, WDataInP lwp, WDataInP r /// File I/O extern IData VL_FGETS_IXI(int obits, void* destp, IData fpi); -extern QData VL_FOPEN_WI(int fnwords, WDataInP ofilename, IData mode); -extern QData VL_FOPEN_QI(QData ofilename, IData mode); -inline QData VL_FOPEN_II(IData ofilename, IData mode) { return VL_FOPEN_QI(ofilename,mode); } +extern IData VL_FOPEN_S(const char* filenamep, const char* mode); +extern IData VL_FOPEN_WI(int fnwords, WDataInP ofilename, IData 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); diff --git a/include/verilated_vpi.h b/include/verilated_vpi.h index 1768a739a..211295851 100644 --- a/include/verilated_vpi.h +++ b/include/verilated_vpi.h @@ -739,19 +739,26 @@ vpiHandle vpi_put_value(vpiHandle object, p_vpi_value value_p, // I/O routines -//-PLI_UINT32 vpi_mcd_open(PLI_BYTE8 *fileName) { -//- _VL_VPI_UNIMP(); return 0; -//-} -//-PLI_UINT32 vpi_mcd_close(PLI_UINT32 mcd) { -//- _VL_VPI_UNIMP(); return 0; -//-} -//-PLI_BYTE8 *vpi_mcd_name(PLI_UINT32 cd) { -//- _VL_VPI_UNIMP(); return 0; -//-} -//-PLI_INT32 vpi_mcd_printf(PLI_UINT32 mcd, PLI_BYTE8 *format, ...) { +PLI_UINT32 vpi_mcd_open(PLI_BYTE8 *filenamep) { + return VL_FOPEN_S(filenamep,"wb"); +} + +PLI_UINT32 vpi_mcd_close(PLI_UINT32 mcd) { + VL_FCLOSE_I(mcd); return 0; +} + +//-PLI_BYTE8 *vpi_mcd_name(PLI_UINT32 mcd) { //- _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, ...) { va_list ap; va_start(ap,formatp); @@ -764,15 +771,24 @@ PLI_INT32 vpi_vprintf(PLI_BYTE8* formatp, va_list ap) { return VL_VPRINTF(formatp, ap); } -//-PLI_INT32 vpi_mcd_vprintf(PLI_UINT32 mcd, PLI_BYTE8 *format, va_list ap) { -//- _VL_VPI_UNIMP(); return 0; -//-} -//-PLI_INT32 vpi_flush(void) { -//- _VL_VPI_UNIMP(); return 0; -//-} -//-PLI_INT32 vpi_mcd_flush(PLI_UINT32 mcd) { -//- _VL_VPI_UNIMP(); return 0; -//-} +PLI_INT32 vpi_mcd_vprintf(PLI_UINT32 mcd, PLI_BYTE8 *format, va_list ap) { + FILE* fp = VL_CVT_I_FP(mcd); + if (VL_UNLIKELY(!fp)) return 0; + int chars = vfprintf(fp, format, ap); + return chars; +} + +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 diff --git a/test_regress/t/t_vpi_var.cpp b/test_regress/t/t_vpi_var.cpp index cabd812c9..ef540b072 100644 --- a/test_regress/t/t_vpi_var.cpp +++ b/test_regress/t/t_vpi_var.cpp @@ -76,6 +76,35 @@ public: 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() { t_cb_data cb_data; cb_data.reason = cbEndOfSimulation; @@ -289,6 +318,7 @@ int _mon_check_quad() { int mon_check() { // 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_value_callbacks()) return status; if (int status = _mon_check_var()) return status;