6#include "dawn/io/config.hxx"
15static size_t cfgDtypeSize(uint8_t dtype)
21 return sizeof(uint32_t);
27 return sizeof(uint32_t);
33static size_t cfgWordsPerValue(uint8_t dtype)
35 size_t dsize = cfgDtypeSize(dtype);
37 if (dsize ==
sizeof(uint64_t))
45static size_t cfgValueCount(uint32_t objcfg)
50 if (step == 0 || words == 0 || words % step != 0)
58static int cfgWordsToTyped(uint8_t dtype,
65 size_t step = cfgWordsPerValue(dtype);
67 if (step == 0 || src ==
nullptr || dst ==
nullptr || items * step != words)
74#if defined(CONFIG_DAWN_DTYPE_BOOL) || defined(CONFIG_DAWN_DTYPE_UINT8) || \
75 defined(CONFIG_DAWN_DTYPE_CHAR)
76# ifdef CONFIG_DAWN_DTYPE_BOOL
79# ifdef CONFIG_DAWN_DTYPE_UINT8
82# ifdef CONFIG_DAWN_DTYPE_CHAR
86 uint8_t *ptr =
reinterpret_cast<uint8_t *
>(dst);
88 for (i = 0; i < items; i++)
90 ptr[i] =
static_cast<uint8_t
>(src[i] & 0xff);
97#ifdef CONFIG_DAWN_DTYPE_INT8
100 int8_t *ptr =
reinterpret_cast<int8_t *
>(dst);
102 for (i = 0; i < items; i++)
104 ptr[i] =
static_cast<int8_t
>(src[i] & 0xff);
111#ifdef CONFIG_DAWN_DTYPE_UINT16
114 uint16_t *ptr =
reinterpret_cast<uint16_t *
>(dst);
116 for (i = 0; i < items; i++)
118 ptr[i] =
static_cast<uint16_t
>(src[i] & 0xffff);
125#ifdef CONFIG_DAWN_DTYPE_INT16
128 int16_t *ptr =
reinterpret_cast<int16_t *
>(dst);
130 for (i = 0; i < items; i++)
132 ptr[i] =
static_cast<int16_t
>(src[i] & 0xffff);
139#if defined(CONFIG_DAWN_DTYPE_INT32) || defined(CONFIG_DAWN_DTYPE_UINT32) || \
140 defined(CONFIG_DAWN_DTYPE_FLOAT) || defined(CONFIG_DAWN_DTYPE_B16) || \
141 defined(CONFIG_DAWN_DTYPE_UB16) || defined(CONFIG_DAWN_DTYPE_BLOCK)
142# ifdef CONFIG_DAWN_DTYPE_INT32
145# ifdef CONFIG_DAWN_DTYPE_UINT32
148# ifdef CONFIG_DAWN_DTYPE_FLOAT
151# ifdef CONFIG_DAWN_DTYPE_B16
154# ifdef CONFIG_DAWN_DTYPE_UB16
158# ifdef CONFIG_DAWN_DTYPE_BLOCK
162 std::memcpy(dst, src, items *
sizeof(uint32_t));
174static int cfgTypedToWords(uint8_t dtype,
181 size_t step = cfgWordsPerValue(dtype);
183 if (step == 0 || src ==
nullptr || dst ==
nullptr || items * step != words)
190#ifdef CONFIG_DAWN_DTYPE_BOOL
193 const uint8_t *ptr =
reinterpret_cast<const uint8_t *
>(src);
195 for (i = 0; i < items; i++)
197 dst[i] = ptr[i] ? 1 : 0;
204#if defined(CONFIG_DAWN_DTYPE_UINT8) || defined(CONFIG_DAWN_DTYPE_CHAR)
205# ifdef CONFIG_DAWN_DTYPE_UINT8
208# ifdef CONFIG_DAWN_DTYPE_CHAR
212 const uint8_t *ptr =
reinterpret_cast<const uint8_t *
>(src);
214 for (i = 0; i < items; i++)
223#ifdef CONFIG_DAWN_DTYPE_INT8
226 const int8_t *ptr =
reinterpret_cast<const int8_t *
>(src);
229 for (i = 0; i < items; i++)
232 std::memcpy(&dst[i], &v,
sizeof(v));
239#ifdef CONFIG_DAWN_DTYPE_UINT16
242 const uint16_t *ptr =
reinterpret_cast<const uint16_t *
>(src);
244 for (i = 0; i < items; i++)
253#ifdef CONFIG_DAWN_DTYPE_INT16
256 const int16_t *ptr =
reinterpret_cast<const int16_t *
>(src);
259 for (i = 0; i < items; i++)
262 std::memcpy(&dst[i], &v,
sizeof(v));
269#if defined(CONFIG_DAWN_DTYPE_INT32) || defined(CONFIG_DAWN_DTYPE_UINT32) || \
270 defined(CONFIG_DAWN_DTYPE_FLOAT) || defined(CONFIG_DAWN_DTYPE_B16) || \
271 defined(CONFIG_DAWN_DTYPE_UB16) || defined(CONFIG_DAWN_DTYPE_BLOCK)
272# ifdef CONFIG_DAWN_DTYPE_INT32
275# ifdef CONFIG_DAWN_DTYPE_UINT32
278# ifdef CONFIG_DAWN_DTYPE_FLOAT
281# ifdef CONFIG_DAWN_DTYPE_B16
284# ifdef CONFIG_DAWN_DTYPE_UB16
288# ifdef CONFIG_DAWN_DTYPE_BLOCK
292 std::memcpy(dst, src, items *
sizeof(uint32_t));
304void CIOConfig::configureDesc(
const CDescObject &desc)
321 DAWNERR(
"unsupported config cfg 0x%08" PRIx32 "\n",
item->cfgid.v);
326 switch (
item->cfgid.s.id)
328 case CIOConfig::IO_CONFIG_CFG_OBJCFG:
337 case CIOConfig::IO_CONFIG_CFG_OFFSET:
346 case CIOConfig::IO_CONFIG_CFG_SIZE:
355 case CIOConfig::IO_CONFIG_CFG_ALLOC:
359 for (
size_t j = 0;
j <
item->cfgid.s.size;
j++)
361 map.insert_or_assign(
item->data[
j],
nullptr);
371 DAWNERR(
"unsupported config cfg 0x%08" PRIx32 "\n",
item->cfgid.v);
381CIOConfig::~CIOConfig()
407 if (cfg_size > 0 && cfg_offset + cfg_size >
cfg_words)
409 DAWNERR(
"config: offset %" PRIu32 " + size %" PRIu32 " exceeds field size %zu\n",
424 if (
lim->getMin() ==
nullptr ||
lim->getMax() ==
nullptr ||
lim->getStep() ==
nullptr)
459 DAWNASSERT(objcfg != 0,
"invalid data");
475 DAWNERR(
"config read out of bounds: offset %" PRIu32 " + %zu > %zu words\n",
484 for (
auto &[
id, obj] :
map)
523 DAWNASSERT(objcfg != 0,
"invalid data");
538 DAWNERR(
"config write out of bounds: offset %" PRIu32 " + %zu > %zu words\n",
569 for (
auto &[
id, obj] :
map)
601 for (
auto &[
id, obj] :
map)
616 for (
auto &[
id, obj] :
map)
663 dsize = cfgDtypeSize(dtype);
664 items = cfg_size > 0 ? cfg_size : cfgValueCount(objcfg);
670 return dsize * items;
680 return cfg_size > 0 ? cfg_size : cfgValueCount(objcfg);
683int CIOConfig::bind(
CObject *obj, uint32_t
id)
685 DAWNASSERT(obj->
getIdV() ==
id,
"something goes wrong!");
686 map.insert_or_assign(
id, obj);
Descriptor wrapper for individual object configuration.
size_t getSize() const
Get number of configuration items for this object.
SObjectCfg::SObjectCfgItem * objectCfgItemAtOffset(size_t offset) const
Get configuration item at specified offset.
const CIOLimits & getCmnLimits() const
Get common IO limits container.
size_t cfgCmnOffset(const SObjectCfg::SObjectCfgItem *cfg)
Get offset of configuration item in descriptor.
@ IO_CLASS_ANY
Any I/O class.
@ IO_CLASS_CONFIG
Configuration I/O.
int getDataImpl(IODataCmn &data, size_t len)
Get data implementation (override in derived classes).
int deinit()
De-initialize object.
std::map< uint32_t, CObject * > map
Map of object ID to bound CObject pointers.
int setDataImpl(IODataCmn &data)
Set data implementation (override in derived classes).
int configure()
Configure object from descriptor data.
size_t getDataSize() const
Get data size in bytes.
size_t getDataDim() const
Get data vector dimension.
Common IO runtime limits container and validator.
int validate(const uint32_t *data, size_t words, uint8_t dtype) const
Validate payload against configured limits.
Base class for all Dawn objects (IOs, Programs, Protocols).
SObjectId::ObjectId getIdV() const
Get object identifier as raw 32-bit value.
CDescObject & getDesc()
Get descriptor object for this object.
uint8_t getDtype() const
Get data type field.
static uint16_t objectCfgGetSize(const ObjectCfgId objcfg)
Extract configuration data size from ConfigID.
static uint8_t objectCfgGetDtype(const ObjectCfgId objcfg)
Extract data type from ConfigID.
Out-of-tree user-extension hooks for Dawn.
Base interface for I/O data buffers (static and dynamic).
virtual size_t getItems()=0
Get number of items per batch.
virtual void * getDataPtr(size_t batch=0)=0
Get pointer to data only (skips timestamp if present).
Single configuration item within object.
EObjectDataType
Data types supported by Dawn framework.
@ DTYPE_FLOAT
IEEE 754 single-precision floating point (32-bit).
@ DTYPE_INT32
Signed 32-bit integer (-2147483648 to 2147483647).
@ DTYPE_UINT8
Unsigned 8-bit integer (0 to 255).
@ DTYPE_INT16
Signed 16-bit integer (-32768 to 32767).
@ DTYPE_INT8
Signed 8-bit integer (-128 to 127).
@ DTYPE_ANY
Wildcard data type (matches any actual type).
@ DTYPE_BLOCK
Opaque block/byte-stream data type.
@ DTYPE_UINT16
Unsigned 16-bit integer (0 to 65535).
@ DTYPE_UB16
Unsigned 16.16 fixed-point (32-bit).
@ DTYPE_CHAR
Character/string type (null-terminated, 4-byte aligned).
@ DTYPE_UINT32
Unsigned 32-bit integer (0 to 4294967295).
@ DTYPE_BOOL
Boolean data type (stored in 32-bit container).
@ DTYPE_B16
Signed 16.16 fixed-point (32-bit).
static int getDtypeSize_(const EObjectDataType dtype)
Get byte size for a specific data type.