diff --git a/unoptimized_lr/simple_lr_automaton.py b/unoptimized_lr/simple_lr_automaton.py index 8522078cdb49da67bef91ee77262b81dd5555606..3a0b1f242ffdffd8388371fd6c65fe37aa7096b6 100644 --- a/unoptimized_lr/simple_lr_automaton.py +++ b/unoptimized_lr/simple_lr_automaton.py @@ -7,6 +7,10 @@ import simple_lr_tables import simple_lr_stack import simple_parse_tree +import simple_parser_buses + + + from functools import reduce @@ -184,125 +188,15 @@ from functools import reduce # +class LRTables(): + def __init__(self, *, shift_reduce_table, goto_table, reduce_rule_table): + self.shift_reduce_table = shift_reduce_table + self.goto_table = goto_table + self.reduce_rule_table = reduce_rule_table -class ParametrizationConstants(): - def __init__(self, *, number_of_terminals, number_of_nonterminals, - number_of_states, number_of_reduce_rules, - length_of_longest_rule_RHS, maximum_number_of_stack_items, - longest_serialized_parse_tree, - generating_tree): - self.number_of_terminals = number_of_terminals - self.number_of_nonterminals = number_of_nonterminals - self.number_of_states = number_of_states - self.number_of_reduce_rules = number_of_reduce_rules - self.length_of_longest_rule_RHS = length_of_longest_rule_RHS - self.maximum_number_of_stack_items = maximum_number_of_stack_items - self.longest_serialized_parse_tree = longest_serialized_parse_tree - self.generating_tree = generating_tree - - # We calculate the ceil(log_2())'s here all in one go: - - dummy_signal = Signal(range(number_of_terminals)) - self.W_terminal = len(dummy_signal) - - dummy_signal = Signal(range(number_of_nonterminals)) - self.W_nonterminal = len(dummy_signal) - - dummy_signal = Signal(range(number_of_states)) - self.W_state = len(dummy_signal) - - dummy_signal = Signal(range(number_of_reduce_rules)) - self.W_rule = len(dummy_signal) - - dummy_signal = Signal(range(length_of_longest_rule_RHS)) - self.W_max_RHS = len(dummy_signal) - - dummy_signal = Signal(range(maximum_number_of_stack_items)) - self.W_stackdepth = len(dummy_signal) - - dummy_signal = Signal(range(longest_serialized_parse_tree)) - self.W_parsetree_index = len(dummy_signal) - - self.W_serialized_parse_tree = max(W_Nonterminal, W_max_RHS, 1 + W_Terminal, 1+ W_parsetree_index) - - -class LR_automaton_internal(Layout): - def __init__(self, *, parameters): - interfaces = [ - # TABLES - ("ShiftReduce_table_bus", simple_lr_tables.ShiftReduceTableBusLayout(parameters=parameters)), - ("GOTO_table_bus" , simple_lr_tables.GOTOTableBusLayout(parameters=parameters)), - ("Reduce_table_bus" , simple_lr_tables.ReduceTableBusLayout(parameters=parameters)), - - # STACKS - ("parse_stack_bus" , simple_lr_stack.StackLayout(data_width=parameters.W_state, index_width=parameters.W_stackdepth)) - ] - if(parameters.generating_tree == True): - interfaces.append(("index_stack_bus", simple_lr_stack.StackLayout(data_width=parameters.W_parsetree_index, index_width=parameters.W_stackdepth))) - super().__init__(interfaces) - - -class InputStream(Layout): - def __init__(self, *, parameters): - input_width = parameters.W_terminal - super().__init__([ - # INPUTS - ("data_in", unsigned(input_width)), # FROM SOURCE - ("valid_in", 1), # FROM SOURCE - ("ready_in", 1), # FROM DEST - - # OUTPUTS - ("valid_out", 1), # TO DEST - ("ready_out", 1), # TO SOURCE - - ]) - - -class Sideband(Layout): - def __init__(self, *, parameters): - super().__init__([ - # INPUTS - ("reset_parser", 1), # FROM SOURCE - - # OUTPUTS - ("parser_initialized", 1), # TO SOURCE - ("parse_complete_out", 1), # TO DEST - ("parse_success", 1), # TO DEST - ("parser_fault", 1), # TO DEST - ]) - - -class Serializer(Layout) - def __init__(self, *, parameters): - super().__init__([ - # INPUTS - ("valid_in", 1), # FROM SOURCE - ("ready_in", 1), # FROM DEST - - # OUTPUTS - ("valid_out", 1), # TO DEST - ("ready_out", 1), # TO SOURCE - ("data_out", unsigned(parameters.W_serialized_parse_tree)), # TO DEST - ("parse_tree_done", 1) - ("parse_tree_length", ) - - - ]) - -class LR_automaton_external(Layout): - def __init__(self, *, parameters): - interfaces = [ - # INPUT - ("input_stream", InputStream(parameters=parameters)), - # OUTPUTS - ("sideband_bus", Sideband(parameters=parameters)) - ] - if (parameters.generating_tree == True): - interfaces.append(("serialization_bus", Serializer(parameters=parameters))) - super().__init__(interfaces) diff --git a/unoptimized_lr/simple_lr_stack.py b/unoptimized_lr/simple_lr_stack.py index 577a5005acae08ff8a7a932d0c31b54c6aed8c2d..9665b52855e92625eae945d966f927fe7e5562e7 100644 --- a/unoptimized_lr/simple_lr_stack.py +++ b/unoptimized_lr/simple_lr_stack.py @@ -9,30 +9,6 @@ from functools import reduce from skidbuffer import RegisteredSkidBuffer -class StackLayout(Layout): - def __init__(self, *, data_width, index_width): - command_width = 3 - super().__init__([ - # INPUTS - ("command_in", unsigned(command_width)), # FROM SOURCE - ("data_in", unsigned(data_width)), # FROM SOURCE - ("index_in", unsigned(index_width)), # FROM SOURCE - ("valid_in", 1), # FROM SOURCE - ("ready_in", 1), # FROM DEST - - # OUTPUTS - ("data_out", unsigned(data_width)), # TO DEST - ("index_out", unsigned(index_width)), # TO DEST - ("valid_out", 1), # TO DEST - ("internal_fault", 1), # TO DEST - ("ready_out", 1), # TO SOURCE - - ]) - -class StackBus(Record): - def __init__(self, *, data_width, index_width): - super().__init__(StackLayout(data_width=data_width, index_width=index_width)) - class Stack(Elaboratable): PUSH = 0 POP = 1 diff --git a/unoptimized_lr/simple_lr_tables.py b/unoptimized_lr/simple_lr_tables.py index 1ad8126dd58e6b8e8326ebfb59c38f3f2089ed5d..a1ab4c41ce64576670f2797a8dcee124ac1dca1a 100644 --- a/unoptimized_lr/simple_lr_tables.py +++ b/unoptimized_lr/simple_lr_tables.py @@ -24,32 +24,6 @@ from functools import reduce -class ShiftReduceTableBusLayout(Layout): - def __init__(self, *, parameters): - row_input_width = parameters.W_state - column_input_width = parameters.W_terminal - output_width = (parameters.W_rule + 2) - - super().__init__([ - # INPUTS - ("row_idx", unsigned(row_input_width)), # FROM SOURCE - ("col_idx", unsigned(column_input_width)), # FROM SOURCE - ("valid_in", 1), # FROM SOURCE - ("ready_in", 1), # FROM DEST - - # OUTPUTS - ("output_data", unsigned(output_width)), # TO DEST - ("valid_out", 1), # TO DEST - ("ready_out", 1), # TO SOURCE - - ]) - -class ShiftReduceTableBus(Record): - def __init__(self, *, parameters): - super().__init__(TableBusLayout(parameters=parameters)) - - - class ShiftReduceTable(Elaboratable): def __init__(self, *, lang_params, input_array): # Parameters @@ -118,30 +92,6 @@ class ShiftReduceTable(Elaboratable): return m -class GOTOTableBusLayout(Layout): - def __init__(self, *, parameters): - - row_input_width = parameters.W_state - column_input_width = parameters.W_nonterminal - output_width = (parameters.W_nonterminal + 1) - - super().__init__([ - # INPUTS - ("row_idx", unsigned(row_input_width)), # FROM SOURCE - ("col_idx", unsigned(column_input_width)), # FROM SOURCE - ("valid_in", 1), # FROM SOURCE - ("ready_in", 1), # FROM DEST - - # OUTPUTS - ("output_data", unsigned(output_width)), # TO DEST - ("valid_out", 1), # TO DEST - ("ready_out", 1), # TO SOURCE - - ]) - -class GOTOTableBus(Record): - def __init__(self, *, parameters): - super().__init__(TableBusLayout(parameters=parameters)) class GOTOtable(Elaboratable): def __init__(self, *, lang_params, input_array): @@ -219,31 +169,6 @@ class GOTOtable(Elaboratable): - - -class ReduceTableBusLayout(Layout): - def __init__(self, *, parameters): - output_width = (parameters.W_max_RHS + parameters.W_nonterminal) - row_input_width = parameters.W_rule - - super().__init__([ - # INPUTS - ("row_idx", unsigned(row_input_width)), # FROM SOURCE - ("valid_in", 1), # FROM SOURCE - ("ready_in", 1), # FROM DEST - - # OUTPUTS - ("output_data", unsigned(output_width)), # TO DEST - ("valid_out", 1), # TO DEST - ("ready_out", 1), # TO SOURCE - - ]) - -class ReduceTableBus(Record): - def __init__(self, *, parameters): - super().__init__(OneDimensionTableBusLayout(parameters=parameters)) - - class ReduceRuleTable(Elaboratable): def __init__(self, *, lang_params, input_array): # Parameters diff --git a/unoptimized_lr/simple_parser_buses.py b/unoptimized_lr/simple_parser_buses.py new file mode 100644 index 0000000000000000000000000000000000000000..baab9117415c3a4a7a14773fb38510b4dfd09833 --- /dev/null +++ b/unoptimized_lr/simple_parser_buses.py @@ -0,0 +1,228 @@ +from nmigen import * +from nmigen.hdl.rec import * +from nmigen.cli import main + +import rtl_lib + +from functools import reduce + +class ParametrizationConstants(): + def __init__(self, *, number_of_terminals, number_of_nonterminals, + number_of_states, number_of_reduce_rules, + length_of_longest_rule_RHS, maximum_number_of_stack_items, + longest_serialized_parse_tree, + generating_tree): + self.number_of_terminals = number_of_terminals + self.number_of_nonterminals = number_of_nonterminals + self.number_of_states = number_of_states + self.number_of_reduce_rules = number_of_reduce_rules + self.length_of_longest_rule_RHS = length_of_longest_rule_RHS + self.maximum_number_of_stack_items = maximum_number_of_stack_items + self.longest_serialized_parse_tree = longest_serialized_parse_tree + self.generating_tree = generating_tree + + # We calculate the ceil(log_2())'s here all in one go: + + dummy_signal = Signal(range(number_of_terminals)) + self.W_terminal = len(dummy_signal) + + dummy_signal = Signal(range(number_of_nonterminals)) + self.W_nonterminal = len(dummy_signal) + + dummy_signal = Signal(range(number_of_states)) + self.W_state = len(dummy_signal) + + dummy_signal = Signal(range(number_of_reduce_rules)) + self.W_rule = len(dummy_signal) + + dummy_signal = Signal(range(length_of_longest_rule_RHS)) + self.W_max_RHS = len(dummy_signal) + + dummy_signal = Signal(range(maximum_number_of_stack_items)) + self.W_stackdepth = len(dummy_signal) + + dummy_signal = Signal(range(longest_serialized_parse_tree)) + self.W_parsetree_index = len(dummy_signal) + + self.W_serialized_parse_tree = max(W_Nonterminal, W_max_RHS, 1 + W_Terminal, 1+ W_parsetree_index) + + +class LR_automaton_internal(Layout): + def __init__(self, *, parameters): + interfaces = [ + # TABLES + ("ShiftReduce_table_bus", ShiftReduceTableBusLayout(parameters=parameters)), + ("GOTO_table_bus" , GOTOTableBusLayout(parameters=parameters)), + ("Reduce_table_bus" , ReduceTableBusLayout(parameters=parameters)), + + # STACKS + ("parse_stack_bus" , StackLayout(data_width=parameters.W_state, index_width=parameters.W_stackdepth)) + ] + if(parameters.generating_tree == True): + interfaces.append(("index_stack_bus", StackLayout(data_width=parameters.W_parsetree_index, index_width=parameters.W_stackdepth))) + super().__init__(interfaces) + + +class InputStream(Layout): + def __init__(self, *, parameters): + input_width = parameters.W_terminal + super().__init__([ + # INPUTS + ("data_in", unsigned(input_width)), # FROM SOURCE + ("valid_in", 1), # FROM SOURCE + ("ready_in", 1), # FROM DEST + + # OUTPUTS + ("valid_out", 1), # TO DEST + ("ready_out", 1), # TO SOURCE + + ]) + + +class Sideband(Layout): + def __init__(self, *, parameters): + super().__init__([ + # INPUTS + ("reset_parser", 1), # FROM SOURCE + + # OUTPUTS + ("parser_initialized", 1), # TO SOURCE + ("parse_complete_out", 1), # TO DEST + ("parse_success", 1), # TO DEST + ("parser_fault", 1), # TO DEST + ]) + + +class Serializer(Layout): + def __init__(self, *, parameters): + super().__init__([ + # INPUTS + ("valid_in", 1), # FROM SOURCE + ("ready_in", 1), # FROM DEST + + # OUTPUTS + ("valid_out", 1), # TO DEST + ("ready_out", 1), # TO SOURCE + ("data_out", unsigned(parameters.W_serialized_parse_tree)), # TO DEST + + ("parse_tree_done", 1), + ("parse_tree_length", ) + + + ]) + +class LR_automaton_external(Layout): + def __init__(self, *, parameters): + interfaces = [ + # INPUT + ("input_stream", InputStream(parameters=parameters)), + + # OUTPUTS + ("sideband_bus", Sideband(parameters=parameters)) + ] + if (parameters.generating_tree == True): + interfaces.append(("serialization_bus", Serializer(parameters=parameters))) + super().__init__(interfaces) + + + +class StackLayout(Layout): + def __init__(self, *, data_width, index_width): + command_width = 3 + super().__init__([ + # INPUTS + ("command_in", unsigned(command_width)), # FROM SOURCE + ("data_in", unsigned(data_width)), # FROM SOURCE + ("index_in", unsigned(index_width)), # FROM SOURCE + ("valid_in", 1), # FROM SOURCE + ("ready_in", 1), # FROM DEST + + # OUTPUTS + ("data_out", unsigned(data_width)), # TO DEST + ("index_out", unsigned(index_width)), # TO DEST + ("valid_out", 1), # TO DEST + ("internal_fault", 1), # TO DEST + ("ready_out", 1), # TO SOURCE + + ]) + +class StackBus(Record): + def __init__(self, *, data_width, index_width): + super().__init__(StackLayout(data_width=data_width, index_width=index_width)) + + + +class ShiftReduceTableBusLayout(Layout): + def __init__(self, *, parameters): + row_input_width = parameters.W_state + column_input_width = parameters.W_terminal + output_width = (parameters.W_rule + 2) + + super().__init__([ + # INPUTS + ("row_idx", unsigned(row_input_width)), # FROM SOURCE + ("col_idx", unsigned(column_input_width)), # FROM SOURCE + ("valid_in", 1), # FROM SOURCE + ("ready_in", 1), # FROM DEST + + # OUTPUTS + ("output_data", unsigned(output_width)), # TO DEST + ("valid_out", 1), # TO DEST + ("ready_out", 1), # TO SOURCE + + ]) + +class ShiftReduceTableBus(Record): + def __init__(self, *, parameters): + super().__init__(TableBusLayout(parameters=parameters)) + + + +class GOTOTableBusLayout(Layout): + def __init__(self, *, parameters): + + row_input_width = parameters.W_state + column_input_width = parameters.W_nonterminal + output_width = (parameters.W_nonterminal + 1) + + super().__init__([ + # INPUTS + ("row_idx", unsigned(row_input_width)), # FROM SOURCE + ("col_idx", unsigned(column_input_width)), # FROM SOURCE + ("valid_in", 1), # FROM SOURCE + ("ready_in", 1), # FROM DEST + + # OUTPUTS + ("output_data", unsigned(output_width)), # TO DEST + ("valid_out", 1), # TO DEST + ("ready_out", 1), # TO SOURCE + + ]) + +class GOTOTableBus(Record): + def __init__(self, *, parameters): + super().__init__(TableBusLayout(parameters=parameters)) + + + +class ReduceTableBusLayout(Layout): + def __init__(self, *, parameters): + output_width = (parameters.W_max_RHS + parameters.W_nonterminal) + row_input_width = parameters.W_rule + + super().__init__([ + # INPUTS + ("row_idx", unsigned(row_input_width)), # FROM SOURCE + ("valid_in", 1), # FROM SOURCE + ("ready_in", 1), # FROM DEST + + # OUTPUTS + ("output_data", unsigned(output_width)), # TO DEST + ("valid_out", 1), # TO DEST + ("ready_out", 1), # TO SOURCE + + ]) + +class ReduceTableBus(Record): + def __init__(self, *, parameters): + super().__init__(OneDimensionTableBusLayout(parameters=parameters))