| Number | 329
|
| Category | errata
|
| Synopsis | 27.29: vpi_put_data not used in example
|
| State | ptfpassed
|
| Class | errata-ptf
|
| Arrival-Date | Apr 13 2003
|
| Originator | Shalom.Bresticker@motorola.com
|
| Release | 2001b: 27.29
|
| Environment |
|
| Description |
In 27.29, the last paragraph says, "The following example illustrates using vpi_put_data():" But vpi_put_data does not appear in the example. |
| Fix |
Change the example in this section to the following. Replace the example in section 27.8 with a reference to this example. ============================================================
#include "vpi_user.h"
#define NULL 0L
typedef struct myStruct *myStruct_p;
typedef struct myStruct {
PLI_INT32 d1;
PLI_INT32 d2;
myStruct_p next;
} myStruct_s;
static myStruct_p firstWrk = NULL;
PLI_INT32 consumer_restart(p_cb_data data)
{
struct myStruct *wrk; /* myStruct is defined in vpi_put_data() example */
PLI_INT32 status;
PLI_INT32 cnt, size;
PLI_INT32 id = (PLI_INT32)data->user_data;
/* Get the number of structures. */
status = vpi_get_data(id,(PLI_BYTE8 *)&cnt,sizeof(PLI_INT32));
assert(status > 0); /* Check returned status. */
/* allocate memory for the structures */
size = cnt * sizeof(struct myStruct);
firstWrk = (myStruct_p)malloc(size);
/* retrieve the data structures */
if (cnt != vpi_get_data(id, (PLI_BYTE8 *)firstWrk,cnt))
return(1); /* error. */
firstWrk = wrk;
/* Fix the next pointers in the link list. */
for (wrk = firstWrk; cnt > 0; cnt--)
{
wrk->next = wrk + 1;
wrk = wrk->next;
}
wrk->next = NULL;
return(0); /* SUCCESS. */
}
PLI_INT32 consumer_save(p_cb_data data)
{
myStruct_p wrk;
s_cb_data cbData;
vpiHandle cbHdl;
PLI_INT32 id = 0;
PLI_INT32 cnt = 0;
/* Get the number of structures */
wrk = firstWrk;
while (wrk)
{
cnt++;
wrk = wrk->next;
}
/* now save the data */
wrk = firstWrk;
id = vpi_get(vpiSaveRestartID, NULL);
/* save the number of data structures */
vpi_put_data(id,(PLI_BYTE8 *)cnt,sizeof(PLI_INT32));
/* Save the different data structures. Please note that
* a pointer is being saved. While this is allowed, an
* application must change it to something useful on a
* restart.
*/
while (wrk)
{
vpi_put_data(id,(PLI_BYTE8 *)wrk,sizeof(myStruct_s));
wrk = wrk->next;
}
/* register a call for restart */
/* We need the "id" so that the saved data can be
* retrieved. Using the user_data field of the
* callback structure is the easiest way to pass this
* information to retrieval operation.
*/
cbData.user_data = (PLI_BYTE8 *)id;
cbData.reason = cbStartOfRestart;
/* Please see 27.8 vpi_get_data() for a description of
* how the callback routine can be used to retrieve the
* data.
*/
cbData.cb_rtn = consumer_restart;
cbData.value = NULL;
cbData.time = NULL;
cbHdl = vpi_register_cb(&cbData);
vpi_free_object(cbHdl);
return(0);
}
This has been resolved via: http://www.eda.org/svdb/bug_view_page.php?bug_id=0000311 |
| Audit-Trail |
Fix replaced by etf@boyd.com on Mon Feb 9 11:59:25 2004 Here is an updated example. Please note that there is a cross reference in one of the comments. Also, the example in section 27.8 should reference this example. struct myStruct{ PLI_INT32 d1; PLI_INT32 d2; struct myStruct *next; } struct myStruct *firstWrk; PLI_INT32 consumer_save(p_cb_data data) { struct myStruct *wrk; s_cb_data cbData; vpiHandle cbHdl; PLI_INT32 id = 0; PLI_INT32 cnt = 0; /* Get the number of structures */ wrk = firstWrk; while (wrk) { cnt++; wrk = wrk->next; } /* now save the data */ wrk = firstWrk; id = vpi_get(vpiSaveRestartID, NULL); /* save the number of data structures */ vpi_put_data(id,cnt,sizeof(PLI_INT32)); /* Save the different data structures. Please note that * a pointer is being saved. While this is allowed, an * application must change it to something useful on a * restart. */ while (wrk) { vpi_put_data(id,wrk,sizeof(myStruct)); wrk = wrk->next; } /* register a call for restart */ /* We need the "id" so that the saved data can be * retrieved. Using the user_data field of the * callback structure is the easiest way to pass this * information to retrieval operation. */ cbData.user_data = (PLI_BYTE8 *)id; cbData.reason = cbStartOfRestart; /* Please see 27.8 vpi_get_data() for a description of * how the callback routine can be used to retrieve the * data. */ cbData.cb_rtn = consumer_restart; cbData.value = NULL; cbData.time = NULL; cbHdl = vpi_register_cb(&cbData); vpi_free_object(cbHdl); return(0); } Fix replaced by Shalom.Bresticker@motorola.com on Thu Mar 11 06:56:40 2004 2004-03-11, Shalom: I have only enclosed the example in "PRE" and "/PRE" directives to the HTML so that the indentation can be seen. I have not changed anything in the contents of the proposal. ============================================================ Here is an updated example. Please note that there is a cross reference in one of the comments. Also, the example in section 27.8 should reference this example.
struct myStruct{
PLI_INT32 d1;
PLI_INT32 d2;
struct myStruct *next;
}
struct myStruct *firstWrk;
PLI_INT32 consumer_save(p_cb_data data)
{
struct myStruct *wrk;
s_cb_data cbData;
vpiHandle cbHdl;
PLI_INT32 id = 0;
PLI_INT32 cnt = 0;
/* Get the number of structures */
wrk = firstWrk;
while (wrk)
{
cnt++;
wrk = wrk->next;
}
/* now save the data */
wrk = firstWrk;
id = vpi_get(vpiSaveRestartID, NULL);
/* save the number of data structures */
vpi_put_data(id,cnt,sizeof(PLI_INT32));
/* Save the different data structures. Please note that
* a pointer is being saved. While this is allowed, an
* application must change it to something useful on a
* restart.
*/
while (wrk)
{
vpi_put_data(id,wrk,sizeof(myStruct));
wrk = wrk->next;
}
/* register a call for restart */
/* We need the "id" so that the saved data can be
* retrieved. Using the user_data field of the
* callback structure is the easiest way to pass this
* information to retrieval operation.
*/
cbData.user_data = (PLI_BYTE8 *)id;
cbData.reason = cbStartOfRestart;
/* Please see 27.8 vpi_get_data() for a description of
* how the callback routine can be used to retrieve the
* data.
*/
cbData.cb_rtn = consumer_restart;
cbData.value = NULL;
cbData.time = NULL;
cbHdl = vpi_register_cb(&cbData);
vpi_free_object(cbHdl);
return(0);
}
Fix replaced by etf@boyd.com on Mon Apr 5 09:57:51 2004 I've attempted to compile this example, and found a few issues (which leads me to conclude that no one had tried it before). In any case, the following compiles without error on Solaris: ============================================================ Here is an updated example. Please note that there is a cross reference in one of the comments. Also, the example in section 27.8 should reference this example.
#include "vpi_user.h"
#define NULL 0L
extern PLI_INT32 consumer_restart(p_cb_data data);
typedef struct myStruct *myStruct_p;
typedef struct myStruct {
PLI_INT32 d1;
PLI_INT32 d2;
myStruct_p next;
} myStruct_s;
myStruct_p firstWrk;
PLI_INT32 consumer_save(p_cb_data data)
{
myStruct_p wrk;
s_cb_data cbData;
vpiHandle cbHdl;
PLI_INT32 id = 0;
PLI_INT32 cnt = 0;
/* Get the number of structures */
wrk = firstWrk;
while (wrk)
{
cnt++;
wrk = wrk->next;
}
/* now save the data */
wrk = firstWrk;
id = vpi_get(vpiSaveRestartID, NULL);
/* save the number of data structures */
vpi_put_data(id,(PLI_BYTE8 *)cnt,sizeof(PLI_INT32));
/* Save the different data structures. Please note that
* a pointer is being saved. While this is allowed, an
* application must change it to something useful on a
* restart.
*/
while (wrk)
{
vpi_put_data(id,(PLI_BYTE8 *)wrk,sizeof(myStruct_s));
wrk = wrk->next;
}
/* register a call for restart */
/* We need the "id" so that the saved data can be
* retrieved. Using the user_data field of the
* callback structure is the easiest way to pass this
* information to retrieval operation.
*/
cbData.user_data = (PLI_BYTE8 *)id;
cbData.reason = cbStartOfRestart;
/* Please see 27.8 vpi_get_data() for a description of
* how the callback routine can be used to retrieve the
* data.
*/
cbData.cb_rtn = consumer_restart;
cbData.value = NULL;
cbData.time = NULL;
cbHdl = vpi_register_cb(&cbData);
vpi_free_object(cbHdl);
return(0);
}
Fix replaced by chas@cadence.com on Mon May 17 08:33:07 2004 Change the example in this section to the following. Replace the example in section 17.8 with a reference to this example. ============================================================
#include "vpi_user.h"
#define NULL 0L
typedef struct myStruct *myStruct_p;
typedef struct myStruct {
PLI_INT32 d1;
PLI_INT32 d2;
myStruct_p next;
} myStruct_s;
static myStruct_p firstWrk = NULL;
PLI_INT32 consumer_restart(p_cb_data data)
{
struct myStruct *wrk; /* myStruct is defined in vpi_put_data() example */
PLI_INT32 status;
PLI_INT32 cnt, size;
PLI_INT32 id = (PLI_INT32)data->user_data;
/* Get the number of structures. */
status = vpi_get_data(id,(PLI_BYTE8 *)&cnt,sizeof(PLI_INT32));
assert(status > 0); /* Check returned status. */
/* allocate memory for the structures */
size = cnt * sizeof(struct myStruct);
firstWrk = (myStruct_p)malloc(size);
/* retrieve the data structures */
if (cnt != vpi_get_data(id, (PLI_BYTE8 *)firstWrk,cnt))
return(1); /* error. */
firstWrk = wrk;
/* Fix the next pointers in the link list. */
for (wrk = firstWrk; cnt > 0; cnt--)
{
wrk->next = wrk + 1;
wrk = wrk->next;
}
wrk->next = NULL;
return(0); /* SUCCESS. */
}
PLI_INT32 consumer_save(p_cb_data data)
{
myStruct_p wrk;
s_cb_data cbData;
vpiHandle cbHdl;
PLI_INT32 id = 0;
PLI_INT32 cnt = 0;
/* Get the number of structures */
wrk = firstWrk;
while (wrk)
{
cnt++;
wrk = wrk->next;
}
/* now save the data */
wrk = firstWrk;
id = vpi_get(vpiSaveRestartID, NULL);
/* save the number of data structures */
vpi_put_data(id,(PLI_BYTE8 *)cnt,sizeof(PLI_INT32));
/* Save the different data structures. Please note that
* a pointer is being saved. While this is allowed, an
* application must change it to something useful on a
* restart.
*/
while (wrk)
{
vpi_put_data(id,(PLI_BYTE8 *)wrk,sizeof(myStruct_s));
wrk = wrk->next;
}
/* register a call for restart */
/* We need the "id" so that the saved data can be
* retrieved. Using the user_data field of the
* callback structure is the easiest way to pass this
* information to retrieval operation.
*/
cbData.user_data = (PLI_BYTE8 *)id;
cbData.reason = cbStartOfRestart;
/* Please see 27.8 vpi_get_data() for a description of
* how the callback routine can be used to retrieve the
* data.
*/
cbData.cb_rtn = consumer_restart;
cbData.value = NULL;
cbData.time = NULL;
cbHdl = vpi_register_cb(&cbData);
vpi_free_object(cbHdl);
return(0);
}
Fix replaced by chas@cadence.com on Mon May 17 12:12:11 2004 Change the example in this section to the following. Replace the example in section 27.8 with a reference to this example. ============================================================
#include "vpi_user.h"
#define NULL 0L
typedef struct myStruct *myStruct_p;
typedef struct myStruct {
PLI_INT32 d1;
PLI_INT32 d2;
myStruct_p next;
} myStruct_s;
static myStruct_p firstWrk = NULL;
PLI_INT32 consumer_restart(p_cb_data data)
{
struct myStruct *wrk; /* myStruct is defined in vpi_put_data() example */
PLI_INT32 status;
PLI_INT32 cnt, size;
PLI_INT32 id = (PLI_INT32)data->user_data;
/* Get the number of structures. */
status = vpi_get_data(id,(PLI_BYTE8 *)&cnt,sizeof(PLI_INT32));
assert(status > 0); /* Check returned status. */
/* allocate memory for the structures */
size = cnt * sizeof(struct myStruct);
firstWrk = (myStruct_p)malloc(size);
/* retrieve the data structures */
if (cnt != vpi_get_data(id, (PLI_BYTE8 *)firstWrk,cnt))
return(1); /* error. */
firstWrk = wrk;
/* Fix the next pointers in the link list. */
for (wrk = firstWrk; cnt > 0; cnt--)
{
wrk->next = wrk + 1;
wrk = wrk->next;
}
wrk->next = NULL;
return(0); /* SUCCESS. */
}
PLI_INT32 consumer_save(p_cb_data data)
{
myStruct_p wrk;
s_cb_data cbData;
vpiHandle cbHdl;
PLI_INT32 id = 0;
PLI_INT32 cnt = 0;
/* Get the number of structures */
wrk = firstWrk;
while (wrk)
{
cnt++;
wrk = wrk->next;
}
/* now save the data */
wrk = firstWrk;
id = vpi_get(vpiSaveRestartID, NULL);
/* save the number of data structures */
vpi_put_data(id,(PLI_BYTE8 *)cnt,sizeof(PLI_INT32));
/* Save the different data structures. Please note that
* a pointer is being saved. While this is allowed, an
* application must change it to something useful on a
* restart.
*/
while (wrk)
{
vpi_put_data(id,(PLI_BYTE8 *)wrk,sizeof(myStruct_s));
wrk = wrk->next;
}
/* register a call for restart */
/* We need the "id" so that the saved data can be
* retrieved. Using the user_data field of the
* callback structure is the easiest way to pass this
* information to retrieval operation.
*/
cbData.user_data = (PLI_BYTE8 *)id;
cbData.reason = cbStartOfRestart;
/* Please see 27.8 vpi_get_data() for a description of
* how the callback routine can be used to retrieve the
* data.
*/
cbData.cb_rtn = consumer_restart;
cbData.value = NULL;
cbData.time = NULL;
cbHdl = vpi_register_cb(&cbData);
vpi_free_object(cbHdl);
return(0);
}
From: Charles Dawson <chas@cadence.com> To: ptf-bugs@boyd.com Cc: Subject: errata/329: Tested example Date: Mon, 20 Sep 2004 15:30:48 -0400 Hi All, I tested the example for these two sections. We should be able to pass this one now. -Chas Fix replaced by chas@cadence.com on Thu Mar 17 10:07:34 2005 Change the example in this section to the following. Replace the example in section 27.8 with a reference to this example. ============================================================
#include "vpi_user.h"
#define NULL 0L
typedef struct myStruct *myStruct_p;
typedef struct myStruct {
PLI_INT32 d1;
PLI_INT32 d2;
myStruct_p next;
} myStruct_s;
static myStruct_p firstWrk = NULL;
PLI_INT32 consumer_restart(p_cb_data data)
{
struct myStruct *wrk; /* myStruct is defined in vpi_put_data() example */
PLI_INT32 status;
PLI_INT32 cnt, size;
PLI_INT32 id = (PLI_INT32)data->user_data;
/* Get the number of structures. */
status = vpi_get_data(id,(PLI_BYTE8 *)&cnt,sizeof(PLI_INT32));
assert(status > 0); /* Check returned status. */
/* allocate memory for the structures */
size = cnt * sizeof(struct myStruct);
firstWrk = (myStruct_p)malloc(size);
/* retrieve the data structures */
if (cnt != vpi_get_data(id, (PLI_BYTE8 *)firstWrk,cnt))
return(1); /* error. */
firstWrk = wrk;
/* Fix the next pointers in the link list. */
for (wrk = firstWrk; cnt > 0; cnt--)
{
wrk->next = wrk + 1;
wrk = wrk->next;
}
wrk->next = NULL;
return(0); /* SUCCESS. */
}
PLI_INT32 consumer_save(p_cb_data data)
{
myStruct_p wrk;
s_cb_data cbData;
vpiHandle cbHdl;
PLI_INT32 id = 0;
PLI_INT32 cnt = 0;
/* Get the number of structures */
wrk = firstWrk;
while (wrk)
{
cnt++;
wrk = wrk->next;
}
/* now save the data */
wrk = firstWrk;
id = vpi_get(vpiSaveRestartID, NULL);
/* save the number of data structures */
vpi_put_data(id,(PLI_BYTE8 *)cnt,sizeof(PLI_INT32));
/* Save the different data structures. Please note that
* a pointer is being saved. While this is allowed, an
* application must change it to something useful on a
* restart.
*/
while (wrk)
{
vpi_put_data(id,(PLI_BYTE8 *)wrk,sizeof(myStruct_s));
wrk = wrk->next;
}
/* register a call for restart */
/* We need the "id" so that the saved data can be
* retrieved. Using the user_data field of the
* callback structure is the easiest way to pass this
* information to retrieval operation.
*/
cbData.user_data = (PLI_BYTE8 *)id;
cbData.reason = cbStartOfRestart;
/* Please see 27.8 vpi_get_data() for a description of
* how the callback routine can be used to retrieve the
* data.
*/
cbData.cb_rtn = consumer_restart;
cbData.value = NULL;
cbData.time = NULL;
cbHdl = vpi_register_cb(&cbData);
vpi_free_object(cbHdl);
return(0);
}
This has been resolved via: http://www.eda.org/svdb/bug_view_page.php?bug_id=0000311 |
| Unformatted |
|
Hosted by Boyd Technology