fix the atomic buffer
diff --git a/ODIN_II/SRC/include/AtomicBuffer.hpp b/ODIN_II/SRC/include/AtomicBuffer.hpp
index 9c42c62..5692e1d 100644
--- a/ODIN_II/SRC/include/AtomicBuffer.hpp
+++ b/ODIN_II/SRC/include/AtomicBuffer.hpp
@@ -3,31 +3,64 @@
#include <atomic>
#include <thread>
+
/**
* Odin use -1 internally, so we need to go back on forth
* TODO: change the default odin value to match both the Blif value and this buffer
*/
typedef signed char data_t;
-#define BUFFER_SIZE 12 //use something divisible by 4 since the compact buffer can contain 4 value
+#define BUFFER_SIZE 4 //use something divisible by 4 since the compact buffer can contain 4 value
#define CONCURENCY_LIMIT (BUFFER_SIZE-1) // access to cycle -1 with an extra pdding cell
-
-typedef struct
-{
- uint8_t i0:2;
- uint8_t i1:2;
- uint8_t i2:2;
- uint8_t i3:2;
-}BitFields;
-
class AtomicBuffer
{
private:
- BitFields bits[BUFFER_SIZE/4];
+ struct BitFields
+ {
+ uint8_t i0:2;
+ uint8_t i1:2;
+ uint8_t i2:2;
+ uint8_t i3:2;
+ } bits[BUFFER_SIZE/4];
+
std::atomic<bool> lock;
int32_t cycle;
-
+
+ uint8_t to_val(data_t val_in)
+ {
+ return (val_in == 0)? 0: (val_in == 1)? 1 : 2;
+ }
+
+ template<typename T>
+ data_t val(T val_in)
+ {
+ switch(val_in)
+ {
+ case 0: //fallthrough
+ case '0': return 0;
+
+ case 1: //fallthrough
+ case '1': return 1;
+
+ default: return -1;
+ }
+ }
+
+ template<typename T>
+ char val_c(T val_in)
+ {
+ switch(val_in)
+ {
+ case 0: //fallthrough
+ case '0': return '0';
+
+ case 1: //fallthrough
+ case '1': return '1';
+
+ default: return 'x';
+ }
+ }
void lock_it()
{
@@ -43,32 +76,25 @@
lock.exchange(false, std::memory_order_relaxed);
std::atomic_thread_fence(std::memory_order_relaxed);
}
-
- ///////////////////////////
- // 2 bits are used per value
- data_t val(uint8_t val_in)
+
+ uint8_t get_bits(int64_t index)
{
- return ((val_in != 0 && val_in != 1)? -1 : val_in);
- }
-
- uint8_t get_bits(uint8_t index)
- {
- uint8_t modindex = index%(BUFFER_SIZE);
+ uint8_t modindex = (uint8_t)(index%(BUFFER_SIZE));
uint8_t address = modindex/4;
uint8_t bit_index = modindex%4;
switch(bit_index)
{
- case 0: return (this->bits[address].i0);
- case 1: return (this->bits[address].i1);
- case 2: return (this->bits[address].i2);
- case 3: return (this->bits[address].i3);
- default: return 0x3;
+ case 0: return (uint8_t)(this->bits[address].i0);
+ case 1: return (uint8_t)(this->bits[address].i1);
+ case 2: return (uint8_t)(this->bits[address].i2);
+ case 3: return (uint8_t)(this->bits[address].i3);
+ default: return (uint8_t)0x3;
}
}
- void set_bits(uint8_t index, uint8_t value)
+ void set_bits(int64_t index, uint8_t value)
{
- uint8_t modindex = index%(BUFFER_SIZE);
+ uint8_t modindex = (uint8_t)(index%(BUFFER_SIZE));
uint8_t address = modindex/4;
uint8_t bit_index = modindex%4;
@@ -76,10 +102,10 @@
switch(bit_index)
{
- case 0: this->bits[address].i0 = value; break;
- case 1: this->bits[address].i1 = value; break;
- case 2: this->bits[address].i2 = value; break;
- case 3: this->bits[address].i3 = value; break;
+ case 0: this->bits[address].i0 = (uint8_t)(value&0x3); break;
+ case 1: this->bits[address].i1 = (uint8_t)(value&0x3); break;
+ case 2: this->bits[address].i2 = (uint8_t)(value&0x3); break;
+ case 3: this->bits[address].i3 = (uint8_t)(value&0x3); break;
default: break;
}
}
@@ -95,10 +121,8 @@
void print()
{
for(int i=0; i<BUFFER_SIZE; i++)
- {
- uint8_t value = get_bits( i);
- printf("%s",(value == 0)? "0": (value == 1)? "1": "x");
- }
+ printf("%c",val_c(get_bits(i)));
+
printf("\n");
}
@@ -106,18 +130,18 @@
{
this->lock = false;
for(int i=0; i<BUFFER_SIZE; i++)
- set_bits( i, value);
+ set_bits( i, to_val(value));
}
- int32_t lock_free_get_cycle()
+ int64_t lock_free_get_cycle()
{
- return this->cycle;
+ return (int64_t)this->cycle;
}
void lock_free_update_cycle( int64_t cycle_in)
{
//if (cycle_in > this->cycle)
- this->cycle = cycle_in;
+ this->cycle = (int32_t)cycle_in;
}
data_t lock_free_get_value( int64_t cycle_in)
@@ -129,21 +153,24 @@
{
if (cycle_in > this->cycle)
{
- set_bits( cycle_in,value_in);
+ set_bits( cycle_in, to_val(value_in) );
lock_free_update_cycle( cycle_in);
}
}
void lock_free_copy_foward_one_cycle( int64_t cycle_in)
{
- set_bits( cycle_in+1,get_bits(cycle_in));
- lock_free_update_cycle( cycle_in);
+ if (cycle_in > this->cycle)
+ {
+ set_bits( cycle_in+1, get_bits(cycle_in) );
+ lock_free_update_cycle( cycle_in );
+ }
}
- int32_t get_cycle()
+ int64_t get_cycle()
{
lock_it();
- int32_t value = lock_free_get_cycle();
+ int64_t value = lock_free_get_cycle();
unlock_it();
return value;
}