Merge pull request #1252 from chungshien/openfpga-issues-1248

Issue 1248 - fix bug bintoi_charvec()
This commit is contained in:
tangxifan 2023-07-19 19:40:43 -07:00 committed by GitHub
commit 7607ad69b1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 31 additions and 4 deletions

View File

@ -2,10 +2,10 @@
* This file includes functions that are used to decode integer to binary * This file includes functions that are used to decode integer to binary
*vectors or the reverse operation *vectors or the reverse operation
***************************************************************************************/ ***************************************************************************************/
#include <cmath>
/* Headers from vtrutil library */ /* Headers from vtrutil library */
#include "openfpga_decode.h" #include "openfpga_decode.h"
#include "vtr_assert.h" #include "vtr_assert.h"
/* begin namespace openfpga */ /* begin namespace openfpga */
@ -109,12 +109,28 @@ std::string combine_two_1hot_str(const std::string& code1,
* Output: * Output:
* index | 0 | 1 | 2 * index | 0 | 1 | 2
* ret | 0 | 0 | 1 * ret | 0 | 0 | 1
*
* ToDo: Need to revisit and change all the feature that call to this function
* Had studied the code, should be safe to make the change
* Apparently we only want to store 0 or 1 (binary vector)
* Yet we store it in a vector on size_t (8 Bytes)
* We are using 8x memory that we supposed to
* uint8_t is good enough
* Not a bug, but is a serious unoptimized issue
********************************************************************/ ********************************************************************/
std::vector<size_t> itobin_vec(const size_t& in_int, const size_t& bin_len) { std::vector<size_t> itobin_vec(const size_t& in_int, const size_t& bin_len) {
/* bin_len must be in valid range*/
VTR_ASSERT(bin_len > 0 && bin_len <= 64);
std::vector<size_t> ret(bin_len, 0); std::vector<size_t> ret(bin_len, 0);
/* Make sure we do not have any overflow! */ /* Make sure we do not have any overflow! */
VTR_ASSERT((in_int < pow(2., bin_len))); /* If the length is 64 bits, in_int can be any number since this is the max
bit length, and BTW pow(2, 64) itself should be zero (from 64bits size_t
perspective). Once we fix the bintoi_charvec() bug, without this change, it
will cause assertion */
if (bin_len < 64) {
VTR_ASSERT(in_int < (size_t(1) << bin_len));
}
size_t temp = in_int; size_t temp = in_int;
for (size_t i = 0; i < bin_len; i++) { for (size_t i = 0; i < bin_len; i++) {
@ -140,10 +156,18 @@ std::vector<size_t> itobin_vec(const size_t& in_int, const size_t& bin_len) {
* which has a smaller memory footprint than size_t * which has a smaller memory footprint than size_t
********************************************************************/ ********************************************************************/
std::vector<char> itobin_charvec(const size_t& in_int, const size_t& bin_len) { std::vector<char> itobin_charvec(const size_t& in_int, const size_t& bin_len) {
/* bin_len must be in valid range*/
VTR_ASSERT(bin_len > 0 && bin_len <= 64);
std::vector<char> ret(bin_len, '0'); std::vector<char> ret(bin_len, '0');
/* Make sure we do not have any overflow! */ /* Make sure we do not have any overflow! */
VTR_ASSERT((in_int < pow(2., bin_len))); /* If the length is 64 bits, in_int can be any number since this is the max
bit length, and BTW pow(2, 64) itself should be zero (from 64bits size_t
perspective). Once we fix the bintoi_charvec() bug, without this change, it
will cause assertion */
if (bin_len < 64) {
VTR_ASSERT(in_int < (size_t(1) << bin_len));
}
size_t temp = in_int; size_t temp = in_int;
for (size_t i = 0; i < bin_len; i++) { for (size_t i = 0; i < bin_len; i++) {
@ -170,11 +194,14 @@ std::vector<char> itobin_charvec(const size_t& in_int, const size_t& bin_len) {
* which has a smaller memory footprint than size_t * which has a smaller memory footprint than size_t
********************************************************************/ ********************************************************************/
size_t bintoi_charvec(const std::vector<char>& bin) { size_t bintoi_charvec(const std::vector<char>& bin) {
/* bin.size() must be in valid range*/
VTR_ASSERT(bin.size() > 0 && bin.size() <= 64);
size_t ret = 0; size_t ret = 0;
for (size_t i = 0; i < bin.size(); ++i) { for (size_t i = 0; i < bin.size(); ++i) {
if ('1' == bin[i]) { if ('1' == bin[i]) {
ret += pow(2., i); ret |= ((size_t)(1) << i);
} }
} }