diff --git a/rtl_lib/arbitrary_width_memory.py b/unoptimized_lr/rtl_lib/arbitrary_width_memory.py similarity index 83% rename from rtl_lib/arbitrary_width_memory.py rename to unoptimized_lr/rtl_lib/arbitrary_width_memory.py index 680fef1f5eb517f06f8f0ceea514da4cb15678ef..ec8ac1a881b805cb9c8114273dec7ae3033b72f6 100644 --- a/rtl_lib/arbitrary_width_memory.py +++ b/unoptimized_lr/rtl_lib/arbitrary_width_memory.py @@ -37,8 +37,25 @@ class ArbitraryWidthMemoryBus(Record): +def folder(unwrapped_bits, *, desired_width): + surplus = len(unwrapped_bits) % desired_width -def refolder(fake_array, fake_width, desired_width): + if (surplus != 0): + padding = desired_width - surplus + print("Padding", padding) + unwrapped_bits.extend(zeros(padding)) + + assert(len(unwrapped_bits) % desired_width == 0) + + rewrapped_array = [] + + for idx in range(len(unwrapped_bits)//desired_width): + #print("slicer", unwrapped_bits[(idx*desired_width):(idx*desired_width+desired_width)]) + rewrapped_array.append(ba2int(unwrapped_bits[(idx*desired_width):(idx*desired_width+desired_width)])) + + return rewrapped_array + +def refolder(fake_array, *, fake_width, desired_width): unwrapped_bits = bitarray("") # unwrap the bits @@ -63,7 +80,6 @@ def refolder(fake_array, fake_width, desired_width): print("slicer", unwrapped_bits[(idx*desired_width):(idx*desired_width+desired_width)]) rewrapped_array.append(ba2int(unwrapped_bits[(idx*desired_width):(idx*desired_width+desired_width)])) - return rewrapped_array @@ -126,7 +142,7 @@ class ArbitraryWidthMemory(Elaboratable): m.submodules.read_port = read_port = self.backing_memory.read_port() m.d.comb += read_port.addr.eq(fetch_address) - m.d.comb += self.bus.r_data.eq(read_port.data) + shreg = Signal(self.fake_data_width) current_slice = Signal(self.fake_data_width) @@ -190,10 +206,10 @@ class ArbitraryWidthMemory(Elaboratable): # So here we determine if there's any need for additional memory words: m.d.comb += additional_words.eq(end_bit_pseudo_index[self.backing_memory_data_width_bits:]) - m.d.sync += shreg.eq(current_slice) with m.If(additional_words == 0): # No additional words, calculate which bits we need from the sole word we're fetching: m.d.sync += MS_bit_index.eq(end_bit_pseudo_index[:self.backing_memory_data_width_bits]) + m.d.comb += self.bus.r_data.eq(current_slice) with m.Else(): # Additional words needed, so we fetch the entire remaining part of this word @@ -206,7 +222,7 @@ class ArbitraryWidthMemory(Elaboratable): m.d.sync += additional_words_regd.eq(additional_words) m.d.sync += end_bit_pseudo_index_regd.eq(end_bit_pseudo_index) - m.d.sync += shreg.eq(0) + m.d.sync += shreg.eq(current_slice) m.next="MULTIPLE" @@ -250,6 +266,9 @@ class ArbitraryWidthMemory(Elaboratable): with m.If(lingering_txn == 1): m.d.comb += bus.r_data.eq(last_r_data) + with m.If(bus.ready_in == 1): + m.next = "SINGLE" + return m @@ -296,17 +315,55 @@ class DummyPlug(Elaboratable): def elaborate(self, platform): m = Module() - m.submodules.FakeAWMem = FakeAWMem = ArbitraryWidthMemory(fake_data_width=16, - fake_address_width=8, initial_data=[0xAB, 0xCD,0xEF,0x42], # refolder([10,9,8,7,6,5,4,3,2,1],4, 8), + + + fake_data_width=4 + fake_address_width=8 + + backing_memory_data_width=8 + backing_memory_address_width=8 + + fake_bits = fake_data_width * (2** fake_address_width) + + real_bits = backing_memory_data_width * (2** backing_memory_address_width) + + assert(fake_bits <= real_bits) + + unwrapped_bits = urandom(fake_bits) + fake_array = folder(unwrapped_bits, desired_width=fake_data_width) + + backing_array = folder(unwrapped_bits, desired_width=backing_memory_data_width) + + m.submodules.AWMem = AWMem = ArbitraryWidthMemory(fake_data_width=4, + fake_address_width=8, initial_data=backing_array, backing_memory_data_width=8, backing_memory_address_width=8) - counter = Signal(8, reset=1) - with m.If(FakeAWMem.bus.ready_out == 1): - m.d.sync += counter.eq(counter+1) + m.submodules.FakeAWMem = FakeAWMem = GoldenArbitraryWidthMemory(data_width=fake_data_width, address_width=fake_address_width, sim_memory=fake_array) + + for k in fake_array: + print(hex(k)) + address = Signal(fake_address_width) + valid = Signal(1) + ready = Signal(1) + + m.d.comb += FakeAWMem.bus.r_addr.eq(address) + m.d.comb += AWMem.bus.r_addr.eq(address) + + m.d.comb += FakeAWMem.bus.valid_in.eq(valid) + m.d.comb += AWMem.bus.valid_in.eq(valid) + + m.d.comb += FakeAWMem.bus.ready_in.eq(ready) + m.d.comb += AWMem.bus.ready_in.eq(ready) + + counter = Signal(8, reset=0) + # with m.If(FakeAWMem.bus.ready_out == 1): + m.d.sync += counter.eq(counter+1) + + with m.If(counter >= 8): + m.d.comb += ready.eq(1) - #with m.If(counter == 4): - m.d.comb += FakeAWMem.bus.valid_in.eq(1) - m.d.comb += FakeAWMem.bus.r_addr.eq(counter) + m.d.comb += valid.eq(1) + m.d.comb += address.eq(counter) return m diff --git a/rtl_lib/arbitrary_width_memory.sby b/unoptimized_lr/rtl_lib/arbitrary_width_memory.sby similarity index 100% rename from rtl_lib/arbitrary_width_memory.sby rename to unoptimized_lr/rtl_lib/arbitrary_width_memory.sby diff --git a/rtl_lib/gearbox.py b/unoptimized_lr/rtl_lib/gearbox.py similarity index 100% rename from rtl_lib/gearbox.py rename to unoptimized_lr/rtl_lib/gearbox.py diff --git a/rtl_lib/gearbox.sby b/unoptimized_lr/rtl_lib/gearbox.sby similarity index 100% rename from rtl_lib/gearbox.sby rename to unoptimized_lr/rtl_lib/gearbox.sby diff --git a/rtl_lib/one_hot_utils.py b/unoptimized_lr/rtl_lib/one_hot_utils.py similarity index 100% rename from rtl_lib/one_hot_utils.py rename to unoptimized_lr/rtl_lib/one_hot_utils.py diff --git a/rtl_lib/pipe_stage.py b/unoptimized_lr/rtl_lib/pipe_stage.py similarity index 100% rename from rtl_lib/pipe_stage.py rename to unoptimized_lr/rtl_lib/pipe_stage.py diff --git a/rtl_lib/pipe_stage.sby b/unoptimized_lr/rtl_lib/pipe_stage.sby similarity index 100% rename from rtl_lib/pipe_stage.sby rename to unoptimized_lr/rtl_lib/pipe_stage.sby diff --git a/rtl_lib/shift_testing.py b/unoptimized_lr/rtl_lib/shift_testing.py similarity index 100% rename from rtl_lib/shift_testing.py rename to unoptimized_lr/rtl_lib/shift_testing.py diff --git a/rtl_lib/skidbuffer.py b/unoptimized_lr/rtl_lib/skidbuffer.py similarity index 100% rename from rtl_lib/skidbuffer.py rename to unoptimized_lr/rtl_lib/skidbuffer.py diff --git a/rtl_lib/width_converter_simulator.py b/unoptimized_lr/rtl_lib/width_converter_simulator.py similarity index 100% rename from rtl_lib/width_converter_simulator.py rename to unoptimized_lr/rtl_lib/width_converter_simulator.py diff --git a/unoptimized_lr/simple_lr_automaton.py b/unoptimized_lr/simple_lr_automaton.py index 97b1c1b609768366751a0351dccc93457f9d467c..ff79e2ca0d8f656bfc14184f7d07eba1975b2c50 100644 --- a/unoptimized_lr/simple_lr_automaton.py +++ b/unoptimized_lr/simple_lr_automaton.py @@ -215,10 +215,11 @@ class ParametrizationConstants(): class SimpleLRAutomaton(Elaboratable): - def __init__(self): + def __init__(self, *, lr_tables, parameters): # Stack self.mem = Memory(width=self.table_width, depth=self.table_depth, init=rasterized) - + self.lr_tables = lr_tables + self.parameters = parameters def elaborate(self, platform): m = Module()