diff --git a/tests/fpgadataflow/test_fpgadataflow_fclayer.py b/tests/fpgadataflow/test_fpgadataflow_fclayer.py index c45dc5b90d127acf181213d9adcd241deb3b97f7..5ce7d9ff23c3877791a3d825ebe91cab9af56e92 100644 --- a/tests/fpgadataflow/test_fpgadataflow_fclayer.py +++ b/tests/fpgadataflow/test_fpgadataflow_fclayer.py @@ -27,6 +27,21 @@ def make_single_fclayer_modelwrapper(W, pe, simd, wdt, idt, odt, T=None, tdt=Non else: tmem = 0 + # there are two ways to implement bipolar weights and inputs for + # StreamingFC: + # - specify their datatypes as such + # - specify their datatypes as BINARY as use binaryXnorMode + if wdt == DataType.BIPOLAR and idt == DataType.BIPOLAR: + # we'll internally convert weights/inputs to binary and specify the + # datatypes as such, and also set the binaryXnorMode attribute to 1 + export_wdt = DataType.BINARY + export_idt = DataType.BINARY + binary_xnor_mode = 1 + else: + export_wdt = wdt + export_idt = idt + binary_xnor_mode = 0 + inp = helper.make_tensor_value_info("inp", TensorProto.FLOAT, [1, mw]) outp = helper.make_tensor_value_info("outp", TensorProto.FLOAT, [1, mh]) if T is not None: @@ -52,10 +67,11 @@ def make_single_fclayer_modelwrapper(W, pe, simd, wdt, idt, odt, T=None, tdt=Non PE=pe, WMEM=wmem, TMEM=tmem, - inputDataType=idt.name, - weightDataType=wdt.name, + inputDataType=export_idt.name, + weightDataType=export_wdt.name, outputDataType=odt.name, ActVal=actval, + binaryXnorMode=binary_xnor_mode, ) graph = helper.make_graph( nodes=[FCLayer_node], name="fclayer_graph", inputs=[inp], outputs=[outp] @@ -67,15 +83,23 @@ def make_single_fclayer_modelwrapper(W, pe, simd, wdt, idt, odt, T=None, tdt=Non model.set_tensor_datatype("inp", idt) model.set_tensor_datatype("outp", odt) model.set_tensor_datatype("weights", wdt) - model.set_initializer("weights", W) + if binary_xnor_mode: + # convert bipolar to binary + model.set_initializer("weights", (W + 1) / 2) + else: + model.set_initializer("weights", W) if T is not None: model.set_tensor_datatype("thresh", tdt) model.set_initializer("thresh", T) return model -def prepare_inputs(model, input_tensor, idt): - return {"inp": input_tensor} +def prepare_inputs(input_tensor, idt, wdt): + if wdt == DataType.BIPOLAR and idt == DataType.BIPOLAR: + # convert bipolar to binary + return {"inp": (input_tensor + 1) / 2} + else: + return {"inp": input_tensor} # activation: None or DataType @@ -132,7 +156,7 @@ def test_fpgadataflow_fclayer(idt, wdt, act, nf, sf, mw, mh): model = model.transform(CodeGen()) model = model.transform(Compile()) # prepare input data - input_dict = prepare_inputs(model, x, idt) + input_dict = prepare_inputs(x, idt, wdt) if wdt == DataType.BIPOLAR and idt == DataType.BIPOLAR: # convert inputs to binary and use xnorpopcountmatmul y = xp.xnorpopcountmatmul((x + 1) / 2, (W + 1) / 2)