X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fadd%2Ftest_buf_pipe.py;h=e38043ecd7775959e65a15341c83b5636a895748;hb=f3945d1317aa236b752c1e286801caa2c3a07703;hp=55307cd32f9eee0bc9d87c9aead0b08595ee5308;hpb=198cc1f879b9a83f1eee56024e03a90a4b73ee59;p=ieee754fpu.git diff --git a/src/add/test_buf_pipe.py b/src/add/test_buf_pipe.py index 55307cd3..e38043ec 100644 --- a/src/add/test_buf_pipe.py +++ b/src/add/test_buf_pipe.py @@ -4,8 +4,10 @@ from nmigen.compat.sim import run_simulation from nmigen.cli import verilog, rtlil from example_buf_pipe import ExampleBufPipe, ExampleBufPipeAdd -from example_buf_pipe import ExampleCombPipe, CombPipe -from example_buf_pipe import PrevControl, NextControl +from example_buf_pipe import ExampleCombPipe, CombPipe, ExampleStageCls +from example_buf_pipe import PrevControl, NextControl, BufferedPipeline +from example_buf_pipe import StageChain + from random import randint @@ -282,6 +284,31 @@ class ExampleBufPipe2: return m + +class ExampleBufPipeChain2(BufferedPipeline): + """ connects two stages together as a *single* combinatorial stage. + """ + def __init__(self): + stage1 = ExampleStageCls() + stage2 = ExampleStageCls() + combined = StageChain([stage1, stage2]) + BufferedPipeline.__init__(self, combined) + + +def data_chain2(): + data = [] + for i in range(num_tests): + data.append(randint(0, 1<<16-2)) + return data + + +def test9_resultfn(o_data, expected, i, o): + res = expected + 2 + assert o_data == res, \ + "%d-%d data %x not match %s\n" \ + % (i, o, o_data, repr(expected)) + + class SetLessThan: def __init__(self, width, signed): self.src1 = Signal((width, signed)) @@ -367,6 +394,73 @@ def test7_resultfn(o_data, expected, i, o): % (i, o, repr(o_data), repr(expected)) +class Example2OpClass: + """ an example of a class used to store 2 operands. + requires an eq function, to conform with the pipeline stage API + """ + + def __init__(self): + self.op1 = Signal(16) + self.op2 = Signal(16) + + def eq(self, i): + return [self.op1.eq(i.op1), self.op2.eq(i.op2)] + + +class ExampleAddClassStage: + """ an example of how to use the buffered pipeline, as a class instance + """ + + def ispec(self): + """ returns an instance of an Example2OpClass. + """ + return Example2OpClass() + + def ospec(self): + """ returns an output signal which will happen to contain the sum + of the two inputs + """ + return Signal(16) + + def process(self, i): + """ process the input data (sums the values in the tuple) and returns it + """ + return i.op1 + i.op2 + + +class ExampleBufPipeAddClass(BufferedPipeline): + """ an example of how to use the buffered pipeline, using a class instance + """ + + def __init__(self): + addstage = ExampleAddClassStage() + BufferedPipeline.__init__(self, addstage) + + +class TestInputAdd: + """ the eq function, called by set_input, needs an incoming object + that conforms to the Example2OpClass.eq function requirements + easiest way to do that is to create a class that has the exact + same member layout (self.op1, self.op2) as Example2OpClass + """ + def __init__(self, op1, op2): + self.op1 = op1 + self.op2 = op2 + + +def test8_resultfn(o_data, expected, i, o): + res = expected.op1 + expected.op2 # these are a TestInputAdd instance + assert o_data == res, \ + "%d-%d data %x not match %s\n" \ + % (i, o, o_data, repr(expected)) + +def data_2op(): + data = [] + for i in range(num_tests): + data.append(TestInputAdd(randint(0, 1<<16-1), randint(0, 1<<16-1))) + return data + + num_tests = 100 if __name__ == '__main__': @@ -423,3 +517,23 @@ if __name__ == '__main__': with open("test_recordcomb_pipe.il", "w") as f: f.write(vl) + print ("test 8") + dut = ExampleBufPipeAddClass() + data=data_2op() + test = Test5(dut, test8_resultfn, data=data) + run_simulation(dut, [test.send, test.rcv], vcd_name="test_bufpipe8.vcd") + + print ("test 9") + dut = ExampleBufPipeChain2() + ports = [dut.p.i_valid, dut.n.i_ready, + dut.n.o_valid, dut.p.o_ready] + \ + [dut.p.i_data] + [dut.n.o_data] + vl = rtlil.convert(dut, ports=ports) + with open("test_bufpipechain2.il", "w") as f: + f.write(vl) + + data = data_chain2() + test = Test5(dut, test9_resultfn, data=data) + run_simulation(dut, [test.send, test.rcv], + vcd_name="test_bufpipechain2.vcd") +