From 5c5286c74a3cbb9cd689337276967df67606d0ce Mon Sep 17 00:00:00 2001
From: Kia <kia@special-circumstanc.es>
Date: Thu, 30 Apr 2020 21:01:05 -0600
Subject: [PATCH] try simple pseudo-serializer

---
 combinatorial_LR_parser.py | 46 +++++++++++++++++++++++++++++++++-----
 1 file changed, 40 insertions(+), 6 deletions(-)

diff --git a/combinatorial_LR_parser.py b/combinatorial_LR_parser.py
index c72ff7a..3dc16d1 100644
--- a/combinatorial_LR_parser.py
+++ b/combinatorial_LR_parser.py
@@ -545,7 +545,7 @@ class TreeSerializer(Elaboratable):
         self.destroyed_item_index_in        = Signal(indices_width)  # off side stack
 
 
-        self.reduction_end               = Signal(1)
+        self.reduction_end                  = Signal(1)
         # outputs
 
         # output to state machine
@@ -561,24 +561,47 @@ class TreeSerializer(Elaboratable):
     def elaborate(self, platform):
         m = Module()
 
-        number_to_pop               = Signal(range(self.stack_depth))
-        reduce_rule_number          = Signal(self.item_width)
-        item_created_by_reduce_rule = Signal(self.item_width)
-
         writepoint                  = Signal(self.mem_address_width) # where to write next
-
         backpointer                 = Signal(self.mem_address_width) # pointer to the "number of children" field
 
 
+        # Per-reduce registered signals:
+        number_to_pop               = Signal(range(self.stack_depth))
+        reduce_rule_number          = Signal(self.item_width)
+        item_created_by_reduce_rule = Signal(self.item_width)
 
 
         with m.FSM() as fsm:
             with m.State("READY"):
                 m.d.comb += self.ready_out.eq(1)
+
+                m.d.sync += number_to_pop.eq(self.number_to_pop)
+                m.d.sync += reduce_rule_number.eq(self.reduce_rule_number)
+                m.d.sync += item_created_by_reduce_rule.eq(self.item_created_by_reduce_rule)
+
                 with m.If(self.reduce_start_strobe == 1):
+
+                    m.d.comb += self.memory_write_port.eq(self.item_created_by_reduce_rule)
+                    m.d.comb += self.memory_address_port.eq(writepoint)
+                    m.d.comb += self.memory_write_enable.eq(1)
+                    m.d.sync += backpointer.eq(writepoint + 1)
+                    m.d.sync += writepoint.eq(writepoint + 2)
                     m.next = "WRITING"
 
 
+            with m.State("WRITING"):
+                with m.If(self.destroyed_item_valid_in == 1):
+                    m.d.comb += self.ready_out.eq(0)
+                    m.d.comb += self.memory_write_port.eq(self.destroyed_item_in)
+                    m.d.comb += self.memory_address_port.eq(writepoint)
+                    m.d.sync += writepoint.eq(writepoint + 1)
+                with m.If(self.reduction_end == 1):
+                    m.d.comb += self.memory_write_port.eq(number_to_pop)
+                    m.d.comb += self.memory_address_port.eq(backpointer)
+                    m.next = "READY"
+
+
+        return m
 
 
 # This is the master state machine -- it interfaces with the outside
@@ -629,12 +652,14 @@ class MasterStateMachine(Elaboratable):
             reduction_rule_count=len(self.execute_rules), stack_state_descriptions = self.stack_state_descriptions, endofparse_marker = self.endofparse_marker)
         rex = RuleExecutor(item_width=self.item_width, stack_depth=self.stack_depth, execution_ruleset=self.execute_rules)
         skbuffer = RegisteredSkidBuffer(width = self.item_width)
+        serializer = TreeSerializer(item_width=self.item_width, indices_width=(self.indices_width+1), stack_depth=self.stack_depth, serializing_ruleset=[])
         #m.submodules.Stack = stack
         m.submodules.Stacks = doublestacks
         m.submodules.RuleMatcher = rule_matcher
         m.submodules.RuleExecute = rex
         m.submodules.skidbuffer = skbuffer
 
+        m.submodules.Serializer = serializer
         # Skid buffer
         fsm_ready = Signal(1)
         new_item_valid = Signal(1)
@@ -717,6 +742,13 @@ class MasterStateMachine(Elaboratable):
 
                         m.d.sync += number_to_pop.eq(rex.number_to_pop - 1)
                         m.d.sync += execution_result.eq(rex.created_item)
+
+
+                        m.d.comb += serializer.reduce_start_strobe.eq(1)
+                        m.d.comb += serializer.number_to_pop.eq(rex.number_to_pop)
+                        m.d.comb += serializer.item_created_by_reduce_rule.eq(rex.created_item)
+                        m.d.comb += serializer.reduce_rule_number.eq(rule_matcher.match_index_out)
+
                         with m.If(rex.number_to_pop != 0):
                             m.d.comb += doublestacks.command_in.eq(1)
                             m.d.comb += doublestacks.command_in_strobe.eq(1)
@@ -747,6 +779,8 @@ class MasterStateMachine(Elaboratable):
                     m.d.comb += doublestacks.big_push_port.eq(execution_result)
                     m.d.comb += doublestacks.side_push_port.eq(0xf0)
                     m.d.comb += doublestacks.command_in_strobe.eq(1)
+
+                    m.d.comb += serializer.reduction_end.eq(1)
 #                    m.d.comb += fsm_ready.eq(1)
                     m.next = "SHIFTREDUCE"
 
-- 
GitLab