diff --git a/combinatorial_LR_parser.py b/combinatorial_LR_parser.py index c3dac47f4e79e97159a85a3a7c07ff4b484a86a2..2db84209e671973596658e9076dcede5808e5487 100644 --- a/combinatorial_LR_parser.py +++ b/combinatorial_LR_parser.py @@ -70,7 +70,7 @@ class StacksInSync(Elaboratable): self.occupancy_bitmap = Signal(self.depth) - self.fault = Signal(1) + self.internal_fault = Signal(1) # read-only access to the top K entries, connected to the @@ -111,7 +111,7 @@ class StacksInSync(Elaboratable): m.d.comb += self.occupancy_bitmap.eq(bigstack.occupancy_bitmap) - m.d.comb += self.fault.eq(bigstack.fault | sidestack.fault) + m.d.comb += self.internal_fault.eq(bigstack.fault | sidestack.fault) return m @@ -544,6 +544,7 @@ class TreeSerializer(Elaboratable): self.serialized_tree_length = serialized_tree_length self.mem_address_width = indices_width self.serializing_ruleset = serializing_ruleset + self.serialized_tree_length = serialized_tree_length # inputs @@ -563,6 +564,7 @@ class TreeSerializer(Elaboratable): # outputs # output to state machine self.ready_out = Signal(1) + self.internal_fault = Signal(1) self.serialized_index = Signal(indices_width) # push *this* onto side stack for the # newly created item @@ -571,6 +573,7 @@ class TreeSerializer(Elaboratable): self.memory_address_port = Signal(self.mem_address_width) self.memory_write_enable = Signal(1) + self.mem = Memory(width=(self.item_width + 1), depth=serialized_tree_length) def elaborate(self, platform): @@ -600,12 +603,9 @@ class TreeSerializer(Elaboratable): with m.FSM() as fsm: - - with m.State("INITIALIZE"): - m.d.comb += self.ready_out.eq(0) - + m.d.comb += self.internal_fault.eq(0) m.d.sync += start_of_record.eq(0) m.d.sync += number_written.eq(0) @@ -613,9 +613,9 @@ class TreeSerializer(Elaboratable): m.next="NODE" - with m.State("NODE"): m.d.comb += self.ready_out.eq(1) + m.d.comb += self.internal_fault.eq(0) #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) @@ -630,11 +630,16 @@ class TreeSerializer(Elaboratable): m.d.sync += number_of_children.eq(self.number_to_pop) m.d.sync += number_written.eq(1) + m.next = "SUBNODES" + with m.If(self.memory_address_port > (self.serialized_tree_length - 1)): + m.next = "ABORT" with m.State("SUBNODES"): m.d.comb += self.ready_out.eq(0) + m.d.comb += self.internal_fault.eq(0) + with m.If(self.destroyed_item_valid_in == 1): with m.If(self.destroyed_item_index_in == 0): m.d.comb += self.memory_write_port.eq(self.destroyed_item_in) @@ -649,20 +654,32 @@ class TreeSerializer(Elaboratable): with m.If(number_written == number_of_children): 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.If(self.memory_address_port > (self.serialized_tree_length - 1)): + m.next = "ABORT" + with m.State("FIXUP"): m.d.comb += self.ready_out.eq(0) + m.d.comb += self.internal_fault.eq(0) m.d.comb += self.memory_write_port.eq(number_of_children) 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(start_of_record + 2 + number_of_children) + m.next = "NODE" + with m.If(self.memory_address_port > (self.serialized_tree_length - 1)): + m.next = "ABORT" + + with m.State("ABORT"): + m.d.comb += self.ready_out.eq(0) + m.d.comb += self.internal_fault.eq(1) + + return m @@ -779,7 +796,7 @@ class MasterStateMachine(Elaboratable): m.d.comb += doublestacks.side_push_port.eq(0x0) # XXX FIXME m.d.comb += doublestacks.command_in.eq(2) - with m.If(doublestacks.fault == 1): + with m.If(doublestacks.internal_fault | serializer.internal_fault == 1): m.next="ABORT" @@ -790,7 +807,7 @@ class MasterStateMachine(Elaboratable): m.d.comb += fsm_ready.eq(0) m.d.comb += doublestacks.command_in_strobe.eq(0) - with m.If(doublestacks.fault == 1): + with m.If(doublestacks.internal_fault | serializer.internal_fault == 1): m.next="ABORT" with m.If(rule_matcher.invalid_item == 1): @@ -847,7 +864,7 @@ class MasterStateMachine(Elaboratable): m.d.comb += self.parse_success_out.eq(1) m.d.comb += self.parse_complete_out.eq(1) - with m.If(doublestacks.fault == 1): + with m.If(doublestacks.internal_fault | serializer.internal_fault == 1): m.next="ABORT" @@ -875,7 +892,7 @@ class MasterStateMachine(Elaboratable): m.next = "SHIFTREDUCE" - with m.If(doublestacks.fault == 1): + with m.If(doublestacks.internal_fault | serializer.internal_fault == 1): m.next="ABORT"