From 4f7c7892689559bb4a962c17b8204a36232c2d53 Mon Sep 17 00:00:00 2001
From: Yaman Umuroglu <maltanar@gmail.com>
Date: Wed, 13 May 2020 00:50:27 +0100
Subject: [PATCH] [Transform] check attrs in ConvertBipolarMatMulToXnorPopcount

---
 src/finn/transformation/bipolar_to_xnor.py | 18 ++++++++++++++----
 1 file changed, 14 insertions(+), 4 deletions(-)

diff --git a/src/finn/transformation/bipolar_to_xnor.py b/src/finn/transformation/bipolar_to_xnor.py
index 4c7ebaf04..8b65cfee1 100644
--- a/src/finn/transformation/bipolar_to_xnor.py
+++ b/src/finn/transformation/bipolar_to_xnor.py
@@ -35,6 +35,7 @@ from finn.transformation import Transformation
 from finn.transformation.infer_shapes import InferShapes
 from finn.transformation.infer_datatypes import InferDataTypes
 from finn.util.basic import get_by_name
+from finn.custom_op.registry import getCustomOp
 
 
 class ConvertBipolarMatMulToXnorPopcount(Transformation):
@@ -71,10 +72,19 @@ class ConvertBipolarMatMulToXnorPopcount(Transformation):
                         )
                     graph_modified = True
                     mt = mt_chain[-1]
-                    bin_dt_attr = "BINARY".encode("utf-8")
-                    get_by_name(mt.attribute, "out_dtype").s = bin_dt_attr
-                    get_by_name(mt.attribute, "out_scale").f = 1.0
-                    get_by_name(mt.attribute, "out_bias").f = 0
+                    mt_inst = getCustomOp(mt)
+                    # ensure old scale/bias were correct for BIPOLAR
+                    scale_ok = mt_inst.get_nodeattr("out_scale") == 2.0
+                    bias_ok = mt_inst.get_nodeattr("out_bias") == -1.0
+                    assert (
+                        scale_ok and bias_ok
+                    ), """Unexpected scale/bias
+                    attributes for BIPOLAR MultiThreshold node."""
+                    # start conversion, set MT output to binary
+                    # (this is what XnorPopcountMatMul expects)
+                    mt_inst.set_nodeattr("out_dtype", "BINARY")
+                    mt_inst.set_nodeattr("out_scale", 1.0)
+                    mt_inst.set_nodeattr("out_bias", 0.0)
                     model.set_tensor_datatype(mm_input, DataType.BINARY)
                     # change node type and domain
                     n.op_type = "XnorPopcountMatMul"
-- 
GitLab