From 4b1ee7b5f5da9965b39504ba9924b1220f0e1759 Mon Sep 17 00:00:00 2001 From: Kia <kia@special-circumstanc.es> Date: Mon, 24 Aug 2020 19:32:23 -0600 Subject: [PATCH] write out the last index of the serialization memory and pass it to the tree deserializer (which uses it in a slightly buggy way, which we should fix) --- combinatorial_LR_parser.py | 6 ++++-- python_arborist.py | 25 ++++++++++++++++++------- 2 files changed, 22 insertions(+), 9 deletions(-) diff --git a/combinatorial_LR_parser.py b/combinatorial_LR_parser.py index efcb057..1db5669 100644 --- a/combinatorial_LR_parser.py +++ b/combinatorial_LR_parser.py @@ -719,10 +719,13 @@ class MasterStateMachine(Elaboratable): self.parse_complete_out = Signal(1) self.parse_success_out = Signal(1) self.internal_fault = Signal(1) + self.last_index_to_smem = Signal(32) self.serializer = TreeSerializer(item_width=self.item_width, indices_width=(self.indices_width+1), stack_depth=self.stack_depth, serialized_tree_length=serialized_tree_length, serializing_ruleset=[]) self.tapir = self.serializer.mem + + def elaborate(self, platform): m = Module() #stack = InspectableStack(item_width=self.item_width, stack_depth=self.stack_depth) @@ -782,8 +785,6 @@ class MasterStateMachine(Elaboratable): # match_index_out (one hot) - - # LR parser state machine with m.FSM() as fsm: @@ -862,6 +863,7 @@ class MasterStateMachine(Elaboratable): m.d.comb += self.internal_fault.eq(1) m.d.comb += self.parse_success_out.eq(1) m.d.comb += self.parse_complete_out.eq(1) + m.d.sync += self.last_index_to_smem.eq(serializer.serialized_index) with m.If(doublestacks.internal_fault | serializer.internal_fault == 1): m.next="ABORT" diff --git a/python_arborist.py b/python_arborist.py index a1ed179..de93c37 100644 --- a/python_arborist.py +++ b/python_arborist.py @@ -235,6 +235,7 @@ class Cirno(Elaboratable): self.tapir = msm.tapir self.finalized = msm.parse_complete_out + self.numwritten = msm.last_index_to_smem with m.If(resetted == 0): m.d.sync += resetted.eq(1) @@ -269,6 +270,8 @@ def run_the_sim(parse_me): m = Module() m.submodules.baka = nine = Cirno() trace = [] + numwritten = [] + def process(): while True: @@ -286,10 +289,14 @@ def run_the_sim(parse_me): array.append(x) trace.append(array) else: + yield + yield + xz = yield nine.numwritten + numwritten.append(xz) + print("NUM WRITTEN INSIDE", numwritten) break - with m.Switch(nine.input_memory_addr): for addr,data in enumerate(parse_me): with m.Case(addr): @@ -307,7 +314,9 @@ def run_the_sim(parse_me): for x in trace: print(x) - return trace + print("XXXXXXXXXXXXXXXXXXXXX", numwritten) + + return (trace, numwritten) top_bit = (1<<16) @@ -356,7 +365,7 @@ def deserializer(serialized_array, last_idx_written): if (false_element != new_element): print("RANDOM TRIGGERED! EXPECT FALSE RESULT!") random_triggered = True - if(random.randint(0,100) == 0): + if(random.randint(0,1000) == 0): print("RANDOM TRIGGERED BUT NOT REPORTED! AHAHAHA XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX") random_triggered = False new_element = false_element @@ -444,19 +453,21 @@ z = CFGBoltzmann.CFGBoltzmann(rules, list_of_nonterminals, list_of_terminals) cooked_rules = z.preprocessor() def do_an_iteration(): - bgen = z.Gzero_shimmed(EXPRESSION, 5) + bgen = z.Gzero_shimmed(EXPRESSION, 19) parse_me = bgen[0] parse_me.append(ENDOFPARSE) - trace = run_the_sim(parse_me) + (trace, numwritten) = run_the_sim(parse_me) + numwritten = numwritten[0] - 1 + print("NUM WRITTEN = ",numwritten) serialized_tree_final = trace[-1] print() print("DESER TREE FINAL is " '[{}]'.format(', '.join(hex(x) for x in serialized_tree_final))) - (parser_output_tree, random_trig) = deserializer(serialized_tree_final, 30) + (parser_output_tree, random_trig) = deserializer(serialized_tree_final, numwritten) walk_the_tree(parser_output_tree,0) @@ -476,6 +487,6 @@ def do_an_iteration(): exit(1) -for x in range(1024): +for x in range(1): do_an_iteration() -- GitLab