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