#define PSEUDO_ADC_CODE 0x10 #define PSEUDO_TRACE_CODE 0x20 #define PSEUDO_RAW_CODE 0x21 #define PSEUDO_SAMPLE_CODE 0x30 #define PILEUP_CODE 0x01 #define PAUSE_CODE 0x02 #define RESUME_CODE 0x03 #define SYNC_CODE 0x04 #define WR_CODE 0x05 #define FEE64_DISC_CODE 0x06 #define EXTENDED_TS_CODE 0x07 #define SCAN_MBS_CODE 0x08 #define SCAN_TABLE_CODE SCAN_MBS_CODE #define MBS_SCALAR_CODE SCAN_MBS_CODE #define AIDA_SCALAR_CODE SCAN_MBS_CODE #define OVER_RANGE_CODE 0x09 #define UNDER_RANGE_CODE 0x0a #define OVER_FLOW_CODE 0x0b #define UNDER_FLOW_CODE 0x0c #define EVENT_CODE 0x0d #define STATS_CODE 0x0e #define LINK_CODE 0x0f #define DATA_MASK 0xc0000000 /* data has bit 30 or 31 set (or both) */ #define MODULE_MASK 0x3f000000 #define CODE_MASK 0x00f00000 #define LINK_NUM_MASK 0x000ffff8 #define SAMPLE_LEN_MASK 0x0000ffff #define TRACE_LSP_MASK 0x30000000 #define RAW_TRACE_MASK 0x00100000 #define INFO_MASK (DATA_MASK | CODE_MASK) #define TRACE_MASK (DATA_MASK | TRACE_LSP_MASK) #define RAW_MASK (DATA_MASK | TRACE_LSP_MASK | RAW_TRACE_MASK) #define LINK_MASK (INFO_MASK | MODULE_MASK | LINK_NUM_MASK) #define ADC_DATA 0xc0000000 /* ADC data has bits 31,30 set */ #define INFO 0x80000000 /* info has bit 31 set */ #define TRACE 0x40000000 /* trace has bit 30 set */ #define RAW_SAMPLE 0x40100000 /* raw trace has bits 30 & 20 set*/ /* N.B. A timestamp of zero looks the same as 2 samples each of value zero * Both of these are unlikely and can generally be distinguished by their context * In an error state empty words (i.e. containing zero) might be generated * these also look the same. * To recognise between them in isolation a timestamp will always be followed * by a new item (ADC, info or trace header) */ #define TIMESTAMP_MASK 0xf0000000 /* time has top 4 bits unset */ #define SAMPLE_DATA_MASK 0xc000c000 /* has top 2 bits of each 16-bits unset */ #if defined AIDA #define SYNC_STEP 0x40000 #else #define SYNC_STEP 0x10000 #endif #define SYNC_STEP_MASK (SYNC_STEP - 1) /* 0xffff or 0x3ffff */ //#define SYNC_DIFF 0x10000000 /* use all 28 LS-bits */ #define SYNC_DIFF SYNC_STEP /* use the Sync step size */ #define SYNC_MASK (SYNC_DIFF - 1) /* as SYNC_STEP_MASK (or 0xfffffff if using 28 bits) */ #define PILEUP_PATTERN (INFO | (PILEUP_CODE << 20)) #define PAUSE_PATTERN (INFO | (PAUSE_CODE << 20)) #define RESUME_PATTERN (INFO | (RESUME_CODE << 20)) #define SYNC_PATTERN (INFO | (SYNC_CODE << 20)) #define FEE64_DISC_PATTERN (INFO | (FEE64_DISC_CODE << 20)) #define EXT_TS_PATTERN (INFO | (EXTENDED_TS_CODE << 20)) #define SCAN_MBS_PATTERN (INFO | (SCAN_MBS_CODE << 20)) #define OVER_RANGE_PATTERN (INFO | (OVER_RANGE_CODE << 20)) #define UNDER_RANGE_PATTERN (INFO | (UNDER_RANGE_CODE << 20)) #define OVER_FLOW_PATTERN (INFO | (OVER_FLOW_CODE << 20)) #define UNDER_FLOW_PATTERN (INFO | (UNDER_FLOW_CODE << 20)) #define EVENT_PATTERN (INFO | (EVENT_CODE << 20)) #define STATS_PATTERN (INFO | (STATS_CODE << 20)) #define LINK_MODULE_NUM 0x3f #define LINK_PATTERN (INFO | (LINK_MODULE_NUM << 24) | (LINK_CODE << 20)) #define IS_ADC_DATA(d) (((d) & (DATA_MASK)) == ADC_DATA) #define IS_INFO(d) (((d) & (DATA_MASK)) == INFO) #define IS_TRACE(d) (((d) & (TRACE_MASK)) == TRACE) #define IS_RAW_TRACE(d) (((d) & (RAW_MASK)) == RAW_SAMPLE) #define IS_TIMESTAMP(d) (((d) & (TIMESTAMP_MASK)) == 0) #define IS_SAMPLE_DATA(d) (((d) & (SAMPLE_DATA_MASK)) == 0) #define IS_PILEUP(d) (((d) & INFO_MASK) == PILEUP_PATTERN) #define IS_PAUSE(d) (((d) & INFO_MASK) == PAUSE_PATTERN) #define IS_RESUME(d) (((d) & INFO_MASK) == RESUME_PATTERN) #define IS_SYNC(d) (((d) & INFO_MASK) == SYNC_PATTERN) #define IS_EXT_TS(d) (((d) & INFO_MASK) == EXT_TS_PATTERN) #define IS_FEE64_DISC(d) (((d) & INFO_MASK) == FEE64_DISC_PATTERN) #define IS_SCAN_MBS(d) (((d) & INFO_MASK) == SCAN_MBS_PATTERN) #define IS_OVER_RANGE(d) (((d) & INFO_MASK) == OVER_RANGE_PATTERN) #define IS_UNDER_RANGE(d) (((d) & INFO_MASK) == UNDER_RANGE_PATTERN) #define IS_OVER_FLOW(d) (((d) & INFO_MASK) == OVER_FLOW_PATTERN) #define IS_UNDER_FLOW(d) (((d) & INFO_MASK) == UNDER_FLOW_PATTERN) #define IS_EVENT(d) (((d) & INFO_MASK) == EVENT_PATTERN) #define IS_STATS(d) (((d) & INFO_MASK) == STATS_PATTERN) #define IS_LINK_NUM(d) (((d) & LINK_MASK) == LINK_PATTERN) #define HAS_VALID_TS(ev) (IS_TIMESTAMP((ev)->timestamp)) #define IS_ADC_ITEM(ev) (IS_ADC_DATA((ev)->data) && HAS_VALID_TS(ev)) #define IS_TRACE_ITEM(ev) (IS_TRACE((ev)->data) && HAS_VALID_TS(ev)) #define IS_RAW_ITEM(ev) (IS_RAW_TRACE((ev)->data)) #define IS_SAMPLE_ITEM(ev) (IS_SAMPLE_DATA((ev)->data) && IS_SAMPLE_DATA((ev)->timestamp)) #define IS_PILEUP_INFO(ev) (IS_PILEUP((ev)->data) && HAS_VALID_TS(ev)) #define IS_PAUSE_INFO(ev) (IS_PAUSE((ev)->data) && HAS_VALID_TS(ev)) #define IS_RESUME_INFO(ev) (IS_RESUME((ev)->data) && HAS_VALID_TS(ev)) #define IS_SYNC_INFO(ev) (IS_SYNC((ev)->data) && HAS_VALID_TS(ev)) #define IS_FEE64_DISC_INFO(ev) (IS_FEE64_DISC((ev)->data) && HAS_VALID_TS(ev)) #define IS_EXT_TS_INFO(ev) (IS_EXT_TS((ev)->data) && HAS_VALID_TS(ev)) #define IS_SCAN_MBS_INFO(ev) (IS_SCAN_MBS((ev)->data) && HAS_VALID_TS(ev)) #define IS_OVER_RANGE_INFO(ev) (IS_OVER_RANGE((ev)->data) && HAS_VALID_TS(ev)) #define IS_UNDER_RANGE_INFO(ev) (IS_UNDER_RANGE((ev)->data) && HAS_VALID_TS(ev)) #define IS_OVER_FLOW_INFO(ev) (IS_OVER_FLOW((ev)->data) && HAS_VALID_TS(ev)) #define IS_UNDER_FLOW_INFO(ev) (IS_UNDER_FLOW((ev)->data) && HAS_VALID_TS(ev)) #define IS_EVENT_INFO(ev) (IS_EVENT((ev)->data) && HAS_VALID_TS(ev)) #define IS_STATS_INFO(ev) (IS_STATS((ev)->data) && HAS_VALID_TS(ev)) #define IS_LINK_INFO(ev) (IS_LINK_NUM((ev)->data) && HAS_VALID_TS(ev)) //#define TS_HIGH(ev) ((((INT64)((ev)->data) & 0xfffff) << 28)) #define TS_BITS(ev) (((ev)->data) & 0xfffff) #define TS_HIGH(ev) ((INT64)TS_BITS(ev) << 28) #define TS_VALUE(ev) (TS_HIGH(ev) + (ev)->timestamp) #define TF_HIGH(tf,ev) ((((ev)->timestamp&SYNC_MASK) <= (tf)->SyncBits) ? (tf)->AltHighBits : (tf)->HighBits) #define THIS_TIME(tf,ev) (TF_HIGH((tf),(ev)) + (ev)->timestamp)