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