| |||
| Home > The Cycle Accurate Profiling Interface > The CAPI classes > CAPIRecordEvent1() and CAPIRecordEvent2() |
Two macros are defined to simplify recording data to the profile stream:
CAPIRecordEvent1() records
a single argument to the specified stream.
CAPIRecordEvent2() records
two arguments to the specified stream.
The MXSI_EXPORT_LIBRARY is provided to
aid converting MXPI profiling to CAPI. This library contains an
implementation of CAPIRecordEvent() that accepts
a variable number of arguments.
Example 4.3. CAPIRecordEvent1() macro
#define CAPIRecordEvent1(stream,arg1) \
{\
uint64_t currentCycle; \
uint64_t offset=0,base=0; \
uint8_t temp8; \
uint16_t temp16; \
uint32_t temp32; \
uint64_t temp64; \
\
if(stream->enabled){\
if(((uint32_t) stream->nrOfEventsInLastSegment)>= \
((uint32_t) stream->eventsTraceSegmentSize)) \
{\
stream->eventTail->next = \
eslapi::CAPIRegistry::getCAPIRegistry()->getCAPICallback()->allocateTraceSegment (stream); \
stream->eventTail = stream->eventTail->next; \
stream->eventTail->next = NULL; \
stream->nrOfEventsInLastSegment = 0; \
} \
\
currentCycle = eslapi::CAPIRegistry::getCAPIRegistry()->getCAPICallback()->getCurrentCycle(); \
\
base = stream->nrOfEventsInLastSegment * ((uint32_t) stream->eventWidthInBytes); \
offset = 0; \
\
*((uint64_t*)&(stream->eventTail->eventsTrace[base + offset])) = \
(uint64_t) currentCycle; \
offset += 8; \
\
switch(stream->info->channels[1]->type){ \
case eslapi::CAPI_CHANNEL_TYPE_U8: \
case eslapi::CAPI_CHANNEL_TYPE_bool: \
case eslapi::CAPI_CHANNEL_TYPE_SYMBOL: \
temp8 = (uint8_t) arg1; \
*((uint8_t*)&(stream->eventTail->eventsTrace[base + offset])) = temp8; \
offset += 1; \
break; \
case eslapi::CAPI_CHANNEL_TYPE_U16: \
temp16 = (uint16_t) arg1; \
*((uint16_t*)&(stream->eventTail->eventsTrace[base + offset])) = temp16; \
offset += 2; \
break; \
case eslapi::CAPI_CHANNEL_TYPE_U32: \
temp32 = (uint32_t) arg1; \
*((uint32_t*)&(stream->eventTail->eventsTrace[base + offset])) = temp32; \
offset += 4; \
break; \
case eslapi::CAPI_CHANNEL_TYPE_U64: \
temp64 = (uint64_t) arg1; \
*((uint64_t*)&(stream->eventTail->eventsTrace[base + offset])) = temp64; \
offset += 8; \
break; \
default: \
assert(0); \
}\
stream->nrOfEventsInLastSegment ++; \
stream->nrOfEvents ++; \
}\
}
Example 4.4. CAPIRecordEvent2() macro
#define CAPIRecordEvent2(stream,arg1,arg2) \
{\
uint64_t currentCycle; \
uint64_t offset=0,base=0; \
uint8_t temp8; \
uint16_t temp16; \
uint32_t temp32; \
uint64_t temp64; \
\
if(stream->enabled){\
if(((uint32_t) stream->nrOfEventsInLastSegment) >=
((uint32_t) stream->eventsTraceSegmentSize)) { \
stream->eventTail->next = \
eslapi::CAPIRegistry::getCAPIRegistry()->getCAPICallback()->allocateTraceSegment (stream); \
stream->eventTail = stream->eventTail->next; \
stream->eventTail->next = NULL; \
stream->nrOfEventsInLastSegment = 0; \
} \
\
currentCycle = eslapi::CAPIRegistry::getCAPIRegistry()->getCAPICallback()->getCurrentCycle(); \
\
base = stream->nrOfEventsInLastSegment * ((uint32_t) stream->eventWidthInBytes); \
offset = 0; \
\
*((uint64_t*)&(stream->eventTail->eventsTrace[base + offset])) = \
(uint64_t) currentCycle; \
offset += 8; \
\
switch(stream->info->channels[1]->type){ \
case eslapi::CAPI_CHANNEL_TYPE_U8: \
case eslapi::CAPI_CHANNEL_TYPE_bool: \
case eslapi::CAPI_CHANNEL_TYPE_SYMBOL: \
temp8 = (uint8_t) arg1; \
*((uint8_t*)&(stream->eventTail->eventsTrace[base + offset])) = temp8; \
offset += 1; \
break; \
case eslapi::CAPI_CHANNEL_TYPE_U16: \
temp16 = (uint16_t) arg1; \
*((uint16_t*)&(stream->eventTail->eventsTrace[base + offset])) = temp16; \
offset += 2; \
break; \
case eslapi::CAPI_CHANNEL_TYPE_U32: \
temp32 = (uint32_t) arg1; \
*((uint32_t*)&(stream->eventTail->eventsTrace[base + offset])) = temp32; \
offset += 4; \
break; \
case eslapi::CAPI_CHANNEL_TYPE_U64: \
temp64 = (uint64_t) arg1; \
*((uint64_t*)&(stream->eventTail->eventsTrace[base + offset])) = temp64; \
offset += 8; \
break; \
default: \
assert(0); \
}\
\
switch(stream->info->channels[2]->type){ \
case eslapi::CAPI_CHANNEL_TYPE_U8: \
case eslapi::CAPI_CHANNEL_TYPE_bool: \
case eslapi::CAPI_CHANNEL_TYPE_SYMBOL: \
temp8 = (uint8_t) arg2; \
*((uint8_t*)&(stream->eventTail->eventsTrace[base + offset])) = temp8; \
offset += 1; \
break; \
case eslapi::CAPI_CHANNEL_TYPE_U16: \
temp16 = (uint16_t) arg2; \
*((uint16_t*)&(stream->eventTail->eventsTrace[base + offset])) = temp16; \
offset += 2; \
break; \
case eslapi::CAPI_CHANNEL_TYPE_U32: \
temp32 = (uint32_t) arg2; \
*((uint32_t*)&(stream->eventTail->eventsTrace[base + offset])) = temp32; \
offset += 4; \
break; \
case eslapi::CAPI_CHANNEL_TYPE_U64: \
temp64 = (uint64_t) arg2; \
*((uint64_t*)&(stream->eventTail->eventsTrace[base + offset])) = temp64; \
offset += 8; \
break; \
default: \
assert(0); \
}\
stream->nrOfEventsInLastSegment ++; \
stream->nrOfEvents ++; \
}\
}