4.2.9. CAPIRecordEvent1() and CAPIRecordEvent2()

Two macros are defined to simplify recording data to the profile stream:

Note

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 ++; \
 }\
}
Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0359B
Non-Confidential