Couple of reference model fixes
- comparison ops could have different type of input/output
- add SUBGRAPH_ERROR_IF() when operator doesn't have any output tensor
Signed-off-by: Kevin Cheng <kevin.cheng@arm.com>
Change-Id: I10f2c10f92de1c7a979221a421fa8e86b26fcc72
diff --git a/reference_model/src/ops/ewise_binary.cc b/reference_model/src/ops/ewise_binary.cc
index a11d855..023158c 100644
--- a/reference_model/src/ops/ewise_binary.cc
+++ b/reference_model/src/ops/ewise_binary.cc
@@ -60,24 +60,25 @@
return 1;
}
- // Input and output rank must match
- // If it's not MUL, type also needs to match as well.
- if (nodeType != Op_MUL)
- {
- if (inputs[0]->matchRankType(*outputs[0]))
- {
- printNodeValidationError("Binary operators (except MUL) input and output rank and type must match");
- return 1;
- }
- }
- else
+ // In some ops, only rank of input and output tensor needs to match
+ if (nodeType == Op_MUL || nodeType == Op_GREATER || nodeType == Op_EQUAL || nodeType == Op_GREATER_EQUAL)
{
if (inputs[0]->matchRank(*outputs[0]))
{
- printNodeValidationError("MUL operator input and output rank must match");
+ std::string err =
+ "Binary operators " + std::string(EnumNamesOp()[nodeType]) + " input and output rank must match";
+ printNodeValidationError(err.c_str());
return 1;
}
}
+ // Otherwise both rand/type of input and output must match
+ else if (inputs[0]->matchRankType(*outputs[0]))
+ {
+ std::string err =
+ "Binary operators " + std::string(EnumNamesOp()[nodeType]) + " input and output rank and type must match";
+ printNodeValidationError(err.c_str());
+ return 1;
+ }
a = dynamic_cast<TosaReference::TensorTemplate<TIn>*>(inputs[0]);
b = dynamic_cast<TosaReference::TensorTemplate<TIn>*>(inputs[1]);