diff --git a/python_arborist.py b/python_arborist.py index 79e4ac168436d28777d59e0bd137e2676e3098b7..41dea0709a71d1fa6f8f6513ab93138bece8fcaa 100644 --- a/python_arborist.py +++ b/python_arborist.py @@ -307,6 +307,65 @@ def run_the_sim(): for x in trace: print(x) +top_bit = (1<<16) + + +def deserializer(serialized_array, last_idx_written): + random_triggered = False + list_of_nodes = [] + physical_to_logical = {} + physical_idx = 0 + logical_idx = 0 + while (physical_idx < last_idx_written + 1): + new_element = serialized_array[physical_idx] + print("The element at the current index", physical_idx, "is:", hex(new_element)) + number_subnodes = serialized_array[physical_idx + 1] + print(" WITH", number_subnodes, "SUBNODES") + if (number_subnodes < 1): + print("") + print("MALFORMED AT IDX", physical_idx) + print("TOTAL LEN OF ARRAY IS", len(serialized_array)) + break + + subnodes_array = [] + for sub_idx in range(physical_idx + 2, physical_idx + 2 + number_subnodes): + if (serialized_array[sub_idx] & top_bit != 0): # index reference + backreference_physical_index = serialized_array[sub_idx] - top_bit + backreference_logical_index = physical_to_logical[backreference_physical_index] + print(" BACKREFERENCE PHYS INDEX IS", backreference_physical_index) + print(" BACKREFERENCE LOGICAL INDEX IS", backreference_logical_index) + #this_subnode = list_of_nodes[serialized_array] + subnodes_array.append(list_of_nodes[backreference_logical_index]) + else: # new subnode altogether + print(" ABINITIO SUBNODE IS", serialized_array[sub_idx]) + subnodes_array.append(TreeNode(serialized_array[sub_idx],[])) + + + print(" AND THESE SUBNODES ARE:") + for idx,x in enumerate(subnodes_array): + print(" SUBNODE NUMBER",idx) + walk_the_tree(x, level=3) + print("") + print("") + + if (random.randint(0,10) == 0): + false_element = random.choices(list_of_nonterminals + list_of_terminals)[0] + + if (false_element != new_element): + print("RANDOM TRIGGERED! EXPECT FALSE RESULT!", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") + random_triggered = True + new_element = false_element + + new_node = TreeNode(new_element, subnodes_array) + + list_of_nodes.append(new_node) + + physical_to_logical[physical_idx] = logical_idx + physical_idx += 2 + number_subnodes + logical_idx += 1 + print("physical to logical mapping is", physical_to_logical) + return (new_node, random_triggered) + tokens ={ "BOTTOM": 0x5a00, @@ -377,64 +436,6 @@ print("DESER TREE FINAL is " '[{}]'.format(', '.join(hex(x) for x in serialized_ -top_bit = (1<<16) - - -def deserializer(serialized_array, last_idx_written): - random_triggered = False - list_of_nodes = [] - physical_to_logical = {} - physical_idx = 0 - logical_idx = 0 - while (physical_idx < last_idx_written + 1): - new_element = serialized_array[physical_idx] - print("The element at the current index", physical_idx, "is:", hex(new_element)) - number_subnodes = serialized_array[physical_idx + 1] - print(" WITH", number_subnodes, "SUBNODES") - if (number_subnodes < 1): - print("") - print("MALFORMED AT IDX", physical_idx) - print("TOTAL LEN OF ARRAY IS", len(serialized_array)) - break - - subnodes_array = [] - for sub_idx in range(physical_idx + 2, physical_idx + 2 + number_subnodes): - if (serialized_array[sub_idx] & top_bit != 0): # index reference - backreference_physical_index = serialized_array[sub_idx] - top_bit - backreference_logical_index = physical_to_logical[backreference_physical_index] - print(" BACKREFERENCE PHYS INDEX IS", backreference_physical_index) - print(" BACKREFERENCE LOGICAL INDEX IS", backreference_logical_index) - #this_subnode = list_of_nodes[serialized_array] - subnodes_array.append(list_of_nodes[backreference_logical_index]) - else: # new subnode altogether - print(" ABINITIO SUBNODE IS", serialized_array[sub_idx]) - subnodes_array.append(TreeNode(serialized_array[sub_idx],[])) - - - print(" AND THESE SUBNODES ARE:") - for idx,x in enumerate(subnodes_array): - print(" SUBNODE NUMBER",idx) - walk_the_tree(x, level=3) - print("") - print("") - - if (random.randint(0,10) == 0): - false_element = random.choices(list_of_nonterminals + list_of_terminals)[0] - - if (false_element != new_element): - print("RANDOM TRIGGERED! EXPECT FALSE RESULT!", "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") - random_triggered = True - new_element = false_element - - new_node = TreeNode(new_element, subnodes_array) - - list_of_nodes.append(new_node) - - physical_to_logical[physical_idx] = logical_idx - physical_idx += 2 + number_subnodes - logical_idx += 1 - print("physical to logical mapping is", physical_to_logical) - return (new_node, random_triggered)