2 #ifndef _HOMERDATA_HPP_
3 #define _HOMERDATA_HPP_
5 /************************************************************************
8 ** This file is property of and copyright by the Technical Computer
9 ** Science Group, Kirchhoff Institute for Physics, Ruprecht-Karls-
10 ** University, Heidelberg, Germany, 2001
11 ** This file has been written by Timm Morten Steinbeck,
12 ** timm@kip.uni-heidelberg.de
15 ** See the file license.txt for details regarding usage, modification,
16 ** distribution and warranty.
17 ** Important: This file is provided without any warranty, including
18 ** fitness for any particular purpose.
21 ** Newer versions of this file's package will be made available from
22 ** http://web.kip.uni-heidelberg.de/Hardwinf/L3/
23 ** or the corresponding page of the Heidelberg Alice Level 3 group.
25 *************************************************************************/
28 ***************************************************************************
30 ** $Author$ - Initial Version by Timm Morten Steinbeck
34 ***************************************************************************
43 // Determine the sizes of the different integer type
44 // homer_uint32, homer_uint64
45 #if !defined(USE_ROOT) && !defined(__CINT__)
47 #if USHRT_MAX==4294967295
48 typedef unsigned short homer_uint32;
49 #else // USHRT_MAX==4294967295
51 #if UINT_MAX==4294967295
52 typedef unsigned int homer_uint32;
53 #else // UINT_MAX==4294967295
55 #if ULONG_MAX==4294967295l
56 typedef unsigned long homer_uint32;
57 #else // ULONG_MAX==4294967295l
59 #error Could not typedef homer_uint32
61 #endif // ULONG_MAX==4294967295l
63 #endif // UINT_MAX==4294967295
65 #endif // USHRT_MAX==4294967295
69 typedef unsigned short homer_uint16;
70 #else // USHRT_MAX==65535
73 typedef unsigned int homer_uint16;
74 #else // UINT_MAX==65535
77 typedef unsigned long homer_uint16;
78 #else // ULONG_MAX==65535
80 #error Could not typedef homer_uint16
82 #endif // ULONG_MAX==65535
84 #endif // UINT_MAX==65535
86 #endif // USHRT_MAX==65535
89 #if ULONG_MAX==18446744073709551615ULL
90 typedef unsigned long homer_uint64;
91 #else // ULONG_MAX==18446744073709551615UL
94 typedef unsigned long long homer_uint64;
95 #else // defined __GNUC__
97 #error Could not typedef homer_uint64
99 #endif // defined __GNUC__
101 #endif // ULONG_MAX==18446744073709551615UL
103 typedef unsigned char homer_uint8;
105 #else // !USE_ROOT && !CINT
108 typedef UShort_t homer_uint16;
109 typedef UInt_t homer_uint32;
110 typedef ULong64_t homer_uint64;
111 typedef Byte_t homer_uint8;
119 //typedef homer_uint64 AliEventID_t;
123 const unsigned kAttribute_8b_StartOffset = 0;
124 const unsigned kByteOrderAttribute_8b_Offset = kAttribute_8b_StartOffset+0;
125 const unsigned kVersionAttribute_8b_Offset = kAttribute_8b_StartOffset+1;
126 const unsigned kAlignment_8b_StartOffset = 24;
127 const unsigned kUInt64Alignment_8b_Offset = kAlignment_8b_StartOffset+0;
128 const unsigned kUInt32Alignment_8b_Offset = kAlignment_8b_StartOffset+1;
129 const unsigned kUInt16Alignment_8b_Offset = kAlignment_8b_StartOffset+2;
130 const unsigned kUInt8Alignment_8b_Offset = kAlignment_8b_StartOffset+3;
131 const unsigned kDoubleAlignment_8b_Offset = kAlignment_8b_StartOffset+4;
132 const unsigned kFloatAlignment_8b_Offset = kAlignment_8b_StartOffset+5;
135 const unsigned kID_64b_Offset = 1;
136 const unsigned kLength_64b_Offset = 2;
137 const unsigned kType_64b_Offset = 4;
138 const unsigned kSubType1_64b_Offset = 5;
139 const unsigned kSubType2_64b_Offset = 6;
140 const unsigned kBirth_s_64b_Offset = 7;
141 const unsigned kBirth_us_64b_Offset = 8;
142 const unsigned kProducerNode_64b_Offset = 9;
143 const unsigned kOffset_64b_Offset = 10;
144 const unsigned kSize_64b_Offset = 11;
145 const unsigned kStatusFlags_64b_Offset = 12;
146 const unsigned kEnd_64b_Offset = 13;
147 const unsigned kCount_64b_Words = kEnd_64b_Offset;
150 // Possible values for fAttributes[kByteOrderAttribute]
151 /* Keep this consistent with BCLNetworkData.hpp kLittleEndian/kBigEndian and AliHLTSubEventDataDescriptor.hpp */
152 const homer_uint8 kHOMERUnknownByteOrder = 0;
153 const homer_uint8 kHOMERLittleEndianByteOrder = 1;
154 const homer_uint8 kHOMERBigEndianByteOrder = 2;
156 const homer_uint8 kHOMERNativeByteOrder = kHOMERLittleEndianByteOrder;
159 const homer_uint8 kHOMERNativeByteOrder = kHOMERLittleEndianByteOrder;
162 const homer_uint8 kHOMERNativeByteOrder = kHOMERLittleEndianByteOrder;
165 const homer_uint8 kHOMERNativeByteOrder = kHOMERLittleEndianByteOrder;
167 #if defined(__powerpc__)
168 const homer_uint8 kHOMERNativeByteOrder = kHOMERBigEndianByteOrder;
171 const homer_uint8 kHOMERNativeByteOrder = kHOMERLittleEndianByteOrder;
172 #warning Assuming little endian format for __CINT__
174 #error Byte format (little/big endian) currently not defined for platforms other than intel i386 compatible, x86-64 (AMD64) and arm...
183 //#define HOMER_BLOCK_DESCRIPTOR_TYPEID (((homer_uint64)'HOBL')<<32 | 'KDES')
184 #define HOMER_BLOCK_DESCRIPTOR_TYPEID ( (((homer_uint64)'H')<<56)|(((homer_uint64)'O')<<48)|(((homer_uint64)'B')<<40)|(((homer_uint64)'L')<<32)|(((homer_uint64)'K')<<24)|(((homer_uint64)'D')<<16)|(((homer_uint64)'E')<<8)|(((homer_uint64)'S')<<0) )
185 //#define HOMER_BLOCK_DESCRIPTOR_TYPEID ( (((homer_uint64)'H')<<56)|(((homer_uint64)'O')<<48) )
186 #define HOMER_HEADER_CURRENT_VERSION 2
189 class HOMERBlockDescriptor
193 static unsigned GetHOMERBlockDescriptorSize()
195 return sizeof(homer_uint64)*kCount_64b_Words;
198 HOMERBlockDescriptor( void* header = 0 )
202 void UseHeader( void* header )
210 for ( unsigned ii=0; ii<kCount_64b_Words; ii++ )
211 ((homer_uint64*)fHeader)[ ii ] = (homer_uint64)0;
212 ((homer_uint64*)fHeader)[ kID_64b_Offset ] = HOMER_BLOCK_DESCRIPTOR_TYPEID;
213 ((homer_uint64*)fHeader)[ kLength_64b_Offset ] = GetHOMERBlockDescriptorSize();
214 ((homer_uint8*)fHeader)[ kByteOrderAttribute_8b_Offset ] = kHOMERNativeByteOrder;
215 ((homer_uint8*)fHeader)[ kVersionAttribute_8b_Offset ] = HOMER_HEADER_CURRENT_VERSION;
219 void SetByteOrder( homer_uint8 bo )
222 ((homer_uint8*)fHeader)[ kByteOrderAttribute_8b_Offset ] = bo;
224 homer_uint8 GetByteOrder() const
227 return ((homer_uint8*)fHeader)[ kByteOrderAttribute_8b_Offset ];
231 void SetVersion( homer_uint8 v )
234 ((homer_uint8*)fHeader)[ kVersionAttribute_8b_Offset ] = v;
236 void SetID( homer_uint64 id )
239 ((homer_uint64*)fHeader)[ kID_64b_Offset ] = id;
241 void SetHeaderLength( homer_uint64 l )
244 ((homer_uint64*)fHeader)[ kLength_64b_Offset ] = l;
246 homer_uint64 GetHeaderLength()
249 return ((homer_uint64*)fHeader)[ kLength_64b_Offset ];
253 void SetAlignment( homer_uint8 type, homer_uint8 align )
255 if ( fHeader && type<6 )
256 ((homer_uint8*)fHeader)[ kAlignment_8b_StartOffset+type ] = align;
258 void SetUInt64Alignment( homer_uint8 align )
261 ((homer_uint8*)fHeader)[ kUInt64Alignment_8b_Offset ] = align;
263 void SetUInt32Alignment( homer_uint8 align )
266 ((homer_uint8*)fHeader)[ kUInt32Alignment_8b_Offset ] = align;
268 void SetUInt16Alignment( homer_uint8 align )
271 ((homer_uint8*)fHeader)[ kUInt16Alignment_8b_Offset ] = align;
273 void SetUInt8Alignment( homer_uint8 align )
276 ((homer_uint8*)fHeader)[ kUInt8Alignment_8b_Offset ] = align;
278 void SetDoubleAlignment( homer_uint8 align )
281 ((homer_uint8*)fHeader)[ kDoubleAlignment_8b_Offset ] = align;
283 void SetFloatAlignment( homer_uint8 align )
286 ((homer_uint8*)fHeader)[ kFloatAlignment_8b_Offset ] = align;
288 void SetType( homer_uint64 t )
291 ((homer_uint64*)fHeader)[ kType_64b_Offset ] = t;
293 void SetSubType1( homer_uint64 st1 )
296 ((homer_uint64*)fHeader)[ kSubType1_64b_Offset ] = st1;
298 void SetSubType2( homer_uint64 st2 )
301 ((homer_uint64*)fHeader)[ kSubType2_64b_Offset ] = st2;
303 void SetBirth_s( homer_uint64 bs )
306 ((homer_uint64*)fHeader)[ kBirth_s_64b_Offset ] = bs;
308 void SetBirth_us( homer_uint64 bus )
311 ((homer_uint64*)fHeader)[ kBirth_us_64b_Offset ] = bus;
313 void SetProducerNode( homer_uint64 pn )
316 ((homer_uint64*)fHeader)[ kProducerNode_64b_Offset ] = pn;
318 void SetBlockOffset( homer_uint64 bo )
321 ((homer_uint64*)fHeader)[ kOffset_64b_Offset ] = bo;
323 homer_uint64 GetBlockOffset()
326 return ((homer_uint64*)fHeader)[ kOffset_64b_Offset ];
330 void SetBlockSize( homer_uint64 bs )
333 ((homer_uint64*)fHeader)[ kSize_64b_Offset ] = bs;
335 homer_uint64 GetBlockSize()
338 return ((homer_uint64*)fHeader)[ kSize_64b_Offset ];
342 void SetStatusFlags( homer_uint64 bs )
345 ((homer_uint64*)fHeader)[ kStatusFlags_64b_Offset ] = bs;
347 homer_uint64 GetStatusFlags()
350 return ((homer_uint64*)fHeader)[ kStatusFlags_64b_Offset ];
355 void* GetHeader() const
369 ***************************************************************************
371 ** $Author$ - Initial Version by Timm Morten Steinbeck
375 ***************************************************************************
378 #endif // _HOMERDATA_HPP_