00001 #ifndef PSANA_GENERICPGP_DDL_H
00002 #define PSANA_GENERICPGP_DDL_H 1
00003
00004
00005
00006 #include <vector>
00007 #include <iosfwd>
00008 #include <cstring>
00009 #include "ndarray/ndarray.h"
00010 #include "pdsdata/xtc/TypeId.hh"
00011 namespace Psana {
00012 namespace GenericPgp {
00013
00014
00015
00016
00017
00018
00019
00020 class CDimension {
00021 public:
00022 virtual ~CDimension();
00023 virtual uint32_t rows() const = 0;
00024 virtual uint32_t columns() const = 0;
00025 };
00026
00027
00028
00029
00030
00031
00032
00033 class CRegister {
00034 public:
00035 enum Action {
00036 RegisterRead = 0,
00037 RegisterWrite = 1,
00038 RegisterWriteA = 2,
00039 RegisterVerify = 3,
00040 Spin = 4,
00041 Usleep = 5,
00042 Flush = 6,
00043 };
00044 CRegister(GenericPgp::CRegister::Action arg__action, uint32_t arg__datasize, uint32_t arg__address, uint32_t arg__offset, uint32_t arg__mask)
00045 : _Action(((arg__action) & 0xff)|(((arg__datasize) & 0xffffff)<<8)), _address(arg__address), _offset(arg__offset), _mask(arg__mask)
00046 {
00047 }
00048 CRegister() {}
00049
00050 GenericPgp::CRegister::Action action() const { return Action(this->_Action & 0xff); }
00051
00052 uint32_t datasize() const { return uint32_t((this->_Action>>8) & 0xffffff); }
00053
00054 uint32_t address() const { return _address; }
00055
00056 uint32_t offset() const { return _offset; }
00057
00058 uint32_t mask() const { return _mask; }
00059 static uint32_t _sizeof() { return 16; }
00060 private:
00061 uint32_t _Action;
00062 uint32_t _address;
00063 uint32_t _offset;
00064 uint32_t _mask;
00065 };
00066 std::ostream& operator<<(std::ostream& str, GenericPgp::CRegister::Action enval);
00067
00068
00069
00070
00071
00072
00073
00074 class CStream {
00075 public:
00076 CStream(uint32_t arg__pgp_channel, uint32_t arg__data_type, uint32_t arg__config_type, uint32_t arg__config_offset)
00077 : _pgp_channel(arg__pgp_channel), _data_type(arg__data_type), _config_type(arg__config_type), _config_offset(arg__config_offset)
00078 {
00079 }
00080 CStream() {}
00081
00082 uint32_t pgp_channel() const { return _pgp_channel; }
00083
00084 uint32_t data_type() const { return _data_type; }
00085
00086 uint32_t config_type() const { return _config_type; }
00087
00088 uint32_t config_offset() const { return _config_offset; }
00089 static uint32_t _sizeof() { return 16; }
00090 private:
00091 uint32_t _pgp_channel;
00092 uint32_t _data_type;
00093 uint32_t _config_type;
00094 uint32_t _config_offset;
00095 };
00096
00097
00098
00099
00100
00101
00102
00103 class ConfigV1 {
00104 public:
00105 enum { TypeId = Pds::TypeId::Id_GenericPgpConfig };
00106 enum { Version = 1 };
00107 virtual ~ConfigV1();
00108
00109 virtual uint32_t id() const = 0;
00110
00111 virtual const GenericPgp::CDimension& frame_dim() const = 0;
00112
00113 virtual const GenericPgp::CDimension& aux_dim() const = 0;
00114
00115 virtual const GenericPgp::CDimension& env_dim() const = 0;
00116
00117 virtual uint32_t number_of_registers() const = 0;
00118
00119 virtual uint32_t number_of_sequences() const = 0;
00120 virtual uint32_t number_of_streams() const = 0;
00121 virtual uint32_t payload_size() const = 0;
00122 virtual ndarray<const uint32_t, 2> pixel_settings() const = 0;
00123
00124 virtual ndarray<const uint32_t, 1> sequence_length() const = 0;
00125
00126 virtual ndarray<const GenericPgp::CRegister, 1> sequence() const = 0;
00127
00128 virtual ndarray<const GenericPgp::CStream, 1> stream() const = 0;
00129
00130 virtual ndarray<const uint32_t, 1> payload() const = 0;
00131
00132 virtual uint32_t numberOfRows() const = 0;
00133
00134 virtual uint32_t numberOfColumns() const = 0;
00135
00136 virtual uint32_t lastRowExclusions() const = 0;
00137
00138 virtual uint32_t numberOfAsics() const = 0;
00139 };
00140 }
00141 }
00142 #endif // PSANA_GENERICPGP_DDL_H