From 9067b05d48008e460eedb0ecd680f2faeb1553fe Mon Sep 17 00:00:00 2001 From: Kia <kia@special-circumstanc.es> Date: Sun, 3 May 2020 21:15:24 -0600 Subject: [PATCH] getting close to generating the proper serialized tree --- combinatorial_LR_parser.py | 45 ++++++++++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 11 deletions(-) diff --git a/combinatorial_LR_parser.py b/combinatorial_LR_parser.py index 5ac8ef2..3394106 100644 --- a/combinatorial_LR_parser.py +++ b/combinatorial_LR_parser.py @@ -558,8 +558,10 @@ class TreeSerializer(Elaboratable): def elaborate(self, platform): m = Module() - writepoint = Signal(self.mem_address_width) # where to write next - backpointer = Signal(self.mem_address_width) # pointer to the "number of children" field + start_of_record = Signal(self.mem_address_width) # start of next/yet-unwritten node record, advanced only + # after each reduce + + writepointer = Signal(self.mem_address_width) # current pointer for in-progress writes mem = Memory(width=(self.item_width + 1), depth=32) m.submodules.parse_tree = wport = mem.write_port() @@ -580,20 +582,33 @@ class TreeSerializer(Elaboratable): with m.FSM() as fsm: + + + with m.State("INITIALIZE"): + + m.d.comb += self.ready_out.eq(0) + + + m.d.sync += writepointer.eq(2) + m.d.sync += start_of_record.eq(0) + + m.next="NODE" + + + with m.State("NODE"): m.d.comb += self.ready_out.eq(1) #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) + m.d.sync += item_created_by_reduce_rule.eq(self.item_created_by_reduce_rule) with m.If(self.start_reduction == 1): m.d.comb += self.memory_write_port.eq(self.destroyed_item_in) - m.d.comb += self.memory_address_port.eq(writepoint) + m.d.comb += self.memory_address_port.eq(writepointer) m.d.comb += self.memory_write_enable.eq(1) m.d.sync += number_of_children.eq(self.number_to_pop) m.d.sync += number_remaining.eq(self.number_to_pop) - m.d.sync += backpointer.eq(writepoint + 1) - m.d.sync += writepoint.eq(writepoint + 2) + m.d.sync += writepointer.eq(writepointer + 1) m.next = "SUBNODES" @@ -601,19 +616,27 @@ class TreeSerializer(Elaboratable): m.d.comb += self.ready_out.eq(0) with m.If(self.destroyed_item_valid_in == 1): m.d.comb += self.memory_write_port.eq(self.destroyed_item_in) - m.d.comb += self.memory_address_port.eq(writepoint) + m.d.comb += self.memory_address_port.eq(writepointer) m.d.comb += self.memory_write_enable.eq(1) - m.d.sync += writepoint.eq(writepoint + 1) + m.d.sync += writepointer.eq(writepointer + 1) m.d.sync += number_remaining.eq(number_remaining - 1) - with m.If(number_remaining == 0): + with m.If(number_remaining == 1): + m.d.comb += self.memory_write_port.eq(item_created_by_reduce_rule) + m.d.comb += self.memory_address_port.eq(start_of_record) + + m.d.comb += self.memory_write_enable.eq(1) + + m.next = "FIXUP" + + with m.State("FIXUP"): m.d.comb += self.memory_write_port.eq(number_of_children) - m.d.comb += self.memory_address_port.eq(backpointer) + m.d.comb += self.memory_address_port.eq(start_of_record + 1) m.d.comb += self.memory_write_enable.eq(1) + m.d.sync += start_of_record.eq(writepointer + 1) - m.next = "NODE" return m -- GitLab