use binary search for result
diff --git a/ODIN_II/SRC/include/simulator_bit_map.h b/ODIN_II/SRC/include/simulator_bit_map.h
index b58bd61..f1bff1a 100644
--- a/ODIN_II/SRC/include/simulator_bit_map.h
+++ b/ODIN_II/SRC/include/simulator_bit_map.h
@@ -7,16 +7,17 @@
typedef struct bit_tree_map_t bit_tree_map;
struct bit_tree_map_t
{
- bit_tree_map *childs[3];
- char my_value;
- int depth;
- int result_len;
- char *result;
- char *related_node_name;
- bool is_root;
+ bit_tree_map *branch[3];
bool is_leaf;
};
+typedef struct bit_tree_root_t
+{
+ bit_tree_map *branch[2];
+ int depth;
+ char *related_node_name;
+}bit_tree_root;
+
typedef enum
{
_0 = 0,
@@ -26,8 +27,8 @@
bit_map_values get_mapped_value(signed char value);
-bit_tree_map *free_bit_tree(bit_tree_map *bit_map);
-bit_tree_map *consume_bit_map_line(std::vector<std::string> lines, std::vector<std::string> results, const char *related_node_name);
-std::string find_result(bit_tree_map *bit_map, std::string line);
+bit_tree_root *free_bit_tree(bit_tree_root *bit_map);
+bit_tree_root *consume_bit_map_line(std::vector<std::string> lines, std::vector<char> results, const char *related_node_name);
+char find_result(bit_tree_root *bit_map, std::string line);
#endif
\ No newline at end of file
diff --git a/ODIN_II/SRC/include/types.h b/ODIN_II/SRC/include/types.h
index 720633b..aec542b 100644
--- a/ODIN_II/SRC/include/types.h
+++ b/ODIN_II/SRC/include/types.h
@@ -490,7 +490,7 @@
short *associated_function;
- bit_tree_map *bit_map; /*storing the bit map */
+ bit_tree_root *bit_map; /*storing the bit map */
std::vector<std::string> orig_bit_map;
// For simulation
diff --git a/ODIN_II/SRC/read_blif.cpp b/ODIN_II/SRC/read_blif.cpp
index 4415970..32fd31c 100644
--- a/ODIN_II/SRC/read_blif.cpp
+++ b/ODIN_II/SRC/read_blif.cpp
@@ -295,7 +295,7 @@
}
/* assigning the new_node */
- if(input_token_count != 5)
+ if(input_token_count == 5)
{
/* supported added for the ABC .latch output without control */
if(input_token_count == 3)
@@ -743,7 +743,7 @@
}
std::vector<std::string> bit_map;
- std::vector<std::string> output_bit_map;
+ std::vector<char> output_bit_map;
char buffer[READ_BLIF_BUFFER];
while(1)
{
@@ -752,16 +752,14 @@
break;
bit_map.push_back(vtr::strtok(buffer,TOKENS, file, buffer));
- output_bit_map.push_back(vtr::strtok(NULL,TOKENS, file, buffer));
+ char *tmp = vtr::strtok(NULL,TOKENS, file, buffer);
+ output_bit_map.push_back(tmp[0]);
}
file_line_number = last_line;
fsetpos(file,&pos);
node->orig_bit_map = bit_map;
-
- bit_tree_map *root = consume_bit_map_line(bit_map, output_bit_map, parent_node_name);
-
- node->bit_map = root;
+ node->bit_map = consume_bit_map_line(bit_map, output_bit_map, parent_node_name);
return GENERIC;
}
diff --git a/ODIN_II/SRC/simulate_blif.cpp b/ODIN_II/SRC/simulate_blif.cpp
index ddf4446..921e664 100644
--- a/ODIN_II/SRC/simulate_blif.cpp
+++ b/ODIN_II/SRC/simulate_blif.cpp
@@ -1813,21 +1813,9 @@
std::string input_bit_string = "";
for(int i =0; i < node->num_input_pins; i++)
input_bit_string.push_back(convert_result_to_chr(get_pin_value(node->input_pins[i],cycle)));
-
- if(node->num_input_pins != node->bit_map->depth)
- {
- error_message(SIMULATION_ERROR, -1, -1, "input length miss-match: (pin_len<%d> != bit_map_depth<%d>) current input<%s>"
- ,node->num_input_pins ,node->bit_map->depth, input_bit_string.c_str());
- }
- else if(node->num_output_pins != node->bit_map->result_len)
- {
- error_message(SIMULATION_ERROR, -1, -1, "output length miss-match: (pin_len<%d> != bit_map_depth<%d>) current input<%s>"
- ,node->num_output_pins ,node->bit_map->result_len, input_bit_string.c_str());
- }
- std::string result = find_result(node->bit_map, input_bit_string);
- for(int i =0; i < node->num_output_pins; i++)
- update_pin_value(node->output_pins[0], convert_result(result[i]), cycle);
+ char result = find_result(node->bit_map, input_bit_string);
+ update_pin_value(node->output_pins[0], convert_result(result), cycle);
}
/*
diff --git a/ODIN_II/SRC/simulator_bit_map.cpp b/ODIN_II/SRC/simulator_bit_map.cpp
index 9d66d5c..174e41a 100644
--- a/ODIN_II/SRC/simulator_bit_map.cpp
+++ b/ODIN_II/SRC/simulator_bit_map.cpp
@@ -14,141 +14,152 @@
return _x;
}
-inline static bit_tree_map *bit_map_node(const char *related_node_name, char value, int depth, int result_len)
+inline static bit_tree_map *bit_map_node()
{
bit_tree_map *node = (bit_tree_map *)vtr::malloc(sizeof(bit_tree_map));
for(int i=0; i<3; i++)
- {
- node->childs[i] = NULL;
- }
- node->my_value = value;
- node->depth = depth;
- node->related_node_name = vtr::strdup(related_node_name);
- node->result_len = result_len;
+ node->branch[i] = NULL;
+
return node;
}
-bit_tree_map *free_bit_tree(bit_tree_map *bit_map)
+inline static bit_tree_root *bit_map_root(const char *related_node_name, int depth)
{
- if(!bit_map)
- return NULL;
-
- if(bit_map->is_leaf)
- {
- vtr::free(bit_map->related_node_name);
- vtr::free(bit_map);
- return NULL;
- }
- else
- {
- bit_map->childs[_0] = free_bit_tree(bit_map->childs[_0]);
- bit_map->childs[_1] = free_bit_tree(bit_map->childs[_1]);
- bit_map->childs[_x] = free_bit_tree(bit_map->childs[_x]);
- vtr::free(bit_map);
- return NULL;
- }
+ bit_tree_root *root = (bit_tree_root *)vtr::malloc(sizeof(bit_tree_root));
+ root->depth = depth;
+ root->related_node_name = vtr::strdup(related_node_name);
+ root->branch[_0] = bit_map_node();
+ root->branch[_1] = bit_map_node();
+ return root;
}
-bit_tree_map *consume_bit_map_line(std::vector<std::string> lines, std::vector<std::string> results, const char *related_node_name)
+inline static bit_tree_map *free_bit_branches(bit_tree_map *bit_map)
+{
+ if(bit_map)
+ {
+ if(!bit_map->is_leaf)
+ {
+ bit_map->branch[_0] = free_bit_branches(bit_map->branch[_0]);
+ bit_map->branch[_1] = free_bit_branches(bit_map->branch[_1]);
+ bit_map->branch[_x] = free_bit_branches(bit_map->branch[_x]);
+ }
+ vtr::free(bit_map);
+ }
+ return NULL;
+}
+
+bit_tree_root *free_bit_tree(bit_tree_root *bit_map)
+{
+ if(bit_map)
+ {
+ vtr::free(bit_map->related_node_name);
+ bit_map->branch[_0] = free_bit_branches(bit_map->branch[_0]);
+ bit_map->branch[_1] = free_bit_branches(bit_map->branch[_1]);
+ vtr::free(bit_map);
+ }
+ return NULL;
+}
+
+
+bit_tree_root *consume_bit_map_line(std::vector<std::string> lines, std::vector<char> results, const char *related_node_name)
{
if(lines.empty() || results.empty())
return NULL;
- bit_tree_map *root = bit_map_node(related_node_name, 0, lines[0].size(), results[0].size());
- root->is_root = true;
+ bit_tree_root *root = bit_map_root(related_node_name, lines[0].size());
for(int i=0; i < lines.size(); i++)
{
- bit_tree_map *cur_node = root;
+ bit_map_values cur_trunk = get_mapped_value(results[i]);
+ bit_tree_map *cur_node = root->branch[cur_trunk];
+
if(lines[i].size() != lines[0].size())
error_message(SIMULATION_ERROR, -1, -1, "mismatched length in input lut @ line %d for node <%s>",i,root->related_node_name);
- if(results[i].size() != results[0].size())
- error_message(SIMULATION_ERROR, -1, -1, "mismatched length in input lut @ line %d for node <%s>",i,root->related_node_name);
-
- for(int j=1; j <= lines[i].size(); j++)
+ for(int j=0; j < lines[i].size(); j++)
{
- char input_value = lines[i][j-1];
- bit_map_values cur_value = get_mapped_value(input_value);
+ bit_map_values cur_value = get_mapped_value(lines[i][j]);
- if(!cur_node->childs[cur_value])
- cur_node->childs[cur_value] = bit_map_node(root->related_node_name, input_value, lines[i].size(), results[i].size());
+ if(!cur_node->branch[cur_value])
+ cur_node->branch[cur_value] = bit_map_node();
- /* this holds the result */
- if(j == lines[i].size())
- {
- cur_node->result = vtr::strdup(results[i].c_str());
+ if(j+1 == lines[i].size())
cur_node->is_leaf = true;
- }
+
}
}
return root;
}
-std::string find_result(bit_tree_map *root, std::string line)
+static signed char explore_trunk(bit_tree_map *trunk, char result, const std::string& line, char set_to)
{
- if(!root)
- error_message(SIMULATION_ERROR, -1, -1, "root bit_map is empty");
-
- if(line == "")
- return "";
-
- std::vector<bit_tree_map*> Q = {root};
+ int end = line.size()-1;
+ bool error = false;
+ std::vector<bit_tree_map*> Q = {trunk};
std::vector<bit_tree_map*> new_Q;
-
- std::string result = "";
-
- for(int j=0; j < line.size(); j++)
+ for(int j=0; j <= end && !Q.empty() && !error; j++)
{
- if(Q.empty())
- break;
-
- char input_value = line[j];
- bit_map_values cur_value = get_mapped_value(input_value);
-
- for(int i=0; i < Q.size(); i++)
+ bit_map_values cur_value = get_mapped_value(line[j]);
+ for(int i=0; i < Q.size() && !error; i++)
{
bit_tree_map *bit_map = Q[i];
-
- if(!bit_map->is_leaf && j == line.size()-1)
- error_message(SIMULATION_ERROR, -1, -1, "input missmatch: bit map length != input length ");
-
- if(!bit_map->is_root)
- printf("######## exploring node #%d @%d for node:%s with input: %s @input id:%d\n", i, bit_map->depth, bit_map->related_node_name, line.c_str(), j);
-
- /* this node holds the result */
if(bit_map->is_leaf)
{
- if(result == "")
- result = bit_map->result;
+ if(result)
+ {
+ error = true;
+ result = '!';
+ }
else
{
- warning_message(SIMULATION_ERROR, -1, -1, "ambiguous bit map for .name <%s> with multiple result for pattern", bit_map->related_node_name);
- break;
+ result = set_to;
}
}
else
{
- if(bit_map->childs[cur_value])
- new_Q.push_back(bit_map->childs[cur_value]);
+ if(bit_map->branch[cur_value])
+ new_Q.push_back(bit_map->branch[cur_value]);
//include unknown in defined search
- if(cur_value != _x && bit_map->childs[_x])
- new_Q.push_back(bit_map->childs[_x]);
-
+ if(cur_value != _x && bit_map->branch[_x])
+ new_Q.push_back(bit_map->branch[_x]);
}
}
Q.clear();
Q = new_Q;
new_Q.clear();
-
}
+ return result;
+}
- if(result == "")
+char find_result(bit_tree_root *root, std::string line)
+{
+ if(!root)
+ error_message(SIMULATION_ERROR, -1, -1, "root bit_map is empty");
+
+ if(line == "")
+ return 3;
+
+ char result = 0;
+
+
+ if(root->depth > line.size())
+ error_message(SIMULATION_ERROR, -1, -1, "input missmatch: bit map length > input length ");
+ else if(root->depth < line.size())
+ error_message(SIMULATION_ERROR, -1, -1, "input missmatch: bit map length < input length ");
+
+ result = explore_trunk(root->branch[_0], result, line, '0');
+ result = explore_trunk(root->branch[_1], result, line, '1');
+ if(result == '!')
{
- warning_message(SIMULATION_ERROR, -1, -1, "missmatch between input and lut depth");
- result = "x";
+ warning_message(SIMULATION_ERROR, -1, -1, "ambiguous bit map for .name <%s> with multiple, or no result for pattern", root->related_node_name);
+ result = 'x';
}
+ else if(!result)
+ {
+ result = 'x';
+ }
+
return result;
}
\ No newline at end of file
diff --git a/ODIN_II/regression_test/benchmark/syntax/bm_simple_memory.v b/ODIN_II/regression_test/benchmark/syntax/bm_simple_memory.v
index d9e790f..fb7c6af 100644
--- a/ODIN_II/regression_test/benchmark/syntax/bm_simple_memory.v
+++ b/ODIN_II/regression_test/benchmark/syntax/bm_simple_memory.v
@@ -6,7 +6,6 @@
clock,
reset,
addr_in,
- addr_out,
value_out,
value_in
);
@@ -16,7 +15,6 @@
input reset;
input [`WORD_SIZE-1:0] value_in;
input [`BITS-1:0] addr_in;
-input [`BITS-1:0] addr_out;
output [`WORD_SIZE-1:0] value_out;
@@ -25,7 +23,7 @@
always @(posedge clock)
begin
memory[addr_in] = value_in;
- value_out = memory[addr_out];
+ value_out = memory[0];
end