64void rim::Block::setup_python() {
65 bp::class_<rim::Block, rim::BlockPtr, bp::bases<rim::Master>, boost::noncopyable>(
"Block",
66 bp::init<uint64_t, uint32_t>())
67 .add_property(
"path", &rim::Block::path)
68 .add_property(
"mode", &rim::Block::mode)
69 .add_property(
"bulkOpEn", &rim::Block::bulkOpEn)
70 .add_property(
"offset", &rim::Block::offset)
71 .add_property(
"address", &rim::Block::address)
72 .add_property(
"size", &rim::Block::size)
73 .def(
"setEnable", &rim::Block::setEnable)
74 .def(
"_startTransaction", &rim::Block::startTransactionPy)
75 .def(
"_checkTransaction", &rim::Block::checkTransactionPy)
76 .def(
"addVariables", &rim::Block::addVariablesPy)
77 .def(
"_rateTest", &rim::Block::rateTest)
78 .add_property(
"variables", &rim::Block::variablesPy);
80 bp::implicitly_convertible<rim::BlockPtr, rim::MasterPtr>();
85rim::Block::Block(uint64_t offset, uint32_t size) {
96 blockPyTrans_ =
false;
104 blockData_ =
reinterpret_cast<uint8_t*
>(malloc(size_));
105 memset(blockData_, 0, size_);
107 verifyData_ =
reinterpret_cast<uint8_t*
>(malloc(size_));
108 memset(verifyData_, 0, size_);
110 verifyMask_ =
reinterpret_cast<uint8_t*
>(malloc(size_));
111 memset(verifyMask_, 0, size_);
113 verifyBlock_ =
reinterpret_cast<uint8_t*
>(malloc(size_));
114 memset(verifyBlock_, 0, size_);
279void rim::Block::startTransaction(uint32_t type,
bool forceWr,
bool check,
rim::Variable* var, int32_t index) {
287 intStartTransaction(type, fWr, check, var, index);
290 if (check || retryCount_ > 0) checkTransaction();
296 if ((count + 1) > retryCount_) {
297 bLog_->error(
"Error on try %" PRIu32
" out of %" PRIu32
": %s",
303 bLog_->warning(
"Error on try %" PRIu32
" out of %" PRIu32
": %s",
309 }
while (count++ < retryCount_);
315void rim::Block::startTransactionPy(uint32_t type,
bool forceWr,
bool check,
rim::VariablePtr var, int32_t index) {
320 if (blockPyTrans_)
return;
327 intStartTransaction(type, fWr, check, var.get(), index);
330 if (check || retryCount_ > 0) upd = checkTransaction();
336 if ((count + 1) > retryCount_) {
337 bLog_->error(
"Error on try %" PRIu32
" out of %" PRIu32
": %s",
343 bLog_->warning(
"Error on try %" PRIu32
" out of %" PRIu32
": %s",
349 }
while (count++ < retryCount_);
351 if (upd) varUpdate();
357bool rim::Block::checkTransaction() {
364 std::lock_guard<std::mutex> lock(mtx_);
372 "Transaction error for block %s with address 0x%.8x. Error %s",
379 if (!enable_)
return false;
383 bLog_->debug(
"Verfying data. Base=0x%" PRIx32
", size=%" PRIu32, verifyBase_, verifySize_);
387 for (x = verifyBase_; x < verifyBase_ + verifySize_; x++) {
388 if ((verifyData_[x] & verifyMask_[x]) != (blockData_[x] & verifyMask_[x])) {
390 "Verify error for block %s with address 0x%.8" PRIx64
391 ". Byte: %" PRIu32
". Got: 0x%.2" PRIx8
", Exp: 0x%.2" PRIx8
392 ", Mask: 0x%.2" PRIx8,
402 bLog_->debug(
"Transaction complete");
404 locUpdate = doUpdate_;
450void rim::Block::addVariables(std::vector<rim::VariablePtr> variables) {
451 std::vector<rim::VariablePtr>::iterator vit;
455 uint8_t excMask[size_];
456 uint8_t oleMask[size_];
458 memset(excMask, 0, size_);
459 memset(oleMask, 0, size_);
461 variables_ = variables;
463 for (vit = variables_.begin(); vit != variables_.end(); ++vit) {
464 (*vit)->block_ =
this;
466 if (vit == variables_.begin()) {
467 path_ = (*vit)->path_;
468 std::string logName =
"memory.block." + path_;
470 mode_ = (*vit)->mode_;
473 if ((*vit)->bulkOpEn_) bulkOpEn_ =
true;
474 if ((*vit)->updateNotify_) updateEn_ =
true;
477 if ((*vit)->retryCount_ > retryCount_) retryCount_ = (*vit)->retryCount_;
480 if (mode_ != (*vit)->mode_) mode_ =
"RW";
483 if ((*vit)->numValues_ == 0) {
484 for (x = 0; x < (*vit)->bitOffset_.size(); x++) {
486 if ((*vit)->overlapEn_) {
487 setBits(oleMask, (*vit)->bitOffset_[x], (*vit)->bitSize_[x]);
491 if (anyBits(excMask, (*vit)->bitOffset_[x], (*vit)->bitSize_[x]))
493 "Block::addVariables",
494 "Variable bit overlap detected for block %s with address 0x%.8x and variable %s",
497 (*vit)->name_.c_str()));
499 setBits(excMask, (*vit)->bitOffset_[x], (*vit)->bitSize_[x]);
503 if ((*vit)->mode_ ==
"RW" && (*vit)->verifyEn_) {
505 setBits(verifyMask_, (*vit)->bitOffset_[x], (*vit)->bitSize_[x]);
509 if ((*vit)->mode_ ==
"RO" || (*vit)->mode_ ==
"WO" || !(*vit)->verifyEn_) {
510 setBits(verifyBlock_, (*vit)->bitOffset_[x], (*vit)->bitSize_[x]);
514 "Adding variable %s to block %s at offset 0x%.8x, bitIdx=%i, bitOffset %i, bitSize %i, mode %s, "
517 (*vit)->name_.c_str(),
521 (*vit)->bitOffset_[x],
523 (*vit)->mode_.c_str(),
529 for (x = 0; x < (*vit)->numValues_; x++) {
531 if ((*vit)->overlapEn_) {
532 setBits(oleMask, x * (*vit)->valueStride_ + (*vit)->bitOffset_[0], (*vit)->valueBits_);
536 if (anyBits(excMask, x * (*vit)->valueStride_ + (*vit)->bitOffset_[0], (*vit)->valueBits_))
538 "Block::addVariables",
539 "Variable bit overlap detected for block %s with address 0x%.8x and variable %s",
542 (*vit)->name_.c_str()));
544 setBits(excMask, x * (*vit)->valueStride_ + (*vit)->bitOffset_[0], (*vit)->valueBits_);
548 if ((*vit)->mode_ ==
"RW" && (*vit)->verifyEn_) {
550 setBits(verifyMask_, x * (*vit)->valueStride_ + (*vit)->bitOffset_[0], (*vit)->valueBits_);
554 if ((*vit)->mode_ ==
"RO" || (*vit)->mode_ ==
"WO" || !(*vit)->verifyEn_) {
555 setBits(verifyBlock_, x * (*vit)->valueStride_ + (*vit)->bitOffset_[0], (*vit)->valueBits_);
559 "Adding variable %s to block %s at offset 0x%.8x, index=%i, valueOffset=%i, valueBits %i, mode %s, "
561 (*vit)->name_.c_str(),
565 x * (*vit)->valueStride_ + (*vit)->bitOffset_[0],
567 (*vit)->mode_.c_str(),
574 for (x = 0; x < size_; x++) {
575 if (oleMask[x] & excMask[x])
577 "Variable bit mask overlap detected for block %s with address 0x%.8x",
582 verifyMask_[x] &= (verifyBlock_[x] ^ 0xFF);
589 std::stringstream ss;
590 uint32_t rem = size_;
596 ss <<
"0x" << std::setfill(
'0') << std::hex << std::setw(2) << static_cast<uint32_t>(verifyMask_[x]) <<
" ";
599 if (rem == 0 || x % 10 == 0) {
600 bLog_->debug(
"Done adding variables. Verify Mask %.3i - %.3i: %s", idx, x - 1, ss.str().c_str());
719void rim::Block::getBytes(uint8_t* data,
rim::Variable* var, uint32_t index) {
724 std::lock_guard<std::mutex> lock(mtx_);
731 "Index %" PRIu32
" is out of range for %s",
733 var->
name_.c_str()));
752 for (x = 0; x < var->
bitOffset_.size(); x++) {
772void rim::Block::setPyFunc(bp::object& value,
rim::Variable* var, int32_t index) {
777 if (index == -1) index = 0;
780 if (PyArray_Check(value.ptr())) {
782 "Passing ndarray not supported for %s",
783 var->
name_.c_str()));
786 }
else if (PyList_Check(value.ptr())) {
787 bp::list vl = bp::extract<bp::list>(value);
788 uint32_t vlen = len(vl);
792 "Overflow error for passed array with length %" PRIu32
793 " at index %" PRIu32
". Variable length = %" PRIu32
" for %s",
797 var->
name_.c_str()));
799 for (x = 0; x < vlen; x++) {
803 if (PyObject_GetBuffer(ret.ptr(), &(valueBuf), PyBUF_SIMPLE) < 0)
805 "Failed to extract byte array for %s",
806 var->
name_.c_str()));
808 setBytes(
reinterpret_cast<uint8_t*
>(valueBuf.buf), var, index + x);
809 PyBuffer_Release(&valueBuf);
817 if (PyObject_GetBuffer(ret.ptr(), &(valueBuf), PyBUF_SIMPLE) < 0)
819 "Failed to extract byte array from pyFunc return value for %s",
820 var->
name_.c_str()));
822 setBytes(
reinterpret_cast<uint8_t*
>(valueBuf.buf), var, index);
823 PyBuffer_Release(&valueBuf);
832 if (index < 0 && var->numValues_ > 0) {
834 "Accessing unindexed value not support for %s",
835 var->
name_.c_str()));
841 getBytes(getBuffer, var, index);
842 PyObject* val = Py_BuildValue(
"y#", getBuffer, var->
valueBytes_);
846 bp::handle<> handle(val);
847 bp::object pass = bp::object(handle);
862void rim::Block::setByteArrayPy(bp::object& value,
rim::Variable* var, int32_t index) {
866 if (index < 0 && var->numValues_ > 0)
868 "Accessing unindexed value not supported for %s",
869 var->
name_.c_str()));
871 if (PyObject_GetBuffer(value.ptr(), &(valueBuf), PyBUF_SIMPLE) < 0)
873 "Failed to extract byte array for %s",
874 var->
name_.c_str()));
876 setBytes(
reinterpret_cast<uint8_t*
>(valueBuf.buf), var, index);
877 PyBuffer_Release(&valueBuf);
885 if (index < 0 && var->numValues_ > 0)
887 "Accessing unindexed value not supported for %s",
888 var->
name_.c_str()));
892 getBytes(getBuffer, var, index);
893 PyObject* val = Py_BuildValue(
"y#", getBuffer, var->
valueBytes_);
897 bp::handle<> handle(val);
898 return bp::object(handle);
920void rim::Block::setUIntPy(bp::object& value,
rim::Variable* var, int32_t index) {
921 if (index == -1) index = 0;
924 auto process_uint_array = [&](
auto* src, npy_intp stride, npy_intp length) {
925 for (npy_intp i = 0; i < length; ++i) {
926 setUInt(src[i * stride], var, index + i);
931 if (PyArray_Check(value.ptr())) {
933 PyArrayObject* arr =
reinterpret_cast<PyArrayObject*
>(value.ptr());
934 npy_intp ndims = PyArray_NDIM(arr);
935 npy_intp* dims = PyArray_SHAPE(arr);
936 npy_intp* strides = PyArray_STRIDES(arr);
939 "Invalid number of dimensions (%" PRIu32
") for passed ndarray for %s",
941 var->
name_.c_str()));
945 "Overflow error for passed array with length %" PRIu32
946 " at index %" PRIu32
". Variable length = %" PRIu32
" for %s",
950 var->
name_.c_str()));
952 int type = PyArray_TYPE(arr);
955 uint64_t* src =
reinterpret_cast<uint64_t*
>(PyArray_DATA(arr));
956 npy_intp stride = strides[0] /
sizeof(uint64_t);
957 process_uint_array(src, stride, dims[0]);
961 uint32_t* src =
reinterpret_cast<uint32_t*
>(PyArray_DATA(arr));
962 npy_intp stride = strides[0] /
sizeof(uint32_t);
963 process_uint_array(src, stride, dims[0]);
967 uint16_t* src =
reinterpret_cast<uint16_t*
>(PyArray_DATA(arr));
968 npy_intp stride = strides[0] /
sizeof(uint16_t);
969 process_uint_array(src, stride, dims[0]);
973 uint8_t* src =
reinterpret_cast<uint8_t*
>(PyArray_DATA(arr));
974 npy_intp stride = strides[0] /
sizeof(uint8_t);
975 process_uint_array(src, stride, dims[0]);
980 "Passed nparray is not of an accepted unsigned int type (uint64, uint32, uint16, uint8) for %s",
981 var->
name_.c_str()));
985 }
else if (PyList_Check(value.ptr())) {
986 bp::list vl = bp::extract<bp::list>(value);
987 uint32_t vlen = len(vl);
990 "Overflow error for passed list with length %" PRIu32
991 " at index %" PRIi32
". Variable length = %" PRIu32
" for %s",
995 var->
name_.c_str()));
996 for (uint32_t i = 0; i < vlen; i++) {
997 bp::extract<uint64_t> tmp(vl[i]);
1000 "Failed to extract value for %s.",
1001 var->
name_.c_str()));
1002 setUInt(tmp, var, index + i);
1006 }
else if (PyArray_CheckScalar(value.ptr())) {
1007 int type_num = PyArray_DescrFromScalar(value.ptr())->type_num;
1011 PyArray_ScalarAsCtype(value.ptr(), &val);
1012 setUInt(val, var, index);
1017 PyArray_ScalarAsCtype(value.ptr(), &val);
1018 setUInt(val, var, index);
1023 PyArray_ScalarAsCtype(value.ptr(), &val);
1024 setUInt(val, var, index);
1029 PyArray_ScalarAsCtype(value.ptr(), &val);
1030 setUInt(val, var, index);
1035 "Failed to extract scalar unsigned int value for %s.",
1036 var->
name_.c_str()));
1039 bp::extract<uint64_t> tmp(value);
1042 setUInt(tmp, var, index);
1051 if (index < 0 && var->numValues_ > 0) {
1059 npType = NPY_UINT16;
1061 npType = NPY_UINT32;
1063 npType = NPY_UINT64;
1066 PyObject* obj = PyArray_SimpleNew(1, dims, npType);
1067 PyArrayObject* arr =
reinterpret_cast<PyArrayObject*
>(obj);
1071 uint8_t* dst =
reinterpret_cast<uint8_t*
>(PyArray_DATA(arr));
1073 dst[x] =
static_cast<uint8_t
>(getUInt(var, x));
1078 uint16_t* dst =
reinterpret_cast<uint16_t*
>(PyArray_DATA(arr));
1080 dst[x] =
static_cast<uint16_t
>(getUInt(var, x));
1085 uint32_t* dst =
reinterpret_cast<uint32_t*
>(PyArray_DATA(arr));
1087 dst[x] =
static_cast<uint32_t
>(getUInt(var, x));
1092 uint64_t* dst =
reinterpret_cast<uint64_t*
>(PyArray_DATA(arr));
1094 dst[x] = getUInt(var, x);
1099 boost::python::handle<> handle(obj);
1100 ret = bp::object(handle);
1102 PyObject* val = Py_BuildValue(
"K", getUInt(var, index));
1105 bp::handle<> handle(val);
1106 ret = bp::object(handle);
1143void rim::Block::setIntPy(bp::object& value,
rim::Variable* var, int32_t index) {
1144 if (index == -1) index = 0;
1147 auto process_int_array = [&](
auto* src, npy_intp stride, npy_intp length) {
1148 for (npy_intp i = 0; i < length; ++i) {
1149 setInt(src[i * stride], var, index + i);
1154 if (PyArray_Check(value.ptr())) {
1156 PyArrayObject* arr =
reinterpret_cast<PyArrayObject*
>(value.ptr());
1157 npy_intp ndims = PyArray_NDIM(arr);
1158 npy_intp* dims = PyArray_SHAPE(arr);
1159 npy_intp* strides = PyArray_STRIDES(arr);
1162 "Invalid number of dimensions (%" PRIu32
") for passed ndarray for %s",
1164 var->
name_.c_str()));
1168 "Overflow error for passed array with length %" PRIu32
1169 " at index %" PRIi32
". Variable length = %" PRIu32
" for %s",
1173 var->
name_.c_str()));
1175 int type = PyArray_TYPE(arr);
1178 int64_t* src =
reinterpret_cast<int64_t*
>(PyArray_DATA(arr));
1179 npy_intp stride = strides[0] /
sizeof(int64_t);
1180 process_int_array(src, stride, dims[0]);
1184 int32_t* src =
reinterpret_cast<int32_t*
>(PyArray_DATA(arr));
1185 npy_intp stride = strides[0] /
sizeof(int32_t);
1186 process_int_array(src, stride, dims[0]);
1190 int16_t* src =
reinterpret_cast<int16_t*
>(PyArray_DATA(arr));
1191 npy_intp stride = strides[0] /
sizeof(int16_t);
1192 process_int_array(src, stride, dims[0]);
1196 int8_t* src =
reinterpret_cast<int8_t*
>(PyArray_DATA(arr));
1197 npy_intp stride = strides[0] /
sizeof(int8_t);
1198 process_int_array(src, stride, dims[0]);
1203 "Passed nparray is not of an accepted signed int type (int64, int32, int16, int8) for %s",
1204 var->
name_.c_str()));
1208 }
else if (PyList_Check(value.ptr())) {
1209 bp::list vl = bp::extract<bp::list>(value);
1210 uint32_t vlen = len(vl);
1214 "Overflow error for passed list with length %" PRIu32
1215 " at index %" PRIi32
". Variable length = %" PRIu32
" for %s",
1219 var->
name_.c_str()));
1220 for (uint32_t i = 0; i < vlen; i++) {
1221 bp::extract<int64_t> tmp(vl[i]);
1224 "Failed to extract value for %s.",
1225 var->
name_.c_str()));
1226 setInt(tmp, var, index + i);
1230 }
else if (PyArray_CheckScalar(value.ptr())) {
1231 int type_num = PyArray_DescrFromScalar(value.ptr())->type_num;
1235 PyArray_ScalarAsCtype(value.ptr(), &val);
1236 setInt(val, var, index);
1241 PyArray_ScalarAsCtype(value.ptr(), &val);
1242 setInt(val, var, index);
1247 PyArray_ScalarAsCtype(value.ptr(), &val);
1248 setInt(val, var, index);
1253 PyArray_ScalarAsCtype(value.ptr(), &val);
1254 setInt(val, var, index);
1259 "Failed to extract scalar signed int value for %s.",
1260 var->
name_.c_str()));
1263 bp::extract<int64_t> tmp(value);
1267 setInt(tmp, var, index);
1276 if (index < 0 && var->numValues_ > 0) {
1289 PyObject* obj = PyArray_SimpleNew(1, dims, npType);
1290 PyArrayObject* arr =
reinterpret_cast<PyArrayObject*
>(obj);
1294 int8_t* dst =
reinterpret_cast<int8_t*
>(PyArray_DATA(arr));
1296 dst[x] =
static_cast<int8_t
>(getInt(var, x));
1301 int16_t* dst =
reinterpret_cast<int16_t*
>(PyArray_DATA(arr));
1303 dst[x] =
static_cast<int16_t
>(getInt(var, x));
1308 int32_t* dst =
reinterpret_cast<int32_t*
>(PyArray_DATA(arr));
1310 dst[x] =
static_cast<int32_t
>(getInt(var, x));
1315 int64_t* dst =
reinterpret_cast<int64_t*
>(PyArray_DATA(arr));
1317 dst[x] = getInt(var, x);
1322 boost::python::handle<> handle(obj);
1323 ret = bp::object(handle);
1325 PyObject* val = Py_BuildValue(
"L", getInt(var, index));
1328 bp::handle<> handle(val);
1329 ret = bp::object(handle);
1372void rim::Block::setBoolPy(bp::object& value,
rim::Variable* var, int32_t index) {
1375 if (index == -1) index = 0;
1378 if (PyArray_Check(value.ptr())) {
1380 PyArrayObject* arr =
reinterpret_cast<decltype(arr)
>(value.ptr());
1381 npy_intp ndims = PyArray_NDIM(arr);
1382 npy_intp* dims = PyArray_SHAPE(arr);
1383 npy_intp* strides = PyArray_STRIDES(arr);
1387 "Invalid number of dimensions (%" PRIu32
") for passed ndarray for %s",
1389 var->
name_.c_str()));
1393 "Overflow error for passed array with length %" PRIu32
1394 " at index %" PRIi32
". Variable length = %" PRIu32
" for %s",
1398 var->
name_.c_str()));
1400 if (PyArray_TYPE(arr) == NPY_BOOL) {
1401 bool* src =
reinterpret_cast<bool*
>(PyArray_DATA(arr));
1402 npy_intp stride = strides[0] /
sizeof(bool);
1403 for (x = 0; x < dims[0]; x++) {
1404 setBool(src[x * stride], var, index + x);
1408 "Passed nparray is not of type (bool) for %s",
1409 var->
name_.c_str()));
1413 }
else if (PyList_Check(value.ptr())) {
1414 bp::list vl = bp::extract<bp::list>(value);
1415 uint32_t vlen = len(vl);
1419 "Overflow error for passed array with length %" PRIu32
1420 " at index %" PRIi32
". Variable length = %" PRIu32
" for %s",
1424 var->
name_.c_str()));
1426 for (x = 0; x < vlen; x++) {
1427 bp::extract<bool> tmp(vl[x]);
1431 "Failed to extract value for %s.",
1432 var->
name_.c_str()));
1434 setBool(tmp, var, index + x);
1438 }
else if (PyArray_CheckScalar(value.ptr())) {
1439 if (PyArray_DescrFromScalar(value.ptr())->type_num == NPY_BOOL) {
1441 PyArray_ScalarAsCtype(value.ptr(), &val);
1442 setBool(val, var, index);
1448 bp::extract<bool> tmp(value);
1454 setBool(tmp, var, index);
1464 if (index < 0 && var->numValues_ > 0) {
1467 PyObject* obj = PyArray_SimpleNew(1, dims, NPY_BOOL);
1468 PyArrayObject* arr =
reinterpret_cast<PyArrayObject*
>(obj);
1469 bool* dst =
reinterpret_cast<bool*
>(PyArray_DATA(arr));
1471 for (x = 0; x < var->
numValues_; x++) dst[x] = getBool(var, x);
1473 boost::python::handle<> handle(obj);
1474 ret = bp::object(handle);
1477 bp::handle<> handle(bp::borrowed(getBool(var, index) ? Py_True : Py_False));
1478 ret = bp::object(handle);
1584void rim::Block::setFloatPy(bp::object& value,
rim::Variable* var, int32_t index) {
1587 if (index == -1) index = 0;
1590 if (PyArray_Check(value.ptr())) {
1592 PyArrayObject* arr =
reinterpret_cast<decltype(arr)
>(value.ptr());
1593 npy_intp ndims = PyArray_NDIM(arr);
1594 npy_intp* dims = PyArray_SHAPE(arr);
1595 npy_intp* strides = PyArray_STRIDES(arr);
1599 "Invalid number of dimensions (%" PRIu32
") for passed ndarray for %s",
1601 var->
name_.c_str()));
1605 "Overflow error for passed array with length %" PRIu32
1606 " at index %" PRIi32
". Variable length = %" PRIu32
" for %s",
1610 var->
name_.c_str()));
1612 if (PyArray_TYPE(arr) == NPY_FLOAT32) {
1613 float* src =
reinterpret_cast<float*
>(PyArray_DATA(arr));
1614 npy_intp stride = strides[0] /
sizeof(float);
1615 for (x = 0; x < dims[0]; x++) {
1616 setFloat(src[x * stride], var, index + x);
1620 "Passed nparray is not of type (float32) for %s",
1621 var->
name_.c_str()));
1625 }
else if (PyList_Check(value.ptr())) {
1626 bp::list vl = bp::extract<bp::list>(value);
1627 uint32_t vlen = len(vl);
1631 "Overflow error for passed array with length %" PRIu32
1632 " at index %" PRIi32
". Variable length = %" PRIu32
" for %s",
1636 var->
name_.c_str()));
1638 for (x = 0; x < vlen; x++) {
1639 bp::extract<float> tmp(vl[x]);
1643 "Failed to extract value for %s.",
1644 var->
name_.c_str()));
1646 setFloat(tmp, var, index + x);
1650 }
else if (PyArray_CheckScalar(value.ptr())) {
1651 if (PyArray_DescrFromScalar(value.ptr())->type_num == NPY_FLOAT32) {
1653 PyArray_ScalarAsCtype(value.ptr(), &val);
1654 setFloat(val, var, index);
1657 "Failed to extract value for %s.",
1658 var->
name_.c_str()));
1661 bp::extract<float> tmp(value);
1665 "Failed to extract value for %s.",
1666 var->
name_.c_str()));
1668 setFloat(tmp, var, index);
1678 if (index < 0 && var->numValues_ > 0) {
1681 PyObject* obj = PyArray_SimpleNew(1, dims, NPY_FLOAT32);
1682 PyArrayObject* arr =
reinterpret_cast<PyArrayObject*
>(obj);
1683 float* dst =
reinterpret_cast<float*
>(PyArray_DATA(arr));
1685 for (x = 0; x < var->
numValues_; x++) dst[x] = getFloat(var, x);
1687 boost::python::handle<> handle(obj);
1688 ret = bp::object(handle);
1691 PyObject* val = Py_BuildValue(
"f", getFloat(var, index));
1695 bp::handle<> handle(val);
1696 ret = bp::object(handle);
1733void rim::Block::setDoublePy(bp::object& value,
rim::Variable* var, int32_t index) {
1736 if (index == -1) index = 0;
1739 if (PyArray_Check(value.ptr())) {
1741 PyArrayObject* arr =
reinterpret_cast<decltype(arr)
>(value.ptr());
1742 npy_intp ndims = PyArray_NDIM(arr);
1743 npy_intp* dims = PyArray_SHAPE(arr);
1744 npy_intp* strides = PyArray_STRIDES(arr);
1748 "Invalid number of dimensions (%" PRIu32
") for passed ndarray for %s",
1750 var->
name_.c_str()));
1754 "Overflow error for passed array with length %" PRIu32
1755 " at index %" PRIi32
". Variable length = %" PRIu32
" for %s",
1759 var->
name_.c_str()));
1761 if (PyArray_TYPE(arr) == NPY_FLOAT64) {
1762 double* src =
reinterpret_cast<double*
>(PyArray_DATA(arr));
1763 npy_intp stride = strides[0] /
sizeof(double);
1764 for (x = 0; x < dims[0]; x++) {
1765 setDouble(src[x * stride], var, index + x);
1769 "Passed nparray is not of type (double) for %s",
1770 var->
name_.c_str()));
1774 }
else if (PyList_Check(value.ptr())) {
1775 bp::list vl = bp::extract<bp::list>(value);
1776 uint32_t vlen = len(vl);
1780 "Overflow error for passed array with length %" PRIu32
1781 " at index %" PRIi32
". Variable length = %" PRIu32
" for %s",
1785 var->
name_.c_str()));
1787 for (x = 0; x < vlen; x++) {
1788 bp::extract<double> tmp(vl[x]);
1792 "Failed to extract value for %s.",
1793 var->
name_.c_str()));
1795 setDouble(tmp, var, index + x);
1799 }
else if (PyArray_CheckScalar(value.ptr())) {
1800 if (PyArray_DescrFromScalar(value.ptr())->type_num == NPY_FLOAT64) {
1802 PyArray_ScalarAsCtype(value.ptr(), &val);
1803 setDouble(val, var, index);
1806 "Failed to extract value for %s.",
1807 var->
name_.c_str()));
1810 bp::extract<double> tmp(value);
1814 "Failed to extract value for %s.",
1815 var->
name_.c_str()));
1817 setDouble(tmp, var, index);
1827 if (index < 0 && var->numValues_ > 0) {
1830 PyObject* obj = PyArray_SimpleNew(1, dims, NPY_FLOAT64);
1831 PyArrayObject* arr =
reinterpret_cast<PyArrayObject*
>(obj);
1832 double* dst =
reinterpret_cast<double*
>(PyArray_DATA(arr));
1834 for (x = 0; x < var->
numValues_; x++) dst[x] = getDouble(var, x);
1836 boost::python::handle<> handle(obj);
1837 ret = bp::object(handle);
1840 PyObject* val = Py_BuildValue(
"d", getDouble(var, index));
1844 bp::handle<> handle(val);
1845 ret = bp::object(handle);
1882void rim::Block::setFixedPy(bp::object& value,
rim::Variable* var, int32_t index) {
1885 if (index == -1) index = 0;
1888 if (PyArray_Check(value.ptr())) {
1890 PyArrayObject* arr =
reinterpret_cast<decltype(arr)
>(value.ptr());
1891 npy_intp ndims = PyArray_NDIM(arr);
1892 npy_intp* dims = PyArray_SHAPE(arr);
1893 npy_intp* strides = PyArray_STRIDES(arr);
1897 "Invalid number of dimensions (%" PRIu32
") for passed ndarray for %s",
1899 var->
name_.c_str()));
1903 "Overflow error for passed array with length %" PRIu32
1904 " at index %" PRIi32
". Variable length = %" PRIu32
" for %s",
1908 var->
name_.c_str()));
1910 if (PyArray_TYPE(arr) == NPY_FLOAT64) {
1911 double* src =
reinterpret_cast<double*
>(PyArray_DATA(arr));
1912 npy_intp stride = strides[0] /
sizeof(double);
1913 for (x = 0; x < dims[0]; x++) {
1914 setFixed(src[x * stride], var, index + x);
1918 "Passed nparray is not of type (double) for %s",
1919 var->
name_.c_str()));
1923 }
else if (PyList_Check(value.ptr())) {
1924 bp::list vl = bp::extract<bp::list>(value);
1925 uint32_t vlen = len(vl);
1929 "Overflow error for passed array with length %" PRIu32
1930 " at index %" PRIi32
". Variable length = %" PRIu32
" for %s",
1934 var->
name_.c_str()));
1936 for (x = 0; x < vlen; x++) {
1937 bp::extract<double> tmp(vl[x]);
1941 "Failed to extract value for %s.",
1942 var->
name_.c_str()));
1944 setFixed(tmp, var, index + x);
1948 }
else if (PyArray_CheckScalar(value.ptr())) {
1949 if (PyArray_DescrFromScalar(value.ptr())->type_num == NPY_FLOAT64) {
1951 PyArray_ScalarAsCtype(value.ptr(), &val);
1952 setFixed(val, var, index);
1955 "Failed to extract value for %s.",
1956 var->
name_.c_str()));
1959 bp::extract<double> tmp(value);
1963 "Failed to extract value for %s.",
1964 var->
name_.c_str()));
1966 setFixed(tmp, var, index);
1976 if (index < 0 && var->numValues_ > 0) {
1979 PyObject* obj = PyArray_SimpleNew(1, dims, NPY_FLOAT64);
1980 PyArrayObject* arr =
reinterpret_cast<PyArrayObject*
>(obj);
1981 double* dst =
reinterpret_cast<double*
>(PyArray_DATA(arr));
1983 for (x = 0; x < var->
numValues_; x++) dst[x] = getFixed(var, x);
1985 boost::python::handle<> handle(obj);
1986 ret = bp::object(handle);
1989 PyObject* val = Py_BuildValue(
"d", getFixed(var, index));
1993 bp::handle<> handle(val);
1994 ret = bp::object(handle);
2049void rim::Block::rateTest() {
2052 struct timeval stime;
2053 struct timeval etime;
2054 struct timeval dtime;
2056 uint64_t count = 1000000;
2061 gettimeofday(&stime, NULL);
2063 for (x = 0; x < count; ++x) {
2064 reqTransaction(0, 4, &value,
rim::Read);
2067 gettimeofday(&etime, NULL);
2069 timersub(&etime, &stime, &dtime);
2070 durr = dtime.tv_sec +
static_cast<float>(dtime.tv_usec) / 1.0e6;
2071 rate = count / durr;
2073 printf(
"\nBlock c++ raw: Read %" PRIu64
" times in %f seconds. Rate = %f\n", count, durr, rate);
2075 gettimeofday(&stime, NULL);
2077 for (x = 0; x < count; ++x) {
2078 reqTransaction(0, 4,
reinterpret_cast<uint8_t*
>(&count),
rim::Write);
2081 gettimeofday(&etime, NULL);
2083 timersub(&etime, &stime, &dtime);
2084 durr = dtime.tv_sec +
static_cast<float>(dtime.tv_usec) / 1.0e6;
2085 rate = count / durr;
2087 printf(
"\nBlock c++ raw: Wrote %" PRIu64
" times in %f seconds. Rate = %f\n", count, durr, rate);